第 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\) 很大 → 正则项压过似然项,函数过度光滑,整体拟合反而变差。

它为什么能改善测试表现,有两个角度:

  1. 抑制过拟合:网络必须在“死板地贴合数据”和“想要光滑”之间权衡。结果是方差下降(不再非得穿过每个点)、偏差略升(只能表示光滑函数)——这正是偏差/方差权衡的体现。
  2. 约束无数据区域:当网络过参数化时,多出来的容量描述的是没有训练数据的区域。这里 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、集成、贝叶斯、加噪、标签平滑、迁移学习、多任务、自监督、数据增强。
  • 四大底层机理(这是把上面所有方法串起来的关键地图):
    1. 让函数更光滑(如 L2 正则化);
    2. 增加有效数据量(如数据增强);
    3. 组合多个模型以对冲拟合过程中的不确定性(如集成);
    4. 寻找更宽的极小值,让参数的小误差无关紧要(如给权重加噪)。
  • 还有一条没列进“正则化”但同样提升泛化的路:选对模型架构来匹配任务(如图像中共享参数,不必在每个位置独立学“树长什么样”)——这正是第 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 章 卷积网络