权值初始化 - Xavier和MSRA方法

设计好神经网络结构以及loss function 后,训练神经网络的步骤如下:

  1. 初始化权值参数
  2. 选择一个合适的梯度下降算法(例如:Adam,RMSprop等)
  3. 重复下面的迭代过程:
    1. 输入的正向传播
    2. 计算loss function 的值
    3. 反向传播,计算loss function 相对于权值参数的梯度值
    4. 根据选择的梯度下降算法,使用梯度值更新每个权值参数

初始化

神经网络的训练过程是一个迭代的过程,俗话说:好的开始就是成功的一半,所以的权值参数的初始化的值对网络最终的训练结果有很大的影响。 过大或者过小的初始值,对网络收敛的结果都会有不好的结果。

所有的参数初始化为0或者相同的常数

最简单的初始化方法就是将权值参数全部初始化为0或者一个常数,但是使用这种方法会导致网络中所有的神经元学习到的是相同的特征

假设神经网络中只有一个有2个神经元的隐藏层,现在将偏置参数初始化为:bias=0bias = 0,权值矩阵初始化为一个常数α\alpha。 网络的输入为(x1,x2)(x_1,x_2),隐藏层使用的**函数为ReLUReLU,则隐藏层的每个神经元的输出都是relu(αx1+αx2)relu(\alpha x_1 + \alpha x_2)。 这就导致,对于loss function的值来说,两个神经元的影响是一样的,在反向传播的过程中对应参数的梯度值也是一样,也就说在训练的过程中,两个神经元的参数一直保持一致,其学习到的特征也就一样,相当于整个网络只有一个神经元。

过大或者过小的初始化

如果权值的初始值过大,则会导致梯度爆炸,使得网络不收敛;过小的权值初始值,则会导致梯度消失,会导致网络收敛缓慢或者收敛到局部极小值。

如果权值的初始值过大,则loss function相对于权值参数的梯度值很大,每次利用梯度下降更新参数的时,参数更新的幅度也会很大,这就导致loss function的值在其最小值附近震荡。

而过小的初值值则相反,loss关于权值参数的梯度很小,每次更新参数时,更新的幅度也很小,着就会导致loss的收敛很缓慢,或者在收敛到最小值前在某个局部的极小值收敛了。

Xavier初始化

Xavier初始化,由Xavier Glorot 在2010年的论文 Understanding the difficulty of training deep feedforward neural networks 提出。
为了避免梯度爆炸或者梯度消失,有两个经验性的准则:

  1. 每一层神经元**值的均值要保持为0
  2. 每一层**的方差应该保持不变。

在正向传播时,每层的**值的方差保持不变;在反向传播时,每层的梯度值的方差保持不变。

基于上述的准则,初始的权值参数WlW^lll为网络的第ll层)要符合以下公式
W[l]N(μ=0,σ2=1n[l1])b[l]=0 \begin{aligned} W^{[l]} & \sim \mathcal{N}\left(\mu=0, \sigma^{2}=\frac{1}{n^{[l-1]}}\right) \\ b^{[l]} &=0 \end{aligned}

其中nn1n^{n-1}是第l1l-1层的神经元的个数。 也就是说,初始的权值ww可以从均值μ=0\mu = 0,方差为σ2=1nl1\sigma^{2}=\frac{1}{n ^{l-1}}的正态分布中随机选取。

正向传播的推导过程

推导过程中的三个假设:

  1. 权值矩阵ww是独立同分布的,且其均值为0
  2. 每一层的输入aa是独立同分布的,且均值也为0
  3. wwaa是相互独立的

LL层的权值矩阵为WW,偏置为bb,其输入为aa
zl=wlal1+bl z^l = w^la^{l-1} + b^l


Var(zl)=Var(i=0nwilail)=i=0nVar(wilail1) Var(z^l) = Var(\sum_{i=0}^nw_{i}^la_i^l) = \sum_{i=0}^n Var(w_{i}^la_i^{l-1})

有统计概率的知识可得到:(第一个假设WW,xx相互独立)
Var(wixi)=E2(wi)Var(wi)+E2(xi)Var(xi)+Var(wi)Var(xi) Var(w_ix_i) = E^2(w_i)Var(w_i) + E^2(x_i)Var(x_i) + Var(w_i)Var(x_i)

由第一第二个假设可知:ll层输入的均值为0,权值参数WW的均值也为0,即:E(xi)=0,E(wi)=0E(x_i) = 0,E(w_i) = 0则有:Var(wixi)=Var(wi)Var(xi)Var(w_ix_i) = Var(w_i)Var(x_i),即

