1、作用
dropout的作用就是解决神经网络的过拟合问题,我们知道神经网络其实就是一个强大的拟合函数,以线性函数为例,对于函数,我们已知一部分
及其对应的
,即我们所说的数据及其标签,我们的目的是利用这些已知的
以及
来求解
以及
。但是,求解出的k、b的值与f(x)、x的值的关系非常大。比如我们想求解的线性函数如图1所示,其中黑点即为理想的x值,但是当给定的x值的数量较少时,求解出的f(x)就会如图2所示。此时,利用图2中的黑点求出的f(x)对图2的黑点进行测试的话,其准确率就会非常高,而当使用图1中剩下的黑点即数据x来测试时,利用图2中曲线求解出的数值与真实数值的差距就会非常大,如图3,这就是过拟合。模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。
图1
图2
图3
为了解决过拟合问题,我们可以这样考虑,即利用给定的数据训练多个网络,通过输入相同的数据,将多个网络的输出进行平均后的值作为我们最终的结果,但是这样的话就会费时费力。dropout的作用就是在训练过程中让该神经网络众多神经元失活一部分,由于我们训练该神经网络时要经过多个回合,可以理解为每个回合,该神经网络失活的神经元是不同的,从而可以理解为每个回合训练的该神经网络的神经元是不同的即相当于利用训练该神经网络的时间训练了多个不同的神经网络。
2、原理
首先假设一层神经网络中有n个神经元,其输出为一个神经元,如图4所示。加上dropout后,有n*p个神经元失活,未加dropout前,其理想输出为z的话,那么经过dropout后这层神经元的输出期望就变成了(1-p)*z=(1-p)z,由前文可知,dropout相当于求多个神经网络的平均值,那么一个网络的输出值就为(1-p)z。我们需要保证这个网络在训练和测试阶段的输出基本不变即求网络的平均值。那么就有两种方式来解决:
第一种在训练的时候,让这个网络的输出缩放1/(1-p)倍,那么它的输出期望就变成(1-p)z/(1-p)=z,和不dropout的输出期望一致;
第二种方式是在测试的时候,让神经元的输出缩放(1-p)倍,那么它的输出期望就变成了(1-p)z,和训练时的期望是一致的。
这样就在做到了训练与测试的一致性。
图4
3、推导
前向传播
假设dropout前的输入为x,经过dropout层时,我们采用上文所述第一种解决方式,对于没有失活的神经元,进行如下操作:
其他前向传播操作与不加dropout时相同。
反向传播
对于损失函数L,其反向传播公式为:
其中,对于失活的神经元,对于未失活的神经元
注意:如果使用第二种解决方式,则对于未失活的神经元不需要乘上这个系数,在测试的时候对输出乘上
系数。