训练与优化 / 优化器 原理笔记入门 3 分钟阅读 查看源文件 ↗

AdamW#

TL;DR#

本页内容7 个部分

1. 背景与问题#

无动量 SGD 中,在 loss 上加 L2 惩罚可以展开成每步按比例收缩参数。沿用这个直觉,把 L2 梯度送入 Adam,却还会改变一阶、二阶矩,收缩效果随坐标历史而变。

AdamW 要把“根据任务梯度更新”与“按比例缩小参数”分开,使衰减不再经过自适应缩放。[1]

2. 目标与定义#

设任务损失为 Ltask\mathcal L_{\mathrm{task}},任务梯度为 gtg_t,衰减系数为 λ≥0\lambda\ge0,学习率为 η>0\eta>0。比较两种处理:L2 改变损失为 Ltask+λ∥θ∥22/2\mathcal L_{\mathrm{task}}+\lambda\|\theta\|_2^2/2;解耦衰减则保持矩状态只由任务梯度决定,另收缩参数。

无动量 SGD 的等价来自直接展开:

θt=θt−1−η(gt+λθt−1)=(1−ηλ)θt−1−ηgt.\theta_t=\theta_{t-1}-\eta(g_t+\lambda\theta_{t-1})=(1-\eta\lambda)\theta_{t-1}-\eta g_t.

这里两项共用同一标量步长。接下来检查 Adam 多出的历史归一化为什么破坏这一步。

3. 方法与推导#

3.1 L2 如何改变 Adam 状态#

加入 L2 后,优化器收到 g~t=gt+λθt−1\tilde g_t=g_t+\lambda\theta_{t-1},于是:

mtL2=β1mt−1L2+(1−β1)g~t,vtL2=β2vt−1L2+(1−β2)g~t2.m_t^{\mathrm{L2}}=\beta_1m_{t-1}^{\mathrm{L2}}+(1-\beta_1)\tilde g_t,\qquad v_t^{\mathrm{L2}}=\beta_2v_{t-1}^{\mathrm{L2}}+(1-\beta_2)\tilde g_t^2.

平方项还包含 2λgtθt−12\lambda g_t\theta_{t-1} 与 λ2θt−12\lambda^2\theta_{t-1}^2。因此不能先计算任务 Adam 方向,再把 L2 的影响简单写成一个固定比例收缩。[1]

3.2 AdamW 把衰减放在哪里#

只用 gtg_t 按 Adam 规则计算 m^t,v^t\hat m_t,\hat v_t,再更新:

θt=(1−ηλ)θt−1−ηm^tv^t+ϵ.\theta_t=(1-\eta\lambda)\theta_{t-1}-\eta\frac{\hat m_t}{\sqrt{\hat v_t}+\epsilon}.

衰减直接作用于旧参数,梯度方向仍作自适应归一化。解耦指衰减不进入矩历史和分母,不表示衰减比例与学习率无关。[1]

4. 计算过程#

先用一个首步算例比较两种规则。设 θ0=2\theta_0=2、任务梯度 g1=2g_1=2、η=0.1\eta=0.1、λ=0.01\lambda=0.01,矩状态从零开始,忽略 ϵ\epsilon。

规则 进入矩估计的梯度 首步归一化方向 更新后参数
Adam + L2 2+0.01×2=2.022+0.01\times2=2.02 1 2−0.1=1.92-0.1=1.9
AdamW 2 1 0.999×2−0.1=1.8980.999\times2-0.1=1.898

两者第一步已经不同;下一步的历史状态也不同。再核对一般方向为 0.5 的情形:先收缩旧参数为 1.9981.998,再减 0.050.05,得到 1.9481.948。若先更新到 1.951.95 再整体收缩,会得到 1.948051.94805,与上式不是同一规则。

5. 比较与边界#

AdamW 沿用 Adam 的方向与尺度估计,改变的是衰减路径。它不等价于对所有任务最小化同一个简单 L2 惩罚目标,也不保证任何配置下泛化更好。

衰减哪些参数仍是配置选择;bias、归一化参数常被分到不衰减的组。比较时记录学习率、衰减系数、参数组与预算,避免只比较优化器名称。

参考资料#

  1. Decoupled Weight Decay Regularization(ICLR 2019). §2、Algorithm 2:L2 与衰减的等价条件和 AdamW 更新。

延伸阅读#

相关阅读路线

完成一次训练更新 ↗理解优化器 ↗