Var(zl)=i=0nVar(wil)Var(xil1) Var(z^l) = \sum_{i=0}^nVar(w_i^l)Var(x_i^{l-1})

设权值矩阵WW独立同分布的则有Var(wl)=Var(w11l)==Var(Wijl)Var(w^l) = Var(w_{11}^l) = \cdots = Var(W_{ij}^l),输入al1a^{l-1}也是独立同分布的有:Var(al1)=Var(a1l1)==Var(ail1)Var(a^{l-1}) = Var(a_1^{l-1}) = \cdots = Var(a_i^{l-1})
则有
Var(zl)=nl1Var(wl)Var(al1),(n1) Var(z^l) = n^{l-1}Var(w^l)Var(a^{l-1}),(n-1)为上一层神经元的个数

这里得出了第ll层输入到**函数中的值zlz^l与其输入al1a^{l-1}(也就是上一层输出的**值)的方差之间的关系。但我们假设的是每一层输出的**值的方差保持不变,也就是说要得到Var(al)Var(a^l)Var(al1)Var(a^{l-1})之间的关系。

ff为**函数,则有
al=f(zl) a^l = f(z^l)
Xavier假设的**函数为tanhtanh,其函数曲线为
权值初始化 - Xavier和MSRA方法

其中间的部分可以近似线性(linear regime),而在训练的过程就要保证**值是落在这个线性状体的区间内的,不然就会出现梯度饱和的情况。所以,这里可以近似的有
al=tanh(zl) a^l = tanh(z^l)

也就是说:
Var(al)=Var(zl)=nl1Var(wl)Var(al1) Var(a^l) = Var(z^l) = n^{l-1}Var(w^l)Var(a^{l-1})
要让每一层的**值的方差保持不变,则有Var(al)=Var(al1)Var(a^l) = Var(a^{l-1}),既有
Var(wl)=1nl1 Var(w^l) = \frac{1}{n^{l-1}}

通常输入神经元和输出神经元的个数不一定总是相同的,这里取两者的均值
i,Var(Wl+1)=2nl+nl+1 \forall i, \operatorname{Var}\left(W^{l+1}\right)=\frac{2}{n_{l}+n_{l+1}}

限制
对于权值的初始化,Glorot提出两个准则:

  • 各个层**值的方差保持不变(正向传播)
  • 各个层的梯度值的方差保持不变(反向传播)

在Xavier的推导的过程中,做了以下假设:

  1. 权值矩阵ww是独立同分布的,且其均值为0
  2. 每一层的输入aa是独立同分布的,且均值也为0
  3. wwaa是相互独立的

但是,对Xavier限制最大的则是,其是基于tanh作为**函数的。
上述公式的详细推导过程可参见 http://www.deeplearning.ai/ai-notes/initialization/

Xavier的初始化有个假设条件,**函数关于0对称,且主要针对于全连接神经网络。适用于tanh和softsign。

均匀分布

通过上面的推导,得出权值矩阵的均值为:0,方差为
i,Var(Wl+1)=2nl+nl+1 \forall i, \operatorname{Var}\left(W^{l+1}\right)=\frac{2}{n_{l}+n_{l+1}}

$[a,b] 间的均匀分布的方差为 var = \frac{(b-a)^2}{12},,设F_{in}为输入的神经元个数,F_{out}$为输出的神经元个数
limit=6Fin+Fout limit = \sqrt{\frac{6}{F_{in} + F_{out}}}
则权值参数从分布
WU[limit,limit]WU[6Fin+Fout,+6Fin+Fout] W \sim U[-limit,limit] \rightarrow W \sim U\left[-\sqrt{\frac{6}{F_{in} + F_{out}}}, + \sqrt{\frac{6}{F_{in} + F_{out}}}\right]

正态分布

基于正态分布的Xavier初始化从均值为0,方差为2Fin+Fout\sqrt{\frac{2}{F_{in} + F_{out}}}的正态分布中随机选取。
WN(0.0,2Fin+Fout) W \sim N(0.0,\sqrt{\frac{2}{F_{in} + F_{out}}})

He初始化(MSRA)

由 Kaiming 在论文Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification提出,由于Xavier的假设条件是**函数是关于0对称的,而常用的ReLU**函数并不能满足该条件。

只考虑输入的个数,MSRA的初始化是一个均值为0,方差为2Fin\sqrt{\frac{2}{F_{in}}}的高斯分布
wG[0,2Fin] w \sim G\left[0, \sqrt{\frac{2}{F_{in }}}\right]

正向传播的推导过程

