在Keras的文档中,没有关于LSTM层如何实际实现dropout的信息。
然而,有一个链接指向论文“循环神经网络中dropout的理论基础应用”,这让我认为dropout是按照该论文中描述的方式实现的。
也就是说,对于层处理的时间序列中的每个时间步,都使用相同的dropout掩码。
查看源代码,我发现LSTMCell.call被迭代调用,每次处理时间序列中的一个时间步,并且每次调用时都会生成一个新的dropout掩码。
我的问题是:
要么是我误解了Keras的代码,要么是Keras文档中对论文的引用具有误导性。究竟是哪一种情况?
回答:
论文和代码是一致的。你理解得正确,但对代码的解释有点错误。
在初始化dropout_mask之前有一个检查,self._dropout_mask is None
所以LSTMCell.call被迭代调用,每次处理时间序列中的一个时间步,但只有在第一次调用时才会生成一个新的dropout掩码。
if 0 < self.dropout < 1 and self._dropout_mask is None: self._dropout_mask = _generate_dropout_mask( K.ones_like(inputs), self.dropout, training=training, count=4)if (0 < self.recurrent_dropout < 1 and self._recurrent_dropout_mask is None): self._recurrent_dropout_mask = _generate_dropout_mask( K.ones_like(states[0]), self.recurrent_dropout, training=training, count=4)
希望这能解答你的疑惑。