跳到主要内容

泛化 — 这门手艺的唯一核心矛盾

这一章讲三件事: 为什么「训练误差小」不等于「模型好」; 泛化这件事到底从哪来(流形假说);以及对抗过拟合的四件工具和标准打法。 原书把这一章叫作「机器学习基础」——它是全书的理论中心: 前面五章教的每个动作,这一章给出理由;后面八章的每个技巧,都能在这一章找到户口。

1. 顶层全景

第 05 章你已经见过那个画面:训练损失一路降,验证损失第 4 轮掉头。 书里把这一现象提升为机器学习的根本问题1:

优化 ──────► 让模型在训练数据上表现更好(第 03 章的全部内容)
泛化 ──────► 让模型在前所未见的数据上依然表现好

└─ 两者在训练初期同向,过某个点之后开始互相拉扯
——这个拉扯,就是机器学习的根本问题。

图说:过拟合 = 模型开始学「仅和训练数据有关的模式」。
欠拟合 = 模型连训练数据里的模式都还没学完。

过拟合的正式定义是:模型学到的是仅和训练数据有关的模式,而不是和数据真正有关的模式2欠拟合则是另一头:还没学到家。训练的过程,就是从欠拟合走向过拟合的单程车, 最佳下车点正好在中间。

本章的主走查是书里最硬的一个实验:给 MNIST 的每张图拼接 784 维纯随机白噪声, 再和「拼接 784 维全零」的对照组比——两组的信息量一模一样(噪声和零都不含任何信息), 结果噪声组的验证精度掉了约 1 个百分点3。这个实验会成为「虚假相关性」最干净的证据。

2. 过拟合的三种来源

书里把过拟合拆成三种来源,值得逐个记住4:

① 嘈杂的训练数据。 数据本身脏(全黑的图、标错的标签),模型把脏东西的规律也学了。

② 模糊的特征。 特征和目标之间本来就没有确定关系(香蕉的「成熟」没有明确界限; 明天下不下雨有随机性),模型却硬要找出确定规律,找到的都是假象。

③ 罕见的特征与虚假相关性。 这是最值得讲的一个。书里的例子:如果「番荔枝」这个词 在训练数据里只出现在一条负面影评里,模型可能给它赋一个巨大的权重, 从此把所有提到这种水果的影评都判成负面——可客观地说,一种水果的名字哪来的情绪5? 更微妙的是:哪怕某个词在数据里出现 100 次,54% 正面、46% 负面, 这点差异也可能纯属偶然——样本不够多时,「略有倾向」什么也不能说明

回到白噪声实验:主走查全程

现在做主走查。实验设计极其简单3:

对照组 A:MNIST 784 维 + 784 维全零 ← 信息不变(零没有信息)
实验组 B:MNIST 784 维 + 784 维白噪声 ← 信息也不变(噪声同样没有信息)

结果:B 的验证精度比 A 低约 1 个百分点

图说:两组的信息量严格相等,模型精度却不同。
差别只可能是:噪声里那些「纯属巧合的规律」被模型当成了真规律。

结论:模型会认真利用噪声通道里与标签的偶然相关——这就是虚假相关性的直接证据。 应对办法叫特征选择:给每个特征算一个「有用性分数」(比如它和标签的互信息), 没用的特征直接扔掉,别指望模型自己学会忽略6

一个更极端的演示:打乱标签

书里最震撼的实验是这个:把 MNIST 的标签随机打乱再训练—— 训练损失照样一路下降,模型照样能拟合。因为只要容量够, 模型可以把「这张图 → 那个随机标签」整个背下来7:

「模型最终只会记住特定的输入,就像 Python 字典一样。」

背下来不等于会——打乱标签的模型在测试集上当然是瞎猜。 这个实验把第 1 节的矛盾钉死了:拟合能力和泛化能力是两种完全独立的能力, 前者的证据(训练损失下降)对后者零说明。

3. 泛化从哪来:流形假说

3.1 自然数据挤在一个低维表面上

