跳到主要内容

机器学习(让机器从数据里自己学出规律)基础 — 过拟合与三件正则化武器

这一章讲三件事: 机器学习任务怎么分、项目流程长什么样; 「训练误差低」为什么可能是坏消息(过拟合);以及三件正则化武器各自怎么拆这个问题。 读完本章,你就有了判断「这个模型到底行不行」的标尺——第 06 章起每个实验都用它量。

1. 顶层全景:从任务到标尺

任务四类:监督(有标签) · 无监督(无标签) · 半监督(少量标签) · 强化(试错反馈)


流程六步:明确目标 → 收集数据 → 探索与预处理 → 选模型与损失 → 训练 → 评估与优化
│ (预处理占项目大部分时间)

评估出来的数字怎么读?
训练误差 ↓ 测试误差 ↓ 健康学习
训练误差 ↓ 测试误差 ↑ 过拟合 —— 本章的主题

四类任务的分界线是「有没有标签」。分类、回归属于监督学习(有标准答案的学习)。

没有答案的归无监督:比如聚类(自动分堆)。

降维(压低维度)也算无监督。

半监督(大量不带答案的数据加少量答案)让两者搭着用,书里把「自己当老师」的自编码、语言模型都归在这里。

强化学习靠环境反馈而非教师信号,第 13 章展开1

流程里有一条最容易被低估的事实:数据预处理常占整个机器学习过程的大部分时间2——第 03 章那三级流水线(加载/批量/增强)就是为这段时间修的路。

模型选择还有一条「元知识」:不存在对任何情况都表现很好的算法(解题的一套固定步骤),书里引了行话「没有免费的午餐」——所以实际做法是几个方法都试,选最好的3。评估方法按数据量选:数据多就三分(训练/验证/测试),数据少就 K 折交叉验证(把数据分 K 份,轮流拿一份当测试)4

2. 过拟合长什么样

过拟合有个明确的仪表特征,不是感觉:随着训练继续,训练误差还在降,测试误差却不降反升——曲线出现分叉5

机制一句话:模型把训练数据里无关紧要甚至错误的模式也背了下来。训练集里「背答案」能涨分,换一套题立刻现形。书里给的解决手段统称正则化(regularization,一切显式用来压低测试误差的策略的总称),目标是降泛化误差而不是训练误差6。下面三节是三件武器。

3. 主走查:给损失函数加一记重罚

这是本章的主走查,也是最透明的一次「看懂正则化」。 场景:用房屋面积预测房价。真实规律是 2 次多项式(一条抛物线),但训练数据里混了噪声,模型拟成了一条4 次多项式——曲线扭了两下,把噪声也拟合了进去7

修补思路:让 x³、x⁴ 那两项的系数 θ3、θ4 自己缩到接近 0,4 次多项式就退化回 2 次。做法是在损失函数后面直接加罚项8:

原损失:L = 均方误差(预测 − 真实)
新损失:L' = L + 10000·θ3² + 10000·θ4²

优化器现在的处境:
把 θ3 留在大值 → 罚项贡献 10000·θ3²,损失暴涨
把 θ3 压到 0 → 罚项消失,只剩普通误差
⟹ 只要普通误差涨得不多,优化器一定选择把 θ3、θ4 压向 0
⟹ 曲线从「扭两下的 4 次」回到「平滑的 2 次」,测试误差下降

(这里的 10000 只是「一个大数」的代表;真实训练里这个系数就是优化器的 weight_decay 参数,L2 正则在神经网络里的名字叫权重衰减——每步把所有权重按比例缩小一点,效果等同给每个权重挂了罚项9。)

两条边界:罚项是「一刀切」的,它压的是所有权重,不只压坏项——罚太重,连有用的权重也被压扁,模型变成欠拟合(学不动,连训练数据都学不好);以及它只对「模型太复杂」这类过拟合有效,数据本身有错标时压参数救不了。

4. Dropout:训练时随机失明

第二件武器不从损失函数下手,从网络结构下手:dropout(随机丢弃——训练时按设定比例随机屏蔽一部分神经元;论文里常大写为 Dropout)——被屏蔽的神经元本次前向不贡献、本次反向不更新10

它为什么有效?书里给了一个值得记住的机制名:复杂的协同适应(co-adaptation)——神经元之间会互相配合、互相依赖某个邻居的特定输出,这种「拉帮结派」让网络对训练数据过拟合、变得脆弱11。随机失明强迫每个神经元不依赖任何特定队友:既然队友随时可能消失,任何单个输入都拿不到太大权重,网络只能学更稳的、冗余的模式12

