权重衰减(Weight Decay)是机器学习尤其是深度学习中用于控制模型复杂度的常用技术,它的核心目标是在不显著牺牲训练准确率的前提下,降低模型在未知数据上的误差。从数学本质上看,权重衰减与L2正则化描述的是同一件事,只是落地方式略有差异。很多初学者容易把两者割裂开来理解,实际上在标准随机梯度下降里,它们完全等价。

L2正则化指的是在原始损失函数后面,额外加上一个与模型参数平方和成正比的项。假设我们原本的损失是交叉熵或者均方误差,记作L(θ),那么引入L2惩罚后的目标函数变为 L(θ) + (λ/2)·‖θ‖²,这里的θ代表所有可训练权重,λ是控制惩罚力度的超参数,常被称为正则化系数。加上这一项之后,优化过程不仅要让预测误差变小,还要让权重数值整体保持克制,避免个别维度参数变得过大。
为什么限制权重大小就能提升泛化呢?直观上,参数绝对值过大往往意味着模型对训练样本中的噪声也进行了记忆,曲线会变得异常曲折。而L2项像一只无形的手,把解往原点方向拉,使得拟合函数更加平滑。从贝叶斯视角看,这等同于给权重引入了零均值高斯先验,认为小权重出现的概率更高,从而降低模型表达过于极端规律的可能。
权重衰减在SGD中的等价实现
在最常见的随机梯度下降(SGD)里,权重衰减可以直接体现为每次更新时对权重做等比缩放。推导起来十分清晰:带L2项的损失对θ求梯度,会得到原梯度再加上 λ·θ。于是更新公式变成 θ = θ - η·(∇L + λ·θ) = (1 - ηλ)·θ - η·∇L。其中 (1 - ηλ) 这一项就是衰减系数,它让权重在每一步都先自发缩小一点,再沿梯度反方向走。
这种实现方式极其简单,所以在早期深度学习框架中,大家直接在优化器里设一个weight_decay参数,优化器在内部做参数减去衰减量即可。例如把weight_decay设为0.01,学习率η设为0.1,那么每一步权重先乘以0.999再更新。这种做法和手动在损失函数加L2项在数学上完全一致,因此工程上习惯把L2正则化直接叫成权重衰减。
Adam优化器中的实现差异
当优化器换成Adam时,情况变得微妙。标准Adam使用梯度的一阶和二阶矩估计来调整每一步的有效学习率,如果还像SGD那样简单地在梯度里加λ·θ,由于Adam对梯度做了归一化,L2惩罚会被自适应学习率稀释,导致实际衰减效果远弱于预期。研究者因此提出解耦权重衰减(Decoupled Weight Decay),也就是把衰减操作从梯度中拿出来,单独在参数更新后执行:θ = θ - ηλ·θ - η·m_hat/(√v_hat+ε)。
PyTorch等框架的AdamW优化器正是照此实现。如果你在AdamW里把weight_decay设成和以前SGD一样的数值,衰减强度才真正可比。不少实践者反映换用Adam后过拟合变严重,排查下来常常是因为直接套用旧weight_decay值却忘了Adam内部并未解耦,等价于正则力被削弱。因此理解L2正则化在优化器层面的具体代码路径,比单纯记住名词更重要。
L2正则化系数怎么选
λ的大小直接决定约束强弱。太小起不到抑制过拟合的作用,太大则会让模型欠拟合,连训练集都学不好。经验上可以从1e-4、1e-3这类量级起步,结合验证集表现做对数网格搜索。数据量大、特征冗余多时,可适当调大;数据少但模型深,更要依赖衰减来保底。
下面给出一个简化对照,帮助建立直观感受:
| 场景 | 建议lambda范围 | 预期效果 |
|---|---|---|
| 小数据集全连接网络 | 1e-3 到 1e-2 | 明显平滑决策边界 |
| 大模型预训练微调 | 1e-5 到 1e-4 | 轻微约束防止遗忘 |
| 卷积网络图像分类 | 1e-4 左右 | 平衡精度与泛化 |
需要提醒的是,偏置项(bias)通常不参加L2惩罚,因为偏置只影响整体平移,不会让函数变复杂。框架里一般通过参数分组把weight和bias分开,只给weight设衰减。另外归一化层里的缩放参数也常豁免,这都是为了不让正则误伤必要自由度。
常见误区与排查思路
一个典型误区是认为weight_decay参数填了就等于做了L2正则。如前文所述,在Adam未解耦的实现中,这个参数带来的约束很弱。另一个误区是训练前期就设很大衰减,导致模型根本没机会学到有效特征。正确做法是先无衰减跑通基线,确认能过拟合后,再逐步加衰减观察验证集涨幅。
调试时可以把带衰减与不带衰减的权重范数打印出来对比。若范数没明显下降,就要检查优化器是否支持解耦,或者衰减系数是否被学习率稀释。只有把L2正则化的数学形式和框架实现对齐,权重衰减才会真正成为手中可靠的防过拟合工具。