深度学习的初始化很重要,若初始化值过低,会导致梯度消失,神经网络过早收敛,提前到达极小值。若初始化值过高,会导致梯度爆炸,网络会在极小值位置震荡。
现阶段主流的初始化有四种,一种为常规初始化方法,一种为Xavier初始化方法,适用于sigmoid,一种为kaiming初始化,适用于relu激活函数,另外有迁移学习初始化方法,还有pretrain初始化方法,orthogonal初始化方法

初始化的权重对网络训练的影响

1.W初始化的情况对结果影响较大,权重初始化过大会导致梯度爆炸,就其原因是因为将原始的程序

已知梯度前向传播:

(1) a∣l−1∣=g∣l−1∣(z∣l−1∣)a^{|l-1|} = g^{|l-1|}(z^{|l-1|})al1=gl1(zl1)
(2) z∣l∣=W∣l∣a∣l−1∣+b∣l−1∣z^{|l|} = W^{|l|}a^{|l-1|} + b^{|l-1|}zl=Wlal1+bl1
(3) a∣l∣=g∣l∣(z∣l∣)a^{|l|} = g^{|l|}(z^{|l|})al=gl(zl)

为了使:
(1) E[a[l−1]]=E[a[l−1]]E[a^{[l-1]}] = E[a^{[l-1]} ]E[a[l1]]=E[a[l1]]
(2) Var(a[l−1])=Var(a[l])Var(a^{[l-1]}) = Var(a^{[l]})Var(a[l1])=Var(a[l])

所以要使用多种激活方法:

q1.pre-train初始化

pre-train在机器学习和深度神经网络前期用的比较多,权重的初始化是为了让符合正态分布的图像输入和输出符合相同的分布,那么递归的构思,整个网络初始化后输入和输出都符合相同的分布,那么每一层的激活值都要符合相同的分布,那么就把每一层当作一个网络训练就好了,将每一层当作一个encoder-decoder训练器,那么这一层的输出值(激活值就是完全相同的),抽出每一层训练,那么整体一定都是符合正态分布的(你想想每一层的输入=输出了),然后把每一层陆续放入网络中。现在运用的较少了。

q2.高斯分布初始化

按照标准正态分布随机初始化权重可能会导致2个问题——梯度消失或梯度爆炸:

  1. 梯度消失——对于深度网络,任何激活函数abs(dW)值将随着反向传播过程中每一层向后移动而变得越来越小。在这种情况下,较早的层次变化是最慢的。权重更新较小,进而导致收敛速度变慢,这使会使得损失函数的优化变得缓慢。在最坏的情况下,可能会完全停止神经网络的进一步训练。形状的就是loss提前下降到最小值。
    更具体地说,在sigmoid(z)和tanh(z)的情况下,如果权重值很大,那么梯度将会很小,从而有效地防止权重改变它们的值,这是因为abs(dW)每次迭代后会稍微增加或者变得越来越小。使用RELU(z)作为激活函数时,梯度消失通常不会成为问题,因为负(和零)输入的梯度值总为0,其正输入时梯度的值总为1。

  2. 梯度爆炸——这与梯度消失完全相反。假设你有非负的、大的权重值和小的激活值A(可能是sigmoid(z)的情况)。当这些权重沿着层次相乘时,会导致损失函数发生较大变化。因此,梯度值也会很大,这意味着W的变化将大幅增加W-⍺* dW。

这可能导致模型在最小值附近一直振荡,一次又一次错过了最佳值,模型将永远不会得到最好的学习!梯度爆炸的另一个影响是梯度的超大值可能会导致数字溢出,从而导致不正确的计算或引入NaN,这也可能导致出现损失值为NaN的情况

使用高斯分布或者平均分布,会出现梯度消失(方差太小),梯度爆炸(方差太大),而且由于梯度的后向传播的过程中会出现梯度不断减少的问题(对sigmoid来说),随机初始化(0, 1)在面对一个很深的网络的时候,梯度反向传播越来越小,接近与0。

正态分布的方差均值为1/3,分布的区间为[−1n,1n][-\frac{1}{\sqrt{n}},\frac{1}{\sqrt{n}}][n 1,n 1]

q3.xavier initialization

xaiver初始化方法是针对tanh,sigmoid方法准备的,首先可以看一下sigmoid函数和sigmoid梯度函数:
在这里插入图片描述

sigmoid函数

在这里插入图片描述

sigmoid导数


