神经网络的权重初始化

注:搬迁服务器图片已经找不到了,暂时不会重新做实验出图像

为什么神经网络的权重需要随机初始化

如果我们将神经网络的一个隐藏层的所有参数全部初始化为相同的值,那么这一层的网络可以看成是完全对称的,每一个神经元均具有相同的参数,在之后的训练中,每一个神经元梯度下降的改变值均相同,梯度下降后参数也均相同,参数将始终保持一致,在最终结果中,该层的每个神经元参数均相同。同样的,该层如果有两个神经元参数相同,那么这两个神经元就是对称的,最终的结果也将一致

因此,我们需要随机初始化权重,当然,偏置可以全部初始化为0,这并不会导致上面的对称问题(对称失效问题)

权重应该如何随机初始化

接下来我们以tanh和ReLU两种激活函数举例

普通随机初始化

我们可以用numpy生成一个\(n^{[i]}\times n^{[i-1]}\)维度的矩阵,矩阵内的元素符合标准正态分布:

1
np.random.randn(N[i], N[i-1])

其中,N[i]表示\(n^{[i]}\),也就是第\(i\)个神经层的神经元个数,N[i-1]表示\(n^{[i-1]}\),也就是第\(i-1\)个神经层的神经元个数

\(i\)个神经层的权重表示的矩阵为\(W^{[i]}\),其为\(n^{[i]}\times n^{[i-1]}\)维度的矩阵,在python中,我们用W[i]表示

则:

1
W[i] = np.random.randn(N[i], N[i-1])

标准正态分布中大量数据的范围依旧比较大,我们将其进行缩减,分成两组,每组分别缩减10倍、100倍,即:

第一组:

1
W[i] = np.random.randn(N[i], N[i-1])*0.1

第二组:

1
W[i] = np.random.randn(N[i], N[i-1])*0.01

注:对于每组数据,我们均采用10000个输入特征,每个隐藏层5000个神经元(目的是每层输出数据足够多,更具有一般性),分布直方图分为200块

对于ReLU函数

