上一章我们推导出了线性回归的完美闭式解。但故事远没有结束——如果你真的用它去预测,很可能会遭遇一个噩梦:模型在训练集上完美,在测试集上一塌糊涂。

这就是过拟合。本章将介绍对抗它的终极武器:正则化


正则化

还记得上一章我们最后提到的模型过拟合问题吗?复盘一下:

如果你用一个九次多项式来拟合只有几个点的正弦曲线时,模型就拥有了过于强大的能力。它不仅学会了正弦曲线的趋势,还拼命扭曲自己去穿过每一个带有噪音的样本点。

在这时,模型的Training loss几乎为零,因为它确实记住了测试集的所有样本,而你发现你模型的Test Loss巨大无比。

如果你去看你的参数$\theta$,你会发现它们通常会变得极大,因为只有剧烈的波动才能让模型穿过所有噪点。

使用正则化的核心思想是:我们不仅希望Training Loss小,我们还希望模型能够“简单”。在数学上,这通常意味着我们希望参数$\theta$的值保持在一个较小的水准。


硬约束

假设你正优化Loss,你的上司告诉你:“你可以尽情降低Loss,但是我给你一个要求,你参数$\theta$的总模长不能超过$r$”。这基本就是硬约束 (Hard Constraint) 的逻辑。

这就像是给了你一笔有限的预算,你的目标是在预算内取得最好的拟合效果。

硬约束的公式是:

$$ \min_{\theta} \hat{L}(\theta) = \frac{1}{n} \sum_{i=1}^n \ell(f(x_i), y_i) $$
$$ \text{subject to: } \theta \in \Omega $$

通常,$\Omega$ 是一个范数球(Norm Ball),比如 $|\theta|_2^2 \le r^2$。

硬约束的优点比较明确。如果你知道参数的物理意义(比如它是某种功率),你知道它绝对不能超过某个界限 $r$,那么使用这种方法约束参数的大小最合适。


软约束

软约束 (Soft Constraint) 是我们在编写机器学习应用时实际使用的视角。

由于硬约束必须小于$r$的要求在数学求解上比较麻烦。你需要不停检查参数有没有越界,如果越界了你还需要投影回来。不如我们换个思路,将硬约束问题编程无约束问题:

不强制限制你,但是我们要对你的“铺张浪费”进行罚款。你想让参数 $\theta$ 变大?可以,但每变大一点,就要在 Loss 里加上一笔罚金。

公式:

$$ \min_{\theta} \hat{L}_R(\theta) = \hat{L}(\theta) + \lambda R(\theta) $$

其中:

  • $\hat{L}(\theta)$: 原始的 Training Loss。
  • $R(\theta)$: 正则项或者叫惩罚系数(Penalty term),比如 $|\theta|^2$。
  • $\lambda$: 正则化系数 (Hyperparameter)。它控制罚款的力度。
    • $\lambda \to 0$: 不罚款,回到过拟合。
    • $\lambda \to \infty$: 罚款极重,模型被迫让 $\theta \to 0$(欠拟合)。

贝叶斯先验

这是最深刻、最哲学的一个视角。回过头来想一想,我们为什么我们要惩罚大的参数?凭什么加一个$||\theta||^2$就能防止过拟合?

我们在上一章学过,MAP 的目标是最大化后验概率:
$$ P(\theta | Data) \propto P(Data | \theta) \cdot P(\theta) $$

取对数并取负号,将问题变为最小化问题:
$$ -\log P(\theta | Data) = -\log P(Data | \theta) + -\log P(\theta) $$

如果我们假设参数 $\theta$ 的先验分布 (Prior) 还是一个高斯分布$\theta \sim \mathcal{N}(0, \frac{1}{\lambda}I)$:

$$ P(\theta) \propto \exp\left( -\frac{\lambda}{2} |\theta|^2 \right) $$
那么,正则项 $-\log P(\theta)$ 就变成了:

$$ -\log \left( \exp\left( -\frac{\lambda}{2} |\theta|^2 \right) \right) = \frac{\lambda}{2} |\theta|^2 $$

因此:

$$ P(\theta) \propto e^{-|\theta|^2} \implies \log P(\theta) \propto -|\theta|^2 $$

这里的推导再次印证了我们在Ch3和Ch4反复提到的结论:
L2正则化 = MAP估计(假设参数服从高斯先验)

无论你是从"软约束"的角度(罚款),还是从"贝叶斯"的角度(先验信念),最后都殊途同归。


L2正则化

继续刚才的故事,在软约束上,我们如果要决定对参数$\theta$进行“罚款”,那么最自然的方式是什么?这你就联想到了在集合中衡量距离最自然的方式就是使用欧几里得距离。

如此,我们不妨来计算向量$\theta$的长度平方:

$$ |\theta|_2^2 = \theta_1^2 + \theta_2^2 + \dots + \theta_d^2 $$