由于sigmoid是有饱和区域的,在饱和区域的梯度为0,为了使正则化后(默认标准正态分布)的数据不出现在sigmoid梯度接近于0的位置,正向传播计算中,若设下一层feature map的方差为 δi+1x\delta^x_{i+1}δi+1x , 本层feature map的方差为 δix\delta^x_{i}δix, 本层的参数个数nin_ini,本层权重方差为δiw\delta^w_{i}δiw,那么计算公式为:
δi+1x=ni∗δix∗δiw(1)\delta^x_{i+1} = n_i * \delta^x_{i} * \delta^w_{i} (1)δi+1x=niδixδiw1
若设计本层的x方差与下一层的x方差相等,则公式可以改变为:
1=ni∗δiw(2)1 = n_i * \delta^w_{i}(2)1=niδiw2
那么第i层权值的方差则
δiw=1ni(3)\delta^w_{i}=\frac{1} {n_i} (3)δiw=ni1(3)

若反向传播过程中我们假设每一层的参数服从均值为0,方差为某值的分布,那么有如下公式那么有公式:
Var(∂Loss∂xjk−1)=nk∗Var(∂Loss∂xjk)∗δwkVar(\frac{\partial Loss}{\partial x^{k-1}_j}) = n^k *Var(\frac{\partial Loss}{\partial x^{k}_j}) * \delta^k_wVar(xjk1Loss)=nkVar(xjkLoss)δwk
若推倒到第一层,那么有
Var(∂Loss∂xj1)=Var(∂Loss∂xjk)∗∏i=0k−1ni∗δwiVar(\frac{\partial Loss}{\partial x^{1}_j})=Var(\frac{\partial Loss}{\partial x^{k}_j}) * \prod_{i=0}^{k-1}n^i * \delta^i_w Var(xj1Loss)=Var(xjkLoss)i=0k1niδwi
因为连乘中出现了w的方差,w的方差过大或者过小都会导致x的方差出现爆炸或者消失,那可是万万不可以的,为了保证每一层Var(x)Var(x)Var(x)都哦较为稳定,那么只能让每一层的方差都相等,即Var(∂Loss∂xjk−1)=Var(∂Loss∂xjk)Var(\frac{\partial Loss}{\partial x^{k-1}_j}) =Var(\frac{\partial Loss}{\partial x^{k}_j})Var(xjk1Loss)=Var(xjkLoss),那么对权重的方差要求即为:
δwk=1nk(1)\delta^k_w = \frac{1}{n^k}(1)δwk=nk1(1)

可以看到,无论是正向传播还是反向过程中,都是期望输出层与通道数的倒数相等,但是正向和反向传播中n的位置不是相同的,所以是w的方差第i,i+1i,{i+1}i,i+1层的参数的导数,推导就是:
δwk=2nk+nk+1(2)\delta^k_w = \frac{2}{n^k + n^{k+1}}(2)δwk=nk+nk+12(2)

XavierXavierXavier文章中提出WWW均匀分布在[−a,a][-a, a][a,a]中间,并且均匀分布的方差计算公式为:
Var(uniform)=(a−(−a))212=a23=δk=2nk+nk+1(3)Var(uniform) = \frac{(a-(-a))^2}{12} = \frac{a^2}{3} =\delta^k= \frac{2}{n^k + n^{k+1}}(3)Var(uniform)=12(a(a))2=3a2=δk=nk+nk+12(3)
那么就可知a=6nk+nk+1,Xavier=[−6nk+nk+1,6nk+nk+1](4)a=\sqrt{\frac{6}{n^k + n^{k+1}}},Xavier=[-\sqrt{\frac{6}{n^k + n^{k+1}}}, \sqrt{\frac{6}{n^k + n^{k+1}}}](4)a=nk+nk+16 Xavier=[nk+nk+16 ,nk+nk+16 ](4)
也可以使用正态分布方法,方差已经计算出来了,区间直接为:
[−2nk+nk+1,2nk+nk+1][-\frac{2}{n^k + n^{k+1}}, \frac{2}{n^k + n^{k+1}}][nk+nk+12,nk+nk+12]

q4.He initialization

