训练监控与诊断
本节定位
很多训练失败并不是“模型不够强”,而是:
- 数据有问题
- 学习率不对
- 训练过程在悄悄崩
所以训练时最关键的能力之一不是“会开训”,而是:
看得懂训练过程到底出了什么问题。
学习目标
- 理解训练监控应该看哪些关键信号
- 学会区分过拟合、欠拟合、学习率异常等常见问题
- 通过可运行示例建立训练曲线诊断直觉
- 学会把问题定位到数据、优化器或模型结构层
先建立一张地图
如果你已经学过训练循环和调参,这一节最自然的续接就是:
- 训练循环告诉你“怎么训”
- 调参告诉你“先调什么”
- 这一节开始回答“训坏了时到底先查什么”
所以训练诊断不是补充阅读,而是训练工程里最核心的排障能力之一。
训练诊断最适合新人的方式不是“靠经验猜”,而是先把问题拆成几层:
这个顺序会让你少走很多弯路。
一个更适合新人的总类比
你可以把训练诊断理解成:
- 医生先看体征,再判断病因
如果你一看到 loss 不对就立刻换模型,
就很像:
- 还没量体温就先换整套治疗方案
更稳的方式通常是:
- 先看现象
- 再做初步归类
- 最后再定位真正根因
一、为什么训练诊断这么重要?
1.1 因为训练失败很少会直接报“真正原因”
你更常看到的是:
- loss 不降
- 验证集突然变差
- 准确率卡住
但这些只是现象,不是根因。
1.2 真正的诊断要回答
- 是学习率问题?
- 是数据问题?
- 是过拟合?
- 还是模型容量不够?
1.3 这节最值得先记的,不是故障名称,而是什么?
最值得先记的是:
训练现象和根因不是同一个东西。
比如:
loss 不降只是现象- 真正根因可能是学习率、标签、梯度、数据分布、模型容量
一旦你把“现象”和“根因”分开,排障会理性很多。
二、先看一个最常见的诊断入口:训练曲线
history = [
{"epoch": 1, "train_loss": 0.95, "val_loss": 0.98},
{"epoch": 2, "train_loss": 0.72, "val_loss": 0.81},
{"epoch": 3, "train_loss": 0.51, "val_loss": 0.79},
{"epoch": 4, "train_loss": 0.35, "val_loss": 0.92},
]
for row in history:
print(row)