大模型通识 / AI 理论基础
9. 学会与背会有什么区别:泛化、过拟合与分布变化
原文备份 · 第 10 / 14 篇 · 查看极客时间原知识库 ↗
本篇目录 · 9 节
来源:AI 理论基础
你的复习助手终于能给笔记分类了。开发时反复使用的 60 篇笔记,它全部分对。于是你换上 20 篇没有拿来训练的新笔记,结果只分对 14 篇。
100% 变成 70%,究竟发生了什么?模型可能记住了这批材料的细节,也可能依赖了一个恰巧有效的线索;新笔记还可能来自完全不同的领域。仅凭这两个数字,不能立刻确定原因,但它们已经说明:熟悉材料上的表现,不能直接当作新材料上的表现。
上一篇解释了怎样让训练损失下降。本篇接着讨论更重要的一步:这种改善能否带到真实使用中。我们会区分泛化、欠拟合、过拟合与分布变化,并给复习助手安排三组职责不同的材料。
下面的笔记数量、模型结果与分组方案都是教学构造,不是实测报告。不需要运行模型,你可以通过分组方案和小练习检查理解。
泛化:换成新样本,学到的规律还管不管用
泛化,generalization,关注模型对没有用于拟合的新样本的表现。
假设我们希望识别前端笔记和数据库笔记。模型若利用内容中与主题相关的模式,可能也能识别另一位作者的新笔记;如果它只是记住了每篇旧笔记的编号,就很难处理新编号。
“学会与背会”是帮助理解的比喻,不是在判断模型有没有人类意义上的理解。模型也可能同时记住一些样本、利用一些可迁移的规律。我们最终需要用新材料上的表现来判断哪些能力能够复用。Google:泛化、欠拟合与过拟合
这里的“新”,还要说明新到什么程度。另一篇风格相近的前端笔记,与一张模糊的手写化学笔记照片,虽然都没用于这次训练,却是很不一样的挑战。一个模型在前一种材料上表现好,不保证它能够处理后一种。
因此,评价泛化时,不能只说“测试的是新样本”,还需要说明:来自哪些人、哪些主题、哪些格式,是否接近未来打算处理的材料。
为什么降低训练损失,可能学到不可靠的线索
假设开发材料里,前端笔记都由小林整理,标题总以“前端学习”开头;数据库笔记都由小周整理,标题总以“数据库整理”开头。
模型根据标题分类,在这些材料上可以做得很好。后来你导入网页剪藏,标题只写“第六讲”,原来的线索消失,它就不一定还能正确判断主题。
这并不要求模型逐字背下训练材料。过拟合,overfitting,也可以表现为过度依赖训练样本里的偶然关系、噪声或某些局部细节,使新样本上的表现落后于训练表现。损失函数只对提供的目标计分,不会自动区分“内容规律”和“碰巧相关的标题格式”。
还要注意:标题本身不是天然的坏特征。如果真实任务就是按可靠标题路由文件,它可能很有用。问题在于,你想证明的是“能够根据笔记内容识别主题”,却只提供了通过标题就能完成的材料。训练和测试方案没有真正考查所声称的能力。
解决办法也不一定是先换更大的模型。可以先加入不同作者、不同标题格式的材料,并检查模型对去掉标题、换一种表达后的笔记是否仍然有效。这里应保持主题和标签不变,避免把测试改写成另一个任务。
三组材料,分别承担三种职责
假设已经整理了 100 篇有主题标签、彼此没有近重复的笔记,准备训练一个小分类器。可以先用下面的分配理解基本流程:
| 数据组 | 教学例子中的数量 | 主要用途 |
|---|---|---|
| 训练集,training set | 60 篇 | 计算训练损失和梯度,更新模型参数 |
| 验证集,validation set | 20 篇 | 比较方案、选择训练轮次、调整超参数 |
| 测试集,test set | 20 篇 | 方案确定后,估计其在留出材料上的表现 |
验证集通常不直接参与梯度更新,但你根据它决定使用哪个模型、什么时候停止训练,所以它已经影响了开发决策。测试集则应从这种反复选择中留出来。Google:训练集、验证集与测试集的划分
可以把三者想成三种用途:日常练习、练习后的方案比较、最后的独立检查。关键在用途,不在文件夹的名字。把参与调参的材料命名成 test,不会让它重新变成独立测试集。
训练集 → 更新参数 → 产生候选模型
↓
验证集 → 比较候选表现 → 确定模型和设置
↓
测试集 ─────────────→ 做留出检查并记录结果
60/20/20 只是便于说明的分配,不是固定最佳比例。材料很少时,还可以在开发数据内做交叉验证,让不同部分轮流承担验证角色;但选择过程与最终独立检查仍要区分。本篇不要求实施交叉验证。
看一组训练结果,什么时候该停下来
假设我们在第 1、10、100 轮各保存了一个模型版本,并用相同规则检查固定的训练集和验证集:
| 保存时的训练轮次 | 训练集分对数 | 训练正确率 | 验证集分对数 | 验证正确率 |
|---|---|---|---|---|
| 第 1 轮 | 42/60 | 70% | 13/20 | 65% |
| 第 10 轮 | 54/60 | 90% | 17/20 | 85% |
| 第 100 轮 | 60/60 | 100% | 14/20 | 70% |
如果我们预先约定以验证正确率选择候选版本,那么在这三个版本中应选第 10 轮,而不是训练正确率最高的第 100 轮。这个选择暂时不需要查看测试集。
训练表现继续改善、验证表现却变差,是值得检查过拟合的信号。第 1 轮在两组材料上都不够好,则可能还没学到足够规律,表现出欠拟合,underfitting。不过,表现不佳也可能来自训练没充分进行、输入特征不足、标签有误等原因,不能仅凭一张表就决定“把模型加大”。
第 06 篇还解释过,正确率与损失不是同一件事。若监测的是损失,也可能看到训练损失持续下降,验证损失先降后升。选择依据要事先说清,不能一会儿用正确率、一会儿用损失,只挑对当前方案有利的数字。
一种常见做法是早停,early stopping:监测验证表现,连续一段时间没有足够改善,就停止继续训练,并按约定保留或恢复验证表现较好的版本。它不是“某一轮验证损失稍微上升就立刻停止”。实现时还要明确是否真的恢复了较好的权重,停止训练本身不等于自动回到最好的一轮。Keras:EarlyStopping 的监测、等待与权重恢复
而且,这里验证集只有 20 篇,多分对一篇就改变 5 个百分点。第 10 轮只是这个小例子里按既定规则选出的版本,不能据此声称它在所有未来笔记上都稳定达到 85%。
划分前先想:哪些记录其实来自同一个东西
“把记录随机打散再分组”并非总能得到有效的独立检查。
例如,你有 10 篇长笔记,每篇切成 10 个片段,共 100 条记录。如果直接按片段随机分组,一篇笔记的开头可能进入训练集,中段进入验证集,末段进入测试集。这些片段共享术语、写法和主题;模型实际上可能已经熟悉这篇笔记。
如果想检查对新笔记的能力,应先按原始笔记分组,再把整组分配到不同用途。相似的原稿、修订版、摘要版,也需要检查是否属于高度相关的一组。若目标是服务新作者或新用户,就可能还要按作者或用户留出,而不是只按文件名分开。scikit-learn:分组划分与新主体的评估
另一种情况与时间有关。你想知道“用过去的材料开发后,下个月能否继续好用”,就应该考虑按时间安排开发和检查。把未来材料混入开发集后随机测试,回答的就不再完全是这个问题。scikit-learn:时间序列划分
第 04 篇提过数据泄漏。它不仅包括答案直接混入输入,也包括本应留出的信息参与了训练或选择。例如,用包括测试集在内的全部资料计算特征的均值和缩放系数,再声称模型完全没有利用测试信息,就不严谨。需要从数据中拟合的预处理步骤,应在相应训练材料上确定,再应用到留出材料。scikit-learn:避免预处理中的数据泄漏
这不意味着查看文件格式、检查重复项都不允许。关键是区分数据管理与利用留出结果优化方案,并如实记录哪些信息进入了开发过程。
过拟合与分布变化,为什么要分开看
假设模型在训练集、验证集和测试集上都表现不错,但上线后用户开始上传扫描件,文字识别经常出错。现在遇到的输入与原来的清晰文本不同,这属于分布变化,distribution shift的一种情形。
这里的“分布”可以先理解为:什么类型的输入经常出现,它们有什么特征,以及输入与正确结果之间有什么关系。这些条件改变,原来的评估结论就可能不再适用。《动手学深度学习》:环境与分布变化
放到复习助手中,至少有几种常见变化:
| 变化 | 对原结论的影响 |
|---|---|
| 清晰的短文本变成含识别错误的长扫描文档 | 输入质量、长度与结构发生变化 |
| 原来主要是编程笔记,后来大量出现外语和化学笔记 | 材料领域与相关模式发生变化 |
| 原来“待复习”指还没看过,后来改成最近答错过 | 标签的定义和判断标准发生变化 |
过拟合关注模型是否过度适应已有样本;分布变化关注实际面对的数据或关系是否改变。两者可以同时存在,但不能把所有上线失败都归为“背题”。即使原来泛化得很好,换了任务范围也需要重新验证。
如果扫描件失败,首先可能应该查看文字解析结果;如果标签定义变了,就要更新目标与评估标准。继续在旧材料上训练更多轮,未必能解决这些问题。
改善泛化,为什么不能只靠一种方法
确认问题以后,可以针对原因调整:补充目标场景中缺少的材料,修复标签,减少无关线索,或者改变模型与训练设置。数据数量本身不是目的,重复堆入相同来源的笔记,也不等于补齐了不同用户的写作方式。
训练中还有一类方法叫作正则化,regularization,它通过额外约束或训练设计,限制模型过度适应训练细节。例如,某些权重正则化会把对较大权重的惩罚加入训练目标,让优化同时考虑拟合样本与参数约束。它可能改善泛化,也可能在约束太强时妨碍学习,仍需验证。TensorFlow:过拟合、欠拟合与权重正则化
你现在不需要掌握一套正则化参数。先理解三种不同作用即可:补充资料是在改善学习依据,调整训练是在改变怎样学习,改善评估是在看清实际效果。评估分数变得更诚实,并不等于模型退步;它可能只是终于暴露了之前没有测到的问题。
如果只调用大模型 API,也要留出材料吗
要,但用途要说清。你没有训练模型权重,也可能反复用同一批笔记改提示词、调整资料切分、选择模型和输出格式。这批笔记已经成为应用的开发依据。
如果每次都拿那几篇试到满意,再用同一批结果宣布“复习助手很好用”,只能证明你把这些案例调好了。仍应另留一批没有参与这些决策的笔记,检查整个应用。
这里更准确的说法是应用方案对开发案例过度适应,不应因此声称底层模型权重刚刚发生了过拟合。留出的“新材料”也只是对你的开发过程而言;使用预训练模型时,若不了解其训练数据,不能保证它从未在更早阶段见过类似内容。
若查看最终测试结果后继续针对其中错误修改方案,这组材料就开始承担开发用途。修复当然有价值,但还应安排新的留出检查,或明确披露测试已参与迭代,而不是继续把旧分数当成独立证明。
对个人项目,可以先写下四行约定:准备服务哪些笔记;用哪些材料开发;哪些相关记录必须放在同一组;最终用哪些尚未参与调试的材料检查。它比只记一个“正确率 95%”更能说明结果适用的范围。
理解检查:这些结果能说明什么
- 前面的三个训练版本中,第 100 轮训练正确率最高。若预先约定按验证正确率选版本,应选择哪一轮?
- 把同一篇长笔记切成 20 段,再随机分到训练与测试中,能否直接证明对新笔记的能力?
- 模型一直能处理清晰中文文本,换成带识别错误的英文扫描件后变差,是否一定属于过拟合?
- 你没有改模型权重,只是反复根据 10 篇笔记修改提示词。最后拿这 10 篇作为独立测试,是否合适?
- 一份 20 篇笔记的测试中,17 篇分类正确,测试正确率是多少?能否把它当作未来所有材料的稳定正确率?
第 1 题: 第 10 轮,其验证正确率为 17/20,即 85%。训练集全对不自动代表对新材料更好;选择时不需要先查看最终测试集。
第 2 题: 不能直接这样判断。片段来自同一原始笔记,信息可能高度相关。若要评估新笔记,应按原始笔记分组留出,再检查近重复和其他关联。
第 3 题: 不一定。语言、格式和输入质量均发生了变化,应检查分布变化及解析流程。仅凭效果变差,不能确定模型过度拟合了原样本。
第 4 题: 不合适。这 10 篇已经影响了方案选择,可以继续作为回归检查案例,但需要其他未参与调试的材料评估泛化。没有更新权重,不代表应用评估就自动独立。
第 5 题: 是 85%。但样本少,一篇就占 5 个百分点,材料来源与覆盖范围也有限。应同时报告数量、来源与任务范围,而不是把一次小测试的比例当作保证。
现在,我们不仅知道参数怎样改变,也知道为什么必须检查这种改变能否迁移到新任务材料。下一篇换一种学习信号:如果没有逐题给出的标准答案,而是要通过行动后的奖励改进策略,模型又怎样学习?
上一篇:08|训练究竟在做什么:梯度下降、反向传播与参数更新
下一篇:10|强化学习:模型怎样从行动和反馈中改进
返回:第一部分大纲