在Dropout的论文中,在evaluation过程中,由于不执行dropout,为了防止scale变大,要把权重乘以p(权重不被drop的概率),这样就可以把输出值当成所有带dropout的输出的平均值,相当于做了ensemble。

Training:

Evaluation:

问题

简化一下模型,只考虑单层,有N个输入,1个输出,(不考虑偏置),假如之间是的,那么y的方差应该等于各项方差的和。

Training:

Evalutation:

那么问题就来了,训练过程和测试过程中Dropout层输出的scale是不一致的,这肯定会导致问题!正确的做法难道不应该是在测试过程中让权重乘以而不是嘛! 为什么这个问题一直没有被大家发现呢!

解决

仔细思考一下,其实的假设一开始就是不成立的。在模型得到充分训练的前提下,不同的mask采样应该会对应相似的输出(这也是dropout的初衷,避免对个别输入过于敏感),那么此时是高度相关的,对应的标准差应该接近(训练期),那么测试期用作为标准化系数去乘以权重就可以得到一致的结果。

反过来想,如果不同mask采样对应的输出值相差很远呢?那么就意味着这个输出的不确定性是非常大的,那么在测试期乘以确实会缩小scale,这种scale的缩小可以有效减小不确定性带来的误差,也是合理的。

(数学公式上有点偷懒了)