《Understanding the difficulty of training deep feedforward neural networks》笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/KangRoger/article/details/61414426

《Understanding the difficulty of training deep feedforward neural networks》

概要

神经网络难以训练,作者想要读者更好理解:为什么梯度下降法不适用随机初始化权重的神经网络,且怎么设计更好的初始化方法。

作者发现随机化初始化权重时,不适合使用sigmod作为激活函数,因为它均值不为零,前面的hidden layer容易饱和;令人惊讶的时饱和的神经元可以自动变为不饱和,尽管过程很慢。

作者通过观察不同层的激活函数和梯度,提出了新的权重初始化方法,可以更快的是网络收敛。

Sigmod实验

bias初始化为零,权重初始化

WijU[1n,1n]

n 表示前一层的size(即前一层权重W的列数)

下图是5层网络中,4个隐藏层的激活值随epoc的变化:

2_01.jpg

通过图片可以看到,最后的隐藏层很快饱和,但是在epoch 100左右,又开始变为不饱和。其它几层的均值大概为0.5,随着训练进行开始变小。

上面这种情况很可能是因为随机初始化权重引起的。输出层为 softmax(b+Wh) ,这样的话,输出的结果更加依赖 b (因为h饱和,接近为0),bias学习速度将会比 h 快。梯度误差将会使 Wh 向零靠近,造成前面的层学习不到有用的特征。这样训练的网络质量差,泛化性能差。

作者还对比了使用不同激活函数的情况。

代价函数的影响

在逻辑回归或似然估计时,使用softmax输出,cost function为对数函数 logP(y|x) 比二次代价函数要好。一个2层网络,代价函数随两层网络权重变化如图:

2_02.jpg

交叉熵代价函数是黑色,二次型代价函数是红色; 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)

可以得到

Costsik=f(sik)Wi+1k,Costsi+1Costwil,k=zilCostsik

假设第 i 层的大小为 ni ,网络输入为 x

f(sik)1Var[zi]=Var[x]i=0i1niVar[Wi]

其中 Var[Wi] 表示第 i 层的共享权重的方差,对于 d 层的网络

Var[Costsi]=Var[Costsd]i=idni+1Var[Wi]Var[Costwi]=i=0i1niVar[Wi]i=id1ni+1Var[Wi]×Var[x]Var[Costsd]

对于前向传播

(i,i),Var[zi]=Var[zi]

对于反向传播:

(i,i),Var[Costsi]=Var[Costsi]

因此得到:

i,niVar[Wi]=1i,ni+1Var[Wi]=1

一个层的输入输出一般不相同,作为折中

i,Var[Wi]=2ni+ni+1

对于

WU[1n,1n]Var(W)=13n

因此得到初始化权重:

WU[6nj+nj+1,6nj+nj+1]

猜你喜欢

转载自blog.csdn.net/KangRoger/article/details/61414426