跳到主要内容

泛化 — 机器学习的根本问题,与第一味药 weight decay

这一章讲两件事: 为什么「训练误差低」证明不了任何事, 以及在数据不变的前提下,我们能做什么——第一个正则化(给模型加约束、防它死记硬背训练数据的一类技术)weight decay。 第 03 章你见到了怎么把模型训出来;这一章回答的是:训出来算不算数。

1. 两个学生:背题的与抓规律的

想象两个备考的学生1

Extraordinary Ellie 把历年考题的答案全背了下来。 如果今年考的全是旧题,她拿满分; 但只要遇上一道新题,她当场冻住。

Inductive Irene 记性平平,但善于抓规律。 考旧题她拿 90 分(背不全),考新题她还是 90 分。

机器学习的处境是:我们手里的「历年考题」是有限的, 而想答的永远是「新题」。 没人想预测昨天的股价、认出已经确诊的病人——要的都是明天和未见。 所以作者把话说到最重: 怎么发现能泛化的规律,是机器学习的根本问题,甚至可以说是整个统计学的根本问题—— 再放大一层,它其实就是「什么时候我们有权从个别观察跳到一般陈述」这个科学哲学问题2

2. 两种误差,一个假设

先把「误差」这个词拆成两个不同的东西:

  • 训练误差:模型在训练集上的平均损失。 这是一个统计量——从手头这堆数据算出来的数;
  • 泛化误差:模型在「背后那个数据分布」上的期望损失。 可以想象成:拿同一分布源源不断产生的新数据来考它,平均错多少3

泛化误差才是我们真正关心的,但它永远算不出精确值—— 没人告诉我们那个分布长什么样。 所以实践中只能估计它:留一部分数据不用于训练, 训完后在这部分「测试集」上量一量。

这一步能成立,全靠一个通常不声张的假设: 训练数据和测试数据来自同一个分布,且各自独立抽取——简称 IID 假设。 作者说得直白:没有这类假设,我们就「dead in the water」—— 凭什么相信从分布 P 抽的训练数据,能指导在分布 Q 上的预测?4

还有一个细节值得记住:训练误差是泛化误差的有偏估计—— 因为模型本身就是照着这批训练数据调出来的, 它对这批数据天然偏袒;而测试集上的评估不存在这层偏袒(模型没见过它)5

3. 模型复杂度:能背答案的模型什么都证明不了

什么情况下训练误差贴近泛化误差? 经典理论的答案:模型简单 + 数据多,两者就贴近; 模型复杂或数据少,训练误差会降,但两者之间的「泛化鸿沟」会变大6

为什么?设想一个模型类强大到: 随便给你 n 条数据、标签乱填,它都能完美拟合。 那它拟合了你的训练集,能说明它发现了规律吗?——什么都说明不了, 它对乱填的标签也照单全收。

作者在这里请了哲学家波普尔(Popper)出场: 一个能解释一切观察的理论,等于什么都没说—— 它没有排除任何可能性7。 模型也一样:想让人相信「你学到了规律」, 前提是你的模型类本来有学不会的东西,而你观察到的数据恰好在它会的那部分里。

但作者同时给了一个诚实的反转,这句话请原样记住:

能拟合任意标签 ⟹ 低训练误差不能证明低泛化误差; 但它同样不能证明泛化误差一定高。

深度神经网络恰好就是这种「理论上什么都能拟合、实践中却常常泛化得很好」的模型。 经典理论在此失声,所以实践里只能更依赖留出数据(holdout)做事后认证—— 这份尴尬,第 06 章会专门展开。

4. 欠拟合(连训练误差都降不下来,模型太简单)与过拟合:看两个误差的关系

把训练误差和验证误差摆在一起看,只有三种格局8:

格局训练误差验证误差诊断对策
欠拟合高(差距小)模型太简单,连训练集都学不会加复杂度
过拟合明显更高模型在背训练集正则化、加数据
刚好

书里还有一个冷静提醒:过拟合不总是坏事9。 深度学习里最好的模型,训练表现往往都明显好于留出数据。 我们最终只关心泛化误差本身的绝对水平—— 鸿沟只在「它挡住你继续降泛化误差」时才是问题。

数据量是另一个杠杆:模型固定时,训练数据越少越容易过拟合; 数据越多,泛化误差通常越小——more data never hurts。 书里的经验值:深度学习通常要有几千条训练样本,才开始赢过线性模型10

5. 模型选择与测试集的纪律

比较多个模型(不同结构、不同超参数)挑一个,叫模型选择。 这里的纪律只有一条,但极其容易违犯:

测试集只能在最后碰一次。 用测试集参与挑选,就会「过拟合测试集」—— 而对训练集过拟合还有测试集兜底,对测试集过拟合,就没有任何东西兜底了11

现实的妥协方案是把数据切成三份:训练集、验证集(用来挑模型、调超参)、 测试集(只在最终评估用一次)。 数据太少、留不出验证集时,用 K 折交叉验证: 把训练集切 K 份,轮流拿 1 份当验证、其余 K−1 份训练,跑 K 次取平均12

