从 0 理解梯度消失与梯度爆炸

以下内容由AI辅助生成

一、训练神经网络到底在做什么

训练神经网络,本质只有一件事:

不断微调参数,使模型输出更接近真实目标。

参数该往哪个方向调、调多大力度,完全由梯度决定。

如果梯度能够稳定传播,模型就能学习;
如果梯度在传播过程中衰减或失控,训练就会失败。


二、什么是梯度(不涉及神经网络)

1. 变化率的直觉理解

考虑函数:

发生微小变化时, 的变化量取决于当前位置。

  • 附近, 增加 0.01, 约增加 0.02
  • 附近,同样增加 0.01, 却增加约 0.2

这说明:
同样的输入变化,在不同位置,对输出的影响不同。


2. 导数的定义

这种“对变化的敏感程度”,就是导数。

数学上,导数的定义为:

:

: 在单变量函数中称为导数,在多变量函数中,所有偏导数组成的向量称为梯度。


三、梯度在训练中的作用

1. 参数是如何被更新的

设一个最简单的模型:

定义损失函数:

训练的目标是让损失 变小。


2. 梯度下降规则

参数更新公式为:

其含义是:

  • 梯度大 → 参数调整幅度大
  • 梯度小 → 参数调整幅度小
  • 梯度为 0 → 参数不再更新

梯度决定了模型是否还能继续学习。


四、神经网络中的梯度从哪里来

1. 神经网络是复合函数

多层神经网络可以表示为函数嵌套:

损失函数是


2. 反向传播的本质

反向传播使用链式法则计算梯度:

也就是说:

梯度是多个导数的连乘结果。


五、梯度消失:为什么“传不到前面”

1. 连乘导致的数值衰减

假设每一层反向传播的导数约为 0.5:

  • 10 层:

  • 50 层:

梯度几乎为 0。


2. 对训练的影响

  • 输出层附近仍能更新
  • 输入层附近梯度趋近于 0
  • 参数几乎不发生变化

这称为梯度消失(Vanishing Gradient)


六、梯度爆炸:同一机制的反面

1. 连乘导致的数值放大

若每一层导数约为 1.5:

  • 10 层:
  • 50 层:

2. 对训练的影响

  • 参数更新幅度极大
  • 损失函数变为 NaN 或 inf
  • 数值溢出,模型发散

这称为梯度爆炸(Exploding Gradient)


七、激活函数为什么会深刻影响梯度

1. 激活函数的作用

如果每一层只有线性变换:

多层叠加后仍等价于一次线性变换,模型表达能力有限。

因此神经网络必须引入非线性激活函数


2. 激活函数在反向传播中的角色

在反向传播过程中,每一层梯度都会乘上激活函数的导数:

激活函数的导数直接决定梯度是被缩小,还是能够稳定传播。


3. Sigmoid:典型的饱和型激活函数

函数形态:

1
2
3
4
5
6
y
1 | ________
| /
| /
0 |______/____________ x
-∞ 0 +∞

形态特征:

  • 输出值域在 (0, 1) 之间
  • 两端逐渐变平,存在明显饱和区
  • 当输入绝对值较大时(如 ),函数几乎不变化
  • 在饱和区内,导数接近 0
  • 最大导数出现在 处,值为 0.25

多层连乘后,即使在最佳位置,导数也只有 0.25,梯度迅速衰减,极易出现梯度消失。


4. ReLU:非饱和激活函数

函数形态:

1
2
3
4
5
6
y
|
| /
| /
0 |______/____________ x
-∞ 0 +∞

形态特征:

  • 负区间输出恒为 0()
  • 正区间保持线性增长()
  • 正区间内导数恒为 1
  • 负区间内导数恒为 0

优点: 梯度在正区间不会被缩小,更适合深层网络。

缺点: 负区间梯度为 0,可能导致“神经元死亡”问题(Dead ReLU),即某些神经元永远不会被激活。


5. GELU:平滑的非饱和激活函数

函数形态:

1
2
3
4
5
6
y
| /
| /
| __/
0 |____/______________ x
-∞ 0 +∞

形态特征:

  • 整体趋势类似 ReLU
  • 负区间平滑过渡,而非硬截断(允许小的负值通过)
  • 附近是光滑可导的
  • 同时保持梯度稳定与函数连续性
  • 避免了 ReLU 的“神经元死亡”问题

因此在 Transformer 等现代深层模型中被广泛采用。


6. 激活函数对梯度的整体影响

  • Sigmoid / Tanh: 饱和型激活函数,导数最大值为 0.25(Sigmoid)或 1(Tanh),在饱和区导数接近 0,易导致梯度消失
  • ReLU: 非饱和激活函数,正区间导数恒为 1,但负区间导数为 0,可能导致神经元死亡
  • GELU / Swish: 平滑的非饱和激活函数,结合了 ReLU 的优点并避免了硬截断,在深层网络中表现更好

八、梯度消失与爆炸的本质

梯度问题并非偶然,而是反向传播机制的必然结果:

  • 小于 1 的数反复相乘 → 梯度消失
  • 大于 1 的数反复相乘 → 梯度爆炸

问题与网络深度、激活函数和结构设计强相关。


九、常见解决思路

针对梯度消失:

  • 使用非饱和激活函数(如 ReLU、GELU)代替 Sigmoid、Tanh
  • 引入残差连接(ResNet),为梯度提供直接的反向传播路径
  • 使用批归一化(Batch Normalization)或层归一化(Layer Normalization)稳定数值尺度
  • 适当的权重初始化(如 Xavier、He 初始化)使初始梯度保持在合理范围

针对梯度爆炸:

  • 梯度裁剪(Gradient Clipping),限制梯度的最大范数
  • 降低学习率
  • 使用权重正则化(如 L2 正则化)
  • 批归一化同样有助于防止梯度爆炸

十、总结

梯度消失是信号衰减问题,
梯度爆炸是信号放大失控问题。

深度学习模型结构的演进,本质上是在解决同一个问题:
如何让梯度稳定、完整地传回去。