既然背下来那么容易,为什么真实训练里模型不全是「活字典」? 答案在数据这一侧,叫流形假说8

先感受一下输入空间有多大:MNIST 一张图是 784 个像素、每个像素 0~255, 所有可能的输入有 256 的 784 次幂种——远远大于宇宙中的原子数。 但这里面的「有效手写数字」只占极小极小的一块:它们不是随机散布的像素组合, 而是挤在一个高度结构化的低维子空间里——随机撒一把像素,几乎不可能撒出一张像数字的图9

流形假说:所有自然数据都位于高维空间中的一个低维流形上。 (流形的正式说法:一个连续的表面,局部看近似于低维的线性空间—— 第 02 章那个揉皱的纸团就是它的画像。)这个假说有两个直接的含义10:

  1. 模型只需要拟合输入空间里那个低维子空间,而不是整个空间——学习这才变得可行;
  2. 在流形上,两个样本之间可以做插值——沿着流形从一个已知样本「走过去」, 途经的每个点都是有效样本,于是前所未见的新点也能被理解。

3.2 插值就是深度学习的泛化

插值的意思是:在两个已知点之间,沿流形连续地生成中间点—— 在数字「3」和「5」的流形上,存在一条从「3」连续变形到「5」的路径, 路径上每一点都还是一个有效数字。 (注意是沿流形走,不是走直线——把两张数字图直接做像素平均,得到的是一团糊, 不是有效数字。流形插值和父空间线性插值是两回事11。)

深度学习的泛化,就是在学到的流形上做插值。 这句话同时划出了它的边界12:

插值只能帮你理解与之前所见非常接近的事物——这叫局部泛化。 人类能做到的是另一回事:用极少的数据甚至没有数据,应对从未体验过的全新情况—— 抽象、符号模型、推理、常识——这叫极端泛化,它靠的是「理性」, 而不是「直觉和模式识别」。

这对概念(局部泛化 vs 极端泛化)是第 14 章的总纲,书里在这里埋了伏笔,我们也在这里记账。

3.3 为什么深度学习恰好擅长插值

书里的论证分两层13:

  • 梯度下降天然给出光滑曲线。 模型是一条高维光滑曲线, 训练是让它一点点弯曲、平滑地贴过训练样本;训练的中途,这条曲线大致就是自然流形的样子;
  • 架构预设让插值更简单。 深度学习适合这类数据的两个特性: 它是从输入到输出的光滑连续映射;它的架构假设(卷积的平移不变性、RNN 的顺序性) 反映了数据的真实形状。

由此推出全章最实用的一句14:

改进深度学习模型的最佳方法,就是在更多的数据或更好的数据上训练模型。

而且数据要密集采样——均匀覆盖整个输入流形。因为插值只能发生在「已有样本之间」, 哪块地方没采样,模型在那块地方就只会瞎外推——外推就是跑到已知样本的范围之外硬猜15

外推和插值正好是一对:插值是在已知样本「之间」猜,外推是跑到范围「之外」猜。 你只见过 20 岁到 60 岁的人的体检数据,问你 40 岁的什么样,那是插值,靠谱; 问你 5 岁的什么样,那是外推,你只能把已有的趋势往外延一段,而那段延长线没有任何数据担保。 模型的处境一模一样——它在没采过样的地方给出的答案,看起来一样自信,但那是编的。

4. 评估:别让自己骗自己

4.1 信息泄露:验证集是会被「用脏」的

第 04 章说了「训练和验证严格分开」,这一章讲为什么这句话比看上去更难做到16

每当你根据验证集的表现调一个旋钮(层数、学习率……), 就有一点点关于验证集的信息泄露进了模型。调一次,泄露一点;调上几十次, 模型就开始对验证集过拟合——验证分数越来越好,真实表现原地踏步。

超参数就是这类「不由训练学、要由人来调」的旋钮(层数、单元数、学习率), 和「训练学出来」的参数(权重)相对17。防泄露的办法是把数据切成三段: 训练集调权重、验证集调超参数、测试集只在最后评一次—— 测试集的任何信息都不许进训练流程(第 05 章的标准化铁律就是这条的一个特例)18