作者还自曝了一条行业潜规则:公开基准(MNIST、ImageNet)被整个领域 反复当「测试集」用了几十年,严格说早已被污染; 本书自己的实验,严格说也只有训练集和验证集,没有真正的测试集13。 测试集复用的统计学(多重检验问题),第 05 章展开。

6. weight decay:不砍参数个数,限制参数取值

现在给出第一个正则化(防过拟合)技术。 思路的出发点是:不直接动模型的结构(砍几个特征), 而是限制参数能取的值。

为什么说 f = 0(对任何输入都输出 0)是「最简单」的函数? 顺着这个直觉,一个函数的复杂度可以用「它的参数离零有多远」来度量—— 也就是权重向量的范数14。 做法:在原来的损失上加一项惩罚,

新损失 = 原损失 L(w, b) + (λ/2)·‖w‖²

λ 是正则化常数(超参数,用验证集挑):λ=0 退化成原问题; λ 越大,参数被压得越小15。 用平方范数而不是范数本身,纯粹是为了求导干净 (平方消掉根号,导数就是各分量自己)。

用 ℓ2 范数的版本在统计里叫 ridge 回归; 换 ℓ1 范数叫 lasso——它会把不重要的权重直接压成 0, 顺带做了特征选择;ℓ2 则倾向把权重均摊到更多特征上, 对单个特征的测量误差更稳16

把它代进 minibatch SGD 的更新式,会出现一个漂亮的变形17:

w ← (1 − ηλ)·w − η·(原来的梯度项)

每步先把 w 往零缩一点,再走梯度

每一步更新,参数都先自己「衰减」一点—— 这就是 weight decay(权重衰减)名字的由来。

走查:200 维特征、20 条样本

书里用合成数据演示了效果18。 数据:y = 0.05 + Σ 0.01·xᵢ + 噪声,特征维度 d=200, 而训练集只有 20 条——特征比样本多十倍,过拟合的温床。

  • 不开 weight decay(λ=0):训练误差一路降,验证误差不动—— 作者原话「a textbook case of overfitting」,教科书式过拟合;
  • 开 weight decay(λ 取一个较大值):训练误差上升,验证误差下降—— 正则化想要的正是这个交换:宁可训练集上差一点,换没见过数据上更准。

工程上,框架把 weight decay 直接做进了优化器 (PyTorch 里就是 weight_decay 参数); 惯例是偏置 b 不做衰减,只压权重19

7. 作者的判断与证据

书里给了证据的: 多项式拟合随阶数变化的过拟合演示; weight decay 开关对照实验(训练/验证误差曲线);K 折交叉验证流程。

作者明说是开放问题的: 「为什么深度网络过参数化还能泛化」—— 本章只能给「训练误差不能证明」的否定性结论, 正面的理论解释被推迟(第 06 章会给出研究现状:没有公论); 「过拟合不总是坏事」是作者基于实践的立场陈述,不是定理。

判断(我们的,不是书里的): 这一章的测试集纪律, 对今天「刷榜」文化的批评力只增不减: 当一个基准数据集被成千上万篇论文反复评估, 它就不再测量「泛化」,而在测量「对这份基准的适配」。 评价任何榜单分数时,先问这个测试集被用了多少次。 如果错,会错在: 有些基准设计上就是为了被反复使用 (题目定期更新、答案不公开),这类基准受污染的程度确实更轻—— 判据应是「信息泄露的渠道是否被封死」,而不是「使用次数」本身。

8. 边界与局限

  • IID 假设是这一切的地基;训练与部署分布不同(分布偏移)时怎么办,第 05 章专章讲;
  • weight decay 只讲了 ℓ2;ℓ1 及其他范数只给了对比,没给实现;
  • 「模型复杂度」本身没有统一定义(参数量(模型里旋钮的个数)、取值范围、VC 维各是一把尺), 跨模型类(树 vs 网络)比较复杂度基本不可行——书里照实承认20

9. 可带走的

  1. 训练误差低 ≠ 学得好;背题的 Ellie 与新题的 Irene,是全书质量观的分水岭;
  2. 训练误差是统计量,泛化误差是期望;前者是后者的有偏估计;
  3. 没有 IID 之类的假设,泛化无从谈起;
  4. 能拟合任意标签的模型类什么都证明不了(波普尔)——但反过来也不能证明它泛化差;
  5. 欠拟合/过拟合看两个误差的关系;最终只关心泛化误差本身;
  6. 测试集只能最后碰一次;挑模型用验证集,数据少用 K 折;
  7. weight decay = 损失 + (λ/2)‖w‖² ⇒ 更新时每步先把 w 往零缩;
  8. ℓ2 均摊权重、ℓ1 清零权重做特征选择;偏置通常不衰减。

10. 原文地图

