一句话定义
解耦权重衰减(Decoupled Weight Decay)就是把“让参数往 0 缩一缩”这件事,从梯度更新里拆出来单独做一步;AI 词典:AdamW 优化器">AdamW 优化器采用的就是这种做法。它和传统写法里的 L2 正则(L2 regularization)并不等价,这个差别经常被人当成同义词糊弄过去。
罚款写进总分,还是单独扣钱
设想一家公司处理违规:做法 A 是把罚款金额加进月度 KPI 总分,再由系统按“这个人平时业绩波动多大”统一折算,于是同样违规,业绩起伏大的人折算得轻、起伏小的人折算得重;做法 B 是违规一次,直接按固定比例从工资里扣,和 KPI 折算无关。
L2 正则就是做法 A。它把惩罚项 λ/2·‖w‖²(λ 是系数,‖w‖² 是所有参数的平方和)加进损失函数,求导后梯度变成 g + λw,这一项和原梯度混在一起,然后被 Adam 除以 √v̂(v̂ 是该参数梯度平方的滑动平均)。历史梯度大的参数,分母大,λw 被稀释,实际衰减就弱;历史梯度小的参数,反而被衰减得更狠。你本想控制“参数往 0 走多快”,得到的却是“跟梯度历史挂钩”的东西。
解耦权重衰减是做法 B:先照常做 Adam 更新,再单独乘一步 θ ← θ − ηλθ(η 是学习率)。这一步不经过 √v̂ 的缩放,衰减强度只由 η 和 λ 决定。
顺带一提:在纯 SGD 下两者是等价的(把 λw 加进梯度,就等于每步乘上 1−ηλ)。差异完全来自自适应优化器引入的分母。
| L2 正则(耦合) | 解耦权重衰减 | |
|---|---|---|
| 实现方式 | 惩罚项进 loss,梯度变 g+λw | 更新后再乘 (1−ηλ) |
| 是否经过自适应缩放 | 是,会被 √v̂ 除 | 否 |
| 实际衰减强度 | 与梯度历史相关 | 只由 η、λ 决定 |
| 典型出现在 | SGD;PyTorch 里 Adam 的 weight_decay 参数 | AdamW |
对实际工作的意义
别把 weight_decay 当成同义词。 在 Adam 里把 weight_decay 调大,常常“感觉没什么用”或效果古怪,就是因为被 √v̂ 稀释了;换成 AdamW 后,同样的 λ 手感完全不同。从 Adam 迁到 AdamW,λ 不能照搬,得重新调。
数值上要有预期。 大模型预训练里 λ 常取 0.1 这个量级,小模型、小数据往往要更小,最终以自己任务的验证集为准。
常规做法:不做衰减的参数要单独列出来。 LayerNorm 的缩放参数和 bias 通常不参与衰减,因为它们本来就不该被往 0 拉,主流框架都支持把参数分组、只对权重矩阵做衰减。
概念上分清两句话:weight decay 是“显式地把参数往 0 拉”,L2 正则是“在损失里加惩罚项”。只有在没有自适应缩放的优化器下,两者才数值等价。具体优化器行为以官方文档为准。