还有一个视角:每轮屏蔽不同的神经元,等于同时训练一大批「瘦身版子网络」,测试时再合并——4 个单元(节点)的小网络就有 16 种子集组合13。所以 Dropout 的效果与 L2 相近(两者都收缩权重),但路径不同14

使用纪律,书里给得很具体:丢弃率 20%50% 起步(太低没用、太高学不动);网络越大越有效;配合把学习率放大 10100 倍、动量调到 0.9~0.99;测试时把输出按丢弃比例缩小,补偿训练时的「缺员」15

5. 批标准化:把每层输入拉回稳定分布

第三件武器解决另一个病灶。深层网络训练中,前面层的参数在变,后面层收到的数据分布也跟着漂——用 sigmoid/tanh 这类激活函数时,数据一旦漂到两端平坦区,导数接近 0,梯度就消失。批标准化(Batch Normalization,简称 BN)在每个隐藏层的激活函数之前插一步:按当前小批数据算均值和方差(数据散得多开),把输入拉回均值 0、方差 1 的稳定分布,再用两个可学习参数 γ、β 把分布拉开到合适位置(保留网络「想」要的偏移)16

收益是实在的:可以用更大的初始学习率、收敛更快;能减弱对 Dropout 和 L2 的依赖;书里也如实给了对照——在这个简单的房价网络上,加 BN 的改善「没有 Dropout 那么明显」,并注明在更复杂的网络上 BN 效果会更好17

训练与测试两种模式的差别单独记一笔(这是第 03 章留下的问题;原书只给了测试集对照图,模式机制为补充(不在书里,来自通用知识)):训练时按当前小批数据算均值和方差;测试时常常一次只来一条,没有「批」可算,于是改用训练过程中一路累计(滑动平均)下来的全局均值与方差。model.eval() 切的就是这个统计来源——忘了切,测试成绩会莫名其妙地掉。

三条武器对完账:罚项治「权重过大」,Dropout 治「神经元抱团」,BN 治「分布漂移」;三者常组合使用,而非三选一。

6. 初始化:训练开始前就分胜负

迭代(一轮轮重复)优化的起点不是无关紧要的细节:初始值过大会在传播中产生爆炸的值,过小会丢失信息;起点不同,还会收敛到不同的极值点18。通用做法是正态或均匀分布的随机初始化;PyTorch 的模块都带合理默认值,一般够用。要手动选时记一条对应关系:xavier 初始化配 sigmoid/tanh 这类 S 型激活,kaiming 初始化配 ReLU 类——两者都是按「让激活值的方差逐层不塌缩」反推出来的19

7. 激活函数与损失函数:两张选型表

激活函数的任务是给网络加非线性(会拐弯)——没有它,叠再多层也还是直来直去的变换20

选型看导数:深层网络的梯度是各层导数的连乘,sigmoid 的导数最大只有 1/4,层数一多,乘积以指数(翻倍)速度缩小(梯度消失);理想导数是 1——ReLU 的正区间恰好是 1,所以深网络默认用 ReLU。

softmax 把输出变成归一化的概率(每种可能各占几成),用在多分类输出层21

损失函数的任务是给「差多远」定一个数。选型跟着任务走。分类那一项的名字里有熵(信息论里度量「不确定程度」的词)。

它的全名叫交叉熵——按「真实答案被分到的概率」给预测打分,分错时罚得重。

任务损失函数末层输出
回归(预测实数)均方误差 MSE1 个节点,不加激活
分类(预测类别)交叉熵多个节点

这里藏着一个新手必踩的坑:PyTorch 的 CrossEntropyLoss 不是严格的交叉熵——它内部先对输入做 softmax,再算交叉熵22。所以网络最后一层应该是裸的 Linear(输出「分数」),不要自己再接 softmax,接了等于 softmax 两次,精度反而掉。另一个实用参数:weight 可给每个类设权重,治类别不均衡(比如欺诈样本远少于正常样本时)23

8. 作者的判断与证据

给了证据的: 正则化主走查里的房价多项式、Dropout 的 16 子网络图解、BN 的算法流程都是书里展开讲过的;Dropout 与 BN 各配了一个房价数据的对照实验,结论分别是「效果比较明显」和「没有 Dropout 那么明显」——后者是作者对自己方法的负结果,值得肯定。

