2.2 泛化能力:过拟合与欠拟合


2.2 泛化能力:过拟合与欠拟合

本节摘要:训练集上损失不断下降,不等于模型就会用。本节讲清过拟合与欠拟合的判据、导致的偏差方差权衡,给出"看两条误差曲线差值"的诊断法,并预告正则化、数据扩充、早停等处置出口。

上一节造好了反向传播这台引擎,但引擎再准,也可能练出一台"只会背参考答案、不会做新题"的机器。本节把镜头转向泛化:如何判断模型是真懂了,还是只是在训练数据上死记硬背。它承上启下——是第1章"损失低不等于好"那盆冷水的展开,也为下一节正则化开出药方。

训练成绩单和新场考试是两码事

判断泛化,核心看两笔账:训练集上的误差(背题效果)和它没见过的测试集上的误差(真本事)。两者放在一起,形态就清楚了:

  • 欠拟合:连训练集都不熟,训练误差高企。多半是模型容量太小、特征没喂够,或者训练没到位。它的特征是"训练和测试一起差"。
  • 过拟合:训练误差近乎完美,测试误差却明显变差——训练和测试之间的那道鸿沟就是"背题"的证据。模型把训练集里的噪声和巧合也学进去了,换新题就露馅。

一句话记法:欠拟合是不会背,过拟合是只会背。前者愁能力,后者愁迁移。

为什么越聪明越容易跑偏

模型容量越大、参数越多,对数据"记得越细"。如果样本量和信号都撑不起这么大的容量,网络就会用"记住每个训练点的细节"来投机取巧,而不是抽出真正可迁移的规律。反之容量太小,连主干规律都装不下。于是"容量"是把双刃剑:太小欠拟合,太大过拟合,中间那个甜点区域才是泛化最好的区间。这就是机器学习里常说的偏差方差权衡——太简单的模型高偏差、低方差,太灵活的模型低偏差、高方差,两边都不香。

怎么诊断:盯住两条曲线的差值

诊断不需要高深工具:把训练损失和验证损失画在同一条轴上,一路观察。最理想的形态是两者都缓缓下降并靠拢;一旦验证曲线掉头向上、训练曲线还在往下冲,就是过拟合的标志——那一刻你已经在"背题"了。验证集的作用,正是当一台"裁判",让我们在模型还没见过的新题上诚实评估,而不是拿训练成绩自吹。

选验证集要注意别污染:测试集应当只在最后用一次,平时反复用就会"反向拟合"到它上面。所以要准备独立的三份——训练、验证(调参挑模型)、测试(最终一锤定音)。

五种常用的处置出口

发现过拟合,手段大致能归为五类,各有各的适用面:

症状 首选手段 备注
数据太少撑不起容量 加大数据、做数据增强 最治本,见第7章
网络太大 降容量、减层减宽 简单粗暴
参数太自由 L1/L2、Dropout 正则 下一节细讲
训练太久 早停(validation 不再降就停) 在 2.4 配合学习率
单模型不稳 集成、交叉验证 更贵但更稳

写代码对照一下"高容量多项式"是如何把噪声一并记住的:

import numpy as np rng = np.random.default_rng(1) xs = np.linspace(0, 2, 30) y_truth = 1 + xs - xs ** 2 y = y_truth + rng.normal(0, 0.12, size=len(xs)) # 真实含噪声的训练点 low = np.polyfit(xs, y, 1) # 简单模型 high = np.polyfit(xs, y, 12) # 高容量模型 print("一次多项式|训练均方误差:", round(np.mean((np.polyval(low,xs)-y)**2),4)) print("十二次多项式|训练均方误差:", round(np.mean((np.polyval(high,xs)-y)**2),4))

十二次多项式几乎把每个训练点都扳到自己曲线上,训练误差小得漂亮;可一旦拿到新样本,它那抖得不成样的曲线会错得离谱——这正是"背题"的活标本。低次模型训练误差稍高,但规律抓得更稳。

别把验证指标当回事到走火入魔

除了准确率这种直观数字,评估还要看场景。类别极不均衡时,准确率会被多数类带偏,这时候召回率、精确率、F1、AUC 这类指标才靠谱(2.4 里会专门列一张评估指标清单)。而且调参时盯的是一个从验证集采来的估计,天生带方差——与其追求小数点后两位的通透,不如接受"略糙但稳健"的分。

欠拟合的那一侧,也别只会加复杂度

前面大半篇幅在讲过拟合,但实际项目里欠拟合同样常见,尤其在你刚换一个更难的任务、或把模型容量压得太狠时。症状是训练和验证误差都居高不下、难以下探。此时若是急着往上堆正则化反而帮倒忙——做上保险要先看"是不是病人还没吃饱"。诊断顺序应当反过来:先确认容量够不够、特征有没有喂全、训练跑没跑到位,再谈是不是该上约束。很多人一看到"误差高"就无脑加数据或加层,其实最省力的第一步是先看一眼损失曲线是否还有明显下降空间,以及 batch size、学习率是不是定的太保守让网络压根没动起来。

一句话框住分寸:过拟合是"练过头",欠拟合是"没练够"。对症下手,别拿治过拟合的方子去治欠拟合,也别反向操作。真到分不清是哪种时,就同时盯住训练集和验证集两条曲线一起看——训练集都高,必然不是过拟合这条赛道的病。

一个拿来即用的排错顺序

遇到"模型效果差"的通用排查次序,可以按下面三步走:第一,看训练损失是否降得动——若一动不动,查学习率和初始化,多半是"没练够";第二,若训练降得好但验证差,那才是过拟合的苗头,开始上数据增强、降容量、正则、早停;第三,若两者都降不动,回填容量与特征,别再死磕正则。把这个顺序刻在脑子里展开排错,比拿着指标瞎调有效得多。

早停:让迭代也学会收敛

早停是过拟合防线里最"白送"的一招:训练中每跑几个 epoch 就在验证集上算一次指标,一旦验证集不再变好就停止训练。它的妙处是几乎不改变模型结构,只是砍掉过拟合后期那段"背题"的浪费。工程里常配合"保存最佳验证分数的权重"一起用——宁可任何时候都留着跑得最好的那一版,也别让它继续在验证集上往坏里跑。早停和正则化(2.3)并不冲突:前者管"何时停",后者管"怎么约束",两者加在一起往往比单用一种更稳。

本节要点回顾

  • 欠拟合是不会背,过拟合是只会背,看训练/测试误差差来判断
  • 容量是把双刃剑,太小高偏差、太大高方差,甜点区最好
  • 诊断盯差值:验证曲线掉头向上即过拟合警报
  • 五类出口:加数据、降容量、正则化、早停、集成
  • 测试集只能最后用一次,评估指标要按场景挑

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U