你就得到了L2 Norm (L2 范数)

当我们把它加到 Loss 里:
$$ J(\theta) = \text{Loss}(\theta) + \frac{\lambda}{2} |\theta|_2^2 $$

这就是 L2 正则化 (Ridge Regression)。你可能已经发现了这就是上一章讲过的岭回归。


我们加入了这样一个$\lambda$后,机器在训练时到底发生了什么变化?

如果没有正则化,则你的训练过程:

$$ \theta_{new} = \theta_{old} - \eta \cdot \nabla \text{Loss} $$
..全靠 Loss 的指挥,你会拼命往 Loss 小的地方跑。

使用L2正则化时:

首先我们需要对新的目标函数求导:

$$ \nabla (\text{Loss} + \frac{\lambda}{2} |\theta|^2) = \nabla \text{Loss} + \lambda \theta $$

代入梯度下降公式:

$$ \theta_{new} = \theta_{old} - \eta (\nabla \text{Loss} + \lambda \theta_{old}) $$
$$ \theta_{new} = \underbrace{(1 - \eta \lambda) \theta_{old}}_{\text{Decay}} - \eta \nabla \text{Loss} $$

你会发现,每一次更新机器做的第一件事就是先把旧参数通过乘以一个小于 1 的系数 $1-\eta\lambda$ $\theta_{old}$ 缩小一点点

这就像给参数加了一个“衰减力”。不管 Loss 让你往哪跑,你每走一步,身体都会不由自主地向 0 收缩。这就是为什么 L2 正则化在深度学习里常被称为 权重衰减 (Weight Decay)

设置$\lambda$的值的时候需要小心。如果$\eta\lambda > 1$,那么系数$(1-\eta\lambda)$就会变成负数。这会导致你的参数不仅不会平滑收敛,反而发生震荡。


L2如何改变最优解?

假设原本(没有正则化时)的最优解是 $\theta^*$。
加了 L2 正则化后,新的最优解 $\theta^*_R$ 会在哪里?

证明我就不写了,但是我们需要记一下结果:

$$ \theta^*_R \approx (H + \alpha I)^{-1} H \theta^* $$

其中$H$是Loss在最优点的曲率矩阵。

人话解释,这其实是一个 缩放 (Rescaling) 操作。$H$ 代表了“在这个方向上,Loss 对参数变化敏不敏感”。

如果某个方向上 Loss 很敏感(特征值大),正则化就不太敢动它,参数保持原样。如果某个方向上 Loss 很平坦(特征值小,说明这个参数没啥用),正则化就会毫不客气地把它压扁,让它接近 0。

所以我们发现,L2 正则化像一个聪明的园丁。它不会把所有草都剪光,而是保留那些“重要的草”(对 Loss 影响大的参数),把那些“杂草”(对 Loss 影响小的参数)修剪得很短。

为什么L2只是尽可能衰减参数,而不会将某些参数变为零?L2的衰减机制是每次乘以一个系数,例如0.99。这样你的参数在连乘之下只会永远逼近0,但永远达不到真正的0。这就导致你的模型可能会有成千上万个极小的参数。虽然它们很小,但是它们都在那歇着。这意味着模型不够稀疏,你没法说这几个特征完全没用。


噪声注入

如果我们不加正则项,而是在输入数据 $x$ 上人为添加高斯噪音,会发生什么?

还是懒得写过程了,不过数学推导证明:
$$ \mathbb{E}[ (y - \theta^T(x + \epsilon))^2 ] \approx (y - \theta^T x)^2 + \lambda |\theta|^2 $$

你会发现给输入加噪音竟然在数学上等价于加 L2 正则项。这主要印证了 L2 的本质:它让模型对微小的输入扰动变得不敏感。


L1正则化

L2不会扼杀参数到0可能会出现问题,这就是我们为什么还搞出了像L1正则化这样的东西。

如果我们不按欧几里得距离(直线距离)来算罚款,而是按照曼哈顿距离来算,那么你就需要计算所有参数绝对值之和:

$$ |\theta|_1 = |\theta_1| + |\theta_2| + \dots + |\theta_d| $$

这就是 L1 范数 (L1 Norm)

当我们把它加到 Loss 里:
$$ J(\theta) = \text{Loss}(\theta) + \lambda |\theta|_1 $$

这就是 L1 正则化(也叫 Lasso Regression)。


根L2一样,我们需要看看L1对梯度下降做了什么。

对比 L2 来看,对 $|\theta|$ 求导,会得到 $\text{sign}(\theta)$(符号函数:正数是+1,负数是-1)。

你的梯度下降公式现在就看起来像:

$$ \theta_{new} = \theta_{old} - \eta (\nabla \text{Loss} + \lambda \cdot \text{sign}(\theta_{old})) $$
$$ \theta_{new} = \theta_{old} - \eta \nabla \text{Loss} - \eta \lambda \cdot \text{sign}(\theta_{old}) $$