转述文献的: Dropout 归于 Srivastava 等 2014 年论文,BN 归于 Ioffe 和 Szegedy,书都点了出处;Dropout「与 L2 产生相同的收缩权重效果」是书里的论断,理由给了(都是收缩权重),未给定量比较14

作者的经验值: 丢弃率 20%50%、学习率放大 10100 倍、动量 0.9~0.99,都是「一般原则」式的经验数字,书中注明属实践总结而非推导15

9. 边界与局限

  • 本章完全没提数据增强。 它其实是第四件正则化武器(改数据而不是改模型),书把它放到第 10 章与迁移学习并讲——读的时候记得拼回来。
  • BN「为什么有效」的讨论只到「稳定分布」。 后来研究对 BN 与损失面平滑度的关系有更多解释,书的时代没有,也不必苛求。
  • 交叉熵一节没有给公式推导,只给直观(「量两个分布差多远」);想知道交叉熵怎么从最大似然(挑「让数据最像」的那个解释)推出来的,要另找材料(补充(不在书里,来自通用知识))。
  • 欠拟合(模型太简单学不动)只在开头提了一嘴,没有对称的展开。

10. 可带走的

  1. 读训练结果先看两条曲线的分叉:训练降、测试升 = 过拟合,处理手段的总名叫正则化;
  2. L2/权重衰减 = 给损失挂罚项压小权重;理解它只需看懂「+10000·θ²」这一步;
  3. Dropout = 随机失明打断神经元抱团,20%~50% 起步,测试时输出按比例缩小;
  4. BN = 激活函数前把每层输入拉回稳定分布,深层网络训练不稳时第一个该试;小网络上它常不如 Dropout 明显;
  5. 初始化不是仪式:太大爆炸、太小丢信息;xavier 配 S 型激活,kaiming 配 ReLU;
  6. 深层网络选激活函数看导数:sigmoid ≤1/4 必梯度消失,ReLU 正区间恒 1;
  7. 回归用 MSE、分类用交叉熵;PyTorch 的 CrossEntropyLoss 已内置 softmax,末层不要自己再接;
  8. 类别不均衡用损失函数的 weight 参数,不要去删样本;
  9. 预处理占项目大部分时间,不是脏活是主战场。

11. 原文地图

主题原书章原文位置
四类基本任务第5章 机器学习基础text/06-ch05.txt:26(搜「监督学习」)
强化学习四元素第5章 机器学习基础text/06-ch05.txt:61(搜「智能体」)
流程与预处理占比第5章 机器学习基础text/06-ch05.txt:77(搜「定义问题」) · text/06-ch05.txt:117(搜「大部分时间」)
没有免费的午餐第5章 机器学习基础text/06-ch05.txt:132(搜「表现很好的算法」)
留出法与 K 折第5章 机器学习基础text/06-ch05.txt:152(搜「留出法」) · text/06-ch05.txt:159(搜「K折交叉验证」)
过拟合的分叉第5章 机器学习基础text/06-ch05.txt:174(搜「不降反升」)
正则化的定义第5章 机器学习基础text/06-ch05.txt:154(搜「泛化误差」)
4 次多项式与房价第5章 机器学习基础text/06-ch05.txt:193(搜「4次多项式」)
10000 罚项压系数第5章 机器学习基础text/06-ch05.txt:205(搜「10000」) · text/06-ch05.txt:197(搜「接近于0」)
L2 即权重衰减第5章 机器学习基础text/06-ch05.txt:220(搜「Weight Decay」)
Dropout 做法第5章 机器学习基础text/06-ch05.txt:229(搜「随机忽略」)
协同适应第5章 机器学习基础text/06-ch05.txt:237(搜「协同适应」)
不依赖单一输入第5章 机器学习基础text/06-ch05.txt:240(搜「太大的权重」)
16 个子网络第5章 机器学习基础text/06-ch05.txt:249(搜「16个」)
使用原则与经验值第5章 机器学习基础text/06-ch05.txt:265(搜「20%」) · text/06-ch05.txt:282(搜「0.9~0.99」)
BN 的提出第5章 机器学习基础text/06-ch05.txt:326(搜「Batch Normalization」)
BN 作用在激活前第5章 机器学习基础text/06-ch05.txt:353(搜「非线性映射前」)
BN 好处与使用时机第5章 机器学习基础text/06-ch05.txt:360(搜「比较大的初始学习率」) · text/06-ch05.txt:356(搜「收敛速度很慢」)
BN 不如 Dropout 明显第5章 机器学习基础text/06-ch05.txt:399(搜「BN在一些复杂网络中」)
初始化的影响第5章 机器学习基础text/06-ch05.txt:408(搜「局部最小」)
xavier 与 kaiming第5章 机器学习基础text/06-ch05.txt:423(搜「kaiming」)
激活函数与梯度消失第5章 机器学习基础text/06-ch05.txt:434(搜「1/4」) · text/06-ch05.txt:436(搜「导数为1最好」)
两大损失函数第5章 机器学习基础text/06-ch05.txt:452(搜「交叉熵」)
CrossEntropyLoss 内置 softmax第5章 机器学习基础text/06-ch05.txt:507(搜「softmax激活函数」)
weight 治类别不均衡第5章 机器学习基础text/06-ch05.txt:523(搜「类别不均衡」)

