网络权重初始化方法 常数初始化、Lecun、Xavier与He Kaiming

梯度消失与梯度爆炸

梯度为偏导数构成的向量。

损失函数收敛至极小值时,梯度为0(接近0),损失函数不再下降。我们不希望在抵达极小值前,梯度就为0了,也不希望下降过程过于震荡,甚至不收敛。梯度消失与梯度爆炸分别对应这2种现象,

梯度消失(vanishing gradients):指的是在训练过程中,梯度(偏导)过早接近于0的现象,导致(部分)参数一直不再更新,整体上表现得像损失函数收敛了,实际上网络尚未得到充分的训练。

梯度爆炸(exploding gradients):指的是在训练过程中,梯度(偏导)过大甚至为NAN(not a number)的现象,导致损失剧烈震荡,甚至发散(divergence)。

由上一节的分析可知,在梯度(偏导)计算中,主要的影响因素来自激活函数的偏导、当前层的输入(前一层的输出)、以及权重的数值等,这些因子连续相乘,带来的影响是指数级的。训练阶段,权重在不断调整,每一层的输入输出也在不断变化,梯度消失和梯度爆炸可能发生在训练的一开始、也可能发生在训练的过程中

因子项中当前层的输入仅出现一次,下面着重看一下激活函数和权重的影响。

激活函数的影响

以Sigmoid和Tanh为例,其函数与导数如下(来自链接),

 

网络权重初始化方法 常数初始化、Lecun、Xavier与He KaimingSigmoid和Tanh,及其导数

 

两者的导数均在原点处取得最大值,前者为0.25后者为1,在远离原点的正负方向上,两者导数均趋近于0,即存在饱和区。

  • 原点附近:从因子项连乘结果看,Tanh比Sigmoid稍好,其在原点附近的导数在1附近,如果激活函数的输入均在0左右,偏导连续相乘不会很小也不会很大。而sigmoid就会比较糟糕,其导数最大值为0.25,连续相乘会使梯度指数级减小,在反向传播时,对层数越多的网络,浅层的梯度消失现象越明显。
  • 饱和区:一旦陷入饱和区,两者的偏导都接近于0,导致权重的更新量很小,比如某些权重很大,导致相关的神经元一直陷在饱和区,更新量又接近于0,以致很难跳出或者要花费很长时间才能跳出饱和区。

所以,一个改善方向是选择更好的非线性激活函数,比如ReLU,相关激活函数如下图所示,

 

网络权重初始化方法 常数初始化、Lecun、Xavier与He Kaimingactivation functions

 

ReLU只在负方向上存在饱和区,正方向上的导数均为1,因此相对更少地遭遇梯度消失,但梯度爆炸现象仍然存在。

权重矩阵的影响

假设激活函数为线性,就像ReLU的正向部分,导数全为1。则一个简化版本的全连接神经网络如下图所示,

 

网络权重初始化方法 常数初始化、Lecun、Xavier与He Kaiminga simple 9-layer neural network

 

假设权重矩阵均为WW,前向传播和反向传播过程均涉及WW(转置)的反复相乘,tt步相当于WtWt,若WW有特征值分解W=V diag(λ) V−1W=V diag(λ) V−1,简单地,

Wt=(V diag(λ) V−1)t=V diag(λ)t V−1Wt=(V diag(λ) V−1)t=V diag(λ)t V−1

其中diag(λ)diag(λ)为特征值对角矩阵,如果特征值λiλi不在1附近,大于1经过tt次幂后会“爆炸”,小于1经过tt次幂后会“消失”。

如果网络初始化时,权重矩阵过小或过大,则在网络训练的初始阶段就可能遭遇梯度消失或梯度爆炸,表现为损失函数不下降或者过于震荡。

不良初始化

