QUESTION

Adam与AdamW有什么区别,为什么要解耦权重衰减?

A

两者的Adam更新相同,真正区别在于weight decay是否先混入梯度和自适应状态。

DETAILED ANSWER

直接结论

Adam和AdamW都会利用梯度平均m与梯度平方平均v更新同一套模型参数。两者真正的区别只在启用权重衰减时:传统Adam把衰减项λw加进梯度,随后一起进入mv;AdamW让原始梯度正常经过Adam,再单独把参数向0缩小。

如果weight_decay=0,二者的核心更新没有这项区别。

传统Adam中的耦合方式

设数据损失产生的梯度为g,参数为w,衰减系数为λ。耦合方式先得到:

处理后的梯度 = g + λw

然后,这个处理后的梯度会参与Adam的两份历史统计:

g + λw
  ↓
更新m:方向的平滑平均
更新v:平方后的大小平均
  ↓
自适应参数更新

问题在于,λw原本只是想稳定地缩小权重,现在却也被Adam按不同参数的历史梯度大小进行自适应缩放,衰减效果不再是一个清晰、独立的动作。

AdamW中的解耦方式

AdamW把两条路线分开:

原始梯度g → 更新m和v → 完成Adam更新
当前参数w → 单独执行权重衰减

简化写成:

新w = 旧w − Adam更新量 − ηλ旧w

其中:

  • η是当前基础学习率;
  • λweight_decay
  • ηλw是本轮单独执行的缩小量。

例如w=10η=0.001λ=0.01,本轮权重衰减量是:

0.001 × 0.01 × 10 = 0.0001

这部分不会进入Adam的mv

不要误解成两套模型

AdamW不会创建另一套用于拟合的wb。网络仍然只有原来的权重和偏置;优化器只是维护与每个参数对应的历史状态,并按照不同规则更新原参数。

应该怎样回答区别

AdamW不是“比Adam多更新了一套权重”,而是把权重衰减从Adam的梯度和自适应统计中解耦。原始梯度仍按Adam处理,衰减项则直接作用于参数,所以权重衰减的含义更清楚。

参考

PyTorch AdamW官方文档