keras中的卷积层dropout层

数据挖掘 机器学习 神经网络 喀拉斯 西阿诺 辍学
2021-10-02 00:21:29

根据经典论文

http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf

dropout 操作不仅影响训练步骤,还影响测试步骤——我们需要将所有神经元输出权重乘以概率 p。

但是在 keras 库中,我发现了 dropout 操作的以下实现:

retain_prob = 1. - level

...

random_tensor = rng.binomial(x.shape, p=retain_prob, dtype=x.dtype)

...

x *= random_tensor
x /= retain_prob
return x

(见https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py

为什么 x 除以 retain_prob 而应该相乘?或者我只是很困惑,乘以权重等于除以输出值?

2个回答

让我们澄清一些关于辍学的事情。尼尔·斯莱特 (Neil Slater ) 应归功于这个答案,因为他的评论有助于形成更清晰的解释

首先,dropout 是一种正则化方法,它通常只在训练期间应用(尽管它可以在预测中用作贝叶斯神经网络的近似值,正如Yarin Gal 的论文所解释的那样)。正如您可能已经理解的那样,它的目标是限制过度拟合。也就是说,训练一个能够更好地泛化到新出现的数据样本的模型。因此,它与测试无关,而与培训有关。

二、你可能看到输出乘以的原因p在预测时间是一个技巧,它与被称为 vanilla dropout 的非常基本的 dropout 实现一起使用。在预测时间(或测试时间,如果您更喜欢这个措辞)不需要再下降,但需要将输出缩放p. 原因是因为在训练时,dropout 是有概率的p,则需要缩放输出以调整 p 在预测时。

第三,倒置 dropout(这是所有严肃的 DL 库中使用的 dropout 实现)不需要在预测时缩放输出,因为缩放 p 实际上已经在训练时执行(除以 p)。因此,在预测时不需要任何技巧!

最后,这些来自Udacity 深度学习课程斯坦福大学的课程的视频很好地解释了这个概念。

我希望这足够清楚。:)

您正在查看 Keras 代码为训练步骤实现 dropout。

在 Keras 实现中,输出值在训练期间被校正(通过除法,除了随机丢弃值)而不是在测试期间(通过乘法)。这称为“反向辍学”。

Inverted dropout 在功能上等同于原始 dropout(根据您对 Srivastava 论文的链接),具有一个很好的功能,即网络在测试和预测期间根本不使用 dropout 层。这在这个Keras issue中有一点解释