核心要点

  • 主要对治梯度爆炸:当梯度范数过大时按比例缩放回阈值内,防止参数更新发散

  • Clip-by-norm(最常用):整体梯度向量范数超过 max_norm 时等比缩放,保留方向

  • Clip-by-value:逐元素截断到 [-c, c],会改变梯度方向,较少用

  • RNN/LSTM 与 Transformer 训练常配置,阈值(如 1.0)作为超参数调

标准回答

解决的问题

深层或循环网络在反向传播时,梯度可能逐层连乘而指数级放大(梯度爆炸),导致更新步长极大、loss 跳变甚至变 NaN。梯度裁剪在更新前给梯度设一个"上限",把过大的梯度拉回安全范围,从而稳定训练。

两种方式

  • 按范数裁剪(clip-by-norm):计算所有参数梯度拼成的全局范数 ||g||,若超过阈值 max_norm,则乘以 max_norm/||g|| 等比缩小。保留梯度方向,最常用。
  • 按值裁剪(clip-by-value):把每个梯度分量截断到 [-c, c]。实现简单但会改变方向,使用较少。

适用场景

RNN/LSTM 处理长序列时极易梯度爆炸,几乎必配裁剪;Transformer 大模型训练也常用 max_norm=1.0 之类设置防止 loss 尖峰。

注意:裁剪只压制爆炸,不能解决梯度消失——后者要靠门控结构(LSTM/GRU)、残差连接、合适初始化与归一化

常见误区

⚠️ 常见踩坑

梯度裁剪治爆炸而非消失,二者机理相反;阈值过小会限制有效学习、拖慢收敛,过大则形同虚设,需结合 loss 曲线调整。

追问

追问 1clip-by-norm 和 clip-by-value 该如何选择?

优先 clip-by-norm,它整体缩放保留梯度方向、对训练动态更友好,是 PyTorch/框架默认推荐;clip-by-value 会逐维截断改变方向,仅在特定需求(如限制单参数更新幅度)下使用。

追问 2裁剪应该在优化器更新前还是后做?

在反向传播得到梯度之后、optimizer.step() 之前裁剪。若用混合精度,需先 unscale 还原真实梯度再裁剪,否则阈值会被 loss scale 扭曲。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。

🛠️ AI 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出