AdamW#
TL;DR#
本页内容7 个部分
1. 背景与问题#
无动量 SGD 中,在 loss 上加 L2 惩罚可以展开成每步按比例收缩参数。沿用这个直觉,把 L2 梯度送入 Adam,却还会改变一阶、二阶矩,收缩效果随坐标历史而变。
AdamW 要把“根据任务梯度更新”与“按比例缩小参数”分开,使衰减不再经过自适应缩放。[1]
2. 目标与定义#
设任务损失为 Ltask,任务梯度为 gt,衰减系数为 λ≥0,学习率为 η>0。比较两种处理:L2 改变损失为 Ltask+λ∥θ∥22/2;解耦衰减则保持矩状态只由任务梯度决定,另收缩参数。
无动量 SGD 的等价来自直接展开:
θt=θt−1−η(gt+λθt−1)=(1−ηλ)θt−1−ηgt.
这里两项共用同一标量步长。接下来检查 Adam 多出的历史归一化为什么破坏这一步。
3. 方法与推导#
3.1 L2 如何改变 Adam 状态#
加入 L2 后,优化器收到 g~t=gt+λθt−1,于是:
mtL2=β1mt−1L2+(1−β1)g~t,vtL2=β2vt−1L2+(1−β2)g~t2.
平方项还包含 2λgtθt−1 与 λ2θt−12。因此不能先计算任务 Adam 方向,再把 L2 的影响简单写成一个固定比例收缩。[1]
3.2 AdamW 把衰减放在哪里#
只用 gt 按 Adam 规则计算 m^t,v^t,再更新:
θt=(1−ηλ)θt−1−ηv^t+ϵm^t.
衰减直接作用于旧参数,梯度方向仍作自适应归一化。解耦指衰减不进入矩历史和分母,不表示衰减比例与学习率无关。[1]
4. 计算过程#
先用一个首步算例比较两种规则。设 θ0=2、任务梯度 g1=2、η=0.1、λ=0.01,矩状态从零开始,忽略 ϵ。
两者第一步已经不同;下一步的历史状态也不同。再核对一般方向为 0.5 的情形:先收缩旧参数为 1.998,再减 0.05,得到 1.948。若先更新到 1.95 再整体收缩,会得到 1.94805,与上式不是同一规则。
5. 比较与边界#
AdamW 沿用 Adam 的方向与尺度估计,改变的是衰减路径。它不等价于对所有任务最小化同一个简单 L2 惩罚目标,也不保证任何配置下泛化更好。
衰减哪些参数仍是配置选择;bias、归一化参数常被分到不衰减的组。比较时记录学习率、衰减系数、参数组与预算,避免只比较优化器名称。
参考资料#
- Decoupled Weight Decay Regularization(ICLR 2019). §2、Algorithm 2:L2 与衰减的等价条件和 AdamW 更新。
延伸阅读#