Keras
实现的dropout引用了本文。
以下摘录自该论文:
这个想法是在测试时使用单个神经网络而不会丢失。该网络的权重是经过训练的重量。如果在训练期间以概率p保留了一个单元,则该单元的传出权重在测试时乘以p如图2所示。
Keras文档提到,dropout仅在列车时刻使用,dropout实现的以下行
x = K.in_train_phase(K.dropout(x, level=self.p), x)
似乎表明,实际上,层的输出只是在测试期间传递的。
此外,我找不到像论文所建议的那样,在训练完成后降低重量的代码。我的理解是,这个缩放步骤对于使丢弃工作是至关重要的,因为它相当于获取"子网络"集合中中间层的预期输出。如果没有它,计算就不能再被视为从"子网"集合中采样。
那么,我的问题是,在喀拉拉邦,这种辍学的规模效应在哪里实现?
更新1:好的,所以Keras使用反向丢弃,尽管它在Keras文档和代码中被称为丢弃。链接http://cs231n.github.io/neural-networks-2/#reg似乎并没有表明两者是等价的。答案也不在https://stats.stackexchange.com/questions/205932/dropout-scaling-the-activation-versus-inverting-the-dropout.我可以看到他们做着相似的事情,但我还没有看到有人说他们完全一样。我认为他们不是。
因此,一个新的问题是:辍学和反向辍学是等价的吗?需要明确的是,我正在寻找数学上的理由来证明它们是或不是。
是。它得到了正确的实施。从Dropout发明的时候起,人们也从实现的角度对其进行了改进。Keras正在使用其中一种技术。它被称为反向辍学,您可以在这里阅读它。
更新:
老实说,在严格的数学意义上,这两种方法是不等价的。在反转的情况中,您将每个隐藏的激活乘以dropout参数的倒数。但由于导数是线性的,它相当于将所有梯度乘以相同的因子。为了克服这种差异,你必须设定不同的学习权重。从这个角度来看,这些方法各不相同。但从实际角度来看,这些方法是等效的,因为:
- 如果你使用一种自动设置学习率的方法(如RMSProp或Adagrad),它几乎不会改变算法
- 如果你使用一种自动设置学习率的方法,你必须考虑到辍学的随机性,并且由于一些神经元在训练阶段会被关闭(在测试/评估阶段不会发生),你必须重新调整学习率以克服这种差异。概率论为我们提供了最佳的重新缩放因子,它是丢弃参数的倒数,使损失函数梯度长度的期望值在训练和测试/评估阶段都相同
当然,以上两点都是关于反向脱落技术。
摘自Dropout原始论文(第10节):
在本文中,我们将dropout描述为一种方法,在该方法中,我们在训练时保留概率为p的单元,并在测试时通过将其乘以因子p来缩小权重。实现相同效果的另一种方法是通过在训练时乘以1/p而在测试时不修改权重来放大保留的激活。这些方法等效于在每一层适当缩放学习率和权重初始化。
请注意,虽然keras的丢弃层是使用反向丢弃实现的。速率参数与keep_rate的相反。
keras.layers.Dropout(rate, noise_shape=None, seed=None)
Dropout包括将输入单位的分数率随机设置为训练期间每次更新0,这有助于防止过拟合。
也就是说,rate
设置的是丢失率,而不是反向丢失所期望的保持率
Keras Dropout