版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/KangRoger/article/details/61414426
《Understanding the difficulty of training deep feedforward neural networks》
概要
神经网络难以训练,作者想要读者更好理解:为什么梯度下降法不适用随机初始化权重的神经网络,且怎么设计更好的初始化方法。
作者发现随机化初始化权重时,不适合使用sigmod作为激活函数,因为它均值不为零,前面的hidden layer容易饱和;令人惊讶的时饱和的神经元可以自动变为不饱和,尽管过程很慢。
作者通过观察不同层的激活函数和梯度,提出了新的权重初始化方法,可以更快的是网络收敛。
Sigmod实验
bias初始化为零,权重初始化
Wij∼U[−1n√,1n√]
n
表示前一层的size(即前一层权重W的列数)
下图是5层网络中,4个隐藏层的激活值随epoc的变化:
通过图片可以看到,最后的隐藏层很快饱和,但是在epoch 100左右,又开始变为不饱和。其它几层的均值大概为0.5,随着训练进行开始变小。
上面这种情况很可能是因为随机初始化权重引起的。输出层为
softmax(b+Wh)
,这样的话,输出的结果更加依赖
b
(因为h饱和,接近为0),bias学习速度将会比
h
快。梯度误差将会使
Wh
向零靠近,造成前面的层学习不到有用的特征。这样训练的网络质量差,泛化性能差。
作者还对比了使用不同激活函数的情况。
代价函数的影响
在逻辑回归或似然估计时,使用softmax输出,cost function为对数函数
−logP(y|x)
比二次代价函数要好。一个2层网络,代价函数随两层网络权重变化如图:
交叉熵代价函数是黑色,二次型代价函数是红色;
W1
和
W2
分别表示两层的权重。可以看出二次型代价函数有明显的“平”的区域。
权重初始化
为了便于研究,假设使用线性激活函数
f(x)
,且在零点导数
f′(x)=1
。
对于一层网络
f(x)=∑inwixi+b
输出的方差
Var(f(x))=∑inVar(wixi)
其中
Var(wixi)=E[wi]2Var(xi)+E[xi]2Var(wi)+Var(wi)Var(xi)因为:E[xi]=E[wi]=0Var(wixi)=Var(wi)Var(xi)
由于
w
和
x
独立同分布
Var(f(x))=nVar(wi)Var(xi)
假设
zi
是第
i
层的输入向量,
si
是第
i
层激活函数的输入
si=ziWi+bizi+1=f(si)
可以得到
∂Cost∂sik=f′(sik)Wi+1k,⋅∂Cost∂si+1∂Cost∂wil,k=zil∂Cost∂sik
假设第
i
层的大小为
ni
,网络输入为
x
f′(sik)≈1Var[zi]=Var[x]∏i′=0i−1ni′Var[Wi′]
其中
Var[Wi′]
表示第
i′
层的共享权重的方差,对于
d
层的网络
Var[∂Cost∂si]=Var[∂Cost∂sd]∏i′=idni′+1Var[Wi′]Var[∂Cost∂wi]=∏i′=0i−1ni′Var[Wi′]∏i′=id−1ni′+1Var[Wi′]×Var[x]Var[∂Cost∂sd]
对于前向传播
∀(i,i′),Var[zi]=Var[zi′]
对于反向传播:
∀(i,i′),Var[∂Cost∂si]=Var[∂Cost∂si′]
因此得到:
∀i,niVar[Wi]=1∀i,ni+1Var[Wi]=1
一个层的输入输出一般不相同,作为折中
∀i,Var[Wi]=2ni+ni+1
对于
W∼U[−1n√,1n√]Var(W)=13n
因此得到初始化权重:
W∼U[−6√nj+nj+1−−−−−−−√,6√nj+nj+1−−−−−−−√]