核心要点
主要对治梯度爆炸:当梯度范数过大时按比例缩放回阈值内,防止参数更新发散
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 尖峰。
常见误区
⚠️ 常见踩坑
梯度裁剪治爆炸而非消失,二者机理相反;阈值过小会限制有效学习、拖慢收敛,过大则形同虚设,需结合 loss 曲线调整。
追问
追问 1:clip-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 导出