跳到主要内容

神经网络参数初始化与数值稳定性

引言

在训练深度神经网络时,参数初始化方案的选择往往被忽视,但它实际上对模型训练至关重要。不恰当的初始化可能导致梯度消失或梯度爆炸,使得优化算法无法收敛。本文将探讨深度网络中的数值稳定性问题,以及为什么Xavier初始化能够有效解决这些问题。

一、深度网络中的数值稳定性问题

1.1 梯度消失与梯度爆炸

考虑一个具有 LL 层的深层网络,每一层的梯度计算涉及多个矩阵的连乘:

oW(l)=M(L)M(l+1)v(l)\frac{\partial \mathbf{o}}{\partial \mathbf{W}^{(l)}} = \mathbf{M}^{(L)} \cdot \ldots \cdot \mathbf{M}^{(l+1)} \cdot \mathbf{v}^{(l)}

当这些矩阵连乘时,会出现两个极端情况:

梯度消失(Gradient Vanishing)

  • 参数更新过小,模型几乎无法学习
  • 常见于使用sigmoid等饱和激活函数的网络
  • sigmoid函数在输入值很大或很小时,梯度接近于0

梯度爆炸(Gradient Exploding)

  • 参数更新过大,破坏模型的稳定收敛
  • 随机初始化的矩阵连乘可能导致数值急剧增大
  • 例如:100个随机矩阵连乘后,数值可能达到 102310^{23} 量级

1.2 为什么sigmoid容易导致梯度消失?

sigmoid函数 σ(x)=11+ex\sigma(x) = \frac{1}{1 + e^{-x}} 的导数在输入值较大或较小时都接近于0。当反向传播经过多层时,这些接近0的梯度不断相乘,最终导致梯度消失。

解决方案:使用ReLU等非饱和激活函数,它在正区间的梯度恒为1,能有效缓解梯度消失问题。

1.3 对称性问题

如果将所有权重初始化为相同的值(如全部初始化为0或某个常数 cc),会发生什么?

  • 前向传播时,同一层的所有神经元会计算出相同的输出
  • 反向传播时,所有权重得到相同的梯度
  • 结果:网络永远无法打破对称性,多个神经元等价于一个神经元

结论:必须使用随机初始化来打破对称性。

二、Xavier初始化方法

2.1 基本思想

Xavier初始化(由Glorot和Bengio在2010年提出)的核心目标是:

  • 前向传播:保持每层输出的方差稳定
  • 反向传播:保持每层梯度的方差稳定

2.2 数学推导

对于一个全连接层,输出为:

oi=j=1ninwijxjo_i = \sum_{j=1}^{n_{in}} w_{ij} x_j

假设:

  • 权重 wijw_{ij} 独立同分布,均值为0,方差为 σ2\sigma^2
  • 输入 xjx_j 独立同分布,均值为0,方差为 γ2\gamma^2

则输出的方差为:

Var[oi]=ninσ2γ2\text{Var}[o_i] = n_{in} \sigma^2 \gamma^2

前向传播条件:要保持方差不变,需要 ninσ2=1n_{in} \sigma^2 = 1

反向传播条件:同理,需要 noutσ2=1n_{out} \sigma^2 = 1

由于无法同时满足两个条件,Xavier折中处理:

σ2=2nin+nout\sigma^2 = \frac{2}{n_{in} + n_{out}}

2.3 实现方式

Xavier初始化有两种常见实现:

1. 高斯分布(正态分布)

WN(0,2nin+nout)W \sim \mathcal{N}\left(0, \frac{2}{n_{in} + n_{out}}\right)

2. 均匀分布

均匀分布 U(a,a)U(-a, a) 的方差为 a23\frac{a^2}{3},由 a23=2nin+nout\frac{a^2}{3} = \frac{2}{n_{in} + n_{out}} 得:

WU(6nin+nout,6nin+nout)W \sim U\left(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right)

三、实践建议

3.1 何时使用Xavier初始化?

  • 适用场景:使用tanh、sigmoid等激活函数时
  • 不适用场景:使用ReLU激活函数时,建议使用He初始化(方差为 2nin\frac{2}{n_{in}})

3.2 深度学习框架中的默认初始化

大多数深度学习框架(如PyTorch、TensorFlow)已经内置了Xavier初始化和其他初始化方法:

# PyTorch示例
import torch.nn as nn

# Xavier均匀分布初始化
nn.init.xavier_uniform_(layer.weight)

# Xavier正态分布初始化
nn.init.xavier_normal_(layer.weight)

# He初始化(适用于ReLU)
nn.init.kaiming_normal_(layer.weight)

四、总结

参数初始化是深度学习中容易被忽视但极其重要的环节:

  1. 梯度消失和爆炸是深层网络训练的主要障碍
  2. 随机初始化是打破对称性的关键
  3. Xavier初始化通过平衡前向和反向传播的方差,有效缓解了数值稳定性问题
  4. ReLU激活函数 + He初始化是现代深度学习的标准组合

选择合适的初始化方法,可以显著提高模型的训练效率和收敛速度。


参考资料