4.2 常识基准:先证明这门手艺用得上

书里给了一个精彩的比喻:造一枚隐形火箭,你看不见它,唯一的仪表是高度计—— 验证指标就是那个高度计,它是你手上唯一的反馈信号19

所以第一件事是先立一个常识基准:不用任何机器学习,凭常识能到什么程度? 你的模型必须明显超过它,否则20:

如果无法超越简单的解决方案,那么你的模型毫无价值—— 也许你用错了模型,也许你的问题根本不适合机器学习。

基准怎么定,书里给了几个例子:MNIST(10 类均衡)要 >0.1;IMDB(两类均衡)要 >0.5; 路透社 46 类不均衡,基准约 0.18~0.19;如果是 90/10 不均衡的二分类, 「永远猜多数类」就有 90%,基准就得定到 >0.921

4.3 评估的三条注意事项

说明对策
数据代表性数据有序时直接切,验证集可能全是某一类切之前先打乱
时间箭头用过去预测未来,却把数据随机打乱——未来的信息漏进训练集按时间切:验证/测试必须在训练之后
数据冗余同一条数据(或极相似的)同时出现在训练和验证里去重,保证无交集

时间箭头这条,第 10 章的天气预测会正面撞上:随机打乱时间序列, 等于拿明天的天气预测昨天——任务瞬间变得毫无意义地简单22

5. 标准打法:先实现过拟合,再往回拉

5.1 一句话口诀

书里给了一个反直觉但极实用的口诀23:

为了实现完美的拟合,你必须首先实现过拟合。

事先没有人知道「恰好够」的容量是多少,所以正确顺序是: 先把模型调大、调到明确过拟合,找到边界,再从边界上往回拉。 所有训练问题由此分成三类,各有各的药24:

① 训练根本不开始(损失不降)。 多半是学习率不对:书里演示了 lr=1 的 MNIST, 精度卡在 30%~40% 上不去——权重更新一步跨太大,永远在正常值两边跳; 降到 1e-2 立刻正常25

② 训练了但不泛化。 模型学了,可测试集上不行。这是架构预设错了: 要么数据里本来就没有可学的关系,要么模型类型和数据不匹配——换架构,不是加数据26

③ 无法过拟合(训练损失都降不动)。 这是容量不足——模型存不下那么多信息。 书里用一个 logistic 回归在 MNIST 上演示:验证损失卡在 0.26 就再也不动; 加大到两层 96 单元后,模型立刻能正常地(过)拟合了27

5.2 四件工具往回拉

过拟合实现之后,有四件工具把它往回拉,按书里的顺序28:

第一,更多更好的数据。 投资回报最大的一件——第 3 节说过,这是「最佳方法」。

第二,缩减模型容量。 书里在 IMDB 上对照:16 单元的中间层换成 4 单元, 过拟合出现得更晚更慢;换成 512 单元,立即过拟合且验证损失剧烈波动—— 容量越大,背得越快29

第三,权重正则化(L1/L2)。 给损失函数加一项「权重的代价」: L2 是把每个权重的平方乘以一个小系数(比如 0.002)加进损失—— 权重越大,代价越高,于是模型被逼着用小权重,学更平滑的曲线。 理论依据是奥卡姆剃刀:两种解释都能说通时,更简单的那个更可能对。 (L2 正则化还有个名字叫权重衰减,数学上是同一回事30。)

第四,dropout。 训练时随机把某层输出的一部分元素临时置零(比率通常 0.2~0.5); 测试时不置零,改为把输出按比率缩小(或训练时放大,效果相同)—— 这样输出总量在训练和测试间保持一致31