至此,一些权重不良初始化导致的问题就不难解释了,

  • 过小,导致梯度消失
  • 过大,导致梯度爆炸
  • 全常数初始化,即所有权重WW都相同,则z(2)=W1xz(2)=W1x相同,导致后面每一层的输入和输出均相同,即aa和zz相同,回到反向传播的公式,每层的偏导相同,进一步导致每层的权重会向相同的方向同步更新,如果学习率只有一个,则每层更新后的权重仍然相同,每层的效果等价于一个神经元,这无疑极大限制了网络的能力。

     

    网络权重初始化方法 常数初始化、Lecun、Xavier与He Kaiming反向传播中的偏导计算

     

  • 特别地,全0初始化,根据上式,如果激活函数g(0)=0g(0)=0,如ReLU,则初始状态所有激活函数的输入zz和输出aa都为0,反向传播时所有的梯度为0,权重不会更新,一直保持为0;如果激活函数g(0)≠0g(0)≠0,则初始状态激活层的输入为0,但输出a≠0a≠0,则权重会从最后一层开始逐层向前更新,改变全0的状态,但是每层权重的更新方向仍相同,同上。

 

全0、常数、过大、过小的权重初始化都是不好的,那我们需要什么样的初始化?

  • 因为对权重ww的大小和正负缺乏先验,所以应初始化在0附近,但不能为全0或常数,所以要有一定的随机性,即数学期望E(w)=0E(w)=0
  • 因为梯度消失和梯度爆炸,权重不易过大或过小,所以要对权重的方差Var(w)Var(w)有所控制
  • 深度神经网络的多层结构中,每个激活层的输出对后面的层而言都是输入,所以我们希望不同激活层输出的方差相同,即Var(a[l])=Var(a[l−1])Var(a[l])=Var(a[l−1]),这也就意味不同激活层输入的方差相同,即Var(z[l])=Var(z[l−1])Var(z[l])=Var(z[l−1]);
  • 如果忽略激活函数,前向传播和反向传播可以看成是权重矩阵(转置)的连续相乘。数值太大,前向时可能陷入饱和区,反向时可能梯度爆炸,数值太小,反向时可能梯度消失。所以初始化时,权重的数值范围(方差)应考虑到前向和后向两个过程

权重的随机初始化过程可以看成是从某个概率分布随机采样的过程,常用的分布有高斯分布、均匀分布等,对权重期望和方差的控制可转化为概率分布的参数控制,权重初始化问题也就变成了概率分布的参数设置问题

在上回中,我们知道反向传播过程同时受到权重矩阵和激活函数的影响,那么,在激活函数不同以及每层超参数配置不同(输入输出数量)的情况下,权重初始化该做怎样的适配?这里,将各家的研究成果汇总如下,

 

网络权重初始化方法 常数初始化、Lecun、Xavier与He Kaimingweight initialization

 

其中,扇入fan–infan_in和扇出fan–outfan_out分别为当前全连接层的输入和输出数量,更准确地说,1个输出神经元与fan–infan_in个输入神经元有连接(the number of connections feeding into the node),1个输入神经元与fan–outfan_out个输出神经元有连接(the number of connections flowing out of the node),如下图所示(来自链接),

 

网络权重初始化方法 常数初始化、Lecun、Xavier与He KaimingMW33zn.png

 

对于卷积层而言,其权重为nn个c×h×wc×h×w大小的卷积核,则一个输出神经元与c×h×wc×h×w个输入神经元有连接,即fan–in=c×h×wfan_in=c×h×w,一个输入神经元与n×h×wn×h×w个输出神经元有连接,即fan–out=n×h×wfan_out=n×h×w。

期望与方差的相关性质

接下来,首先回顾一下期望与方差计算的相关性质。

对于随机变量XX,其方差可通过下式计算,

Var(X)=E(X2)−(E(X))2Var(X)=E(X2)−(E(X))2

若两个随机变量XX和YY,它们相互独立,则其协方差为0,

Cov(X,Y)=0Cov(X,Y)=0

进一步可得E(XY)=E(X)E(Y)E(XY)=E(X)E(Y),推导如下,

