一个困扰深度学习社区多年的困惑

2015年,Diederik Kingma和Jimmy Ba在ICLR上发表了Adam优化器论文(该论文于2014年12月提交arXiv)。这个结合了动量和自适应学习率的优化器迅速成为深度学习社区的最爱。然而,一个奇怪的现象开始困扰研究者们:使用Adam训练的模型,其泛化能力似乎总是不如使用普通SGD加权重衰减训练的模型。

这个问题困扰了社区多年。直到2019年,Ilya Loshchilov和Frank Hutter在ICLR上发表的论文揭示了真相(论文于2017年11月提交arXiv):Adam配合L2正则化使用的标准做法存在根本性的缺陷。他们提出的AdamW优化器,通过一个看似简单的修改——解耦权重衰减——彻底改变了大模型训练的格局。

今天,AdamW已经成为训练Transformer和大语言模型的默认选择。从BERT到GPT,从LLaMA到Claude,几乎所有现代大模型都使用AdamW进行训练。但很多人并不真正理解,为什么把权重衰减从梯度路径中分离出来会产生如此巨大的影响。

timeline
    title 优化器发展历程
    section 基础时代
        1951 : SGD随机梯度下降
        1986 : Momentum动量加速
    section 自适应时代
        2011 : AdaGrad自适应学习率
        2012 : RMSProp解决学习率衰减
        2014 : Adam结合动量与自适应
    section 精细化时代
        2017 : AdamW解耦权重衰减

这篇文章将带你深入理解权重衰减与L2正则化之间的微妙差异,揭示Adam的自适应机制如何破坏了这种等价性,以及AdamW是如何优雅地解决这个问题的。

L2正则化与权重衰减:两个看似等价的概念

L2正则化:从损失函数入手

L2正则化是最经典的正则化技术之一。其核心思想是在损失函数中添加一个惩罚项,限制权重的大小:

$$\mathcal{L}_{reg}(\theta) = \mathcal{L}(\theta) + \frac{\lambda}{2}\|\theta\|_2^2$$

其中$\mathcal{L}(\theta)$是原始损失函数(如交叉熵或均方误差),$\frac{\lambda}{2}\|\theta\|_2^2$是正则化项,$\lambda$是正则化强度超参数。系数$\frac{1}{2}$是为了方便后续的梯度计算。

当我们对这个正则化损失求梯度时,得到:

$$\nabla_\theta \mathcal{L}_{reg}(\theta) = \nabla_\theta \mathcal{L}(\theta) + \lambda\theta$$

这意味着,除了原始梯度外,每个权重还会受到一个指向原点的力,力的大小与权重本身成正比。权重越大,受到的"拉力"越强,从而倾向于让权重保持较小。

flowchart LR
    subgraph L2正则化过程
        A[原始损失 L] --> C[正则化损失 L + λ/2||θ||²]
        B[权重向量 θ] --> C
        C --> D[梯度 ∇L + λθ]
        D --> E[参数更新]
    end
    
    style C fill:#e1f5fe
    style D fill:#fff3e0

权重衰减:直接修改更新规则

权重衰减采取了另一种思路。它不修改损失函数,而是直接在参数更新步骤中让权重"衰减":

$$\theta_{t+1} = \theta_t - \alpha g_t - \alpha\lambda\theta_t$$

可以重新整理为:

$$\theta_{t+1} = (1 - \alpha\lambda)\theta_t - \alpha g_t$$

这里$(1 - \alpha\lambda)$是一个略小于1的因子,每一步都会将权重略微缩小,就像放射性元素衰变一样。因此得名"权重衰减"。

flowchart LR
    subgraph 权重衰减过程
        A[当前权重 θ_t] --> B[衰减因子 1-αλ]
        B --> C[衰减后权重]
        C --> D[应用梯度更新]
        D --> E[新权重 θ_{t+1}]
    end
    
    style B fill:#fce4ec
    style D fill:#e8f5e9

为什么在SGD中它们等价

对于标准的随机梯度下降(SGD),这两种方法确实产生完全相同的更新:

使用L2正则化时,SGD更新为:

$$\theta_{t+1} = \theta_t - \alpha(\nabla_\theta \mathcal{L}(\theta_t) + \lambda\theta_t) = \theta_t - \alpha g_t - \alpha\lambda\theta_t$$

这正是权重衰减的形式!因为SGD对所有梯度分量使用相同的学习率$\alpha$,正则化梯度$\lambda\theta$被同等对待,最终效果与直接衰减权重完全一致。

