本节摘要:训练不是"点了就跑、跑完看结果",而是"边跑边看、实时干预"。本节讲清监控什么(损失、学习率、梯度、显存)、怎么看训练曲线、常见异常怎么排查,以及"问题定位三步法"。
阅读完本节,你应当能够:
训练脚本跑着,你的注意力应该在哪里?盯四个指标:损失(在不在降)、学习率(是否按计划)、梯度范数(是否爆炸)、显存(会不会 OOM)。这四个指标就像汽车仪表盘——不盯着开,爆胎了才知道。
| 指标 | 看什么 | 异常信号 |
|---|---|---|
| 训练损失 | 是否下降 | 不降/上升 |
| 验证损失 | 是否过拟合 | 先降后升 |
| 梯度范数 | 训练稳定性 | 突然暴涨 |
| 显存占用 | 资源边界 | 接近上限 |
第一步 看损失曲线:判断是收敛问题还是过拟合问题 第二步 查数据与配置:数据格式对吗?学习率对吗? 第三步 小规模复现:用最小样本复现,快速验证修复
💡 关键直觉:大部分训练异常在"小规模复现"这一步就能定位——用 100 条数据跑一轮,几秒钟出结果,比在大规模上干等快得多。
| 异常 | 可能原因 | 优先排查 |
|---|---|---|
| 损失 NaN | 学习率过大/数据有 NaN | 检查数据、降学习率 |
| 损失不降 | 学习率太小/数据错 | 调大学习率、查数据 |
| 显存 OOM | 批次太大/模型太大 | 降批次、用 LoRA |
| 验证不升 | 过拟合/评估错误 | 加正则、查评估集 |
| 训练超慢 | 数据加载瓶颈 | 检查数据加载器 |
第一步 降批次大小 第二步 用梯度累积(等效大批次) 第三步 降精度(fp16/bf16) 第四步 换参数高效方法(LoRA)
⚠️ 常见坑:OOM 就加大机器不是首选。按上面顺序先软件优化,多数场景降批次加梯度累积就能解决——省钱也省事。
简单:训练脚本里每步打印指标 中阶:用可视化工具看训练曲线 习惯:每轮存档检查点,出问题能回滚
检查点(checkpoint) 是训练的"存档点"——每轮保存模型权重,训练中断或效果变差时回滚到最近的存档,不用重跑。
把前面的监控手段串成一个实战场景:你第一次微调,训练到第 10 轮,训练损失几乎不动,验证损失也不动。按下面的排查顺序走:
第 1 步 看数据:打印一个 batch 的 input_ids 与 label,确认 tokenizer 没把标签当成输入、padding 是否正确 第 2 步 看梯度:梯度范数是否为 0(模型被冻结?)或 NaN(学习率过大) 第 3 步 看学习率:warmup 是否生效,实际 lr 是否真的在 1e-5 量级 第 4 步 看损失数值:如果 loss 从一开始就是恒定常数,多半是 标签配错或 loss 计算方式错误 第 5 步 最小复现:用 10 条数据、1 个 batch 跑通,排除代码 bug
90% 的"loss 不降"不是优化器问题,而是数据与代码问题:标签错位、padding 错、模型被意外冻结。所以排查顺序永远是"先数据、后代码、再超参"——用最小复现把变量一个个隔离,比盯着曲线空想高效得多。这也是 3.4 节强调梯度范数要进日志的原因:它把"数据错"(梯度正常但 loss 高)和"代码错"(梯度为 0 或 NaN)一眼区分开。
第 3 章完结。第 4 章看实战——图像、NLP、跨领域、工业界四大案例。