Cov(X,Y)=E((X−E(X))(Y−E(Y)))=E(XY)−E(X)E(Y)=0Cov(X,Y)=E((X−E(X))(Y−E(Y)))=E(XY)−E(X)E(Y)=0

两个独立随机变量和的方差,

Var(X+Y)=E((X+Y)2)−(E(X+Y))2=E(X2+Y2+2XY)−(E(X)+E(Y))2=(E(X2)+E(Y2)+2E(XY))−((E(X))2+(E(Y))2+2E(X)E(Y))=(E(X2)+E(Y2)+2E(X)E(Y))−((E(X))2+(E(Y))2+2E(X)E(Y))=E(X2)−(E(X))2+E(Y2)−(E(Y))2=Var(X)+Var(Y)Var⁡(X+Y)=E((X+Y)2)−(E(X+Y))2=E(X2+Y2+2XY)−(E(X)+E(Y))2=(E(X2)+E(Y2)+2E(XY))−((E(X))2+(E(Y))2+2E(X)E(Y))=(E(X2)+E(Y2)+2E(X)E(Y))−((E(X))2+(E(Y))2+2E(X)E(Y))=E(X2)−(E(X))2+E(Y2)−(E(Y))2=Var⁡(X)+Var⁡(Y)

两个独立随机变量积的方差,

Var(XY)=E((XY)2)−(E(XY))2=E(X2)E(Y2)−(E(X)E(Y))2=(Var(X)+(E(X))2)(Var(Y)+(E(Y))2)−(E(X))2(E(Y))2=Var(X)Var(Y)+(E(X))2Var(Y)+Var(X)(E(Y))2Var⁡(XY)=E((XY)2)−(E(XY))2=E(X2)E(Y2)−(E(X)E(Y))2=(Var⁡(X)+(E(X))2)(Var⁡(Y)+(E(Y))2)−(E(X))2(E(Y))2=Var⁡(X)Var⁡(Y)+(E(X))2Var⁡(Y)+Var⁡(X)(E(Y))2

全连接层方差分析

对线性组合层+非线性激活层,计算如下所示,其中z[l−1]izi[l−1]为l−1l−1层第ii个激活函数的输入,a[l−1]iai[l−1]为其输出,w[l]ijwij[l]为第ll层第ii个输出神经元与第jj个输入神经元连接的权重,b[l]b[l]为偏置,计算方式如下

a[l−1]iz[l]ia[l]i=f(z[l−1]i)=∑j=1fan–inw[l]ij a[l−1]j+b[l]=f(z[l]i)ai[l−1]=f(zi[l−1])zi[l]=∑j=1fan_inwij[l] aj[l−1]+b[l]ai[l]=f(zi[l])

在初始化阶段,将每个权重以及每个输入视为随机变量,可做如下假设和推断,

  • 网络输入的每个元素x1,x2,…x1,x2,…为独立同分布
  • 每层的权重随机初始化,同层的权重wi1,wi2,…wi1,wi2,…独立同分布,且期望E(w)=0E(w)=0;
  • 每层的权重ww和输入aa随机初始化且相互独立,所以两者之积构成的随机变量wi1a1,wi2a2,…wi1a1,wi2a2,…亦相互独立,且同分布;
  • 根据上面的计算公式,同层的z1,z2,…z1,z2,…为独立同分布,同层的a1,a2,…a1,a2,…也为独立同分布

需要注意的是,上面独立同分布的假设仅在初始化阶段成立,当网络开始训练,根据反向传播公式,权重更新后不再相互独立。

在初始化阶段,输入aa与输出zz方差间的关系如下,令b=0b=0,

Var(z)=Var(∑j=1fan–inwij aj)=fan–in×(Var(wa))=fan–in×(Var(w) Var(a)+E(w)2Var(a)+Var(w)E(a)2)=fan–in×(Var(w) Var(a)+Var(w)E(a)2)Var(z)=Var(∑j=1fan_inwij aj)=fan_in×(Var(wa))=fan_in×(Var(w) Var(a)+E(w)2Var(a)+Var(w)E(a)2)=fan_in×(Var(w) Var(a)+Var(w)E(a)2)

