The Keras
Dropout参考的实施这张纸.
以下摘录自该论文:
这个想法是在测试时使用单个神经网络而不丢失。
该网络的权重是经过训练的按比例缩小的版本
重量。如果在训练期间以概率 p 保留一个单元,则
该单元的输出重量在测试时乘以 p 为
如图2所示。
Keras 文档提到 dropout 仅在训练时使用,以及 Dropout 实现中的以下行
x = K.in_train_phase(K.dropout(x, level=self.p), x)
似乎表明实际上层的输出在测试期间只是简单地传递。
此外,我找不到按照论文建议在训练完成后缩小权重的代码。我的理解是,这个缩放步骤对于使 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 等价吗?需要明确的是,我正在寻找数学理由来证明它们是或不是。
是的。它得到了正确的实施。从 Dropout 被发明的时候起,人们就从实现的角度对其进行了改进。 Keras 正在使用其中一种技术。它被称为反向辍学你可能会读到相关内容here.
UPDATE:
老实说 - 从严格的数学意义上来说,这两种方法并不等同。在倒置大小写您将每个隐藏激活乘以 dropout 参数的倒数。但由于导数是线性的,它相当于将所有梯度乘以相同的因子。为了克服这种差异,你必须设置不同的学习权重。从这个角度来看,这种方法有所不同。但从实际角度来看,这种方法是等效的,因为:
- 如果您使用自动设置学习率的方法(如 RMSProp 或 Adagrad),那么算法几乎不会发生任何变化。
- 如果您使用自动设置学习率的方法 - 您必须考虑 dropout 的随机性,并且由于某些神经元在训练阶段将被关闭(在测试/评估阶段不会发生什么) - 你必须重新调整你的学习率才能克服这种差异。概率论为我们提供了最佳的重新调用因子 - 它是 dropout 参数的倒数,它使得损失函数梯度长度的期望值在训练和测试/评估阶段相同。
当然——以上两点都是关于反向辍学技术。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)