M04:从 loss 与 gradient 症状定位训练故障
训练诊断不是看到 loss 异常就猜原因,而是联合观察损失、梯度、参数更新、输入数据和实现状态,逐步排除故障。
内容类型:预习教材(不代表已完成)
日期:2026-08-27
阶段:P1 · AI Model Engineering 90
周次:W1 · 张量、梯度、autograd
节奏:周四案例与连接
状态:教材已备;学习未完成
标签:训练诊断、梯度累积、学习率、激活饱和、数据质量
一句话定义
训练诊断不是看到 loss 异常就猜原因,而是联合观察损失、梯度、参数更新、输入数据和实现状态,逐步排除故障。
学习目标
- 区分忘记清梯度、学习率过大、激活饱和和数据错误的典型信号。
- 学会建立“症状 → 假设 → 最小验证”的诊断表。
- 理解相似曲线可能来自不同根因,不能只看单一指标。
- 能设计一个只改变单因素的小实验。
核心知识
PyTorch 默认累加梯度。若训练循环忘记在正确位置清梯度,第 n 步使用的可能是前多步梯度之和,更新幅度逐渐失控。典型线索包括梯度范数随 step 异常增长、相同 batch 重复训练仍出现不合逻辑的更新,但具体曲线也取决于梯度方向,不能把“loss 爆炸”当作唯一症状。
学习率过大意味着局部下降方向正确,步幅却跨过低谷,loss 可能振荡、突然发散或出现非有限值;过小则表现为曲线缓慢、参数更新相对参数尺度极小。观察 update-to-weight ratio 比只看学习率数字更有意义,因为不同模型和参数组尺度不同。
sigmoid/tanh 在输入绝对值较大时进入饱和区,局部导数趋近零,前层梯度可能消失。ReLU 也可能因长期位于负区间形成“死亡单元”。数据错误包括标签错位、单位不一致、归一化遗漏、padding 被当成有效 token、训练/验证处理不一致等;它们可能让训练 loss 看似正常,却破坏验证或业务行为。
机制与诊断路径
建立最小观测集:batch 输入范围与标签分布、当前 loss、各层梯度范数、参数范数、更新范数、是否出现 NaN/Inf。随后每次只验证一个假设:
- 清梯度假设:固定一个 batch,对比每步清零与不清零的梯度序列。
- 学习率假设:保持其他条件不变,仅把学习率按数量级缩小。
- 饱和假设:查看激活分布及其导数有效区间,或换用非饱和输入尺度。
- 数据假设:直接打印少量原始样本、变换后样本、标签与 mask 对齐关系。
诊断顺序通常先查数据和实现不变量,再查超参数,最后才扩大模型。因为错误数据上的大模型只会更快拟合错误。
最小观察步骤
- 为同一个极小模型准备固定 batch 和固定初始参数。
- 设计四个独立变体:不清梯度、极大学习率、饱和激活输入、标签打乱。
- 每个变体只计划记录 loss、gradient norm、update norm 和一项数据检查。
- 在运行前先写出预期症状,运行后再填写实际观察,禁止倒推故事。
- 汇总为“现象—可能原因—区分实验—修复动作”四列表。
常见误区
- loss 不下降就立刻加深模型,忽略标签与预处理。
- 用一次随机运行判断根因,没有固定 seed 和初始状态。
- 只看总梯度范数,漏掉某一层全零或异常大的局部问题。
- 梯度裁剪后曲线稳定就认为根因消失;裁剪可能只抑制表面症状。
- 把训练 loss 低等同于数据正确、泛化良好或决策成本低。
场景连接
AML 数据常有金额单位、时间窗口、标签延迟和样本选择问题。若模型效果异常,先核对“交易发生时是否已知该特征”和“标签是否晚于决策时点”,往往比调学习率更关键。
自检问题
- 忘记 zero-grad 为什么不一定从第一步就立刻爆炸?
- 如何区分学习率过大与标签随机造成的 loss 不降?
- 哪些观测能支持“激活饱和”而不仅是猜测?
- 为什么一次只改变一个变量有助于形成因果判断?
专业课程对齐
- Stanford CS231n:对应神经网络训练、参数更新与训练过程诊断。重点关注 loss 曲线、激活分布、梯度量级和学习率之间的联系。
- Stanford CS229 Materials:对应偏差—方差、优化和正则化,用于区分“没优化好”与“泛化不好”。
- PyTorch Tutorials:对应标准训练循环,核对
train/eval、梯度清零、反传和更新的正确顺序。
深入学习提示
先精读 CS231n 的训练诊断思路,再用 PyTorch 官方循环逐行建立观测点,最后选读 CS229 的偏差—方差材料。应同时观察训练/验证损失、梯度范数、参数更新比、激活饱和比例和预测分布;单一 loss 无法定位故障。公式上比较更新尺度 η‖g‖/‖w‖,理解学习率过大与梯度爆炸虽都造成剧烈更新,但根因不同。反例包括:训练损失下降而验证恶化、准确率不变但概率逐渐校准、忘记 model.eval() 使验证抖动、标签泄漏带来异常完美曲线。诊断顺序应从数据与目标、前向输出、梯度、更新,再到泛化,不先靠更复杂模型掩盖问题。
学后填写区
- 我的症状—原因表:____
- 运行前预测:____
- 实际观察(未运行可留空):____
- 最先会检查的不变量:____
- 实际学习日期与用时:____