✨ 复制成功!

以文会友,打造好学人设!

📋 已复制到剪贴板:

如何缓解训练中的梯度爆炸和梯度消失?

创建时间:2026-08-29 更新时间:2026-08-29 阅读次数:1009 次

如何缓解训练中的梯度爆炸和梯度消失

梯度爆炸和梯度消失是深度神经网络训练中的两大核心障碍,尤其在循环神经网络(RNN)和很深的前馈网络中尤为突出。

要缓解这两个问题,需要从模型结构设计权重初始化归一化策略激活函数选择以及优化器与梯度裁剪等多个维度协同入手。

以下是系统性的解决方案:

一、从根源入手:权重初始化

如果初始权重过大,前向传播信号会迅速增大,反向传播梯度会爆炸;如果初始权重过小,信号和梯度则会消失。

1. Xavier / Glorot 初始化

  • 适用:Sigmoid、Tanh 激活函数。
  • 原理:根据输入和输出神经元的数量来动态调整权重的方差,使得前向传播和反向传播的信号方差保持一致。
  • 公式

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

2. He 初始化

  • 适用:ReLU 及其变体(Leaky ReLU, PReLU)。
  • 原理:考虑到 ReLU 在负半轴为 0 的特性(会丢失一半的方差),He 初始化将方差放大了一倍。
  • 公式

$$W \sim N\left(0, \sqrt{\frac{2}{n_{in}}}\right)$$

二、直接阻断:梯度裁剪

这是处理梯度爆炸最直接、最有效的技术。当梯度的范数超过设定的阈值时,强制将其缩放到阈值大小,防止参数更新步长过大。

在 PyTorch 中,通常实现为 clip_grad_norm_

import torch

# 在 loss.backward() 之后,optimizer.step() 之前调用
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
  • 适用场景:RNN / LSTM 训练(几乎必用)、Transformer 训练初期、GAN 训练。
  • 常用阈值:$1.0$ 或 $5.0$,根据梯度范数的统计量调整。

三、架构创新:让梯度"走捷径"

传统网络是逐层传递的,梯度在传递过程中会不断连乘。如果给梯度开辟一条"高速公路",就能有效缓解消失。

1. 残差连接

由 ResNet 提出,是解决深层网络梯度消失的里程碑技术。

$$H(x) = F(x) + x$$

即使 $F(x)$ 的梯度很小,输入 $x$ 的梯度也能通过捷径(Shortcut)无损地传回前层。这使得训练几百层甚至上千层的网络成为可能。

2. 跳跃连接

如 DenseNet,将前面所有层的输出直接连接到后面层,最大程度地促进梯度流动和特征复用。

3. 门控机制

LSTM(长短期记忆网络)GRU(门控循环单元) 通过输入门、遗忘门和输出门控制信息的流动。门控机制使得网络可以学习何时"记住"或"忘记"信息,有效避免了 RNN 在长序列上训练时的梯度消失问题。现代 Transformer 架构也普遍使用门控(如 GLU 变体)。

四、稳定分布:归一化技术

归一化层能让每一层输入数据的分布保持稳定,避免落入激活函数的饱和区(导致梯度消失)或数值过大(导致爆炸)。

1. 批归一化

  • 作用:对每个 mini-batch 的特征进行归一化(均值为 0,方差为 1),再进行缩放和平移。
  • 效果:极大缓解了内部协变量偏移,允许使用更大的学习率,并起到一定的正则化作用。
  • 局限:对 batch size 敏感,不适用于 RNN 或 NLP 任务(因为序列长度不一)。

2. 层归一化

  • 作用:在单个样本的特征维度上进行归一化,与 batch size 无关。
  • 效果:Transformer 架构的标准配置,在 NLP 和现代视觉模型(ViT)中表现极佳。

五、激活函数选择:避免饱和区

传统的 Sigmoid 和 Tanh 在输入值很大或很小时,导数趋近于 0,容易引起梯度消失。

1. ReLU 及变体(解决消失)

  • ReLU:$f(x)=\max(0, x)$。在 $x>0$ 区间导数恒为 1,解决了正区间的梯度消失问题。
  • 缺点:存在"神经元死亡"问题(如果输入恒为负,梯度永远为 0)。
  • 改进Leaky ReLU($f(x)=\max(0.01x, x)$)、PReLU(斜率可学习)、ELU(负半轴平滑)。

2. GELU / Swish(现代标准)

在 Transformer 和大模型中广泛使用,比 ReLU 更平滑,允许较小的负梯度流通。

六、优化器与学习率策略

1. 自适应优化器

Adam/AdamWRMSProp 会针对每个参数自动调整学习率。即使某些参数的梯度很大(爆炸风险)或很小(消失风险),优化器也会通过除以历史梯度的二阶矩(方差)来平衡更新步长。

2. 合理的初始学习率与 Warmup

  • 在训练初期(前几百步)使用极小的学习率进行预热,可以有效防止因初始随机权重导致的梯度爆炸。
  • 学习率过大是导致梯度爆炸的常见诱因,使用 Warmup 后逐步增大到预设值。

总结:实战中的策略选择

问题场景 推荐策略 优先级
训练 RNN/LSTM 梯度裁剪 + LSTM门控机制 极高
训练深层 CNN(>50层) 残差连接 + He 初始化 + 批归一化 极高
训练 Transformer 层归一化 + 残差连接 + AdamW + Warmup 极高
出现 Loss 变为 NaN 梯度裁剪 + 降低学习率 + 检查权重初始化 极高
浅层网络几乎不更新 残差连接 + 换用 ReLU/Leaky ReLU
GAN 训练不稳定 梯度裁剪 + 谱归一化

通用且优先检查的三件事:

  1. 加残差:如果网络很深,把卷积块或全连接块改成残差块。
  2. 加归一化:在每层激活函数之前加入 BN 或 LN。
  3. 加裁剪:在反向传播后,更新参数前,加上梯度裁剪,防止意外爆炸。

📌 面试天下网:一款服务于大一新生的口袋书,让大家在无聊的公共课上可以学习大模型技术!
📌 网站公告:人人都需要的干眼克星上线啦>>>>>>
📌 网站公告:程序出海:中国程序员当下最大的机遇>>>>>>
📌 网站公告:程序员都应该掌握的快速学习法>>>>>>

评论专区

评论加载中...