\[ \left\{ \begin{aligned} &Z^{[l]} = W^{[l]T}A^{[l-1]}+b^{[l]}\\\ &A^{[l]} = g(Z^{[l]}) = \max(0, Z^{[l]}) \end{aligned} \right. \]

注:\(\max(0, Z^{[l]})\)即对\(Z^{[l]}\)内每个元素与0比较,选取更大的那个

我们将每一层的\(Z^{[l]}\)进行比较(其中输入层的\(Z^{[l]}\)默认为\(A^{[0]}\),也就是输入的数据):

第一组:

第一组-ReLU

第二组:

第二组-ReLU

我们发现:

  • 第一组\(Z^{[i]}\)的值随\(i\)增大分布的范围越来越大,可能会形成正向传播原因导致的梯度爆炸
  • 第二组\(Z^{[i]}\)的值随\(i\)增大分布的范围越来越小,可能会形成正向传播与反向传播原因共同导致的梯度消失

对于tanh函数

\[ \left\{ \begin{aligned} &Z^{[l]} = W^{[l]T}A^{[l-1]}+b^{[l]}\\\ &A^{[l]} = g(Z^{[l]}) = \frac{e^{Z^{[l]}}-e^{-Z^{[l]}}}{e^{Z^{[l]}}+e^{-Z^{[l]}}} \end{aligned} \right. \]

注:\(\frac{e^{Z^{[l]}}-e^{-Z^{[l]}}}{e^{Z^{[l]}}+e^{-Z^{[l]}}}\)即对\(Z^{[l]}\)内部每个元素\(Z_{i,j}^{[l]}\)都进行相应计算

我们将每一层的\(Z^{[l]}\)进行比较(其中输入层的\(Z^{[l]}\)默认为\(A^{[0]}\),也就是输入的数据):

第一组:

第一组-tanh

第二组:

第二组-tanh

我们发现:

  • 第一组的\(Z^{[i]}\)随着\(i\)增大分布趋于稳定,但其值分布的范围也比较广,而tanh函数在左右两侧都有软饱和,\(Z^{[i]}\)内元素绝对值比较大的话,激活函数导数值会很小,会因为反向传播因素导致梯度消失
  • 第二组\(Z^{[i]}\)的值随\(i\)增大分布的范围越来越小,可能会形成正向传播导致的梯度消失

总结

因此,普通的随机初始化方案很有可能导致梯度消失或者梯度爆炸

Xavier初始化

Xavier初始化可以帮助减少梯度消失的问题,使得信号在神经网络中可以传递得更深,在经过多层神经元后保持在合理的范围(不至于太大或太小)

Xavier初始化的基本思想:保持输入和输出的方差一致(服从相同的分布),这样就避免可所有的输出值都趋向于0

注意:Xavier的(官方)推导是基于线性函数的(假设激活函数是线性函数)

方法

推理

假设上一层的输出是满足标准正态分布的数据:\(x_1,x_2,\cdots,x_n\),则: \[ z = w_1x_1 + w_2x_2 + \cdots + w_nx_n + b \] 我们希望这一层的数据也满足标准正态分布,也就是不会和上层数据有较大差别,如果\(w_1,w_2,\cdots,w_n\)也满足正态分布,且均值为0,那么:

  • \(w\)的期望为\(E(w) = 0\)
  • \(x\)的期望为\(E(x)=0\)
  • \(x\)的方差为\(D(x)=1\)

我们希望\(z\)也满足标准正态分布,则\(E(z) = 0,D(z)=1\)

\[ D(w_ix_i) = [E(x_i)]^2D(w_i)+[E(w_i)]^2D(x_i)+D(x_i)D(w_i) \] 因为 \[ E(x_i) = E(w_i) = 0 \] 所以: \[ D(w_ix_i) = D(x_i)D(w_i) \]

则: \[ D(z) = \displaystyle\sum_{i=1}^n{D(x_iw_i)} = \displaystyle\sum_{i=1}^n{D(x_i)D(w_i)} \] 因为: \[ D(x_i) = 1 \] 所以: \[ D(z) = \displaystyle\sum_{i=1}^n{D(w_i)} = \displaystyle\sum_{i=1}^{n}{D(w)} = nD(w) \] 因为\(D(z) = 1\),则: \[ D(w) = \frac{D(z)}{n} = \frac{1}{n} \] 那么,\(w\)的标准差应该为: \[ \sigma_w = \sqrt{D(w)} = \sqrt{\frac{1}{n}} \] 因为\(Z^{[l]} = W^{[l]}A^{[l-1]}+b^{[l]}\),也就是说,对于\(z_j^{[l]}\)(第\(l\)层第\(j\)个神经元的线性结果)应该有\(n^{[l-1]}\)个权重

因此,\(W^{[l]}\)初始化为标准正态分布后应该乘上\(\frac{1}{\sqrt{n^{[l-1]}}}\)

结论

因此,\(W^{[i]}\)的初始化方案:

1
W[i] = np.random.randn(N[i], N[i-1])/np.sqrt(N[i-1])

效果

对tanh函数

Xavier-tanh

对ReLU函数

Xavier-ReLU

结论

由上面效果图像可知,Xavier初始化对以tanh函数为激活函数的神经网络有不错的效果,但对于以ReLU函数为激活函数的神经网络而言,依旧可能出现梯度消失的情况

  • Xavier初始化适合tanh激活函数,不适合ReLU激活函数

He initialization(MSRA)

由何凯明巨佬提出的一种解决ReLU激活函数梯度消失的权重初始化方案。

方法

推理

ReLU激活函数的特点是:当\(z<0\)时,\(g(z)=0\),也就是说,ReLU激活函数将原本符合标准正态分布的数据的负数部分全部清零,只剩下了一半的有用数据

因此,如果我们想要保持神经网络每层的方差不变,只需要在Xavier的基础上,将\(w\)的方差由\(\sqrt{\frac{1}{n}}\)变为\(\sqrt{\frac{2}{n}}\)

因为\(Z^{[l]} = W^{[l]}A^{[l-1]}+b^{[l]}\),也就是说,对于\(z_j^{[l]}\)(第\(l\)层第\(j\)个神经元的线性结果)应该有\(n^{[l-1]}\)个权重

因此,\(W^{[l]}\)初始化为标准正态分布后应该乘上\(\frac{2}{\sqrt{n^{[l-1]}}}\)

结论

1
W[i] = np.random.randn(N[i], N[i-1])/np.sqrt(N[i-1]/2)

效果

He initialization(MSRA)_ReLU

因此,对于ReLU激活函数,He initialization是一种非常不错的权重初始化方案


神经网络的权重初始化
https://blog.shinebook.net/2025/03/15/人工智能/理论基础/深度学习/神经网络的权重初始化/
作者
X
发布于
2025年3月15日
许可协议