它为什么有效,发明人 Hinton 自己讲的来历值得一听: 他的灵感来自银行的防欺诈机制——银行柜员不停轮换, 是因为「成功欺诈需要多名职员长期共谋」;同理,神经网络里的虚假模式, 也需要某些单元长期「共谋」才搭得起来;每次随机拆掉一批, 共谋就组不成,模型被迫学更扎实、更不依赖特定组合的特征32

书里在 IMDB 上加两层 Dropout(0.5),效果比 L2 正则化还好—— 对大模型,dropout 通常是首选33

5.3 特征工程:深度学习时代仍然值钱

在「数据」和「容量」之间,还有一件老工具不该扔:特征工程—— 在把数据喂给模型之前,先用人对问题的理解,把数据重写成更好嚼的形式34

书里的时钟例子是最好的说明:从时钟照片读时间。

喂给模型的特征问题难度
原始像素很难,要很深的网络
指针尖端的 (x, y) 坐标(5 行脚本就能提取)简单
指针的极坐标角度不用机器学习——字典查找加舍入就够

特征工程把问题变得更简单,让模型可以用更少的数据、更小的容量解决它。 深度学习时代它仍然值钱的两个原因:省资源(浅特征就不需要深网络)、 省数据(好特征自带先验,不用模型从数据里重新学)35

6. 作者的判断与证据

硬实验(全书证据成色最高的一章): 白噪声实验、打乱标签实验、 容量不足实验(0.26)、lr=1 卡死实验——每一个都可以自己跑一遍复现。

作者明确标注为「假说」的: 流形假说本身——书里用的就是「假定」二字; 「局部泛化 vs 极端泛化」的划分是作者的分析框架,第 14 章会全部展开, 那是他的个人理论体系,不是学界公理。

经验法则: 「dropout 对大模型是首选」「rmsprop 是好默认」「先过拟合再正则化」—— 都是模式匹配的经验,书里从不假装它们是定理。

7. 边界与局限

  • 流形假说解释的是「为什么可行」,不是「什么时候必然可行」—— 数据不形成可插值流形时(纯噪声、真正的随机过程),模型什么也学不到;
  • 「极端泛化」这一章只给了名字和直觉,论证在第 14 章—— 读这一章时别急着下「深度学习不过如此」的结论;
  • 正则化四件工具的「怎么配比」没有公式,第 13 章的超参数搜索是它的工程版。

8. 可带走的

  1. 机器学习的根本问题 = 优化与泛化的矛盾;训练损失只证明优化,不证明泛化;
  2. 模型能背下任何东西(打乱标签照样拟合)——训练损失下降什么都不说明;
  3. 过拟合三来源:嘈杂数据、模糊特征、罕见特征与虚假相关(番荔枝、白噪声实验);
  4. 流形假说:自然数据挤在高维空间的低维流形上——学习可行、插值可能的总根源;
  5. 深度学习的泛化 = 流形上的插值 = 局部泛化;极端泛化是人类的事(第 14 章展开);
  6. 改进模型的最佳方法是更多更好的数据,而且要密集采样;
  7. 每次用验证集调参都是一次信息泄露;测试集只在最后评一次;
  8. 先立常识基准再建模——超不过简单方案的模型毫无价值;
  9. 时间序列按时间切,别打乱(时间箭头);
  10. 先实现过拟合,再用数据 / 缩容量 / L2 / dropout 往回拉;dropout 的灵感是银行防共谋。

9. 原文地图