主题原书章原文位置
Ellie 与 IreneGeneralizationtext/17-generalization.txt:11(搜「Extraordinary Ellie」) · text/17-generalization.txt:22(搜「Inductive Irene」)
根本问题Generalizationtext/17-generalization.txt:50(搜「fundamental problem」)
IID 假设、dead in the waterGeneralizationtext/17-generalization.txt:112(搜「IID assumption」) · text/17-generalization.txt:115(搜「dead in the water」)
训练误差有偏Generalizationtext/17-generalization.txt:173(搜「biased estimate」)
Popper 可证伪性Generalizationtext/17-generalization.txt:208(搜「Popper」)
欠拟合/过拟合不总是坏事Generalizationtext/17-generalization.txt:278(搜「underfitting」) · text/17-generalization.txt:284(搜「not always a bad thing」)
模型选择、污染测试集Generalizationtext/17-generalization.txt:379(搜「overfit the test data」) · text/17-generalization.txt:383(搜「how would we ever know」)
验证集、K 折Generalizationtext/17-generalization.txt:409(搜「validation set」)
f=0 最简单Weight Decaytext/18-weight-decay.txt:96(搜「simplest」)
λ、ridge/lasso 对比Weight Decaytext/18-weight-decay.txt:141(搜「regularization constant」) · text/18-weight-decay.txt:169(搜「ridge regression」) · text/18-weight-decay.txt:172(搜「lasso」)
「衰减」名字由来Weight Decaytext/18-weight-decay.txt:203(搜「decays」)
教科书式过拟合Weight Decaytext/18-weight-decay.txt:334(搜「textbook case of overfitting」)
偏置不衰减Weight Decaytext/18-weight-decay.txt:385(搜「PyTorch decays both」)

Footnotes

  1. 出处:「Generalization」第 11 段(text/17-generalization.txt:11,搜「Extraordinary Ellie」)与第 22 段(text/17-generalization.txt:22,搜「Inductive Irene」)。

  2. 出处:「Generalization」第 50 段(text/17-generalization.txt:50,搜「fundamental problem」)。原文:「the fundamental problem of machine learning, and arguably of all of statistics」;并进一步把它联系到「何时能从个别观察跳到一般陈述」。

  3. 出处:「Generalization」第 132 段(text/17-generalization.txt:132,搜「expectation」)。原文:泛化误差是「what you would see if you applied your model to an infinite stream of additional data examples」。

  4. 出处:「Generalization」第 112 段(text/17-generalization.txt:112,搜「IID assumption」)与第 115 段(text/17-generalization.txt:115,搜「dead in the water」)。

  5. 出处:「Generalization」第 173 段(text/17-generalization.txt:173,搜「biased estimate」)。

  6. 出处:「Generalization」第 183 段(text/17-generalization.txt:183,搜「simple models and abundant data」)。

  7. 出处:「Generalization」第 210 段(text/17-generalization.txt:210,搜「Popper」)。原文:「a theory that can explain any and all observations is not a scientific theory at all」。

  8. 出处:「Generalization」第 278 段(text/17-generalization.txt:278,搜「underfitting」)。

  9. 出处:「Generalization」第 284 段(text/17-generalization.txt:284,搜「not always a bad thing」)。原文:「if the training error is zero, then the generalization gap is precisely equal to the generalization error and we can make progress only by reducing the gap」。

  10. 出处:「Generalization」第 358 段(text/17-generalization.txt:358,搜「many thousands of training examples」)。

  11. 出处:「Generalization」第 379 段(text/17-generalization.txt:379,搜「overfit the test data」)与第 383 段(text/17-generalization.txt:383,搜「how would we ever know」)。

  12. 出处:「Generalization」第 409 段(text/17-generalization.txt:409,搜「validation set」)与第 425 段(text/17-generalization.txt:425,搜「fold cross-validation」)。

  13. 出处:「Generalization」第 401 段(text/17-generalization.txt:401,搜「recycling benchmark data」)与第 415 段(text/17-generalization.txt:415,搜「no true test sets」)。

  14. 出处:「Weight Decay」第 96 段(text/18-weight-decay.txt:96,搜「simplest」)与第 98 段(text/18-weight-decay.txt:98,搜「distance of its parameters from zero」)。

  15. 出处:「Weight Decay」第 141 段(text/18-weight-decay.txt:141,搜「regularization constant」)。

  16. 出处:「Weight Decay」第 169 段(text/18-weight-decay.txt:169,搜「ridge regression」)、第 172 段(text/18-weight-decay.txt:172,搜「lasso」)与第 180 段(text/18-weight-decay.txt:180,搜「measurement error」)。

  17. 出处:「Weight Decay」第 203 段(text/18-weight-decay.txt:203,搜「decays」)。原文:「given the penalty term alone, our optimization algorithm decays the weight at each step of training」。

  18. 出处:「Weight Decay」第 237 段(text/18-weight-decay.txt:237,搜「d = 200」)与第 334 段(text/18-weight-decay.txt:334,搜「textbook case of overfitting」)。

  19. 出处:「Weight Decay」第 385 段(text/18-weight-decay.txt:385,搜「PyTorch decays both」)。示例中只给 weight 设衰减,bias 不衰减。

  20. 出处:「Generalization」第 240 段(text/17-generalization.txt:240,搜「substantially different model classes」)。