本文目录
训练集准确率几乎满分,看上去是好消息,但还缺少最关键的信息:模型面对没见过的数据会怎样?下面直接对比三种训练结果,观察同一批样本如何导向不同表现。
三种训练结局
同一批点,模型可以学成三种样子
切换曲线,比较它对训练集与验证集的误差。数字是固定教学数据,不是某个真实模型的评测结果。
当前结局
泛化良好曲线抓住了趋势,但没有追着每一个样本点的细小波动跑。
两边误差接近且都不高,这是更想要的状态。
- 训练误差
- 0.11
- 验证误差
- 0.13
读图时先盯两条误差:训练误差和验证误差。它们同升同降、一低一高,对应的诊断完全不同。
情况一:训练集和验证集都不理想——欠拟合
欠拟合意味着模型还没有捕捉到足够的规律。它可能太简单、训练不够久,或者输入特征本身不够有信息。于是训练数据都做不好,换到验证集也不会突然变好。
验证集是训练期间不参与参数更新、专门用来检查新数据表现的数据。这时不要急着说“模型泛化差”。更准确的诊断是:它连要泛化的基本规律都还没学到。先让模型有能力把主要趋势学出来,才值得讨论它有没有背题。
情况二:两边误差都低——泛化
泛化是模型从训练样本中学到可迁移规律的能力。它不是把每个训练样本的编号背下来,而是在新样本出现时,仍能给出合理判断。
交互图中“泛化良好”的曲线没有穿过每一个点;它抓住的是点群的大方向。现实数据里会有测量误差、标注误差和偶然波动。把每一个小波动都当真,反而会损害新数据表现。
最后上线前,还会用独立的测试集做一次确认:测试集既不参与训练,也不参与“何时停训”的选择,避免验证集本身被反复调参“偷看”。
情况三:训练集近乎满分,验证集变差——过拟合
过拟合像一位把练习册答案和笔迹都背下来的学生:训练误差非常低,但换一套题就失灵。模型容量过大、数据太少、训练过久,或者数据噪声较多,都可能让它开始追逐不该学习的细节。
所以训练时通常同时看两条曲线:训练误差下降是必要信号;验证误差是否也能下降,才决定这是不是有价值的进步。常见对策包括补充和清洗数据、做数据增强、限制模型复杂度、加入正则化,以及在验证误差开始反弹时停止训练(早停)。
切换交互里的三种模式时,可以只问一个问题:曲线是在描述大趋势,还是在追逐每一个抖动点?
怎么读训练曲线,而不是只看最后一个数
单看“最终训练准确率 99%”几乎没有诊断力。更有用的是时间轴上的形状:
- 两条曲线都居高不下 → 先怀疑欠拟合;
- 两条曲线一起下降并贴近 → 泛化方向对了;
- 训练曲线继续下探,验证曲线拐头向上 → 过拟合正在发生。
早停的直觉就在这里:不是训练越久越好,而是在验证曲线开始变坏之前取一版参数。学习率、模型宽度、正则强度都会改变拐头出现的早晚;调参时改一项,就重新看这对曲线,比只比较终点分数更稳。
批量大小和 Epoch:它们不改变三种结局的定义
前面每一次前向与反向计算可以只看一个样本,也可以看一大批。实践中更常用 Mini-Batch(小批量):一次取几十到几百个样本,合并它们的梯度后更新一次参数。它比单样本更新稳定,又不像全量数据那样每一步都很慢。
当训练数据被完整走过一遍,叫一个 Epoch(训练轮次)。一个 Epoch 不是“模型已经学会”的保证:训练 100 个 Epoch,仍可能欠拟合,也可能已在第 20 个 Epoch 后开始过拟合。需要把训练集指标和验证集指标放在一起看。
批量与轮次回答的是“参数更新怎么组织”;欠拟合 / 泛化 / 过拟合回答的是“学到的规律能不能迁移”。前者是训练工程旋钮,后者是结果诊断——不要用“我已经跑了很多 Epoch”代替看验证曲线。
旁支提醒:灾难性遗忘不是过拟合
主线三种情况都发生在同一个任务上:训练数据与新数据的差距。另有一类问题会出现在继续学习时——灾难性遗忘不是过拟合。
它发生在:模型先训练任务 A,之后只用任务 B 的数据继续更新;为了适应 B 而改动的权重,可能破坏了 A 原有能力。过拟合讨论“同一任务上背题”;灾难性遗忘讨论“新任务覆盖旧任务”。两者都与参数更新有关,但对策不同:前者防噪声记忆,后者要在继续训练时保留旧任务数据或约束。
本章交互只演示同一任务的三种拟合;看到“学新任务后旧任务崩掉”,不要套用过拟合那一套早停故事,先换诊断框架。
用一张小检查单收尾
| 观察到的现象 | 优先判断 |
|---|---|
| 训练误差高,验证误差也高 | 欠拟合:先检查模型能力、特征和训练是否充分 |
| 训练误差低,验证误差也低 | 泛化良好:继续用独立测试集做最后确认 |
| 训练误差很低,验证误差明显更高 | 过拟合:模型可能记住了噪声或样本细节 |
| 学新任务后旧任务快速退化 | 灾难性遗忘:需要保留旧任务信息或加入约束 |