死记硬背与真正理解,过拟合
想象一个朋友,考试前一晚把习题册的答案整个背了下来。出一样的题,他全对。可一旦出一道只是数字稍微改了的新题,他就垮了。他只是背了下来,并没有理解原理。机器学习也有同样的陷阱。模型要是把训练数据整个背下来,见过的题考一百分,新题却答错。这叫过拟合。那真本事该怎么量呢?
整个背下来,训练分数就满分
这里散着一些点。
模型的活儿是找一条光滑的曲线
来解释这些点。
可要是贪心,
把曲线上上下下地弯,
让它穿过每一个点也行。
那训练的点就全在曲线上了。
训练分数实打实一百分。
看着完美,其实只是背了下来。
点按钮,打开一条把点整个背下来的弯弯曲曲的曲线。它穿过每一个点,于是训练准确率到一百分。
曲线把每个点都精准地穿过去了。
训练分数成了一百。
感觉不错,可不能就此打住。
这条曲线更接近于
单纯把点的位置背了下来。
它并没有抓住
散点之间流动的真正规律。
背下来为什么是问题,
一扔给它新题就立刻显出来。
新数据一来就垮
背下来的曲线真正的考验,
是一个从没见过的新点。
新点和训练点来自同一个规律。
所以一条光滑的曲线
本该把新点也大致猜对。
可背下来的曲线
在训练点之间剧烈起伏,
到新点附近就指向一个离谱的高度。
见过的题一百分,新题零分。
点空位放进一个新点。背下来的曲线在那儿偏得很大,露出它对没见过的数据有多弱。
在新点上曲线偏得老远。
在训练点上那么完美,
到没见过的点面前却束手无策。
这就是过拟合的真面目。
跟那个只背答案的朋友
一遇数字变了的题就垮,一模一样。
所以我们真正想知道的,
不是训练分数,
而是在没见过的数据上的分数。
分成训练、验证、测试
要用没见过的数据量本事,
就得事先把一部分数据藏起来。
所以把手上的数据分成三份。
训练数据让模型来学,
验证数据让我们在学的途中
检查走得对不对。
测试数据一直不碰,
到最后才看一次。
只有这样才能做出
模拟真正新题的评分。
点点把它们分进训练、验证、测试。三个格子均匀填满后,就准备好用没见过的测试数据来评估了。
把数据分成了三组。
关键是在学习期间
绝不把测试数据给它看。
要是把考题事先做了,
那就不再是考试了。
用训练来学,
用验证在途中把方向,
最后用测试打出真分数。
这个分数才是模型的真本事。
不太简单也不太复杂,恰到好处
现在来比较三种模型。
太简单的模型
想用一条直线就了事,
跟不上点画出的曲线。
这是欠拟合,学得太少。
太复杂的模型
把点全背了,于是对新数据很弱。
两者之间恰到好处的模型,
抓的不是一个个点,
而是柔和地抓住贯穿整体的规律。
依次点这三个模型来比较。欠拟合太直,过拟合因死背而起伏,只有恰到好处的那个在新数据上也好。
三个模型的差别一眼就看出来了。
太简单就漏掉规律,
太复杂就死背而摇摆。
只有恰到好处的模型
在训练和没见过的数据上
都均匀地做得好。
好的学习不是把分数
推到一百,
而是在没见过的数据上稳稳地做得好。
来理一理
归成一句话,是这样。
把点全背下来的弯弯曲曲的曲线,
只有训练分数一百,对新点很弱。
这就是过拟合。
真正的理解是抓住贯穿整体的规律。
所以把数据分成训练、验证、测试,
用没见过的数据量本事。
不太简单也不太复杂,
恰到好处的程度泛化得最好。
依次点要点回顾一下。(整个背下来只有训练一百 -> 新数据失败 -> 分成训练/验证/测试 -> 用没见过的数据量真本事)
现在你知道了死记和真正理解的区别。
训练分数高并不等于好。
要紧的是在从没见过的
新数据面前也不摇摆。
所以我们把数据分开,
用没见过的数据诚实地评分。
抓规律而不是死背,
这一条就是造出聪明机器
最要紧的心态。