Weight Decay
权重衰减是一种正则化技术,它将模型权重向零收缩,帮助神经网络减少过拟合并泛化到新数据。
权重衰减是一种正则化技术,在训练过程中将模型的学习到的权重向零拉近。这种反复收缩可以抑制不必要的大参数值,并帮助神经网络泛化到未见过的样本。当模型容量足以记住训练数据中的噪声时,这种方法尤其有用。
Geoffrey Hinton 在 1986 年的论文《概念的分布式表示学习》中介绍了权重衰减。在论文中的家谱树实验里,他在每次更新后将权重幅度缩小 0.2%,以便更容易解释学习到的连接。此后,权重衰减被广泛用于控制过拟合。
权重衰减的工作原理#
在梯度下降过程中,优化器使用梯度更新参数:梯度是描述每个参数如何影响损失函数的导数。权重衰减会额外施加一个朝向零的拉力。按照许多优化器采用的、由学习率缩放的约定,不使用动量的普通 SGD 更新为 new weight = (1 - learning rate × decay) × old weight - learning rate × gradient。这将根据预测误差进行学习与按比例收缩结合起来。
衰减系数控制这种拉力的强度。设为零时会禁用衰减;在固定学习率下,较大的正值会增强收缩。若任务梯度能改善预测,仍可能增大某个权重。学习率衰减会逐渐减小优化器的步长;权重衰减则作用于参数值。
权重衰减与 L2 正则化的比较#
L2 正则化会在训练目标中加入按比例缩放的权重平方和。对于普通随机梯度下降,对这一惩罚项求导会产生相同的按比例收缩,前提是系数经过适当匹配。在线性回归中,使用这种权重平方惩罚项进行拟合称为岭回归。
使用Adam 优化器时,加入 L2 惩罚会使惩罚项的梯度经过 Adam 的移动平均和针对参数的缩放。AdamW 则将收缩与这种自适应梯度计算分开进行。Ilya Loshchilov 和 Frank Hutter 在 2017 年的论文《解耦权重衰减正则化》中提出了 AdamW,该论文于 2019 年发表于 ICLR。这种分离使衰减强度不受 Adam 的梯度历史缩放影响。
选择衰减强度#
权重衰减是一个超参数,需要使用验证数据进行选择。衰减过弱会导致对过拟合的约束不足。衰减过强则会造成欠拟合:模型无法拟合有用的模式,导致训练样本和验证样本上的误差都很高。比较不同衰减设置下的验证分数,可以找出适用于特定模型和数据集的衰减强度。
衰减的累积效果还取决于学习率调度和优化器更新次数。更改批量大小或训练轮数可能会改变应用衰减的次数;梯度累积会在更新前合并多个批次。Dropout 层通过随机将激活值置零来进行正则化,而早停则会限制训练时长。
Ultralytics YOLO 提供了一个 weight_decay 训练设置,默认值为 0.0005,用于在训练 YOLO26 等模型时控制正则化。其优化器参数组会将偏置和归一化层参数排除在权重衰减之外。
PyTorch 中的权重衰减#
torch.optim.AdamW 优化器在 PyTorch 中提供了解耦权重衰减。使用 pip install torch 安装该软件包;此示例会创建一个为零的任务梯度,使打印出的更新只体现权重衰减:
import torch
weight = torch.nn.Parameter(torch.tensor([2.0]))
optimizer = torch.optim.AdamW([weight], lr=0.1, weight_decay=0.1)
before = weight.item()
# Create a zero gradient while keeping the parameter in the computation.
optimizer.zero_grad()
loss = (weight * 0).sum()
loss.backward()
optimizer.step()
print(f"Weight: {before:.2f} -> {weight.item():.2f}")输出为 Weight: 2.00 -> 1.98:一次更新会将权重乘以 1 - 0.1 × 0.1,即 0.99,使其幅度减少 1%。










