转载: dropout为啥要rescale?
概述
dropout可以让模型训练时,随机让网络的某些节点不工作(输出置零),也不更新权重(但会保存下来,下次训练得要用,只是本次训练不参与bp传播),其他过程不变。
我们通常设定一个dropout radio=p,即每个输出节点以概率p置0(不工作,权重不更新),假设每个输出都是独立的,每个输出都服从二项伯努利分布p(1-p), 那么大约认为训练时,只使用了q= (1-p)比例的输出,相当于每次训练一个子网络。
测试的时候,可以直接去掉Dropout层,将所有输出都使用起来,为此需要将尺度调整,即比例扩大1/(1-p)。
训练的时候需要dropout,测试去掉。
dropout层相当于组合了N个网络,测试的时候去掉dropout,相当于N个网络的组合,类似某种集成学习;
分析
Hinton认为过拟合,可以通过阻止某些特征的协同作用来缓解。在每次训练的时候,每个神经元有0.5的几率被移除,这样可以让一个神经元的出现不应该依赖于另外一个神经元。
另外,我们可以把dropout理解为 模型平均,集成学习。
假设我们要实现一个图片分类任务,我们设计出了100000个网络,这100000个网络,我们可以设计得各不相同,然后我们对这100000个网络进行训练,训练完后我们采用平均的方法,进行预测,这样肯定可以提高网络的泛化能力,或者说可以防止过拟合,因为这100000个网络,它们各不相同,可以提高网络的稳定性。
。而所谓的dropout我们可以这么理解,这n个网络,它们权值共享,并且具有相同的网络层数(这样可以大大减小计算量)。我们每次dropout后,网络模型都可以看成是整个网络的子网络。(需要注意的是如果采用dropout,训练时间大大延长,但是对测试阶段没影响)。
算法实现概述:
1、让某个神经元以概率p,停止工作,其实就是让它的**值以概率p变为0。比如我们某一层网络神经元的个数为1000个,其**值为x1,x2……x1000,我们dropout比率选择0.4,那么这一层神经元经过drop后,x1……x1000神经元其中会有大约400个的值被置为0。
2、Rescale的重要性:
-
1
在训练时,每个神经单元都可能以概率q保持;
在测试阶段,而每个神经单元都是存在的,权重参数w要乘以q,成为:qw。 -
2
当模型使用了dropout layer,训练的时候只有占比为 q 的隐藏层单元参与训练,那么在预测的时候,如果所有的隐藏层单元都需要参与进来,则得到的结果相比训练时平均要大== 1/q== ,为了避免这种情况,就需要测试的时候将输出结果乘以 1/q 使下一层的输入规模保持不变。
利用inverted dropout,我们可以在训练的时候直接将dropout后留下的权重扩大 1/q 倍,这样就可以使结果的scale保持不变,而在预测的时候也不用做额外的操作了,更方便一些。