在 Embedding Layer 之后应用 Dropout Layer 是不是与通过 LSTM dropout 参数应用 dropout 具有相同的效果?

Posted

技术标签:

【中文标题】在 Embedding Layer 之后应用 Dropout Layer 是不是与通过 LSTM dropout 参数应用 dropout 具有相同的效果?【英文标题】:Does applying a Dropout Layer after the Embedding Layer have the same effect as applying the dropout through the LSTM dropout parameter?在 Embedding Layer 之后应用 Dropout Layer 是否与通过 LSTM dropout 参数应用 dropout 具有相同的效果? 【发布时间】:2018-09-02 16:13:28 【问题描述】:

我对在 Keras 中将 dropout 应用于我的 Sequential 模型的不同方法感到有些困惑。

我的模型如下:

model = Sequential()
model.add(Embedding(input_dim=64,output_dim=64, input_length=498))
model.add(LSTM(units=100,dropout=0.5, recurrent_dropout=0.5))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

假设我以如下方式在 Embedding 层之后添加了一个额外的 Dropout 层:

model = Sequential()
model.add(Embedding(input_dim=64,output_dim=64, input_length=498))
model.add(Dropout(0.25))
model.add(LSTM(units=100,dropout=0.5, recurrent_dropout=0.5))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

这会有什么不同,因为我在 LSTM 参数中特别指定了 dropout 应该是 0.5,还是我完全错了?

【问题讨论】:

【参考方案1】:

当您添加 dropout 层时,您只是将 dropout 添加到前一层的输出中,在您的情况下,您正在将 dropout 添加到嵌入层。

LSTM 单元比单层神经网络更复杂,当您在 LSTM 单元中指定 dropout 时,实际上是将 dropout 应用于 LSTM 单元中的 4 个不同的子神经网络操作。

下面是来自 Colah 的关于 LSTM 的博客的 LSMT 单元的可视化(LSTM/RNN 的最佳可视化,http://colah.github.io/posts/2015-08-Understanding-LSTMs/)。黄色框代表 4 个完全连接的网络操作(每个都有自己的权重),它们发生在 LSTM 的底层 - 这被整齐地包裹在 LSTM 单元包装器中,尽管手动编码并不是那么难。

当您在 LSTM 单元中指定 dropout=0.5 时,您在幕后所做的就是将 dropout 应用于这 4 个神经网络操作中的每一个。这有效地添加了model.add(Dropout(0.25)) 4 次,在您在图中看到的 4 个黄色块中的每一个之后,在 LSTM 单元的内部添加一次。

我希望简短的讨论可以更清楚地说明 LSTM 包装器中应用的 dropout(它有效地应用于 LSTM 中的 4 个子网络)与您在嵌入层之后的序列中应用一次的 dropout 有何不同。直接回答你的问题,是的,这两个 dropout 的定义非常不同。

请注意,作为进一步说明这一点的示例:如果要定义一个简单的 5 层全连接神经网络,则需要在每一层之后定义 dropout,而不是一次。 model.add(Dropout(0.25)) 不是某种全局设置,它是将 dropout 操作添加到操作管道中。如果有 5 层,则需要添加 5 个 dropout 操作。

【讨论】:

感谢您提供详细解释且内容丰富的答案。它充分解释了我的问题,并以尽可能简单的形式加以澄清。 更复杂的是,@Danny 还指定了recurrent_dropout=0.5,因此每个 X_t 和 X_t+1 之间的激活有 50% 被丢弃。因此,有三种不同的方法来删除 LSTM 层的激活。通过指定dropoutrecurrent_dropout 将它们放在层中,或者添加Dropout 层将它们放在LSTM 层之后。

以上是关于在 Embedding Layer 之后应用 Dropout Layer 是不是与通过 LSTM dropout 参数应用 dropout 具有相同的效果?的主要内容,如果未能解决你的问题,请参考以下文章

异常检测论文阅读——DRÆM:A discriminatively trained reconstruction embedding for surfaceanomaly detection

Embedding层实现

带有嵌入层的 Keras LSTM 自动编码器

深度学习:bert embedding用法详解

Keepalived + LVS-DR搭建高可用Web服务器集群

推荐系统Embedding向量召回在即刻的工程实践