主题原书章原文位置
优化与泛化的矛盾机器学习基础text/12-ch05.txt:18(搜「优化与泛化之间的矛盾」)
过拟合三来源、番荔枝、54/46机器学习基础text/12-ch05.txt:83(搜「番荔枝」) · text/12-ch05.txt:88(搜「54%」)
白噪声实验机器学习基础text/12-ch05.txt:91(搜「白噪声」)
特征选择机器学习基础text/12-ch05.txt:161(搜「特征选择」)
打乱标签、Python 字典机器学习基础text/12-ch05.txt:194(搜「白噪声输入和随机标签」) · text/12-ch05.txt:196(搜「Python 字典」)
流形假说与 256^784机器学习基础text/12-ch05.txt:203(搜「256 的 784 次幂」) · text/12-ch05.txt:220(搜「流形假说」)
插值、局部/极端泛化机器学习基础text/12-ch05.txt:227(搜「插值」) · text/12-ch05.txt:239(搜「局部泛化」) · text/12-ch05.txt:252(搜「极端泛化」)
深度学习为何适合插值机器学习基础text/12-ch05.txt:269(搜「平滑地拟合」) · text/12-ch05.txt:208(搜「光滑」)
密集采样与「最佳方法」机器学习基础text/12-ch05.txt:300(搜「密集采样」) · text/12-ch05.txt:314(搜「最佳方法」)
信息泄露与超参数机器学习基础text/12-ch05.txt:338(搜「超参数」) · text/12-ch05.txt:342(搜「信息泄露」)
隐形火箭与常识基准机器学习基础text/12-ch05.txt:454(搜「隐形火箭」) · text/12-ch05.txt:461(搜「基准」) · text/12-ch05.txt:465(搜「毫无价值」)
评估三注意(时间箭头)机器学习基础text/12-ch05.txt:476(搜「时间箭头」) · text/12-ch05.txt:480(搜「数据冗余」)
先实现过拟合机器学习基础text/12-ch05.txt:487(搜「必须首先实现过拟合」)
lr=1 卡 30%机器学习基础text/12-ch05.txt:526(搜「30% ~ 40%」)
容量不足 0.26机器学习基础text/12-ch05.txt:596(搜「0.26」) · text/12-ch05.txt:600(搜「容量」)
时钟特征工程机器学习基础text/12-ch05.txt:645(搜「时钟」) · text/12-ch05.txt:667(搜「极坐标」) · text/12-ch05.txt:669(搜「字典查找」)
缩容量对照机器学习基础text/12-ch05.txt:706(搜「缩减模型容量」) · text/12-ch05.txt:760(搜「记忆容量过大」)
L2/奥卡姆/权重衰减机器学习基础text/12-ch05.txt:785(搜「奥卡姆剃刀」) · text/12-ch05.txt:794(搜「权重衰减」)
dropout 与银行共谋机器学习基础text/12-ch05.txt:839(搜「Hinton」) · text/12-ch05.txt:844(搜「0.2 ~ 0.5」) · text/12-ch05.txt:874(搜「防欺诈机制」)
IMDB+dropout 优于 L2机器学习基础text/12-ch05.txt:879(搜「Dropout」)