flowchart TD
    subgraph SGD中的等价性
        A[L2正则化<br/>θ - αg + λθ] --> C[数学等价]
        B[权重衰减<br/>θ - αg - αλθ] --> C
        C --> D[因为SGD使用统一学习率α]
        D --> E[两种方法产生相同更新]
    end
    
    style C fill:#c8e6c9
    style E fill:#a5d6a7

正是因为这种数学上的等价性,在很长一段时间里,L2正则化和权重衰减被视为同一事物的两种表述,甚至被当作同义词使用。

Adam如何打破这种等价

Adam的核心机制:自适应学习率

Adam(Adaptive Moment Estimation)的核心创新在于为每个参数计算一个自适应的学习率。它维护两个指数移动平均值:

一阶矩估计(动量)

$$m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t$$

二阶矩估计(梯度平方的移动平均)

$$v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2$$

然后进行偏差修正:

$$\hat{m}_t = \frac{m_t}{1-\beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1-\beta_2^t}$$

最终更新规则为:

$$\theta_{t+1} = \theta_t - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}$$

这里的关键是每个参数都有自己有效学习率$\alpha / (\sqrt{\hat{v}_t} + \epsilon)$。历史梯度大的参数,$\hat{v}_t$也大,有效学习率就小;历史梯度小的参数,有效学习率就大。这种自适应机制让Adam能够处理不同尺度的梯度,收敛速度快且稳定。

flowchart TD
    subgraph Adam自适应机制
        A[梯度 g_t] --> B[一阶矩 m_t<br/>梯度移动平均]
        A --> C[二阶矩 v_t<br/>梯度平方移动平均]
        B --> D[偏差修正 m̂_t]
        C --> E[偏差修正 v̂_t]
        D --> F[有效学习率<br/>α/√v̂_t]
        E --> F
        F --> G[参数更新<br/>θ - α·m̂_t/√v̂_t]
    end
    
    style F fill:#fff9c4
    style G fill:#f8bbd0

当L2正则化遇到Adam:问题出现了

当我们在Adam中使用L2正则化时,梯度变为$g'_t = g_t + \lambda\theta_t$。这个修改后的梯度进入Adam的两个矩估计:

$$m'_t = \beta_1 m'_{t-1} + (1-\beta_1)(g_t + \lambda\theta_t)$$

$$v'_t = \beta_2 v'_{t-1} + (1-\beta_2)(g_t + \lambda\theta_t)^2$$

问题出在二阶矩估计$v'_t$上。对于权重较大的参数,$\lambda\theta_t$项会增加$v'_t$的值。而$v'_t$增大意味着什么?有效学习率会降低!

这就形成了一个恶性循环:

  1. 权重较大的参数本应受到更强的正则化
  2. 但L2正则化项增加了这些参数的二阶矩估计
  3. 二阶矩估计增大导致有效学习率降低
  4. 正则化效果被自适应机制削弱了!

这正是问题的根源:Adam的自适应机制与L2正则化的目标产生了冲突。L2正则化希望在权重大的地方施加更强的惩罚,但Adam却在那里降低了学习率,导致正则化信号被压制。

flowchart TD
    A[L2正则化: 梯度变为 g + λθ] --> B[进入Adam的一阶矩 m_t]
    A --> C[进入Adam的二阶矩 v_t]
    C --> D[大权重参数 → v_t增大]
    D --> E[有效学习率 α/√v_t 减小]
    E --> F[正则化效果被削弱]
    
    G[理想情况: 大权重应受强正则化] -.->|冲突| F
    
    style F fill:#ffcccc
    style G fill:#ccffcc

一个具体的数值例子

假设我们有一个参数,其权重$\theta = 10$,当前梯度$g = 1$,设置$\lambda = 0.01$。

使用普通SGD加权重衰减:

$$\theta_{new} = \theta - \alpha(g + \lambda\theta) = 10 - 0.001 \times (1 + 0.1) = 9.9989$$

衰减效果:权重从10减少到9.9989,减少了0.0011。

现在考虑Adam的情况。假设该参数历史梯度都较小,$\hat{v} = 0.01$。那么:

$$\text{有效学习率} = \frac{\alpha}{\sqrt{\hat{v}}} = \frac{0.001}{0.1} = 0.01$$

但如果加入L2正则化项后,二阶矩估计会因为$(g + \lambda\theta)^2 = 1.1^2 = 1.21$而增大。假设$\hat{v}'$变成了0.1,那么:

$$\text{有效学习率}' = \frac{0.001}{\sqrt{0.1}} = 0.00316$$

有效学习率从0.01降到了0.00316,降低了约68%!正则化的效果被严重削弱。

flowchart LR
    subgraph 数值示例对比
        A[参数: θ=10, g=1, λ=0.01] --> B{使用哪种方法?}
        B -->|SGD+L2| C[有效衰减: 0.0011]
        B -->|Adam+L2| D[有效衰减被削弱68%]
        C --> E[正则化效果正常]
        D --> F[正则化效果显著降低]
    end
    
    style E fill:#c8e6c9
    style F fill:#ffcdd2

AdamW:解耦的力量

核心思想:让权重衰减独立作用

Loshchilov和Hutter的解决方案非常优雅:不要把正则化混入梯度中,而是在Adam更新之后,单独应用权重衰减。

AdamW的更新规则为:

$$\theta_{t+1} = \theta_t - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} - \alpha\lambda\theta_t$$

可以看到,最后多了一个独立的衰减项$-\alpha\lambda\theta_t$。这个项不经过Adam的矩估计,直接作用于权重本身。

用另一种方式表达:

$$\theta_{t+1} = (1 - \alpha\lambda)\theta_t - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}$$

权重首先被一个$(1 - \alpha\lambda)$因子衰减,然后再应用基于梯度的更新。这两个过程完全独立,互不干扰。

为什么这很重要

通过解耦,AdamW实现了两个独立的过程:

  1. 自适应优化:基于梯度历史动态调整学习率,快速收敛
  2. 权重衰减:以恒定速率衰减所有权重,实现正则化

无论某个参数的梯度历史如何,其权重衰减效果都保持一致。大权重参数会被稳定地推向零,不会被自适应机制"保护"。

flowchart LR
    subgraph Adam with L2
        A1[梯度 g + λθ] --> B1[一阶矩 m_t]
        A1 --> C1[二阶矩 v_t]
        B1 --> D1[自适应更新]
        C1 --> D1
        D1 --> E1[正则化效果不确定]
    end
    
    subgraph AdamW
        A2[梯度 g] --> B2[一阶矩 m_t]
        A2 --> C2[二阶矩 v_t]
        B2 --> D2[自适应更新]
        C2 --> D2
        F2[权重衰减 -αλθ] --> D2
        D2 --> E2[正则化效果稳定]
    end
    
    style E1 fill:#ffcccc
    style E2 fill:#ccffcc

算法对比

让我们详细对比Adam和AdamW的算法:

Adam算法

输入:学习率α,矩估计衰减率β₁, β₂,数值稳定项ε
初始化:m₀ = 0, v₀ = 0

for t = 1, 2, ... do
    g_t ← ∇θL(θ_{t-1})           # 计算梯度
    m_t ← β₁m_{t-1} + (1-β₁)g_t  # 更新一阶矩
    v_t ← β₂v_{t-1} + (1-β₂)g_t² # 更新二阶矩
    m̂_t ← m_t/(1-β₁^t)           # 一阶矩偏差修正
    v̂_t ← v_t/(1-β₂^t)           # 二阶矩偏差修正
    θ_t ← θ_{t-1} - α·m̂_t/(√v̂_t + ε)  # 更新参数
end for

AdamW算法

输入:学习率α,矩估计衰减率β₁, β₂,数值稳定项ε,权重衰减系数λ
初始化:m₀ = 0, v₀ = 0

for t = 1, 2, ... do
    g_t ← ∇θL(θ_{t-1})           # 计算梯度(不加正则化项!)
    m_t ← β₁m_{t-1} + (1-β₁)g_t  # 更新一阶矩
    v_t ← β₂v_{t-1} + (1-β₂)g_t² # 更新二阶矩
    m̂_t ← m_t/(1-β₁^t)           # 一阶矩偏差修正
    v̂_t ← v_t/(1-β₂^t)           # 二阶矩偏差修正
    θ_t ← θ_{t-1} - α·m̂_t/(√v̂_t + ε) - α·λ·θ_{t-1}  # 更新参数(带解耦衰减)
end for

唯一的区别在于最后一行:AdamW在Adam更新之后额外减去了$-\alpha\lambda\theta_{t-1}$。这个看似微不足道的改变,却产生了深远的影响。