tanh下的初始化方法

网络权重初始化方法 常数初始化、Lecun、Xavier与He Kaiming

 

 

 

为了避免梯度消失和梯度爆炸,最好保持这个系数为1。

需要注意的是,上面的结论是在激活函数为恒等映射的条件下得出的,而tanh激活函数在0附近可近似为恒等映射,即tanh(x)≈xtanh(x)≈x。

Lecun 1998

Lecun 1998年的paper Efficient BackProp ,在输入Standardization以及采用tanh激活函数的情况下,令n[l−1]Var(w[l])=1n[l−1]Var(w[l])=1,即在初始化阶段让前向传播过程每层方差保持不变,权重从如下高斯分布采样,其中第ll层的fan–in=n[l−1]fan_in=n[l−1],

W∼N(0,1fan–in)W∼N(0,1fan_in)

Xavier 2010

在paper Xavier-2010-Understanding the difficulty of training deep feedforward neural networks中,Xavier和Bengio同时考虑了前向过程和反向过程,使用fan–infan_in和fan–outfan_out的平均数对方差进行归一化,权重从如下高斯分布中采样,

W∼N(0,2fan–in+fan–out)W∼N(0,2fan_in+fan_out)

同时文章中还提及了从均匀分布中初始化的方法,因为均匀分布的方差与分布范围的关系为

Var(U(−n,n))=n23Var(U(−n,n))=n23

若令Var(U(−n,n))=2fan–in+fan–outVar(U(−n,n))=2fan_in+fan_out,则有

n=6–√fan–in+fan–out−−−−−−−−−−−−−−−√n=6fan_in+fan_out

即权重也可从如下均匀分布中采样,

W∼U(−6–√fan–in+fan–out−−−−−−−−−−−−−−−√,6–√fan–in+fan–out−−−−−−−−−−−−−−−√)W∼U(−6fan_in+fan_out,6fan_in+fan_out)

在使用不同激活函数的情况下,是否使用Xavier初始化方法对test error的影响如下所示,图例中带NN的表示使用Xavier初始化方法,Softsign一种为类tanh但是改善了饱和区的激活函数,图中可以明显看到tanh 和tanh N在test error上的差异。

 

网络权重初始化方法 常数初始化、Lecun、Xavier与He Kaimingtest error

 

论文还有更多训练过程中的权重和梯度对比图示,这里不再贴出,具体可以参见论文。

ReLU/PReLU下的初始化方法

搬运一下上面的公式,

Var(z)=fan–in×(Var(w) Var(a)+Var(w)E(a)2)Var(z)=fan_in×(Var(w) Var(a)+Var(w)E(a)2)

因为激活函数tanh在0附近可近似为恒等映射,所以在初始化阶段可以认为E(a)=0E(a)=0,但是对于ReLU激活函数,其输出均大于等于0,不存在负数,所以E(a)=0E(a)=0的假设不再成立。

 

网络权重初始化方法 常数初始化、Lecun、Xavier与He Kaimingactivation functions

 

但是,我们可以进一步推导得到,

Var(z)=fan–in×(Var(w) Var(a)+Var(w)E(a)2)=fan–in×(Var(w)(E(a2)−E(a)2)+Var(w)E(a)2)=fan–in×Var(w)×E(a2)Var(z)=fan_in×(Var(w) Var(a)+Var(w)E(a)2)=fan_in×(Var(w)(E(a2)−E(a)2)+Var(w)E(a)2)=fan_in×Var(w)×E(a2)

He 2015 for ReLU

对于某个具体的层ll则有,

Var(z[l])=fan–in×Var(w[l])×E((a[l−1])2)Var(z[l])=fan_in×Var(w[l])×E((a[l−1])2)