Footnotes

  1. 出处:「第5章 机器学习基础」第 26 段(text/06-ch05.txt:26,搜「监督学习」)与第 61 段(text/06-ch05.txt:61,搜「智能体」)。

  2. 出处:「第5章 机器学习基础」第 117 段(text/06-ch05.txt:117,搜「大部分时间」)。

  3. 出处:「第5章 机器学习基础」第 132 段(text/06-ch05.txt:132,搜「表现很好的算法」)。

  4. 出处:「第5章 机器学习基础」第 152 段(text/06-ch05.txt:152,搜「留出法」)与第 159 段(text/06-ch05.txt:159,搜「K折交叉验证」)。

  5. 出处:「第5章 机器学习基础」第 174 段(text/06-ch05.txt:174,搜「不降反升」)。

  6. 出处:「第5章 机器学习基础」第 154 段(text/06-ch05.txt:154,搜「泛化误差」)。

  7. 出处:「第5章 机器学习基础」第 193 段(text/06-ch05.txt:193,搜「4次多项式」)。

  8. 出处:「第5章 机器学习基础」第 205 段(text/06-ch05.txt:205,搜「10000」)与第 197 段(text/06-ch05.txt:197,搜「接近于0」)。

  9. 出处:「第5章 机器学习基础」第 220 段(text/06-ch05.txt:220,搜「Weight Decay」)。

  10. 出处:「第5章 机器学习基础」第 229 段(text/06-ch05.txt:229,搜「随机忽略」)。

  11. 出处:「第5章 机器学习基础」第 237 段(text/06-ch05.txt:237,搜「协同适应」)。

  12. 出处:「第5章 机器学习基础」第 240 段(text/06-ch05.txt:240,搜「太大的权重」)。

  13. 出处:「第5章 机器学习基础」第 249 段(text/06-ch05.txt:249,搜「16个」)。

  14. 出处:「第5章 机器学习基础」第 231 段(text/06-ch05.txt:231,搜「收缩权重」)。 2

  15. 出处:「第5章 机器学习基础」第 265 段(text/06-ch05.txt:265,搜「20%」)与第 282 段(text/06-ch05.txt:282,搜「0.9~0.99」);测试缩小输出见第 260 段(text/06-ch05.txt:260,搜「Dropout Rate」)。 2

  16. 出处:「第5章 机器学习基础」第 326 段(text/06-ch05.txt:326,搜「Batch Normalization」)与第 353 段(text/06-ch05.txt:353,搜「非线性映射前」)。

  17. 出处:「第5章 机器学习基础」第 399 段(text/06-ch05.txt:399,搜「BN在一些复杂网络中」)与第 399 段(text/06-ch05.txt:399,搜「复杂网络」)。

  18. 出处:「第5章 机器学习基础」第 408 段(text/06-ch05.txt:408,搜「局部最小」)。

  19. 出处:「第5章 机器学习基础」第 423 段(text/06-ch05.txt:423,搜「kaiming」)。

  20. 出处:「第5章 机器学习基础」第 425 段(text/06-ch05.txt:425,搜「非线性建模能力」)。

  21. 出处:「第5章 机器学习基础」第 434 段(text/06-ch05.txt:434,搜「1/4」)与第 436 段(text/06-ch05.txt:436,搜「导数为1最好」)。

  22. 出处:「第5章 机器学习基础」第 507 段(text/06-ch05.txt:507,搜「softmax激活函数」)。原文明说「它不是严格意义上的交叉熵损失函数」。

  23. 出处:「第5章 机器学习基础」第 523 段(text/06-ch05.txt:523,搜「类别不均衡」)。