其前半部分的推导和Xavider类似
对于第ll层,有如下公式 :
yl=Wlxl+bl \mathbf{y}_{l}=\mathbf{W}_{l} \mathbf{x}_{l}+\mathbf{b}_{l}
其中,xlx_l为当前层的输入,也是上一层的**后的输出值。yly_l为当前层输入到**函数的值,wlw_lblb_l为权值和偏置。其中xlx_l以及wlw_l都是独立同分布的,(和Xavier相同的假设条件),则有:
Var[yl]=nlVar[wlxl] \operatorname{Var}\left[y_{l}\right]=n_{l} \operatorname{Var}\left[w_{l} x_{l}\right]

wlw_l的均值为0,即E(wl)=0E(w_l) = 0,则有:
KaTeX parse error: No such environment: align* at position 9: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \operatorname…

这里有和Xavier一个很大的不同是,这里没有假设输入的值的均值为0。这是由于,使用ReLU的**函数,xl=max(0,yl1)x_l = max(0,y_{l-1}),每层输出的值不可能均值为0。

上面最终得到
Var(yl)=nlVar(wl)E(xl2) \operatorname{Var}(y_l) = n_{l} \operatorname{Var}(w_l) \cdot E(x_l^2)

初始化时通常设,ww的均值为0,偏置b=0b = 0,以及wwxx是相互独立的,则有
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \operatorname{…
也就是说,yly_l的均值为0。

再假设ww是关于0对称分布的(均匀分布,高斯分布都符合),则可以得到yly_l在0附近也是对称分布的。

这样,使用ReLU作为**函数,则有
xl=max(0,yl1) x_l = max(0,y_{l-1})
由于只有当yl1>0y_{l-1} > 0的部分,xlx_l才有值,且yly_l在0附近也是对称分布的,则可以得到
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \operatorname{…

将得到的E(xl2)=12Var(yl1)\operatorname{E}(x_l^2) = \frac{1}{2}\operatorname{Var}(y_{l-1}),带入到 $\operatorname{Var}(y_l) = n_{l} \operatorname{Var}(w_l) \cdot E(x_l^2) $ 则可以得到
Var[yl]=12nlVar[wl]Var[yl1] \operatorname{Var}\left[y_{l}\right]=\frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right] \operatorname{Var}\left[y_{l-1}\right]

将所有层的方差累加到一起有:
Var[yL]=Var[y1](l=2L12nlVar[wl]) \operatorname{Var}\left[y_{L}\right]=\operatorname{Var}\left[y_{1}\right]\left(\prod_{l=2}^{L} \frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right]\right)

为了是每一层的方差保持不变,则有:
12nlVar[wl]=1,l \frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right]=1, \quad \forall l

也即得到 权值矩阵的方差应该是
2/nl \sqrt{2 / n_{l}}

和Xavier的方法,也可以使用正态分布或者均匀分布来取得初始的权值矩阵的值。

正态分布
WN(0.0,2/nl) W \sim N(0.0,\sqrt{2 / n_{l}})

均匀分布
WU[6/nl,6/nl] W \sim U[-\sqrt{6 / n_{l}},\sqrt{6 / n_{l}}]

总结及使用的概率公式

正确的初始化方法应该避免指数级地减小或放大输入值的大小,防止梯度“饱和”。 Glorot提出两个准则:

  • 各个层**值的方差保持不变(正向传播)
  • 各个层的梯度值的方差保持不变(反向传播)

通常初始的权值矩阵的均值为0.

这这些条件的基础上,Glorot 使用tanhtanh作为**函数,并假设输入值的均值为0,提出了Xavier初始化的方法。

而Kaiming使用ReLU作为**函数,就无法满足数值的均值为0的条件,因此使用Xavier来初始化ReLU作为**函数的网络,效果也就不是那么理想。其提出了MSRA的初始化方法,来解决该问题。


推导时使用的概率公式:
D(x)=E(x2)E2(x) D(x)=E\left(x^{2}\right)-E^{2}(x)

D(xy)=E(x2y2)E2(xy)=E(x2)E(y2)E2(x)E2(y) D(x y)=E\left(x^{2} y^{2}\right)-E^{2}(x y)=E\left(x^{2}\right) E\left(y^{2}\right)-E^{2}(x) E^{2}(y)

如果E(y)=0E(y) = 0,则有:
D(xy)=D(y)E(x2) D(xy) = D(y)E(x^2)

如果x,yx,y是相互独立的,则有
E(xy)=E(x)E(y) E(xy) = E(x)E(y)

本文只推导了正向传播的过程,对于反向传播的推导可参考原始论文