宏观理解

在深入技术细节之前,我们先建立一个高维度的认知:权重衰减究竟要解决什么问题?

核心问题是过拟合。一个过拟合的模型,就像一个只会死记硬背的学生。他能完美地背出所有练习题(训练集)的答案,但面对一场新考试(测试集),却一塌糊涂。这是因为他没有学到题目背后的普适规律,只是记住了训练数据的特有噪声和偶然模式

在神经网络中,模型的“记忆力”或“复杂度”很大程度上由其权重参数决定。一个模型的权重数值越大、越“崎岖”,它就越有能力拟合出极端复杂的函数,从而完美地穿过训练数据中的每一个点,包括那些噪声点。

正则化就是对模型的“自由度”进行惩罚。它承认模型在拟合训练数据时(我们称之为经验风险)需要一定的复杂度,但同时又告诉模型:“我希望你保持尽可能的简单”(我们称之为结构风险)。最终,模型的目标是在这两者之间找到一个完美的平衡。

权重衰减,就是实现这种哲学思想最直接的手段。

L2正则化

权重衰减通常通过 L2 正则化来实现。

1. 原始目标函数

对于一个给定的任务,我们有一个原始的损失函数 ,它只衡量模型在训练数据上的表现(经验风险)。例如,在线性回归中,它是均方误差:

2. 加入惩罚项的新目标函数

为了惩罚模型的复杂度,我们直接在损失函数中加入一个代表模型复杂度的项。最常用的复杂度度量是权重的 L2 范数的平方

新的目标函数变为:

让我们拆解这个公式:

  • 经验风险项。驱使模型去拟合训练数据。
  • L2 正则化项(结构风险项)。驱使模型的权重尽可能小。
  • 正则化超参数。它控制着我们对“拟合数据”和“保持简单”这两件事的权重分配。
    • 时,我们完全不关心模型的复杂度,模型会尽力去拟合训练数据,容易导致过拟合。
    • 时,我们极度厌恶复杂模型,为了让惩罚项最小,模型会驱使所有权重 趋近于零,导致模型过于简单,无法学习到任何模式,产生欠拟合(Underfitting)
    • 为什么是 而不是 ?这是为了计算方便。 平方项是处处可导的光滑函数,其导数是线性的(),这使得梯度计算和优化变得非常简单。前面的系数 正是为了与这个求导产生的 2 相抵消,使最终梯度形式更简洁。

为何叫“权重衰减”

现在我们从优化的角度来看,为什么这个技术叫“权重衰减”。

考虑使用随机梯度下降(SGD)更新权重。我们首先需要计算新损失函数对权重 的梯度:

在进行一次 SGD 更新时,权重的更新规则是:

其中 是学习率。我们可以把这个式子重新整理一下:

这就是“权重衰减”这个名字的由来!

在每次参数更新时,我们首先将现有的权重 乘以一个小于 1 的因子 ,使其“衰减”一步,然后再像往常一样,减去原始损失函数计算出的梯度。这个过程在每个训练步骤中都会发生,不断地将权重拉向零点,从而抑制其变得过大。

从贝叶斯统计的视角来理解

从贝叶斯统计的观点看,权重衰减(L2正则化)不再是一个经验性的“技巧”,而是有着深刻理论依据的最大后验估计(Maximum A Posteriori, MAP)

  1. 最大似然估计 (MLE):传统的损失最小化,等价于最大似然估计。我们寻找一组参数 ,使得观测到当前训练数据 的概率(似然) 最大。这对应于 的情况,我们对参数 本身没有任何先验的偏好。

  2. 最大后验估计 (MAP):在 MAP 中,我们不仅考虑数据似然,还引入了关于参数 先验分布(Prior Distribution)。这个先验分布代表了我们对“什么样的 是一个好参数”的信念。我们不再最大化 ,而是最大化后验概率

    取对数后,就变成了:

    这等价于最小化:

  3. L2 正则化与高斯先验的等价性

    • 这一项,在很多假设下(例如噪声是高斯的),就等价于我们的原始损失函数

    • 这一项是关键。如果我们假设权重的先验分布是一个均值为 0、方差为 的高斯分布(正态分布),即 ,那么:

    • 将这两项代回,我们发现最小化的目标函数变为:

    这与我们之前定义的 L2 正则化损失函数形式完全一致,只需令

对损失函数添加 L2 正则化项,在数学上完全等价于假设模型的权重参数服从一个均值为0的高斯分布。这为“我们偏好更小的权重”这一直觉,提供了坚实的概率理论基础。

L2 与 L1 正则化的对比

L1 正则化(Lasso)同样也是一个重要的正则化方法。

  • L2 正则化 (Ridge):

    • 惩罚项:
    • 效果: 倾向于让所有权重都变小,但不会强制它们变为精确的零。它会产生“平滑”的、权重值分布更均匀的模型。
    • 贝叶斯解释: 高斯先验。
  • L1 正则化 (Lasso):

    • 惩罚项:
    • 效果: 能够产生稀疏(Sparse) 的权重矩阵。也就是说,它会倾向于将许多不重要的特征权重直接压缩为零 ,从而起到特征选择的作用。
    • 贝叶斯解释: 拉普拉斯先验。
    • 缺点: 处不可导,需要更复杂的优化算法(如次梯度下降)。

PyTorch 中的实现

在 PyTorch 中,实现权重衰减非常简单。

# net 是模型
# lr 是学习率
# weight_decay 参数就是我们的 lambda
optimizer = torch.optim.SGD(net.parameters(), lr=lr, weight_decay=0.01)
 
# 在训练循环中,我们只需正常调用
optimizer.step()

优化器在执行 step() 时,会自动处理权重衰减的计算,你无需手动修改损失函数。

对于 SGD 优化器,在损失函数中添加 L2 正则项与在优化器中设置 weight_decay 是等价的。但对于 Adam 等自适应学习率优化器,两者不等价。现代框架(如 PyTorch 和 fastai)推荐使用优化器中的 weight_decay 参数,这种实现被称为 “AdamW”,它能提供更好的训练稳定性。