一、 常见优化器演进史

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λ∣∣w2 加到 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 如此重要?
  1. 更强的泛化能力:修复了权重衰减的 Bug 后,AdamW 能真正发挥正则化的作用,防止模型过拟合,这对于参数量巨大的 LLM 至关重要。
  2. 训练更稳定:Transformer 模型对超参数非常敏感,AdamW 提供了比 Adam 更合理的参数控制。
  3. 收敛更快:在相同的 Loss 水平下,AdamW 往往比 Adam 需要的 Epoch 更少。

三、 总结建议

场景推荐优化器理由
大语言模型 (LLM)、Transformer (BERT/GPT)AdamW这是目前的工业界标准。必须配合 Warmup 和 Cosine Decay 使用。
计算机视觉 (ResNet/VGG)SGD + Momentum / AdamW很多 CV 论文仍偏爱 SGD,认为其泛化极值点更好;但在 ViT (Vision Transformer) 中,AdamW 是主流。
稀疏数据 / 简单的 NLPAdam / LazyAdam传统任务 Adam 依然够用且方便。
显存极度受限Adafactor / Bitsandbytes-AdamW (8-bit)Adafactor 去掉了二阶动量矩阵,省显存,但训练可能不稳定。

一句话总结:如果你在做深度学习,尤其是 Transformer 相关的任务,闭眼选 AdamW,它就是目前的“版本答案”。但是对于其他工程还需要具体问题具体分析

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