Keras实现的dropout是否正确?

11
Keras中的dropout实现参考了该论文。该论文提出,在测试时使用单个神经网络,而不使用dropout。该网络的权重是训练好的权重的缩小版本。如果在训练时以概率p保留一个单元,则该单元的输出权重在测试时将乘以p。Keras文档指出,dropout仅在训练期间使用,并且在测试时简单地传递层的输出。在Keras的Dropout实现中,我找不到缩小权重的代码,因为这一步骤是使dropout起作用的基本步骤,它相当于在“子网络”的集合中取中间层的期望输出。没有这样做,计算不再被视为从这些“子网络”的集合中随机抽样。因此,我的问题是:如果有的话,Keras中是否实现了dropout的缩小效应?更新1: 好的,Keras使用反转Dropout,但在Keras文档和代码中称为Dropout。链接http://cs231n.github.io/neural-networks-2/#reg似乎并没有表明这两者是等价的。在https://stats.stackexchange.com/questions/205932/dropout-scaling-the-activation-versus-inverting-the-dropout的答案中也是如此。我可以看到它们做了类似的事情,但我还没有见过有人说它们完全相同。我认为它们不相同。

所以一个新的问题:dropout和inverted dropout是等价的吗?明确一下,我正在寻找数学上的理由来说明它们是否相等。

3个回答

13

是的,它被正确地实现了。从Dropout被发明以来——人们也从实现的角度对其进行了改进。Keras正在使用其中一种技术,它被称为反向dropout,您可以在这里阅读有关它的内容。

更新:

说实话,在严格的数学意义上,这两种方法并不等价。在反向情况下,您将通过dropout参数的倒数乘以每个隐藏层激活。但由于导数是线性的,因此它等价于将所有梯度乘以相同的因子。要克服这种差异,您必须设置不同的学习权重。从这个角度来看,这些方法是不同的。但是从实际角度来看,这些方法是等效的,因为:

  1. 如果您使用自动设置学习率的方法(如RMSProp或Adagrad),它几乎不会对算法产生影响。
  2. 如果您使用需要手动设置学习率的方法,您必须考虑dropout的随机性质及其在训练阶段期间关闭某些神经元(在测试/评估阶段不会发生)的事实。为了克服这种差异,您必须重新调整学习率,并使用概率论提供的最佳缩放因子——它是dropout参数的倒数,使得损失函数梯度长度的期望值在训练和测试/评估阶段相同。

当然,上述两点都是关于反向dropout技术的。


谢谢您。您能否提供一些关于我提出的第二个问题的见解? - user3390629
好的,你能解释一下为什么它们是等价的吗?看起来使用dropout计算网络1和使用反向dropout计算网络2的梯度将会不同,因此它们会收敛到不同的最终状态。 - user3390629
更新了我的评论。 - Marcin Możejko

3

以下内容节选自原始的辍学论文(第10节):

在这篇论文中,我们将辍学描述为一种方法,在训练时以概率p保留单元,并通过乘以p因子来缩小权重。另一种实现相同效果的方法是,在训练时通过乘以1/p因子来放大保留的激活值,并在测试时不修改权重。这些方法在每层适当调整学习率和权重初始化后是等效的。


0
请注意,虽然Keras的Dropout层是使用反向丢弃实现的,但率参数是保留率的相反数

keras.layers.Dropout(rate, noise_shape=None, seed=None)

在训练期间,在每次更新时随机将输入单元的一部分比例设置为0,这有助于防止过拟合。

也就是说,rate 设置的是 Dropout 的比例,而不是像反向丢弃那样期望保留的比例。

Keras Dropout


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