2025-08-26
算法
00

目录

AdamW算法原理

今天带来的论文是2019年由Ilya Loshchilov等人发表的《Decoupled Weight Decay Regularization》,在这篇论文中提出了AdamW算法,也是目前transformer模型中主要使用的优化器算法。这篇论文之前被拒两次,但是最终还是极大影响了后来llm优化器的选择。这篇论文纠正了过去的一种正则化思想:在Adam中的梯度加入权重衰减系数等价于对损失函数做L2正则化。 实际上二者在SGD算法中是等价的,但是Adam算法中并不等价。

首先我们来看L2正则化公式: 对于一个模型的损失函数 L(w)L(w)(如均方误差或交叉熵),L2 正则化后的损失函数为:

Lreg(θ)=L(θ)+λ2iθi2\begin{aligned} {\mathcal{L}_{\mathrm{r e g}} ( \mathbf{\theta} )=\mathcal{L} ( \mathbf{\theta} )+\frac{\lambda} {2} \sum_{i} \theta_{i}^{2}} \\ \end{aligned}

计算其梯度:

Lreg(θ)=Lt(θ)+λθ\nabla \mathcal{L}_{\mathrm{r e g}} ( \theta)=\nabla \mathcal{L_t} ( \theta)+\lambda\theta

但是将所有权重相加比较麻烦,所以选择直接在每个参数的梯度上进行衰减【正常来讲二者是等价的】:

θt+1=θtαLreg \boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_{t} - \alpha \nabla \mathcal{L}_{\mathrm{r e g}}

简化后如下:

θt+1=(1λ)θtαLt(θt),\boldsymbol{\theta}_{t+1}=( 1-\lambda) \boldsymbol{\theta}_{t}-\alpha\nabla\mathcal{L}_{t} ( \boldsymbol{\theta}_{t} ) ,

根据梯度下降法,二者确实等价,不用每次这样:

python
# 错误的方式 (Adam + L2 Regularization) optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) loss = criterion(output, target) + l2_lambda * l2_penalty

AdamW算法原理

先参考原始的Adam算法,算法的具体原来参考https://www.jamesblog.top/post/48

Adam 算法的更新规则是(忽略偏置修正项):

θt+1=θtηmtvt+ϵ\theta_{t+1}=\theta_{t}-\eta\frac{m_{t}} {\sqrt{v_{t}}+\epsilon}

其中:

  • mt=β1mt1+(1β1)gtm_{t}=\beta_{1} m_{t-1}+( 1-\beta_{1} ) g_{t}
  • vt=β2vt1+(1β2)gt2v_{t}=\beta_{2} v_{t-1}+( 1-\beta_{2} ) g_{t}^{2}
  • gt=θL(θt)g_{t}=\nabla_{\theta} L ( \theta_{t} )

如果我们直接在梯度上进行修改,添加权重衰减系数【传统错误的方式】:

gtwd=L(θt)+λθtg_{t}^{\mathrm{w d}}=\nabla L ( \theta_{t} )+\lambda\theta_{t}

原来的gtg_t梯度变成了添加衰减系数的梯度gtwdg_{t}^{\mathrm{w d}}, 由mtvtm_t 和 v_t公式可知,动量和速度都受到衰减系数的影响。这是高度耦合的

θt+1=θtηmtvt+ϵ,mt=β1mt1+(1β1)gtwd\theta_{t+1}=\theta_{t}-\eta\frac{m_{t}} {\sqrt{v_{t}}+\epsilon} , \quad m_{t}=\beta_{1} m_{t-1}+( 1-\beta_{1} ) g_{t}^{\mathrm{w d}}

现在我们来分析耦合带来的影响:

  • Adam的更新步长由 ηvt+ϵ\frac{\eta} {\sqrt{v_{t}}+\epsilon}决定。这个分母项 vtv_t本意是用来根据梯度的历史平方大小来调整每个参数的学习率的:梯度大的参数,学习率变小;梯度小的参数,学习率变大。
  • 当我们将权重衰减系数λ\lambda加入梯度后,如果某个权重θi\theta_i的值很大(这正是我们希望通过正则化来惩罚的),那么λθi\lambda \theta_i这一项也会很大。
  • 对应的vtv_t会被放大,vtv_t在分母,导致等效学习率会变小。本来给较大权重施加的“惩罚”效果反而被削弱了,导致正则化效果变差。

L2正则化的目的是将大权重“拉回”到零。但在耦合的Adam中,这个“拉回”的力 λθi\lambda \theta_i同时又不成比例地增加了vtv_t,减小了整体的更新步长,从而削弱了包括正则化项在内的整个梯度更新的效果。

简单来说,权重越大,它受到的正则化惩罚本应越强,但Adam的自适应机制反而会因为这个大权重而降低对它的更新力度,使得正则化效果大打折扣。正则化项在“自我削弱”。

这篇论文通过解耦来优化这种削弱,提出算法AdamW,AdamW 提出的关键思想:将权重衰减从梯度更新中解耦出来,直接在参数更新时进行衰减:

θt+1=θtηmtvt+ϵηλθt\theta_{t+1}=\theta_{t}-\eta\frac{m_{t}} {\sqrt{v_{t}}+\epsilon}-\eta\lambda\theta_{t}
  • ηmtvt+ϵ\eta\frac{m_{t}} {\sqrt{v_{t}}+\epsilon} 这里等效梯度用Adam原始算法的等效梯度,计算mtvtm_t 和 v_t的时候采用gtg_t,而不是gwdg^{wd}. 这样mtm_tvtv_t不受权重衰减系数的影响,实现了解耦。
  • ηλθt\eta\lambda\theta_{t} 是独立的权重衰减

这样权重衰减与自适应梯度无关,能更稳定地控制参数大小。

本文作者:James

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!