Dropout已经被证明可以有效缓解过拟合,在一定程度上达到正则化的效果。这篇博客简单记录一下在 实现的时候进行rescale的操作。

首先,为什么需要rescale

在train过程中,通过添加Dropout,每次迭代都随机屏蔽了一些神经元;如果在infer过程中也做,那么 模型的输出就带有一定的不确定性。同一个样本每次预测结果可能会不一样,这不是我们希望看到的。那么就 需要在infer的时候不做dropout,这时需要保证训练和预测过程中的分布一致,所以要对infer进行rescale。

Dropout的实现方式

根据上面的分析,在infer期间进行rescale就是朴素dropout,即Vanilla Dropout,这时论文原始版。
在Andrew Ng cs231课程中介绍了Inverted Dropout
这两个版本在**训练(forward)、梯度(backward)和预测(predict)*三个阶段都有所区别。

输入序列为 $X = [x_0, x_1, x_2, x_3]$,正常反向梯度序列为$D = [d_0, d_1, d_2, d_3]$, 假设以dropout概率为p=0.2进行伯努利采样得到mask序列$M = [1, 0, 1, 1]$。

Vanilla Dropout

在forward时直接对输入进行mask操作,得到$ X_{}^{‘} = [x_0, 0, x_2, x_3]$,在backward时梯度和输 入保持一致$ D_{}^{‘} = [d_0, 0, d_2, d_3]$,在infer时进行1-p倍缩小 $I = 0.8X$。
因为训练时随机丢掉了一些节点,总期望变小,那么预测时就全体缩小一点保持一致。

这样做的问题是预测过程需要跟着Dropout策略做调整,哪些层取消了、加重了或者减轻了,都需要改。

Inverted Dropout

把所有的修改都放在训练阶段,保持预测阶段不变。在forward时先maskrescale $\frac{1}{1-p}$, 即$ X_{}^{‘} = 1.25 * [x_0, 0, x_2, x_3]$,在backward时梯度和输入保持一致$ D_{}^{‘} = 1.25 * [d_0, 0, d_2, d_3]$,在infer的时候不做额外处理$I = X$。
训练时虽然随机丢掉了一些神经元,但是做了rescale之后,总期望被拉回了原来的水平,预测时就不用再多修改。

$p$, $\frac{1}{1-p}$

drop概率为p,那么整体缩小了1-p倍,所以放大就是$\frac{1}{1-p}$。

关于分布或者说期望一致性的有趣解释

原答案来自知乎ID船长。
10个人拉一个10吨的车,第一次(训练时),只有5个人出力(有p=0.5的人被dropout了),那么这5个人 每个人出力拉2吨。第二次(预测时),10个人都被要求出力,这次每个人出的力就是2*(1-0.5) = 1吨了。