梯度消失与梯度爆炸
这两个问题通常在深度神经网络中出现,特别是在反向传播过程中,会严重影响网络的训练效果。
1. 梯度消失(Vanishing Gradient)
现象
在反向传播时,梯度值逐层减小,导致靠近输入层的权重几乎没有更新,网络难以学习有效特征。
原因
-
激活函数的特性
如Sigmoid和Tanh的梯度范围较小。当输入较大或较小时,梯度趋近于0(函数饱和区域)。
例如,Sigmoid函数的导数:
f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f'(x) = f(x)(1 - f(x)) f′(x)=f(x)(1−f(x))
当 x → ± ∞ x \to \pm\infty x→±∞,导数趋近于0。 -
链式法则
在反向传播中,梯度通过链式法则逐层传递:
∂ L ∂ w 1 = ∂ L ∂ w n ⋅ ∏ i = 2 n ∂ h i ∂ h i − 1 \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial w_n} \cdot \prod_{i=2}^n \frac{\partial h_i}{\partial h_{i-1}} ∂w1∂L=∂wn∂L⋅i=2∏n∂hi−1∂hi
若每层的梯度值小于1,梯度会指数级衰减。
影响
- 深层网络前几层权重更新缓慢或停止。
- 导致模型难以捕捉数据中的复杂模式。
2. 梯度爆炸(Exploding Gradient)
现象
在反向传播时,梯度值逐层增大,最终导致权重更新过大,数值溢出或训练不稳定。
原因
-
不合理的权重初始化
初始权重过大,反向传播时梯度随层数增加而指数级放大。 -
链式法则
若每层梯度值大于1,梯度会指数级增长。 -
过深的网络结构
深度增加时,累乘的梯度可能引发爆炸。
影响
- 损失函数值变为NaN,无法收敛。
- 模型训练过程极其不稳定。
如何缓解梯度消失和梯度爆炸?
1. 梯度消失的解决方法
-
激活函数选择
- 用ReLU、Leaky ReLU或Swish替代Sigmoid/Tanh。
- 它们的梯度不会饱和,例如ReLU的导数是常数1(正区间)。
-
权重初始化技巧
- Xavier初始化:适用于Sigmoid和Tanh。
W ∼ U ( − 6 n i n + n o u t , 6 n i n + n o u t ) W \sim \mathcal{U}\left(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right) W∼U(−nin+nout6,nin+nout6) - He初始化:适用于ReLU。
W ∼ N ( 0 , 2 n i n ) W \sim \mathcal{N}(0, \frac{2}{n_{in}}) W∼N(0,nin2)
- Xavier初始化:适用于Sigmoid和Tanh。
-
归一化层
使用Batch Normalization来保持输入在较好的范围内。 -
使用残差网络(ResNet)
残差块通过跳跃连接缓解梯度消失。
2. 梯度爆炸的解决方法
-
梯度裁剪(Gradient Clipping)
限制梯度的最大范数:
g = g max ( 1 , ∥ g ∥ clip_value ) g = \frac{g}{\max(1, \frac{\|g\|}{\text{clip\_value}})} g=max(1,clip_value∥g∥)g -
权重正则化
添加正则化项(如L2正则化)限制权重大小。 -
优化器选择
使用具有自适应学习率的优化器,如Adam或RMSprop。 -
网络结构改进
- 减少网络深度,或者使用更合理的层设计。
- 添加残差连接或门控机制(如LSTM的遗忘门)。