说得好,那么这与 L2 有什么本质区别?

L2 通过连乘减小参数。但这会带来无限趋近问题,越接近 0,减得越慢。

而L1 是 减法 减小($\theta - 0.01$)。
这样不管 $\theta$ 是 100 还是 0.1,每次都固定减去一个常数 $\eta\lambda$。

不难发现当 $\theta$ 被减到非常接近 0 时,L1 的那个固定步长会直接让它跨过 0,或者正好落在 0 上(在 Proximal Gradient 等优化算法中,会强制截断在 0)。总会有一刻你能把某个参数干没了,不会出现无限趋近问题。
这就是为什么 L1 能产生 稀疏解 (Sparse Solution) —— 很多参数会变成真真正正的 0。


假设你是一名医生,你在利用基因数据预测某种罕见病。你的数据有 10,000 个基因位点,但你直觉上认为只有其中 5 个基因真正导致了这种病,其他都是无关的噪音。

为了找出这 5 个关键基因(Feature Selection),你应该使用 L1 还是 L2 正则化?为什么?

我们应该选择L1,因为它能把那 9,995 个无关基因的权重直接砍成 0,只剩下那 5 个关键基因。这不仅仅是“减少影响”,而是“特征选择 (Feature Selection)”。

现代正则化技巧

之前的L1/L2都是直接爆改Loss公式,但现在的深度学习领域,我们还有很多暗度陈仓的技巧。这些技巧都没有改动Loss公式,但起到了同样甚至更好的正则化效果。

数据增强 (Data Augmentation)

数据增强 (Data Augmentation) 已经是目前计算机视觉领域的标配了。既然计算机视觉模型经常因为数据太少导致过拟合,那么我多来点数据不就是了?

直接人为添加更多数据确实是一个办法,但如果我们将图片旋转,裁剪,水平翻转一下或者加点噪点,同时保持标签$y$不变,我们不就人为创造出更多质量一致的数据集了?

这样的作法实际上告诉了模型一个先验知识:物体的类别不应该随位置、角度、光照而改变。经过这个方法,我们极大的扩充了训练集,让模型见多识广,自然就不容易过拟合了。

早停 (Early Stopping)

这是一个极其简单粗暴但很有效的方法。

假设我们正在观察你的模型训练过程。你会发现你的Training Loss曲线一直下降。这很不赖。

实则并非。还记得Training Loss很低的时候也可能带来过拟合问题吗?

于是你发现你的Validation Loss曲线往往是下降,直到模型跑太久学会了噪音出现了过拟合,这条曲线就发生了反弹现象。

你可以做的是别等到Training loss降到0。只要你看到Validation Loss不降反升,就立刻停止训练,并回滚到之前那个拐点的最佳参数。


你知道吗,实际上早停等价于L2正则化。训练开始时参数$\theta$在原点0。随着时间$t$增加,$\theta$会慢慢爬向最优解$\theta^{*}$。我们限制训练时间$T$,实际上就是限制了参数$\theta$离原点0的距离。这实际上就是Hard Constraint ($||\theta|| \le r$)。限制时间实则就是限制半径$r$。


丢弃法 (Dropout)

这是深度学习中最重要的技巧之一。

我们在训练时,每次随机关掉一半的神经元,让他们的输出为0。那么这样做的理由是什么?

这迫使网络不能依赖一个或者一批神经元。我们相当于在训练$2^N$个不同的子网络,最后再将它们平均起来。这也是一种噪声注入,我们可以增强模型的可依赖性。


批量归一法 (Batch Normalization)

我们强行把每一层的输出拉回到均值为0、方差为1的分布。虽然它主要为了加速训练,但因为它引入了 Batch 的统计噪声(用当前 Batch 的均值代替全局均值),它也有轻微的正则化效果。

本章小结

这一章我们学习了如何给模型"戴上镣铐",防止它在训练数据上玩得太嗨(过拟合):

  • L2正则化 (Ridge):假设参数服从高斯分布,倾向于让参数变小(Weight Decay)。
  • L1正则化 (Lasso):假设参数服从拉普拉斯分布,倾向于让参数变0(稀疏解)。
  • 贝叶斯视角:正则化本质上就是引入先验知识(Prior)。
  • L2像一个园丁,把所有草都修短。
  • L1像一个除草机,把不重要的草直接拔光。

现在我们已经知道怎么用正则化来解决过拟合了。但你可能会问:凭什么加个$|\theta|^2$就能提升泛化能力?这背后的深层原理是什么?

下一章,我们将深入机器学习的理论核心——偏差-方差分解。你会看到,正则化其实是在用一点点偏差(Bias)去换取方差(Variance)的大幅降低。这是一个关于"取舍"的艺术。