weight_decay在pytorch中是l2正则项,等效于在loss中加0.5wd∑p²;adam默认不正确实现,应改用adamw或手动加l2;bias和layernorm权重不应加decay,需参数分组控制。

weight_decay 参数在 PyTorch Optimizer 里到底起什么作用
它不是“每次更新后把参数乘以一个小数”,而是直接加到 loss 上的 L2 正则项:等效于在损失函数中加上 0.5 * weight_decay * sum(p.pow(2))。PyTorch 的 SGD、AdamW 等优化器会自动处理这部分,但 Adam 默认不带(这是最常踩的坑)。
常见错误现象:weight_decay=1e-4 设了却没效果,模型过拟合严重;或者用 Adam 加了 weight_decay,结果训练不稳定——因为老版 Adam 是把 decay 应用在梯度上,而非 loss,和理论不符。
-
AdamW才是官方推荐的带正确 L2 正则的 Adam 变种,务必替换掉Adam - 如果必须用
Adam,得手动在 loss 里加sum(p.pow(2) for p in model.parameters())项 -
weight_decay值通常在1e-4到1e-2之间,大模型可更低(如1e-5),小数据集建议从1e-3起调
为什么 bias 和 LayerNorm 权重不该加 weight_decay
正则的目标是约束“容易过拟合的可学习权重”,而 bias 项本身维度低、无缩放效应;LayerNorm.weight 和 BatchNorm2d.weight 是归一化参数,强制对其做 L2 惩罚会干扰其校准能力,反而损害泛化。
使用场景:构建 optimizer 时漏掉参数分组,导致所有参数被统一施加 weight_decay,模型收敛变慢或 val acc 卡住。
- 用
model.named_parameters()过滤出需要正则的参数:通常只对Linear.weight、Conv2d.weight等卷积/全连接核加 decay - 标准写法是构造两个参数组:
{"params": decay_params, "weight_decay": 1e-4}和{"params": no_decay_params, "weight_decay": 0.0} - Hugging Face Transformers 库里的
get_parameter_names工具函数能自动识别常见 no-decay 参数名
weight_decay 和 L2 正则不是完全等价的实现细节
PyTorch 的 weight_decay 在 SGD 中是“梯度 + weight_decay * param”,而在 AdamW 中是“param -= lr * (grad + weight_decay * param)”,这和原始论文定义一致。但如果你手写 L2 项进 loss,反向传播时二阶导会不同,对二阶优化器(如 Adam)可能有微小影响。
性能影响:加 weight_decay 几乎不增加计算开销,但若参数量极大(如百亿级),每步多一次 param.pow(2) 累加仍会略微拖慢 step time。
- 不要在 loss 中重复加 L2 项,否则相当于 double decay
- 混合精度训练(AMP)下,
weight_decay仍作用于 FP32 主权重,无需额外处理 - 某些旧版本 PyTorch(AdamW 对
foreach=True的支持不完善,可能跳过部分参数的 decay,建议显式设foreach=False
验证 weight_decay 是否生效的最快方式
别等训练完看 val loss,直接检查某一层权重的 L2 norm 在训练初期是否缓慢下降。如果持续上升或震荡剧烈,大概率配置没生效或参数分组错了。
实操建议:在第一个 epoch 的前几个 batch 后,打印 torch.norm(model.layer.weight).item(),对比加/不加 weight_decay 的变化趋势。
- 用
optimizer.param_groups[0]["weight_decay"]现场确认实际值,避免 config 传参被覆盖 - 检查是否误将
weight_decay写成字符串(如"1e-4"),会导致 silent fail - 分布式训练(DDP)下,各卡上的 decay 行为一致,无需额外同步
真正容易被忽略的是:weight_decay 的 scale 和学习率强耦合,调 lr 时往往也要同比例调 weight_decay,尤其换 batch size 或 optimizer 类型时。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











