无脑选AdamW?非也非也
一、 常见优化器演进史
1. SGD (Stochastic Gradient Descent,随机梯度下降)
这是最基础的优化器。每次从训练集中取一个 Batch,计算梯度,然后更新参数。
- 公式逻辑:wt+1=wt−η⋅gtw_{t+1} = w_t - \eta \cdot g_twt+1=wt−η⋅gt (η\etaη 是学习率,gtg_tgt 是梯度)
- 优点:
- 简单,计算量极小。
- 理论上在凸优化问题中能收敛到全局最优。
- 泛化性好:虽然收敛慢,但往往能跑到平坦的极小值点,模型在测试集表现通常比自适应方法好(常用于 ResNet 等计算机视觉任务)。
- 缺点:
- 慢:收敛速度非常慢。
- 容易卡住:在鞍点(Saddle Point)或局部极小值容易震荡或停滞。
- 难调参:所有参数共用一个学习率,对稀疏数据不友好。
2. SGD + Momentum (带动量的 SGD)
为了解决 SGD 容易震荡的问题,引入了物理学中“动量”的概念。
- 核心思想:如果把优化过程想象成小球滚下山,动量让小球在下坡时加速,在遇到坑洼时能借惯性冲过去。
- 优点:
- 比纯 SGD 收敛快。
- 能抑制震荡(比如在峡谷地形中)。
- 缺点:
- 仍然需要精细调节学习率。
3. AdaGrad
进入**自适应学习率(Adaptive Learning Rate)**时代。
- 核心思想:给不同的参数分配不同的学习率。经常更新的参数(梯度大),给它小的学习率;不常更新的参数(梯度稀疏),给它大的学习率。
- 优点:
- 非常适合稀疏数据(如早期的 NLP、推荐系统)。
- 不需要频繁手动调 LR。
- 缺点:
- 早停:分母是累积梯度的平方和,随着训练进行,分母无限变大,导致学习率迅速衰减到 0,训练提前结束。
4. RMSProp
- 核心思想:为了解决 AdaGrad 学习率过早消失的问题,RMSProp 引入了指数加权移动平均。它只关注“最近”的梯度情况,而不是从开天辟地以来的所有梯度。
- 优点:
- 解决了 AdaGrad 训练后期学习率归零的问题。
- 适合处理非平稳目标(如 RNN)。
5. Adam (Adaptive Moment Estimation)
这是很长一段时间内的默认选择(Keep it simple, use Adam)。
- 核心思想:Momentum + RMSProp 的结合体。
- 一阶动量(Mean):模拟 Momentum,利用梯度的惯性。
- 二阶动量(Variance):模拟 RMSProp,自适应调整学习率。
- 优点:
- 快:收敛速度极快。
- 稳:对超参数(learning rate)不那么敏感,默认值通常就能跑。
- 缺点:
- 泛化性稍差:有时在 CV 任务上不如精调的 SGD。
- 权重衰减(Weight Decay)实现有 Bug:这也是 AdamW 诞生的原因。
二、 为什么现在多用 AdamW?
现在的 Transformer 模型(BERT, GPT, DeepSeek, Llama)几乎清一色使用 AdamW。
AdamW 的本质是:Adam + Decoupled Weight Decay(解耦的权重衰减)。
要理解它,必须先理解 Adam 的一个致命缺陷。
1. Adam 的“好心办坏事”
在传统的 SGD 中,我们为了防止过拟合,会使用 L2 正则化(L2 Regularization)或 权重衰减(Weight Decay)。
- L2 正则化:把 λ2∣∣w∣∣2\frac{\lambda}{2}||w||^22λ∣∣w∣∣2 加到 Loss 函数里。
- 权重衰减:在更新参数时,直接让权重 www 变小一点点:w=w−ηλww = w - \eta \lambda ww=w−ηλw。
在 SGD 中,数学上证明了:L2 正则化 ⇔\Leftrightarrow⇔ 权重衰减。两者是等价的。
但是!在 Adam 中,两者不等价!
因为 Adam 会根据梯度的历史信息(二阶动量)去缩放梯度。如果你把 L2 正则项加到 Loss 里(像以前做的那样),计算出的梯度会被 Adam 的自适应系数除一下。
这就导致:正则化的力度被 Adam 扭曲了。 参数幅度大、更新频繁的地方,正则化力度反而变小了,这完全违背了正则化的初衷。
2. AdamW 的解决方案:解耦 (Decoupling)
AdamW 的作者发现,不应该把权重衰减项(Weight Decay)放到梯度里去算,而应该独立出来。
- Adam 的做法(错误):θt+1=θt−η⋅Adam(∇Loss+λθt)\theta_{t+1} = \theta_t - \eta \cdot \text{Adam}(\nabla Loss + \lambda \theta_t)θt+1=θt−η⋅Adam(∇Loss+λθt)
- AdamW 的做法(正确):θt+1=θt−η⋅Adam(∇Loss)−ηλθt\theta_{t+1} = \theta_t - \eta \cdot \text{Adam}(\nabla Loss) - \eta \lambda \theta_tθt+1=θt−η⋅Adam(∇Loss)−ηλθt
AdamW 在执行完 Adam 的梯度更新后,单独、直接地对权重进行衰减。
3. 为什么 AdamW 对 LLM 如此重要?
- 更强的泛化能力:修复了权重衰减的 Bug 后,AdamW 能真正发挥正则化的作用,防止模型过拟合,这对于参数量巨大的 LLM 至关重要。
- 训练更稳定:Transformer 模型对超参数非常敏感,AdamW 提供了比 Adam 更合理的参数控制。
- 收敛更快:在相同的 Loss 水平下,AdamW 往往比 Adam 需要的 Epoch 更少。
三、 总结建议
| 场景 | 推荐优化器 | 理由 |
|---|---|---|
| 大语言模型 (LLM)、Transformer (BERT/GPT) | AdamW | 这是目前的工业界标准。必须配合 Warmup 和 Cosine Decay 使用。 |
| 计算机视觉 (ResNet/VGG) | SGD + Momentum / AdamW | 很多 CV 论文仍偏爱 SGD,认为其泛化极值点更好;但在 ViT (Vision Transformer) 中,AdamW 是主流。 |
| 稀疏数据 / 简单的 NLP | Adam / LazyAdam | 传统任务 Adam 依然够用且方便。 |
| 显存极度受限 | Adafactor / Bitsandbytes-AdamW (8-bit) | Adafactor 去掉了二阶动量矩阵,省显存,但训练可能不稳定。 |
一句话总结:如果你在做深度学习,尤其是 Transformer 相关的任务,闭眼选 AdamW,它就是目前的“版本答案”。但是对于其他工程还需要具体问题具体分析
更多推荐

所有评论(0)