Footnotes

  1. 出处:「机器学习基础」第 18 段(text/12-ch05.txt:18,搜「优化与泛化之间的矛盾」)。

  2. 出处:「机器学习基础」第 42 段(text/12-ch05.txt:42,搜「仅和训练数据有关」)。

  3. 出处:「机器学习基础」第 91 段(text/12-ch05.txt:91,搜「白噪声」)至第 156 段。实验组与对照组的信息量相同,验证精度差约 1 个百分点。 2

  4. 出处:「机器学习基础」第 65 段(text/12-ch05.txt:65,搜「模糊特征」)与第 78 段(text/12-ch05.txt:78,搜「罕见特征」)。

  5. 出处:「机器学习基础」第 83 段(text/12-ch05.txt:83,搜「番荔枝」)。

  6. 出处:「机器学习基础」第 161 段(text/12-ch05.txt:161,搜「特征选择」)与第 164 段(text/12-ch05.txt:164,搜「互信息」)。

  7. 出处:「机器学习基础」第 194 段(text/12-ch05.txt:194,搜「白噪声输入和随机标签」)与第 196 段(text/12-ch05.txt:196,搜「Python 字典」)。

  8. 出处:「机器学习基础」第 220 段(text/12-ch05.txt:220,搜「流形假说」)。

  9. 出处:「机器学习基础」第 203 段(text/12-ch05.txt:203,搜「256 的 784 次幂」)。

  10. 出处:「机器学习基础」第 224 段(text/12-ch05.txt:224,搜「流形假说意味着」)与第 227 段(text/12-ch05.txt:227,搜「插值」)。

  11. 出处:「机器学习基础」第 235 段(text/12-ch05.txt:235,搜「线性插值」)。

  12. 出处:「机器学习基础」第 239 段(text/12-ch05.txt:239,搜「局部泛化」)、第 252 段(text/12-ch05.txt:252,搜「极端泛化」)与第 254 段(text/12-ch05.txt:254,搜「理性」)。

  13. 出处:「机器学习基础」第 269 段(text/12-ch05.txt:269,搜「平滑地拟合」)与第 208 段(text/12-ch05.txt:208,搜「光滑」)。

  14. 出处:「机器学习基础」第 314 段(text/12-ch05.txt:314,搜「最佳方法」)。

  15. 出处:「机器学习基础」第 300 段(text/12-ch05.txt:300,搜「密集采样」)。

  16. 出处:「机器学习基础」第 342 段(text/12-ch05.txt:342,搜「信息泄露」)。

  17. 出处:「机器学习基础」第 338 段(text/12-ch05.txt:338,搜「超参数」)。

  18. 出处:「机器学习基础」第 359 段(text/12-ch05.txt:359,搜「保留一个验证集」)。

  19. 出处:「机器学习基础」第 454 段(text/12-ch05.txt:454,搜「隐形火箭」)。

  20. 出处:「机器学习基础」第 465 段(text/12-ch05.txt:465,搜「毫无价值」)。

  21. 出处:「机器学习基础」第 460 段(text/12-ch05.txt:460,搜「基准」)与第 461 段(text/12-ch05.txt:461,搜「基准」)。

  22. 出处:「机器学习基础」第 476 段(text/12-ch05.txt:476,搜「时间箭头」)。

  23. 出处:「机器学习基础」第 487 段(text/12-ch05.txt:487,搜「必须首先实现过拟合」)。

  24. 出处:「机器学习基础」第 490 段(text/12-ch05.txt:490,搜「3 种常见问题」)。

  25. 出处:「机器学习基础」第 526 段(text/12-ch05.txt:526,搜「30% ~ 40%」)与第 544 段(text/12-ch05.txt:544,搜「学习率」)。

  26. 出处:「机器学习基础」第 551 段(text/12-ch05.txt:551,搜「架构预设」)。

  27. 出处:「机器学习基础」第 572 段(text/12-ch05.txt:572,搜「logistic 回归」)与第 596 段(text/12-ch05.txt:596,搜「0.26」)。

  28. 出处:「机器学习基础」第 625 段(text/12-ch05.txt:625,搜「数据集管理」)。

  29. 出处:「机器学习基础」第 742 段(text/12-ch05.txt:742,搜「容量更小的模型」)与第 760 段(text/12-ch05.txt:760,搜「记忆容量过大」)。

  30. 出处:「机器学习基础」第 785 段(text/12-ch05.txt:785,搜「奥卡姆剃刀」)与第 794 段(text/12-ch05.txt:794,搜「权重衰减」)。l2(0.002) 意为每个系数加 0.002×w² 到损失中。

  31. 出处:「机器学习基础」第 839 段(text/12-ch05.txt:839,搜「Hinton」)与第 844 段(text/12-ch05.txt:844,搜「0.2 ~ 0.5」)。

  32. 出处:「机器学习基础」第 874 段(text/12-ch05.txt:874,搜「防欺诈机制」)与第 878 段(text/12-ch05.txt:878,搜「阴谋」)。

  33. 出处:「机器学习基础」第 879 段(text/12-ch05.txt:879,搜「Dropout」)。

  34. 出处:「机器学习基础」第 640 段(text/12-ch05.txt:640,搜「特征工程」)。

  35. 出处:「机器学习基础」第 645 段(text/12-ch05.txt:645,搜「时钟」)、第 667 段(text/12-ch05.txt:667,搜「极坐标」)与第 679 段(text/12-ch05.txt:679,搜「原因有以下两点」)。