权重初始化

梯度消失

指在网络反向传播过程中由于链式求导法则不断的累积,如果每一层的梯度都小于1,由于累乘效应,出现了某些参数的梯度非常小的现象。在使用这些梯度更新梯度的时候参数值基本没有发生变化,因此就出现了网络训练停滞、模型无法继续优化的问题。


梯度爆炸

指在网络反向传播过程中由于链式求导法则的累乘效应,在每一层梯度都大于1的时候,就可能会出现某些参数的梯度非常大。在使用这些梯度更新参数的时候就会导致参数变化过大,就会出现损失函数震荡的现象。


\(eg:\)设有\(n\)个隐藏层,则反向传播时,输入层与第一个隐藏层的权重矩阵的梯度为:

\[\nabla W_{1}=\frac{\partial J(\theta)}{\partial a^{(n+1)}}\frac{\partial a^{(n+1)}}{\partial z^{(n+1)}}\frac{\partial z^{(n+1)}}{\partial a^{(n)}}...\frac{\partial z^{(2)}}{\partial \omega^{(1)}} \]

\[\nabla W_{1}=\frac{\partial J(\theta)}{\partial a^{(n+1)}}a^{(1)}\prod_{i=2}^{n}\frac{\partial a^{(i+1)}}{\partial z^{(i+1)}}\omega^{(i)} \]

当权重矩阵\(\omega^{(i)}<1\)时,由于连乘效应会导致\(\nabla W_{1}\)的值非常地小,接近于\(0\),从而导致梯度更新十分慢,即梯度消失。反之,若\(\omega^{(i)}>1\),则会使得\(\nabla W_{1}\)的值变得很大,从而导致梯度爆炸,使得下降过程过于震荡,甚至有可能不收敛。为避免这种情况,我们需要对权重矩阵进行初始化。


为什么不进行随机初始化或直接初始化为一个常量

  • 若直接初始化为一个常量,则会导致神经网络变成一个对称的网络,从而导致所有的权重值的梯度都相等,即无论经过多少次的正向和反向传播,所有的权重参数都是相同的。
  • 若进行随机初始化,则有可能会使得某些值很小或很大,从而导致梯度消失或梯度爆炸,使得网络优化变得困难。

以下是可以解决梯度消失和爆炸问题的几种可行方法


预训练(\(pre—training\))

预训练即不从零开始训练一个新模型,而是从在类似问题中训练过的模型入手,引入这些模型的参数来进行训练,而后进行微调,以达到更好的效果。


\(Xavier\)初始化

\(Xavier\)初始化的基本思想:若对于每一层网络的输入和输出都可以保持同一分布且方差相近,则可以避免输出趋向于\(0\)或变得很大,即为了使输入在经过多层神经网络后,不被过分地放大或缩小,应尽可能保持每一层的神经元的输入和输出方差大致相等。

\(eg:\)设在一个神经网络中,第\(l\)层的神经元为\(a^{(l)}\),该层神经元的数量为\(M_{l}\),假设偏置值为\(0\)\(f(\cdot)\)为激活函数,则

\[a^{(l)}=f(\sum_{i=1}^{M_{l-1}}\omega_{\cdot i}^{(l-1)}a^{(l-1)}) \]

\(\omega_{\cdot i}\)\(\omega\)的第\(i\)列,若令激活函数\(f(x)=x\),则

\[a^{(l)}=\sum_{i=1}^{M_{l-1}}\omega_{\cdot i}^{(l-1)}a^{(l-1)} \]

\(\omega^{(l-1)},a^{(l-1)}\)的均值均为\(0\),且相互独立,则\(a^{(l)}\)的均值为

\[E(a^{(l)})=E(\sum_{i=1}^{M_{l-1}}\omega_{\cdot i}^{(l-1)}a^{(l-1)}) \]

\[\quad \quad\quad=\sum_{i=1}^{M_{l-1}}E(\omega_{\cdot i}^{(l-1)}a^{(l-1)}) \]

\[\quad\quad\quad\quad=\sum_{i=1}^{M_{l-1}}E(\omega_{\cdot i}^{(l-1)})E(a^{(l-1)}) \]

\[=0\quad\quad\quad\quad\quad \]

\(a^{(l)}\)的方差为:

\[var(a^{(l)})=var(\sum_{i=1}^{M_{l-1}}\omega_{\cdot i}^{(l-1)}a^{(l-1)}) \]

对两个相互独立的随机变量\(X,Y\),有:

\[var(XY)=E(X^2Y^2)-E^2(XY) \]

\[=E(X^2)E(Y^2)-E^2(X)E^2(Y) \]

\[var(X)=E(X^2)-E^2(X) \]

\[E(X^2)=var(X)+E^2(X) \]

因此

\[var(XY)=[var(X)+E^{2}(X)][var(Y)+E^{2}(Y)]-E^2(X)E^2(Y) \]

由于\(E(\omega^{(l-1)})=E(a^{(l-1)})=0\),故\(a^{(l)}\)的方差为:

\[var(a^{(l)})=\sum_{i=1}^{M_{l-1}}var(\omega_{\cdot i}^{(l-1)})var(a^{(l-1)}) \]

