返回专辑
·Johan·3 分钟阅读

grad_norm spike 与 misclass grid

只看 train loss 不够——要 log lr、grad norm、val slice、GPU 利用率和样例可视化,异常通常是 loss 曲线先以外的信号。

grad_norm spike 与 misclass grid

1. 损失正常,模型已在学错东西

训练损失平稳下降,验证集某切片(夜间、小目标、某 SKU)却在第二十个 epoch 后恶化——这种信号标量 loss 曲线看不到。上次分割项目,直到按场景切片画验证 IoU 才发现「室内」在过拟合而「室外」正常。监控不能只盯一条 loss 线。

2. 必记录的标量

每步或每 N 步记录:训练损失、学习率、梯度范数(裁剪前)、GradScaler 缩放(混合精度时)、显存占用、吞吐(样本每秒)。学习率调度是否按预期变化,一眼能从曲线看出——余弦没生效、warmup 被跳过,常在这里暴露。

python
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
writer.add_scalar('train/loss', loss.item(), step)
writer.add_scalar('train/lr', optimizer.param_groups[0]['lr'], step)
writer.add_scalar('train/grad_norm', grad_norm, step)

出现 NaN 损失应立刻停训并 dump 当前 batch;梯度范数 spike 大于一百暂停查学习率和数据。Weights & Biases、TensorBoard、MLflow 均可,关键是字段固定、可跨 run 对比

3. 样例可视化:错分网格

每 N 个 epoch 固定种子抽一批验证样例,画预测叠加(检测框、分割 mask、分类 top-k)。人眼能抓到的错误模式——系统性偏移、某类全错、增广破坏标签——指标汇总常滞后。

检测项目我会固定二十张「难例」图,跨 run 对比框的变化;分类项目画混淆矩阵热力图 per epoch。可视化成本不高,但能省掉大量「调了三天才发现标签错」的时间。

4. 验证切片与告警

验证指标按切片报:场景、尺寸桶、类别、时间段。总 mAP 涨 0.5 但小目标切片掉 2 点,上线可能是负收益。告警规则示例:验证损失连续三个 epoch 无改善、某切片指标跌超阈值、梯度范数连续 spike。

训练脚本里把超参、git 提交、数据版本写进 run 元数据——三个月后复盘「那次实验用的啥」时,这比翻聊天记录可靠。

5. 与早停、checkpoint 的衔接

监控驱动早停:验证指标最优时存 checkpoint,不是最后一轮。监控也驱动调试:梯度范数在某一 layer spike,反向 hook 定位 block;学习率曲线异常,查 scheduler 绑定 step 还是 epoch。

6. 案例:切片恶化被总指标掩盖

某分类模型总准确率涨两个点,但「低光照」切片跌五个点——该场景是上线主路径。若只盯总准确率会错误上线。切片监控是业务对齐的最低要求。

7. 验收

  • 日志含 loss、lr、grad_norm、AMP scale;可跨 run 对比。
  • 固定难例可视化每 N epoch 更新。
  • 验证按切片报指标,不只看 aggregate。
  • NaN 与 spike 有自动停训或告警。
  • run 元数据含配置、提交、数据版本。

8. 落地与衔接

把监控字段固化成团队模板:训练损失、学习率、梯度范数、混合精度缩放因子、吞吐与显存占用按固定步长写入同一仪表盘。固定二十张难例图跨实验对比,发版前必须过一遍错分网格。切片指标按业务主路径设告警阈值,总指标改善但关键切片恶化时阻断合并。实验元数据绑定代码提交、数据版本与配置摘要,数月后仍能定位那次实验。新人开训第一天就应能对照模板查日志。

训练监控是发现「学错方向」的早期雷达。标量 loss 必要但不充分;切片、可视化与梯度范数才是异常的第一信号。监控契约应写进入职清单:异常先查切片与难例,而不是等总损失崩了再补字段。与早停、检查点策略共用同一验证指标定义,避免监控与选模各说各话。

← 全部文章

johan's blog