赞
踩
问题引入
在机器学习模型中,过拟合问题是一种很常见的问题。具体表现为,在训练集上损失函数很小,而在测试集上损失函数比较大,预测准确率较低。
为了缓解过拟合现象,学者提出了Dropout。
Dropout定义
Dropout的作用就是在前向传播时,让某个神经元以在概率p下停止工作。
这样可以避免模型过于依赖某些局部特征,增强泛化能力。
假设有一个包含 100 个神经元的层,dropout=0.2 表示在每次训练时,将随机选择 20 个神经元,并将它们的输出设置为零。
训练如图所示的一个神经网络,输入是x,输出是y。
正常的流程是:首先把x经过前向传播,然后将误差进行反向传播更新参数再进行前向传播继续学习。
使用Dropout的流程是:
在模型的每个神经元上都要添加一个概率流程,如图所示。
对应公式如下
z i ( l + 1 ) = w i ( l + 1 ) y l + b i ( l + 1 ) z_i^{(l+1)}=w_i^{(l+1)}y^l+b_i^{(l+1)} zi(l+1)=wi(l+1)yl+bi(l+1)
y i ( l + 1 ) = f ( z i ( l + 1 ) ) y_i^{(l+1)}=f(z_i^{(l+1)}) yi(l+1)=f(zi(l+1))
r i ( l ) ∼ B e r n o u l l i ( p ) r_i^{(l)}\sim{Bernoulli(p)} ri(l)∼Bernoulli(p)
y ~ ( l ) = r ( l ) ∗ y ( l ) \tilde{y}^{(l)}=r^{(l)}*y^{(l)} y~(l)=r(l)∗y(l)
z i ( l + 1 ) = w i ( l + 1 ) y ~ l + b i ( l + 1 ) z_i^{(l+1)}=w_i^{(l+1)}\tilde{y}^l+b_i^{(l+1)} zi(l+1)=wi(l+1)y~l+bi(l+1)
y i ( l + 1 ) = f ( z i ( l + 1 ) ) y_i^{(l+1)}=f(z_i^{(l+1)}) yi(l+1)=f(zi(l+1))
Bernoulli函数是为了生成概率r向量,即随机生成一个0、1的向量。
伯努利分布一般指0-1分布,即只进行一次事件试验,该事件发生的概率为p,设随机事件X,X发生记为X=1,不发生记为X=0,则X的分布律为:
X 0 1 px 1-p p 数学期望为:E(X)=p
代码层面实现删除某个神经元,即让它的激活函数值以概率p变为0。比如我们某一层网络神经元的个数为1000个,其激活函数输出值为y1,y2,…,y1000,dropout=0.4,那么这一层神经元经过dropout后,1000个神经元中会有大约400个的值被置为0。
需要注意的是,使用dropout操作,使部分神经元的激活值为0以后,我们还需要对全部向量y1,……,y1000进行缩放,也就是乘以1/(1-p)。如果你在训练的时候,经过置0后,没有对y1,……,y1000进行缩放(rescale),那么在测试的时候,就需要对权重进行缩放,操作如下。
预测模型的时候,每一个神经单元的权重参数要乘以概率1-p。
测试阶段Dropout公式:
w
t
e
s
t
(
l
)
=
(
1
−
p
)
W
(
l
)
w_{test}^{(l)}=(1-p)W^{(l)}
wtest(l)=(1−p)W(l)
Dropout做rescale主要保证了神经元的期望均值与无Dropout时一致。
首先假设一层神经网络中有n个神经元,其中一个神经元的输出是x,输出期望也是x。加上Dropout后,有p的概率这个神经元失活,那么这个神经元的输出期望就变成了(1-p)×x+p×0=(1-p)x,我们需要保证这个神经元在训练和测试阶段的输出期望基本不变。那么就有两种方式来解决:
第一种方式:在训练的时候,让这个神经元的输出rescale1/(1-p)倍,那么它的输出期望就变成(1-p)×x/(1-p)+p×0=x,和不Dropout的输出期望一致;
第二种方式:在测试的时候,让神经元的输出rescale(1-p)倍,那么它的输出期望就变成了(1-p)×x/(1-p)=x,和训练时的期望是一致的。
通俗的例子如下:
5个人拉一个10吨车,第一次(训练时),只有2个人出力(有p=0.6的人被dropout了),那么这2个人每个人出力拉5吨。第二次(预测时),5个人都被要求出力,这次每个人出的力就是5×(1-0.6)=2吨了。或者在第一次(训练时),2个人每个人出力为2×(1/(1-0.6))=5.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。