第 9 章 正则化(Regularization)
本章一句话:正则化是一大家族的方法,目的只有一个——缩小训练表现和测试表现之间的差距(泛化误差),而不是去降低训练误差;既包括往损失里加项的“显式正则化”,也包括 SGD 自带的“隐式正则化”,还有早停、Dropout、集成、加噪、数据增强等一堆实用启发式技巧。
读这章的收获:理解“为什么模型在训练集上很准、到了测试集就拉胯”的两个根因(过拟合 + 无数据区域不受约束),掌握 L2 正则化的公式与直觉,知道梯度下降为什么“偏心”,并对一整套提升泛化的实战手段建立清晰的“何时用、为什么有用”的地图。
本章速览
- 正则化的定义:严格意义上,正则化 = 往损失函数里加额外的项,让训练偏向某些参数;但在机器学习里,这个词被泛用为任何旨在降低泛化误差(而非训练误差)的手段。
- 为什么需要它:训练/测试差距来自两点——(i) 模型学到了训练数据的统计特异性/偶然规律(不代表真实输入-输出映射,即过拟合,不仅仅是拟合噪声);(ii) 在没有训练样本的区域,模型不受约束,预测可能很离谱。
- 显式正则化(9.1):在损失上加 \(\lambda\cdot g[\phi]\)。最常用的是 L2 正则化(\(\lambda\sum_j\phi_j^2\),又叫权重衰减/岭回归),鼓励权重变小、函数变光滑。从概率角度看,它等价于给参数加了一个先验。
- 隐式正则化(9.2):梯度下降和 SGD 并不是中立地滑向最低点——有限步长让 GD 排斥“陡峭区域”,SGD 还额外偏好“各批次梯度一致”的区域。这解释了为什么大学习率、小批量往往泛化更好。
- 提升性能的启发式(9.3):早停、集成(含 Bagging)、Dropout、加噪(输入/权重/标签平滑)、贝叶斯、迁移学习、多任务、自监督、数据增强等。
- 四大底层机理:所有这些方法归根结底走四条路之一——让函数更光滑、增加有效数据量、组合多个模型、寻找更宽的极小值。
- 一句忠告:显式 L2 正则化的实际效果证据其实是“喜忧参半”的;很多时候真正起作用的是隐式正则化和这些启发式技巧。
9.1 显式正则化(Explicit regularization)
思路:往损失里加一项“偏好”
回忆一下,训练就是找参数 \(\hat\phi\) 去最小化损失函数 \(L[\phi]\):
\[\hat\phi = \underset{\phi}{\operatorname{argmin}}\left[\sum_{i=1}^{I}\ell_i[\mathbf{x}_i,\mathbf{y}_i]\right],\]
其中每一项 \(\ell_i\) 衡量网络预测 \(f[\mathbf{x}_i,\phi]\) 与真实目标 \(\mathbf{y}_i\) 的差距。
为了把这个最小化往我们偏好的解上引,我们在损失里再加一项:
\[\hat\phi = \underset{\phi}{\operatorname{argmin}}\left[\sum_{i=1}^{I}\ell_i[\mathbf{x}_i,\mathbf{y}_i] + \lambda\cdot g[\phi]\right].\]
- \(g[\phi]\) 是一个返回标量的函数,参数越“不受欢迎”,它的值越大。
- \(\lambda\) 是一个正标量,控制“原损失”和“正则项”谁的话语权更大。
图像直觉:把原损失想象成一片有很多坑(局部极小)的山谷地形。正则项像在地图正中央放一个“吸引盆”——离中心越远惩罚越大。两者相加后,新地形的坑变少了,全局最低点也被挪到了新的位置。这就是为什么加了正则项后训练会收敛到不同的参数。
9.1.1 概率解释:正则项 = 先验
正则化也可以从概率角度理解。损失函数本来是从最大似然推出来的:
\[\hat\phi = \underset{\phi}{\operatorname{argmax}}\left[\prod_{i=1}^{I}Pr(\mathbf{y}_i\mid\mathbf{x}_i,\phi)\right].\]
如果我们在看到数据之前就对参数有些“先验知识”,可以引入一个先验 \(Pr(\phi)\),于是变成最大后验(MAP) 准则:
\[\hat\phi = \underset{\phi}{\operatorname{argmax}}\left[Pr(\phi)\prod_{i=1}^{I}Pr(\mathbf{y}_i\mid\mathbf{x}_i,\phi)\right].\]
取负对数(回到我们熟悉的“负对数似然损失”)就能看出:
\[\lambda\cdot g[\phi] = -\log\big[Pr(\phi)\big].\]
一句话:正则项就是参数的先验。L2 正则项对应的是“参数倾向于接近 0”的高斯先验。
9.1.2 L2 正则化(最常用的那一个)
到底该惩罚什么样的解?因为神经网络用途极广,这种偏好只能非常“通用”。最常用的就是 L2 范数,它惩罚所有参数的平方和:
\[\hat\phi = \underset{\phi}{\operatorname{argmin}}\left[\sum_{i=1}^{I}\ell_i[\mathbf{x}_i,\mathbf{y}_i] + \lambda\sum_{j}\phi_j^2\right],\]
其中 \(j\) 是参数下标。它还有一堆别名:Tikhonov 正则化、岭回归(ridge regression),作用在矩阵上时叫 Frobenius 范数正则化。
为什么有效——“权重衰减”的直觉:
- 对神经网络,L2 通常只作用在权重上、不作用在偏置上,因此常被叫作权重衰减(weight decay)。
- 它的效果是鼓励更小的权重,从而让输出函数更光滑。道理很直接:输出是最后一层隐藏层激活值的加权和,权重越小,输出变化越小;同样的逻辑一层层往回推。极端情况下若强制所有权重为 0,网络就只会输出一个由最后那个偏置决定的常数。
\(\lambda\) 怎么影响拟合(见原书图 9.2 的实验直觉):
- \(\lambda\) 很小 → 几乎没效果,拟合曲线穿过每一个数据点(容易过拟合噪声)。
- \(\lambda\) 适中 → 函数变光滑,更接近真实函数,泛化最好。
- \(\lambda\) 很大 → 正则项压过似然项,函数过度光滑,整体拟合反而变差。
它为什么能改善测试表现,有两个角度:
- 抑制过拟合:网络必须在“死板地贴合数据”和“想要光滑”之间权衡。结果是方差下降(不再非得穿过每个点)、偏差略升(只能表示光滑函数)——这正是偏差/方差权衡的体现。
- 约束无数据区域:当网络过参数化时,多出来的容量描述的是没有训练数据的区域。这里 L2 会偏好在邻近点之间平滑插值的函数——在不了解真实函数的情况下,这是合理的默认行为。
补充:除了 L2,还有惩罚权重绝对值的 L1 正则化(LASSO)、给每个非零权重固定罚分的 L0 正则化(能“剪枝”网络),以及 L1+L2 混合的弹性网(elastic net)。L1/L0 更鼓励稀疏(很多权重直接变 0);L0 因为导数不光滑而难优化。
9.2 隐式正则化(Implicit regularization)
一个有意思的近期发现:梯度下降(GD)和随机梯度下降(SGD)并不是“中立地”滑向损失的最低点——它们各自偏爱某些解。这种“没人显式写进损失、却真实存在”的偏好,叫隐式正则化。
9.2.1 梯度下降里的隐式正则化
设想步长无穷小的“连续版”梯度下降,参数演化服从微分方程:
\[\frac{d\phi}{dt} = -\frac{\partial L}{\partial\phi}.\]
而真实的梯度下降是步长为 \(\alpha\) 的离散步:
\[\phi_{t+1} = \phi_t - \alpha\frac{\partial L[\phi_t]}{\partial\phi}.\]
离散化会让实际轨迹偏离理想的连续轨迹。可以证明(用反向误差分析),离散轨迹相当于在一个修正后的损失上做连续梯度下降:
\[\tilde{L}_{GD}[\phi] = L[\phi] + \frac{\alpha}{4}\left\|\frac{\partial L}{\partial\phi}\right\|^2.\]
换句话说,有限步长的离散轨迹会被“梯度范数大”(也就是地形陡峭)的地方排斥。这不改变极小值的位置(那里梯度本来就是 0),但会改变沿途的有效地形和优化路径,可能最终落到不同的极小值。
这解释了一个反直觉的现象:全批量梯度下降用更大的步长反而泛化更好——因为大步长带来的隐式正则化更强。
9.2.2 随机梯度下降里的隐式正则化
对 SGD 做类似分析(让连续版到达“所有可能随机更新的平均”所到之处),可以得到:
\[\tilde{L}_{SGD}[\phi] = L[\phi] + \frac{\alpha}{4}\left\|\frac{\partial L}{\partial\phi}\right\|^2 + \frac{\alpha}{4B}\sum_{b=1}^{B}\left\|\frac{\partial L_b}{\partial\phi} - \frac{\partial L}{\partial\phi}\right\|^2.\]
其中 \(L_b\) 是第 \(b\) 个小批次的损失,\(L\) 是全数据集损失(都取个体损失的均值)。
比 GD 多出来的最后一项,正是各批次梯度的方差。也就是说:
SGD 隐式地偏好“各批次梯度一致”的地方——所有小批量都对斜率“达成共识”的区域。
如果模型过参数化、能精确拟合所有训练数据,那么在全局最小值处每个批次的梯度都是 0,这一项也归零,所以它不一定改变全局最小值的位置,但会改变优化轨迹。
实践结论:
- SGD 比 GD 泛化更好;
- 小批量通常比大批量更好。
- 一种解释是随机性让算法能探索损失地形的不同部分;另一种解释就是上面的隐式正则化——它偏好“所有数据都拟合得不错(批次方差小)”的解,而不是“一部分数据拟合得极好、另一部分较差(总损失相同但批次方差大)”的解。前者往往泛化更好。
9.3 提升性能的启发式方法(Heuristics to improve performance)
显式正则化往损失里加项;隐式正则化是 SGD 的“意外副产品”。除此之外,还有一大堆经验性技巧用来改善泛化。记住核心定义:
正则化 = 任何旨在降低泛化误差(而非训练误差)的手段。
下面逐个介绍,每个都讲清直觉与适用场景。
9.3.1 早停(Early stopping)
做法:在训练完全收敛之前就停下来。
直觉:训练过程中,模型往往先学到真实函数的粗略形状,之后才开始去拟合噪声(过拟合)。在它学到粗形状、还没来得及钻噪声牛角尖时停手,泛化最好。两种理解:
- 权重初始化时很小,早停让它们没时间变大——效果类似 L2 正则化;
- 早停降低了有效模型复杂度,相当于沿偏差/方差曲线从“临界区”往回退一点。
适用与优点:几乎万能、零额外成本。它只有一个超参数(停在第几步),而且不需要训练多个模型就能选——训练一次,每隔 \(T\) 步在验证集上看一次表现并存档,最后选验证表现最好的那组参数即可。
9.3.2 集成(Ensembling)
做法:训练多个模型,把它们的预测平均起来。这一组模型叫一个 ensemble。
怎么合并:
- 回归:取输出的均值(或中位数,更鲁棒);
- 分类:取 softmax 前激活的均值(或取最常被预测的类别,多数投票)。
- 背后的假设是:各模型的错误相互独立、会互相抵消。
怎么造出“不同”的模型:
- 不同随机初始化:在远离训练数据的区域,函数本来就不受约束,不同模型给出的预测各异,平均后更稳。
- Bagging(bootstrap aggregating,自助聚合):对训练数据有放回地重采样生成多个数据集,各训一个模型。效果是“抹平”数据——某个离群点若没进入某个训练集,模型就会从邻近点插值,使该区域的拟合更温和。
- 也可以用不同超参数,甚至完全不同族的模型。
适用与代价:可靠地提升测试表现,但代价是要训练、存储、推理多个模型。
9.3.3 Dropout
做法:在每次 SGD 迭代时,把随机一部分隐藏单元(通常 50%)钳为 0。等于每次都在训练一个略有不同的子网络。
为什么有用:
- 让网络不过度依赖任何单个隐藏单元,并鼓励权重变小(某个单元在不在,对函数的影响都不大)。
- 能消除远离训练数据、却不影响损失的“怪异扭结(kinks)”。比如几个隐藏单元“合谋”在某处先抬高斜率、再压下去、再拉回来,制造一个局部畸变——它不增加训练损失,却很难泛化。Dropout 随机去掉其中一个单元,就会在那一带造成明显变化,随后的梯度步会去“补偿”,久而久之这种合谋依赖被瓦解,多余的剧烈起伏被逐渐抹平。
测试时怎么办:
- 权重缩放推理规则:测试时所有单元都激活,但网络比训练时“多了单元”,所以把权重乘以 \((1-\text{dropout 概率})\) 来补偿。
- Monte Carlo dropout:测试时也跑多次、每次随机丢一部分单元,再合并结果——这其实很接近集成(每个随机版本都是一个不同模型),但不用训练或存储多个网络。
9.3.4 添加噪声(Applying noise)
Dropout 可以看成往激活值上施加乘性伯努利噪声。顺着这个思路,可以往网络的不同部位加噪声,让最终模型更鲁棒:
- 给输入加噪:平滑学到的函数。对回归问题,可以证明它等价于加了一个惩罚“输出对输入的导数” 的正则项。极端版本是对抗训练(adversarial training)——优化器主动去找那种“微小扰动却引起输出大变”的输入,相当于最坏情况的加性噪声向量。
- 给权重加噪:鼓励网络在权重被小幅扰动时仍给出合理预测。结果是训练倾向于收敛到又宽又平区域中央的极小值——在那里改动个别权重都无所谓。
- 扰动标签(标签平滑,label smoothing):多分类的最大似然准则想“以绝对确定预测正确类”,会把正确类的激活推到极大、错误类推到极小,过度自信。标签平滑假设有比例 \(\rho\) 的标签其实是错的、均匀属于其他类,于是把目标分布改成“正确类概率 \(1-\rho\)、其余类平分剩下的 \(\rho\)”,再最小化交叉熵。它在多种场景下都能改善泛化(并改善输出概率的“校准”)。
9.3.5 贝叶斯推断(Bayesian inference)
痛点:最大似然通常过度自信——它只挑训练中“最可能”的那一组参数来做预测。但其实很多参数值都和数据基本兼容,只是稍微不那么可能。
贝叶斯做法:把参数当作未知随机变量,用贝叶斯规则算出在给定数据下的后验分布 \(Pr(\phi\mid\{\mathbf{x}_i,\mathbf{y}_i\})\):
\[Pr(\phi\mid\{\mathbf{x}_i,\mathbf{y}_i\}) = \frac{\prod_{i=1}^{I}Pr(\mathbf{y}_i\mid\mathbf{x}_i,\phi)\,Pr(\phi)}{\int\prod_{i=1}^{I}Pr(\mathbf{y}_i\mid\mathbf{x}_i,\phi)\,Pr(\phi)\,d\phi},\]
其中 \(Pr(\phi)\) 是先验,分母是归一化项。预测新输入 \(\mathbf{x}\) 时,对所有可能的参数做加权积分:
\[Pr(\mathbf{y}\mid\mathbf{x},\{\mathbf{x}_i,\mathbf{y}_i\}) = \int Pr(\mathbf{y}\mid\mathbf{x},\phi)\,Pr(\phi\mid\{\mathbf{x}_i,\mathbf{y}_i\})\,d\phi.\]
这本质上是一个无穷大的加权集成,权重取决于参数的先验概率和它与数据的吻合程度。它不仅给出预测均值,还自带不确定性估计。
适用与代价:优雅、预测更鲁棒,但对神经网络这种复杂模型,无法精确表示或积分整个参数分布,所有现有方法都得做近似,且通常给学习和推理带来不小的复杂度。
9.3.6 迁移学习与多任务学习(Transfer & multi-task learning)
当主任务的数据有限时,借助别的数据集:
- 迁移学习(transfer learning):先在一个数据更充足的相关副任务上预训练网络,再把模型迁到主任务上——通常是去掉最后一层、换上适配新输出的层,然后要么固定主体只训新层,要么微调(fine-tune)整个网络。原理是:网络在副任务上学到了好的内部表示,可直接为主任务所用;等价地说,迁移学习相当于把大部分参数初始化到参数空间里一个“大概率能出好解”的位置。
- 多任务学习(multi-task learning):让网络同时解决多个问题。比如一张图同时做语义分割、逐像素深度估计、生成图像描述。这些任务都需要对图像的理解,同时学时每个任务的表现都可能提升。
9.3.7 自监督学习(Self-supervised learning)
如果连副任务的数据/标签都没有,可以用自监督凭空造出大量“免费”的标注数据,再拿去做迁移学习。两大流派:
- 生成式(generative):遮住每个样本的一部分,让网络预测缺失部分。例如对无标签图像做修补(inpainting);或对大量文本遮词预测(后续微调到真正的语言任务,见第 12 章)。
- 对比式(contrastive):把“有共同点的样本对”和“无关样本对”做对比。图像上的副任务可以是“判断两张图是否是同一张图的不同变换”;文本上可以是“判断两句话在原文里是否前后相邻”;有时还要识别一对样本之间的精确关系(如两个图块的相对位置)。
9.3.8 数据增强(Augmentation)
做法:迁移学习靠借别的数据集,多任务学习靠借额外标签,第三条路是直接扩充数据集——对每个输入样本做保持标签不变的变换。
- 图像:旋转、翻转、模糊、调色等,判断“图里有没有鸟”这个标签依旧成立。
- 文本:替换同义词、来回翻译(round-trip translation)。
- 音频:放大/衰减不同频段。
目的:教会模型对这些无关变换“无动于衷”,从而更专注于真正决定标签的特征。
本章小结
- 显式正则化:往损失里加一项,挪动极小值的位置;这一项可解释为参数的先验概率。最常用的是 L2 正则化 / 权重衰减(\(\lambda\sum_j\phi_j^2\)),鼓励小权重、光滑函数。
- 隐式正则化:有限步长的 SGD 不会“中立地”下降——GD 排斥陡峭区域,SGD 还偏好批次梯度一致的区域。这能部分解释“大学习率、小批量泛化更好”。
- 大量启发式:早停、Dropout、集成、贝叶斯、加噪、标签平滑、迁移学习、多任务、自监督、数据增强。
- 四大底层机理(这是把上面所有方法串起来的关键地图):
- 让函数更光滑(如 L2 正则化);
- 增加有效数据量(如数据增强);
- 组合多个模型以对冲拟合过程中的不确定性(如集成);
- 寻找更宽的极小值,让参数的小误差无关紧要(如给权重加噪)。
- 还有一条没列进“正则化”但同样提升泛化的路:选对模型架构来匹配任务(如图像中共享参数,不必在每个位置独立学“树长什么样”)——这正是第 10–13 章各种架构的主题。
- 一点清醒:显式正则化(尤其 L2)对泛化的贡献,学界证据其实喜忧参半;很多提升可能来自隐式正则化与上述启发式。
关键术语对照
| 中文 | English | 一句话含义 |
|---|---|---|
| 正则化 | Regularization | 任何旨在降低泛化误差(而非训练误差)的手段 |
| 泛化(误差/差距) | Generalization (error/gap) | 训练表现与测试表现之间的差距 |
| 过拟合 | Overfitting | 模型学到了训练数据的统计特异性/偶然规律(不代表真实输入-输出映射,不限于噪声) |
| 显式正则化 | Explicit regularization | 往损失函数里加额外的项 |
| L2 正则化 / 权重衰减 | L2 regularization / Weight decay | 惩罚权重平方和,鼓励小权重、光滑函数 |
| 岭回归 / Frobenius 范数正则化 | Ridge regression / Frobenius norm reg. | L2 正则化的别名 |
| L1 正则化(LASSO) | L1 regularization (LASSO) | 惩罚权重绝对值,鼓励稀疏 |
| 先验 / 最大后验 | Prior / MAP | 看数据前对参数的信念 / 最大化后验的训练准则 |
| 隐式正则化 | Implicit regularization | (S)GD 自带的、对某些解的偏好 |
| 早停 | Early stopping | 收敛前停训以防过拟合 |
| 集成 | Ensembling | 训多个模型取平均 |
| 自助聚合 | Bagging | 有放回重采样后各训一个模型再平均 |
| Dropout | Dropout | 每步随机钳零一部分隐藏单元 |
| 蒙特卡洛 Dropout | Monte Carlo dropout | 测试时也随机丢单元、多次平均 |
| 对抗训练 | Adversarial training | 主动找最坏扰动并以此训练 |
| 标签平滑 | Label smoothing | 软化目标分布,抑制过度自信 |
| 贝叶斯推断 | Bayesian inference | 把参数当随机变量,对后验加权积分预测 |
| 迁移学习 | Transfer learning | 先在数据充足的副任务预训练,再迁到主任务 |
| 多任务学习 | Multi-task learning | 同时学多个任务,互相促进 |
| 自监督学习 | Self-supervised learning | 从无标签数据自造监督信号 |
| 数据增强 | Data augmentation | 保标签变换样本以扩充数据 |
返回目录 | 上一章:第 8 章 性能度量 | 下一章:第 10 章 卷积网络