flowchart TD
    subgraph 算法对比
        direction TB
        subgraph Adam
            A1[计算梯度 g] --> B1[更新矩估计]
            B1 --> C1[偏差修正]
            C1 --> D1[参数更新 θ - α·m̂/√v̂]
        end
        subgraph AdamW
            A2[计算梯度 g] --> B2[更新矩估计]
            B2 --> C2[偏差修正]
            C2 --> D2[参数更新 θ - α·m̂/√v̂ - αλθ]
            E2[独立的权重衰减] --> D2
        end
    end
    
    style D2 fill:#c8e6c9
    style E2 fill:#bbdefb

实验证据:AdamW真的更好吗

Loshchilov和Hutter的原始实验

在2019年ICLR发表的论文中,作者在多个数据集上比较了Adam+L2与AdamW的表现:

CIFAR-10上的结果

  • Adam + L2正则化:测试误差约7.5%
  • AdamW:测试误差约6.5%
  • 改进幅度:约15%的相对提升

ImageNet上的结果

  • 使用AdamW训练的模型在验证集上取得了更好的泛化性能
  • 与SGD+动量的差距显著缩小

更重要的是,AdamW使得用Adam训练的模型终于能够在泛化性能上与SGD竞争,同时保持了Adam收敛快的优点。

xychart-beta
    title "CIFAR-10测试误差对比"
    x-axis ["SGD+动量", "Adam+L2", "AdamW"]
    y-axis "测试误差 %" 5 --> 10
    bar [6.8, 7.5, 6.5]

Transformer训练中的表现

AdamW已经成为Transformer架构的标准优化器。以下是几个重要模型使用的配置:

模型 学习率 权重衰减 β₁ β₂
BERT 2e-5 ~ 5e-5 0.01 0.9 0.999
GPT-2 2.5e-4 0.01 0.9 0.999
GPT-3 ~1e-4 0.1 0.9 0.999
ViT 1e-3 0.05 ~ 0.3 0.9 0.999

可以看到,大模型往往使用较强的权重衰减(0.01~0.1),这表明在参数量巨大的情况下,正则化对于防止过拟合至关重要。

为什么AdamW特别适合Transformer

Transformer架构有几个特点,使得AdamW的优势更加明显:

梯度尺度差异大:自注意力层、前馈层和嵌入层的梯度尺度可能相差几个数量级。Adam的自适应机制能够处理这种差异,但只有配合解耦的权重衰减才能确保正则化效果一致。

训练数据量大:现代大语言模型使用数万亿token进行训练。在如此长的训练过程中,正则化效果的累积差异会被放大。

学习率调度复杂:Transformer训练通常使用线性预热接余弦衰减的学习率调度。AdamW的行为在这种调度下更加可预测,因为权重衰减不会与学习率调度产生意外的交互。

flowchart TD
    subgraph Transformer训练特点
        A[梯度尺度差异大] --> D[AdamW优势明显]
        B[训练数据量巨大] --> D
        C[学习率调度复杂] --> D
    end
    
    D --> E[正则化效果一致]
    D --> F[行为可预测]
    D --> G[累积差异小]
    
    style D fill:#e1bee7
    style E fill:#c8e6c9
    style F fill:#c8e6c9
    style G fill:#c8e6c9

实践指南:如何正确使用AdamW

基本配置

AdamW的关键超参数及其典型取值:

学习率(learning rate, α)

  • 预训练:1e-4 ~ 1e-3
  • 微调:2e-5 ~ 5e-5
  • 通常需要配合学习率预热(warmup)

权重衰减(weight decay, λ)

  • 典型范围:0.01 ~ 0.1
  • 大模型通常需要更强的正则化
  • 注意:某些实现中权重衰减实际乘以学习率,因此有效衰减为$\alpha\lambda$

矩估计衰减率(betas)

  • 默认值:(0.9, 0.999)
  • Transformer训练有时使用(0.9, 0.98)以获得更稳定的训练

数值稳定项(epsilon, ε)

  • 默认值:1e-8
  • 混合精度训练时可使用1e-6或1e-7
mindmap
  root((AdamW超参数))
    学习率 α
      预训练: 1e-4 ~ 1e-3
      微调: 2e-5 ~ 5e-5
      需要warmup
    权重衰减 λ
      典型范围: 0.01 ~ 0.1
      大模型更强正则化
      注意实现差异
    Betas
      默认: 0.9, 0.999
      Transformer: 0.9, 0.98
    Epsilon ε
      默认: 1e-8
      混合精度: 1e-6

