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时先mask
再rescale
$\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吨了。