由于\(\omega_{\cdot i}^{(l-1)},\omega^{(l-1)}\)同分布,故其方差相等,故

\[var(a^{(l)})=M_{l-1}var(\omega^{(l-1)})var(a^{(l-1)}) \]

要使神经元的输入和输出不被过分增大或缩小,应使其方差相等,故有\(var(a^{(l)})=var(a^{(l-1)})\),故有

\[var(\omega^{(l-1)})=\frac{1}{M_{l-1}} \]

若考虑神经元的输入和输出在前向和反向传播中都不受影响,则有

\[var(\omega^{(l-1)})=\frac{2}{M_{l-1}+M_{l}} \]

计算出方差后,若采用正态分布(高斯分布),则参数\(\omega^{(l-1)}\sim N(0,\frac{2}{M_{l}+M_{l-1}})\),若采用均匀分布,则参数\(\omega^{(l-1)}\sim U(-\sqrt{\frac{6}{M_{l-1}+M_{l}}},\sqrt{\frac{6}{M_{l-1}+M_{l}}})\)

虽然在上面我们假设了激活函数为\(f(x)=x\),但在实际使用\(Xavier\)初始化时,它也可用于激活函数为\(logistic\)\(tanh\)函数的神经网络上,因为这两个函数在\(x=0\)附近是近似等于线性函数的。同时,若激活函数为\(logistic\)函数,由于其在线性区间的导数值约为\(0.25\)(相当于\(f(x)=0.25x\)),故其方差约为\(16×\frac{2}{M_{l-1}+M_{l}}\),其中\(16\)为缩放因子\(\rho\)


采用均匀分布时的区间推导
\(\omega^{(l-1)}\)服从均匀分布\(U(a,b)\),则

\[E(\omega^{(l-1)})=\frac{1}{2}(b+a)=0 \]

\[var(\omega^{(l-1)})=\frac{1}{12}(a-b)^2=\frac{2}{M_{l-1}+M_{l}} \]

解上述两个方程即可得\(b=-a=\sqrt{\frac{6}{M_{l-1}+M_{l}}}\)


\(He\)初始化

\(Xavier\)初始化对于激活函数为\(logistic\)\(tanh\)函数时有较好的效果,但如果激活函数为\(ReLU\)函数,该方法就不是那么有效了,而\(He\)初始化则可以解决该问题。
\(He\)初始化的基本思想:由于\(ReLU\)函数使一半的\(z\)值变为零,大约移除了一半的方差,故需要使用加倍权重的方差用以弥补损失的方差。而补偿方法即将\(Xavier\)中的权重的方差乘以\(2\)。即

  • \(\omega^{(l-1)}\)服从正态分布,则\(\omega^{(l-1)}\sim N(0,\frac{2}{d})\)
  • \(\omega^{(l-1)}\)服从均匀分布,则\(\omega^{(l-1)}\sim N(-\sqrt{\frac{6}{d}},\sqrt{\frac{6}{d}})\)
    其中\(d=M_{l-1}\quad or \quad d=M_{l}\)

批量归一化\((Batch \quad Normalization)+\)随机初始化

\(BN\)的基本思想:在网络的每一层输入时,插入了一个归一化层,即对输入每层神经元的输入数据先做一个归一化(方差为\(1\),均值为\(0\))处理,而后再进行伸缩和平移变换,最后再把数据交给激活函数处理,而神经网络中的\(\omega\)等参数在初始时可以进行随机初始化。具体流程如下:

  • 对于每一层的输入\(x=[x_{1},x_{2},...,x_{m}]^T\),先计算其均值\(\mu=\frac{1}{m}\sum_{i=1}^{m}x_{i}\)和方差\(\sigma^2=\frac{1}{m}\sum_{i=1}^{m}(x_{i}-\mu)^2\)

  • 而后对\(x\)进行归一化,归一化公式为:

\[\hat{x_{i}} =\frac{x_{i}-\mu}{\sqrt{\sigma^2+\epsilon}} \]

\(\epsilon\)是一个趋于\(0\)的数,主要是为了防止方差为\(0\)时出现除零异常

  • 接下来对归一化的数据进行伸缩和平移变换,变换后向神经元输入的数据为\(y\)\(y\)的公式为:

\[y_{i}=\gamma\hat{x_{i}}+\beta \]

式子中的\(\gamma,\beta\)为我们需要进行优化的参数,和\(\omega\)类似,在反向传播的过程中对其进行优化。

  • 最后将\(y\)送入到激活函数中进行计算,计算出来的值即为本层神经元的输出,即\(a^{(k)}=f(y^{(k)})\)\(k\in[1,l]\)\(l\)为神经网络的层数

为什么\(BN\)有效

\(BN\)相当于将每一层神经元的输入输出分布的均值和方差从权重中剥离出来,只需要通过\(\gamma\)\(\beta\)便可直接对分布进行调整,不再需要去通过调整那么多的权重参数来调整分布,即使得分布不再受权重的影响,同时把因输入层的数据改变(协变量)对后面的隐藏层和输出层造成的影响减小了。

posted @ 2022-09-03 21:03  kris-phl  阅读(73)  评论(0)    收藏  举报