权重衰减应该应用于哪些参数

一个常见的错误是对所有参数都应用权重衰减。正确的做法是:

应该应用权重衰减的参数

  • 所有权重矩阵(Weight matrices)
  • 这是模型参数的主体

不应该应用权重衰减的参数

  • 偏置项(Biases):它们不直接控制特征的重要性
  • 层归一化参数(LayerNorm的scale和shift):它们有特定的功能
  • 嵌入层(有时):实践中做法不一

PyTorch中的实现示例:

# 正确的参数分组
param_groups = [
    {
        'params': [p for n, p in model.named_parameters() 
                   if 'weight' in n and 'ln' not in n and 'embed' not in n],
        'weight_decay': 0.01
    },
    {
        'params': [p for n, p in model.named_parameters() 
                   if 'bias' in n or 'ln' in n or 'embed' in n],
        'weight_decay': 0.0
    }
]

optimizer = AdamW(param_groups, lr=1e-4)

学习率与权重衰减的关系

一个容易被忽视的问题是学习率和权重衰减之间的交互。在PyTorch的实现中,权重衰减的实际效果是$\alpha\lambda\theta$,因此:

  • 如果你将学习率加倍,同时保持权重衰减系数不变,有效衰减也会加倍
  • 如果这不符合你的预期,你需要同时调整权重衰减系数

一些实践者建议采用"独立权重衰减"策略,即保持衰减系数独立于学习率:

# 独立权重衰减策略
effective_weight_decay = weight_decay * (lr / base_lr)

学习率调度

AdamW通常配合以下学习率调度:

线性预热 + 线性衰减

from transformers import get_linear_schedule_with_warmup

scheduler = get_linear_schedule_with_warmup(
    optimizer,
    num_warmup_steps=warmup_steps,
    num_training_steps=total_steps
)

线性预热 + 余弦衰减

from transformers import get_cosine_schedule_with_warmup

scheduler = get_cosine_schedule_with_warmup(
    optimizer,
    num_warmup_steps=warmup_steps,
    num_training_steps=total_steps
)

预热阶段对于Transformer训练至关重要,通常占总步数的1%~10%。

常见误区与陷阱

误区一:AdamW只是Adam的一个小修改

表面上看,AdamW只比Adam多了一行代码。但这种简单性恰恰体现了深刻的洞察:理解了问题的本质,解决方案往往是简洁的。AdamW的成功不是因为它复杂,而是因为它找到了问题的症结所在。

误区二:所有深度学习框架的AdamW都一样

不同框架对AdamW的实现存在微妙差异:

  • PyTorch:权重衰减乘以学习率($\alpha\lambda\theta$)
  • TensorFlow/Keras:可能有不同的实现细节
  • Hugging Face Transformers:基于PyTorch实现,但有额外的参数分组逻辑

在使用之前,务必确认你使用的框架的具体实现。

误区三:权重衰减越大越好

过强的权重衰减会导致:

  • 模型欠拟合,无法充分学习训练数据
  • 权重过早收敛到零附近,模型容量受限
  • 训练损失居高不下

选择权重衰减系数时,应该进行超参数搜索,而不是简单照搬其他模型的配置。

误区四:AdamW总是比Adam好

在某些特定场景下,SGD+动量仍然可能是更好的选择:

  • 计算机视觉任务(一些研究表明SGD有更好的泛化)
  • 内存受限的场景(AdamW需要存储两倍于参数量的矩估计)
  • 需要极致泛化性能的场景

但对于大多数Transformer和语言模型任务,AdamW是一个安全且有效的默认选择。

flowchart TD
    subgraph 常见误区
        A[误区一: AdamW只是小修改] --> A1[实际: 深刻洞察的体现]
        B[误区二: 所有框架实现相同] --> B1[实际: 存在微妙差异]
        C[误区三: 权重衰减越大越好] --> C1[实际: 需要超参数搜索]
        D[误区四: AdamW总是更好] --> D1[实际: 某些场景SGD更优]
    end
    
    style A1 fill:#c8e6c9
    style B1 fill:#c8e6c9
    style C1 fill:#c8e6c9
    style D1 fill:#c8e6c9

深入理解:为什么较小的权重能改善泛化

理解权重衰减的有效性,需要回到正则化的理论基础。

奥卡姆剃刀原则

“如无必要,勿增实体”——这一哲学原则在机器学习中体现为:简单的模型更可能泛化。较小的权重意味着模型的决策边界更平滑,对输入的微小扰动不那么敏感。

