在LSTM之前或之后使用Dropout层。有什么区别?

14

假设我们有一个用于时间序列预测的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之前添加它,它是应用于时间步长(时间序列的不同滞后),还是不同的输入特征,还是两者都是?

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

  • LSTM中的dropout选项和在LSTM层之前的dropout层之间有什么区别吗?

2个回答

10
默认情况下,Dropout 会创建一个由零和一组成的随机张量。没有模式,也没有特权轴。因此,您不能说正在丢弃特定的东西,只是在张量中随机选择坐标。(嗯,它会丢弃特征,但对于每个步骤和每个样本,它丢弃的特征都不同)。
如果需要,您可以使用 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。它会针对每个样本丢弃不同的特征组。
将 dropout 作为 LSTM 的参数有很多差异。它会生成4个不同的 dropout 掩码,用于创建每个不同门的不同输入。(您可以查看 LSTMCell 代码来检查这个过程)。
此外,还有 recurrent_dropout 的选项,它将生成4个dropout掩码,但是应用于计算状态而不是输入,每个recurrent计算步骤。

1
嗯,说得好。也许CuDNNLSTMLSTM不同。我基于LSTM回答的。我认为这是因为CuDNN版本可能没有真正的递归(因为GPU不擅长递归,它们非常适合纯并行计算)。 - Daniel Möller
1
我不确定我所说的话,这只是一个猜测。但我相信你可以将计算展开成一个更大的方程,一次性解决,或者比通常的循环计算更大的步骤。 - Daniel Möller
1
是的,但它会平等地处理所有样本。(因此,可能需要更多的时期来获得良好的辍学变化)。最好使用 noise_shape=(None, 1, features) 进行特征选择,这将使每个样本有所不同,从而产生更多的变化。最简单的方法是只使用 SpatialDropout1D - Daniel Möller
1
Relu不适用于LSTM。最好坚持使用标准激活函数。(反复使用相同的权重很容易产生爆炸性的结果)--每个dropout对于防止过拟合都有帮助,但有些可能会对学习产生不良影响。我不能说哪种方法是最好的。 - Daniel Möller
1
这不是“智能”特征选择,Dropout 永远不会尝试找到一个好的组合。也许我没有理解问题或不知道“特征选择”这个术语的含义。Dropout 层的功能只是添加噪声,使模型学习更好地泛化。它是一种正则化技术(也可以看作是增强)。我之所以说“特征选择”,是因为它在所有时间步骤中都会删除相同的特征,而不是像标准的 Dropout 那样随意删除任何东西。 - Daniel Möller
显示剩余5条评论

4
你将Dropout和它的变体SpatialDropoutND1D2D3D)混淆了。如果return_sequences=False,则只会得到最后一个时间步长的输出,因此在你的情况下大小为[batch,10]。Dropout将在第二个维度上随机丢弃值。不同之处在于,当LSTM产生序列时(例如,序列经过展开的LSTM并在进入下一单元之前丢弃一些特征),dropout是用于时间步骤的。 Dropout将随机丢弃元素(除批量尺寸外)。SpatialDropout1D将丢弃整个通道,在这种情况下,某些时间步长将被完全丢弃(在卷积情况下,可以使用SpatialDropout2D来丢弃通道,输入或沿网络)。请参阅documentation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接