如何处理梯度消失与梯度爆炸?
未标记
考查重点:梯度传播与数值稳定。监测梯度范数与非有限值,检查数据、初始化和学习率;残差/归一化改善传播,裁剪控制爆炸但不自动治消失
本题目录
参考答案
核心回答
梯度消失或爆炸来自反向传播时多个局部导数或Jacobian连乘,使梯度过小或过大。Transformer通过残差路径、归一化、合适初始化、注意力缩放及学习率策略改善稳定性,但没有一种结构能保证训练永远不出问题。实际应同时检查梯度范数、非有限值、参数更新幅度、异常数据和混合精度状态。
梯度裁剪主要限制过大梯度,不能把已经消失的梯度恢复出来;降低学习率控制参数更新步长,也不等于直接改变当前反向求出的梯度。
机制如何理解
一条简化标量链若每层局部导数都是0.5,经过20层乘积约9.54×10⁻⁷;若都是2,则约1.05×10⁶。真实网络是矩阵乘积,还与方向和奇异值有关,不能只看单个权重是否大于1。
残差块y=x+F(x)的局部导数是I+J_F,提供较短的梯度通路,缓解深层优化困难,但仍可能放大或抵消。归一化与初始化控制激活和梯度尺度;Pre-LN常让深层训练更稳定,具体仍取决于结构和训练配方。
注意力中除以√d_k,是为了在常见独立、零均值、单位方差假设下把点积方差维持在较合理尺度,减少softmax过度饱和。这针对注意力logits,并不是对全部梯度异常的通用裁剪。
怎样处理与定位
梯度过大或Loss突然异常:定位首个出现Inf/NaN的激活、Loss或梯度,检查异常样本、掩码、除零、指数溢出及过大的学习率。对有限梯度可做全局范数裁剪:
g_new = g × min(1, c / ||g||)
梯度范数为0时保持原值,不进行除法。例如g=(3,4)、范数5,阈值c=1时缩放为(0.6,0.8),方向不变、范数为1。阈值按任务和观测选择;已经出现非有限值时,应处理原因而非指望裁剪自动修复。
梯度长期很小:检查参数是否被冻结、是否进入优化器、计算图是否被切断、有效标签是否全被忽略,以及激活饱和和网络尺度。参数没更新不一定是数学意义的梯度消失,可能根本没有得到梯度。
混合精度问题:FP16下可用合适的Loss Scaling缓解数值下溢,并在反缩放后检查和裁剪;BF16指数范围较大,也不代表不会出现Inf/NaN。记录逐层梯度统计、裁剪频率与真实更新幅度,再通过验证集确认调整有效。
追问:加了残差和LayerNorm,还需要warmup吗?
可能需要。warmup限制训练初期的更新幅度;归一化位置会影响初始化时的梯度尺度。某篇论文在特定Pre-LN设置可去掉warmup,不等于所有模型、优化器与数据都能照搬。
对应教程
- 30-模型训练原理与高效微调:先分清梯度、优化器和学习率,再理解数值精度与训练稳定性。
参考资料
- 国内:zero2Agent:Transformer梯度稳定性:残差、归一化、初始化、缩放及裁剪的分析,提供了定位梯度消失与梯度爆炸的不同排查方向。
- 国内:wdndev:激活函数:参考激活饱和对梯度的影响,补充正文中梯度长期很小时对激活与网络尺度的检查。
- 国内:Xiong等 / 中科院、北京大学等:On Layer Normalization in the Transformer Architecture:借鉴 Pre-LN、Post-LN 在初始化时的梯度尺度分析,解释正文中归一化位置与 warmup 对稳定性的作用及适用条件。
- 国外:Pascanu等 / Université de Montréal等:On the difficulty of training recurrent neural networks:依据梯度连乘与全局范数缩放,解释正文中梯度异常的来源及裁剪保持方向、限制范数的计算过程。
- 国外:Vaswani等 / Google:Attention Is All You Need:参考缩放点积与学习率预热的设计,解释正文中注意力 logits 尺度与训练初期更新幅度的稳定性机制。
相关面经
2 篇收录题集
PyTorch 实现与追问
- 题目来源
- Devinterview 其中第 85—146 题的题目索引来自 Devinterview,答案由 AIMLInterviews 重新撰写;原文的 50 题补充部分在此收录为 62 道,含拆分追问。
训练、数据与模型优化:从数据清洗到 LoRA
深度学习基础汇编
展开其余 5 条原题
过拟合与欠拟合 另外,请说明BN和LN的区别及适用场景,以及梯度爆炸问题、残差连接和模型参数初始化的相关内容。
