什么是过拟合
假设有个朋友在考试前一天,把习题册的答案整个背了下来。一模一样的题目出来,全都答对;可要是只改了几个数字,就一下子全垮了。因为背的只是答案,并没有弄懂原理。机器学习里也有一模一样的陷阱:模型把训练数据整个背下来,见过的题是 100 分,没见过的题却会答错。这叫过拟合。
整个背下来,训练分数满分
这里散落着一些点。模型要做的,是找一条光滑的曲线,表现出这些点底下的趋势。可要是贪心,也可以把曲线弯来弯去,让它一个不落地穿过每个点。
这样,训练点全落在曲线上,训练分数实打实是 100 分。看着完美,其实只是把点的位置背了下来。
点按钮,打开把点整个背下来的弯弯曲曲的曲线。它穿过所有的点,训练准确率变成百分之 100。
曲线精确地穿过了所有的点,训练分数成了 100 分。心情不错,可不能就此打住。真实的数据里,往往混着测量时带进来的偶然晃动,也就是噪声。
穿过所有点的曲线,不光跟住了真正的趋势,连这些噪声也原样跟了。背下来为什么是个问题,放一个新点进去马上就看出来了。
新数据一来,一下子全垮
背下来的曲线真正的考试,是一个从没见过的新点。新点和训练点来自同一个趋势,所以抓准了趋势的曲线,在新点附近也该八九不离十。
可背下来的曲线在训练点之间上下乱晃,到了新点附近,指的高度就离谱了。见过的题是 100 分,新题却偏得厉害。
点空心圆,放进一个新点。背下来的曲线在那里偏得很远,看得出它对没见过的数据很弱。
在新点上,曲线偏了一大截。在训练点上那么完美,到了没见过的点面前却毫无办法。这就是过拟合的真面目。
就跟只背答案的朋友碰上改了数字的题就垮掉一样。所以我们真正想知道的,不是训练分数,而是在没见过的数据上的分数。在没见过的数据上也能答得好的本事,叫泛化。
分成训练、验证、测试
要用没见过的数据量本事,就得事先把一部分数据分出来藏好。所以把手头的数据分成三份:大部分当训练数据,让模型学习;一部分留作验证数据,在学习途中检查进展是否顺利。
剩下的测试数据一直不碰,到最后才看一次。这样打分,才像是在模拟一场真正的新考试。
点这些点,把它们分进训练、验证、测试三个格子。三个格子都有了,就准备好用没见过的测试数据来评估了。
数据分成了三群。关键是,学习期间绝不能让模型看到测试数据。考题要是提前做过,就不再是考试了。
验证数据还用来决定什么时候停止学习。训练损失还在下降,验证损失却开始回升,说明从那时起开始死记硬背了,就停止学习。这叫提前停止。
不太简单,也不太复杂
现在来比较三个模型。太简单的模型想用一条直线了事,跟不上点画出的曲线。这叫欠拟合,是学得不够的状态。
太复杂的模型把点全背下来,对新数据很弱。介于两者之间、恰到好处的模型,抓住的不是一个个点,而是柔和地抓住贯穿整体的规律。
依次点三个模型来比较。太简单的贴合得不够,太复杂的背下来乱晃,只有恰到好处的模型在新数据上也表现好。
三个模型的差别一目了然:太简单就漏掉规律,太复杂就背下来乱晃。只有恰到好处的模型,在训练数据和没见过的数据上都表现得一样好。
好的学习不是把训练分数拉到 100 分,而是在没见过的数据上稳定地表现好。为了防止过拟合,人们还会多收集数据,或者给过大的权重加罚分。
小结
归纳起来是这样:把点全背下来的弯弯曲曲的曲线,只有训练分数是 100 分,对新点很弱,这就是过拟合。真正的理解,是抓住贯穿整体的规律。
所以把数据分成训练、验证、测试,用没见过的数据量本事。不太简单也不太复杂、恰到好处的模型,泛化得最好。
依次点要点回顾一下。(整个背下来只有训练 100 分 → 对新数据很弱 → 分成训练、验证、测试 → 用没见过的数据量真本事)
现在你知道了死记硬背和真正理解的区别。训练分数高不等于模型好,重要的是在没见过的数据面前也稳得住。
不过,要抓好规律,首先得给模型喂好的数据。收集什么数据、从中挑哪些特征放进去,会大大改变结果。这些内容,下一课讲数据与特征时来谈。