HeHeHe初始化又称为KaiMingKaiMingKaiMing初始化,何凯明在训练resnet过程中发现,若我训练sigmoid和tanh的时候效果还可以,但是训练relu的时候使用XaiverXaiverXaiver初始化的时候就出现了效果不好的问题,网上有两种说法解释:

  1. relu激活函数导致了神经元失活,若我们假设12\frac{1}{2}21的神经元失活,那么我们的一层中的总参数个数为n2\frac{n}{2}2n,所以XaiverXaiverXaiver初始化时n=n2n=\frac{n}{2}n=2n
    δwk=1nk+nk+1(1)\delta^k_w = \frac{1}{n^k + n^{k+1}}(1)δwk=nk+nk+11(1)
    Var(uniform)=(a−(−a))212=a23=δk=1nk+nk+1(2)Var(uniform) = \frac{(a-(-a))^2}{12} = \frac{a^2}{3} =\delta^k= \frac{1}{n^k + n^{k+1}}(2)Var(uniform)=12(a(a))2=3a2=δk=nk+nk+11(2)
    那么就可知
    a=3nk+nk+1,Xavier=[−3nk+nk+1,3nk+nk+1](3)a=\sqrt{\frac{3}{n^k + n^{k+1}}},Xavier=[-\sqrt{\frac{3}{n^k + n^{k+1}}}, \sqrt{\frac{3}{n^k + n^{k+1}}}](3)a=nk+nk+13 Xavier=[nk+nk+13 ,nk+nk+13 ](3)
    若服从正态分布,区间为[−1nk+nk+1,1nk+nk+1][-\frac{1}{n^k + n^{k+1}}, \frac{1}{n^k + n^{k+1}}][nk+nk+11,nk+nk+11]

上面是我个人推的,Kaiming真实的策略为,设aaa为激活函数在x为负数时的斜率:

uniform模式(均值模式) : bound=6(1+a2)∗nkbound=\sqrt{\frac{6}{(1+a^2)*n^k}}bound=(1+a2)nk6
方差模式模式(均值模式) : bound=2(1+a2)∗nkbound=\sqrt{\frac{2}{(1+a^2)*n^k}}bound=(1+a2)nk2

  1. 由于Xavier没有考虑激活函数的问题,relu可以使负数失效,所以relu生成的结果会导致均值变大所以。。。
q5.lecun initialization

是Lecun在98年发明的一篇论文,和KaiMing差不多
其uniform模式为:bound=3nkbound=\sqrt{\frac{3}{n^k}}bound=nk3

q6.orthogonal initialization(正交初始化)

用以解决深度网络下的梯度消失、梯度爆炸问题,在RNN中经常使用的参数初始化方法。
SVD分解:

奇异值分解是一个适用于任意矩阵的分解方法,奇异值分解可以理解为将一个比较复杂的矩阵用更小更简单的3个子矩阵的相乘来表示,这3个小矩阵描述了大矩阵重要的特性。

分解形式:A=U∑VTA=U\sum V^TA=UVT

其中若A∈Rm∗nA\in R^{m*n}ARmn, U∈Rm∗nU\in R^{m*n}URmn,∑∈Rm∗n\sum \in R^{m*n}Rmn,V∈Rm∗nV\in R^{m*n}VRmn

分解式的含义可以理解为:矩阵的作用是将一个向量从这组正交基向量的空间旋转到这组正交基向量的空间,并且按照在各个方向上做了缩放,缩放倍数就是奇异值。

SVD解法:首先求方阵AATAA^TAAT的特征值,AATvi=λiviAA^Tv_i=\lambda_iv_iAATvi=λivi,其中λi\lambda_iλi为特征值,viv_ivi为特征向量也就是上面的V^T;

而奇异值为σi=λi\sigma_i=\sqrt{\lambda_i}σi=λi ,而左奇异量U为ui=1σiAviu_i=\frac{1}{\sigma_i}Av_iui=σi1Avi

SVD分解:1.降维;2.隐性语义分析;3.推荐系统

q7.sparse initialization(稀疏初始化)

另一个处理非标定方差的方法是将所有权重矩阵设为0,但是为了打破对称性,每个神经元都同下一层固定数目的神经元随机连接(其权重数值由一个小的高斯分布生成)。一个比较典型的连接数目是10个。

(这是一个大大大坑啊,如果别人问你W设置为全0是否可以训练,你说不可以那就是没有看到稀疏初始化方法,只要你避免神经网络的对称问题,就没啥事了。)

q7.0 initialization 全0初始化

已知梯度反向传播的过程中基本公式就是从输出层到指定位置的每层激活函数的梯度和n(n代表一层的参数个数)个W相乘组成的,若W为0则会出现反向传播的梯度为0,梯度消失问题,无法训练。(俗称对称失效)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