数学直觉

考虑一个简单的线性模型$y = w^Tx$。如果权重$w$很大,输入$x$的一个小变化就能导致输出$y$的巨大变化。这种敏感性意味着模型可能会对训练数据中的噪声过度拟合。

反之,如果权重$w$较小,模型对输入变化的响应更加平缓,更能捕捉数据中的主要模式而非噪声。

损失函数的几何视角

权重衰减相当于在参数空间中添加了一个以原点为中心的"引力场"。优化过程不仅受到损失函数梯度的驱动,还受到这个引力场的持续作用。最终,模型会收敛到一个既能较好地拟合数据,又不太远离原点的位置。

flowchart TD
    A[较小的权重] --> B[模型输出变化平缓]
    B --> C[对输入扰动不敏感]
    C --> D[更可能捕捉主要模式]
    D --> E[更好的泛化能力]
    
    F[较大的权重] --> G[模型输出变化剧烈]
    G --> H[对输入扰动敏感]
    H --> I[可能拟合噪声]
    I --> J[过拟合风险]
    
    style E fill:#ccffcc
    style J fill:#ffcccc

从Adam到AdamW:深度学习优化的演进

优化器发展的时间线

年份 优化器 主要贡献
1951 SGD 随机梯度下降的基础
1986 Momentum 加速收敛,减少震荡
2011 AdaGrad 自适应学习率的开端
2012 RMSProp 解决AdaGrad的学习率衰减问题
2014 Adam 结合动量与自适应学习率
2017 AdamW 解耦权重衰减

这个演进告诉我们什么

从Adam到AdamW的演变,体现了深度学习研究的一个重要模式:先有实践经验,后有理论理解

Adam在实践中表现优异,但研究者们发现它与正则化的交互存在问题。这个问题的发现和解决,不是通过抽象的理论推导,而是通过仔细观察实验现象、分析失败案例。

这也提醒我们:即使是广泛使用的技术,也可能存在未被发现的问题。保持质疑和实证精神,是推动领域进步的关键。

flowchart LR
    subgraph 深度学习研究模式
        A[实践经验] --> B[发现异常现象]
        B --> C[分析失败案例]
        C --> D[理论理解]
        D --> E[提出解决方案]
        E --> A
    end
    
    style A fill:#e3f2fd
    style D fill:#f3e5f5
    style E fill:#c8e6c9

总结

权重衰减与L2正则化的区别,看似是一个技术细节,却深刻影响了深度学习的发展方向。让我们回顾核心要点:

等价性只在特定条件下成立:对于标准SGD,L2正则化和权重衰减确实等价。但这种等价性依赖于学习率对所有梯度分量的一致应用。

Adam打破了这个等价:Adam的自适应学习率机制根据梯度历史调整每个参数的学习率。当L2正则化项被混入梯度时,它会进入二阶矩估计,导致大权重参数的学习率降低,正则化效果被削弱。

解耦是关键:AdamW通过将权重衰减从梯度路径中分离出来,确保正则化效果不受自适应机制的影响。大权重始终受到一致的衰减压力。

实践中的影响是巨大的:AdamW已经成为训练Transformer和大语言模型的默认选择。几乎所有现代大模型——BERT、GPT、LLaMA——都使用AdamW进行训练。

正确使用很重要:权重衰减应该只应用于权重矩阵,不应应用于偏置项和归一化参数。学习率和权重衰减系数之间存在交互,需要仔细调整。

flowchart TD
    subgraph 核心要点总结
        A[SGD中L2与权重衰减等价] --> B[但Adam打破了这个等价]
        B --> C[AdamW通过解耦修复问题]
        C --> D[成为大模型训练标配]
        D --> E[正确配置至关重要]
    end
    
    style A fill:#bbdefb
    style B fill:#ffcdd2
    style C fill:#c8e6c9
    style D fill:#c8e6c9
    style E fill:#fff9c4

在深度学习的漫长发展历程中,AdamW代表了一个优雅的解决方案——不是通过复杂的机制,而是通过清晰理解问题本质后的简洁修改。这提醒我们,有时候最好的改进来自于对基础概念的深入反思,而非不断增加复杂性。

当你下次在训练脚本中写optimizer = AdamW(model.parameters(), lr=1e-4, weight_decay=0.01)时,希望你能想起这背后蕴含的深刻智慧:有时候,把两件事分开做,比混在一起做更好。