【问题标题】:Dropout layer before or after LSTM. What is the difference?LSTM 之前或之后的 Dropout 层。有什么区别?
【发布时间】:2020-03-04 00:49:01
【问题描述】:

假设我们有一个用于时间序列预测的 LSTM 模型。此外,这是一个多变量案例,因此我们使用多个特征来训练模型。

ipt   = Input(shape = (shape[0], shape[1])
x     = Dropout(0.3)(ipt) ## Dropout before LSTM.
x     = CuDNNLSTM(10, return_sequences = False)(x)
out   = Dense(1, activation='relu')(x)

我们可以在 LSTM 之前(如上面的代码)或 LSTM 之后添加Dropout 层。

  • 如果我们在 LSTM 之前添加它,它是在时间步长(时间序列的不同滞后)或不同的输入特征上应用 dropout,还是两者兼而有之?

  • 如果我们在 LSTM 之后添加它,并且因为 return_sequencesFalse,那么 dropout 在这里做什么?

  • LSTM中的dropout选项和LSTM层之前的dropout层有什么不同吗?

【问题讨论】:

    标签: tensorflow keras lstm dropout


    【解决方案1】:

    默认情况下,Dropout 创建一个由 0 和 1 组成的随机张量。没有模式,没有特权轴。所以,你不能说一个特定的东西被丢弃了,只是张量中的随机坐标。 (好吧,它会丢弃特征,但每个步骤的特征不同,每个样本的特征也不同)

    如果需要,您可以使用noise_shape 属性,它将定义随机张量的形状。然后,您可以选择是否要删除步骤、功能或示例,或者可能是组合。

    • 丢弃时间步长:noise_shape = (1,steps,1)
    • 删除功能:noise_shape = (1,1, features)
    • 删除样本:noise_shape = (None, 1, 1)

    还有SpatialDropout1D 层,它自动使用noise_shape = (input_shape[0], 1, input_shape[2])。这会为所有时间步丢弃相同的特征,但会单独处理每个样本(每个样本将丢弃一组不同的特征)。

    LSTM 之后是shape = (None, 10)。因此,您使用 Dropout 的方式与在任何完全连接的网络中使用的方式相同。它为每个样本丢弃一组不同的特征。

    作为 LSTM 的参数的 dropout 有很多不同之处。它生成 4 个不同的 dropout 掩码,用于为每个不同的门创建不同的输入。 (您可以查看LSTMCell 代码来检查这一点)。

    此外,还有recurrent_dropout 选项,它将生成 4 个 dropout 掩码,但将应用于循环计算的每个步骤的状态而不是输入。

    【讨论】:

    • 嗯,好点子。也许CuDNNLSTMLSTM 不同。我的回答基于LSTM。我认为这是因为 CuDNN 版本可能并没有真正的递归(因为 GPU 不适合这样做,它们非常适合纯并行计算)
    • 我不确定我在说什么,这只是一个猜测。但我相信您可以将计算展开到一个更大的方程中,该方程可以立即求解,或者比通常的循环计算更大。
    • 是的,但它会平等对待所有样本。 (因此,可能需要更多的 epoch 才能获得良好的 dropout 品种)。最好使用noise_shape=(None, 1, features) 进行特征选择,这将对每个样本进行不同的处理,从而导致更多的变化。最简单的就是使用SpatialDropout1D
    • 不建议将 Relu 用于 LSTM。最好坚持标准激活。 (重复使用相同的权重很容易爆炸)——每个 dropout 都会有助于过度拟合,有些可能会对学习造成不良影响。我不能说哪个最好。
    • 这不是一个“智能”的特征选择,dropout 永远不会试图找到一个好的组合。也许我不明白这个问题,或者不知道“特征选择”这个词是什么意思。 dropout 层的功能只是添加噪声,以便模型学会更好地泛化。这是一种正则化技术(可能也被视为增强)。我说“特征选择”是因为它会在所有时间步中丢弃相同的特征,而不是像标准丢弃一样丢弃任何东西。
    【解决方案2】:

    您将Dropout 与它的变体SpatialDropoutND1D2D3D)混淆了。见documentation(显然你不能链接特定的类)。

    • Dropout 将随机二进制掩码应用于输入,无论形状如何,除了第一维(批次),因此在这种情况下它适用于特征和时间步。

    • 这里,如果return_sequences=False,你只能得到最后一个时间步的输出,所以在你的情况下它的大小是[batch, 10]。 Dropout 会从第二维随机丢弃值

    • 1234563下一个单元格)。 Dropout 会丢弃随机元素(批量维度除外)。 SpatialDropout1D 会丢弃整个通道,在这种情况下,某些时间步会被完全丢弃(在卷积情况下,您可以使用 SpatialDropout2D 丢弃输入或沿网络的通道)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 2013-01-22
      • 2017-12-09
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多