如果假定w[l−1]w[l−1]来自某个关于原点对称的分布,因为E(w[l−1])=0E(w[l−1])=0,且b[l−1]=0b[l−1]=0,则可以认为z[l−1]z[l−1]分布的期望为0,且关于原点0对称。

对于一个关于原点0对称的分布,经过ReLU后,仅保留大于0的部分,则有

Var(x)=∫+∞−∞(x−0)2p(x)dx=2∫+∞0x2p(x)dx=2E(max(0,x)2)Var(x)=∫−∞+∞(x−0)2p(x)dx=2∫0+∞x2p(x)dx=2E(max(0,x)2)

所以,上式可进一步得出,

Var(z[l])=fan–in×Var(w[l])×E((a[l−1])2)=12×fan–in×Var(w[l])×Var(z[l−1])Var(z[l])=fan_in×Var(w[l])×E((a[l−1])2)=12×fan_in×Var(w[l])×Var(z[l−1])

类似地,需要放缩系数为1,即

12×fan–in×Var(w[l])=1Var(w)=2fan–in12×fan_in×Var(w[l])=1Var(w)=2fan_in

即从前向传播考虑,每层的权重初始化为

W∼N(0,2fan–in)W∼N(0,2fan_in)

同理,从后向传播考虑,每层的权重初始化为

W∼N(0,2fan–out)W∼N(0,2fan_out)

文中提到,单独使用上面两个中的哪一个都可以,因为当网络结构确定之后,两者对方差的放缩系数之比为常数,即每层扇入扇出之比的连乘,解释如下,

 

网络权重初始化方法 常数初始化、Lecun、Xavier与He KaimingHe initialization

 

使用Xavier和He初始化,在激活函数为ReLU的情况下,test error下降对比如下,22层的网络,He的初始化下降更快,30层的网络,Xavier不下降,但是He正常下降。

 

网络权重初始化方法 常数初始化、Lecun、Xavier与He KaimingXavier vs He

 

He 2015 for PReLU

对于PReLU激活函数,负向部分为f(x)=axf(x)=ax,如下右所示,

 

网络权重初始化方法 常数初始化、Lecun、Xavier与He KaimingReLU and PReLU

 

对于PReLU,求取E((a[l−1])2)E((a[l−1])2)可对正向和负向部分分别积分,不难得出,

12(1+a2)×fan–in×Var(w[l])=1Var(w)=2(1+a2)fan–inW∼N(0,2(1+a2)fan–in)W∼N(0,2(1+a2)fan–out)12(1+a2)×fan_in×Var(w[l])=1Var(w)=2(1+a2)fan_inW∼N(0,2(1+a2)fan_in)W∼N(0,2(1+a2)fan_out)

 

小结

至此,对深度神经网络权重初始化方法的介绍已告一段落。虽然因为BN层的提出,权重初始化可能已不再那么紧要。但是,对经典权重初始化方法经过一番剖析后,相信对神经网络运行机制的理解也会更加深刻。

以上。

参考

 

来源: https://blog.shinelee.me/2019/11-11-%E7%BD%91%E7%BB%9C%E6%9D%83%E9%87%8D%E5%88%9D%E5%A7%8B%E5%8C%96%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93%EF%BC%88%E4%B8%8B%EF%BC%89%EF%BC%9ALecun%E3%80%81Xavier%E4%B8%8EHe%20Kaiming.html             来源: https://blog.shinelee.me/2019/11-04-%E7%BD%91%E7%BB%9C%E6%9D%83%E9%87%8D%E5%88%9D%E5%A7%8B%E5%8C%96%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93%EF%BC%88%E4%B8%8A%EF%BC%89%EF%BC%9A%E6%A2%AF%E5%BA%A6%E6%B6%88%E5%A4%B1%E3%80%81%E6%A2%AF%E5%BA%A6%E7%88%86%E7%82%B8%E4%B8%8E%E4%B8%8D%E5%A5%BD%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96.html

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

       



来自为知笔记(Wiz)



上一篇:探索式软件测试


下一篇:为什么说Python是最伟大的语言?看图就知道了