梯度优化器

下面写一篇结构清晰、逻辑严谨，涵盖：

SGD（随机梯度下降）

Mini-batch SGD（小批量随机梯度下降）

Adam 优化器

AdamW 优化器

三者之间的联系与区别

计算直觉 + 数学公式 + 实践经验

深度学习优化器全面理解：SGD、Mini-batch SGD、Adam、AdamW

在深度学习训练中，优化器（Optimizer）是控制模型参数如何更新的核心组件。
不同优化器会极大影响模型的学习速度、稳定性以及最终效果。

本文将深入理解：

SGD 是什么？

Mini-batch 为什么是深度学习的标准？

Adam 是如何结合 Momentum + RMSProp 的？

AdamW 为什么是目前最主流的大模型优化器？

SGD 和 mini-batch 在一个 batch 中的梯度，取这个 batch 的平均值

1. SGD：随机梯度下降（Stochastic Gradient Descent）

1.1 基本思想

标准梯度下降（Full-batch Gradient Descent）：

Copy θ=θ−η⋅∇θ L(所有训练数据)\theta = \theta - \eta \cdot \nabla_\theta L(\text{所有训练数据})θ=θ−η⋅∇θ​L(所有训练数据)

缺点非常明显：

每次更新都要遍历整个数据集（太慢）

对大数据集不可行

于是我们引入 随机梯度下降 SGD。

SGD 的思想：

每次只用一个样本的梯度来更新参数，而不是所有数据。

更新方式：

Copy θ=θ−η⋅∇θ L(xi)\theta = \theta - \eta \cdot \nabla_\theta L(x_i)θ=θ−η⋅∇θ​L(xi​)

1.2 SGD 的优点

更新速度极快（不用遍历全量数据）

噪声大，可能帮助模型跳出局部最优

1.3 SGD 的缺点

噪声太大，梯度抖动严重

每次只看一个样本，优化轨迹很不稳定

不适合深度网络和大型模型

因此，现在更常用的是 ——Mini-batch SGD。

2. Mini-batch SGD：现代深度学习的默认方式

实际训练不会用 batch=1（SGD），也不会用 full batch，而是：

每次使用一小批样本 (batch_size = 32/64/128...) 来估计梯度。

Mini-batch 梯度：

Copy g=1 B∑i=1 B∇θ L(xi)g = \frac{1}{B} \sum_{i=1}^{B} \nabla_\theta L(x_i)g=B1​i=1∑B​∇θ​L(xi​)

参数更新：

Copy θ=θ−ηg\theta = \theta - \eta gθ=θ−ηg

2.1 为什么 Mini-batch 最优？

Mini-batch 是一个完美的折中：

方法 | 噪声 | 速度 | 稳定性 | 实际使用
SGD（batch=1） | 噪声太大 | 快 | 差 | 少用
Full-batch GD | 无噪声 | 慢 | 好 | 不可行
Mini-batch SGD | 适度噪声 | 快 | 稳定 | 最常用

Mini-batch 的优势：

充分利用 GPU 并行能力

具有合理的梯度噪声，有助于泛化

训练稳定，更新速度快

因此在深度学习中，提到 “SGD” 通常其实指：

Mini-batch SGD，而不是 batch=1 的原始 SGD。

3. Adam：自适应矩估计优化器（Adaptive Moment Estimation）

Adam 可以看成以下两者的结合：

Momentum（动量） —— 平滑梯度方向

RMSProp —— 自适应维度学习率

3.1 Adam 的核心思想

Adam 为每个参数维护两个值：

一阶矩（动量）：梯度的指数平均

Copy mt=β 1m t−1+(1−β 1)gt m_t = \beta_1 m_{t-1} + (1-\beta_1) g_tmt​=β1​mt−1​+(1−β1​)gt​

关键点：

gt g_tgt​：当前 batch 的梯度

m t−1 m_{t-1}mt−1​：之前所有 batch 梯度的 “压缩记忆”
为什么 β\betaβ的值大约是 0.9，比较大？

为什么 β₁ 要设得这么大（比如 0.9）？

1️⃣ 因为 mini-batch 梯度本身 “噪声很大”

你现在已经知道：

每个 gt g_tgt​ 只是一个 mini-batch 的梯度

不同 batch 之间，梯度方向会抖动

如果我们过分相信当前 batch：

参数会 “左一下、右一下”

收敛慢甚至不稳定

所以我们要：

“少听当前 batch，多听历史趋势”

这就是 β₁ 设得大的根本原因。

2️⃣ β₁ = 0.9 实际意味着什么？

Copy mt=0.9 m t−1+0.1 gt m_t = 0.9 m_{t-1} + 0.1 g_tmt​=0.9mt−1​+0.1gt​

解释：

当前 batch 的梯度只占 10%

历史趋势占 90%

但注意：
这 90% 不是 “上一个 batch”，而是所有历史 batch 的综合结果。

3️⃣ “记忆长度” 是多少？

指数平均有一个直观的 “有效记忆长度”：

Copy memory length≈1 1−β 1\text{memory length} \approx \frac{1}{1-\beta_1}memory length≈1−β1​1​

所以：

β₁ = 0.9 → 记住大约 10 个 batch

β₁ = 0.99 → 记住大约 100 个 batch

β₁ = 0.5 → 记住大约 2 个 batch

这也解释了：

β₁ 越大，记忆越长，更新越平滑；
β₁ 越小，反应越快，但更噪。

二阶矩：梯度平方的指数平均

Copy vt=β 2v t−1+(1−β 2)gt 2 v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2vt​=β2​vt−1​+(1−β2​)gt2​

之后进行偏置校正：

Copy m^t=mt 1−β 1 t,v^t=vt 1−β 2 t\hat{m}_t = \frac{m_t}{1-\beta_1^t}, \qquad \hat{v}_t = \frac{v_t}{1-\beta_2^t}m^t​=1−β1t​mt​​,v^t​=1−β2t​vt​​

最终更新：

Copy θ=θ−η⋅m^t v^t+ε\theta = \theta - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \varepsilon}θ=θ−η⋅v^t​ ​+εm^t​​

3.2 Adam 的直觉理解

$\hat {m}_t$：平滑梯度，让优化方向更稳定

$\hat {v}_t$：衡量梯度幅度，大梯度 → 步长小，小梯度 → 步长大

每维参数具有独立学习率：自适应学习率

3.3 Adam 的优势

收敛速度快（尤其训练初期）

对学习率不敏感

对梯度尺度自适应，非常适合深度网络

是 NLP、Transformer 等大模型训练的主力

3.4 Adam 的缺点

有时泛化性能不如 SGD + Momentum

原版 Adam 的 L2 正则不严格等价于 weight decay

这个缺点引出了 AdamW。

4. AdamW：Transformer 等大模型的标准优化器

AdamW = Adam + 正确的权重衰减（Weight Decay）

原版 Adam 的 L2 正则和自适应学习率耦合在一起，导致效果不好。

AdamW 将 weight decay 直接作用在参数上：

Copy θ=θ−η(m^t v^t+ε+λθ)\theta = \theta - \eta \left( \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \varepsilon} + \lambda\theta \right)θ=θ−η(v^t​ ​+εm^t​​+λθ)

这样：

weight decay 只影响参数大小，不影响梯度估计

更符合理论，也更稳定

AdamW 是以下模型的默认优化器：

BERT

GPT-2 / GPT-3 / GPT-4

PaLM / LLaMA

Megatron-LM

Stable Diffusion

几乎所有现代大模型都是用 AdamW 训练的。

5. SGD vs Mini-batch SGD vs Adam vs AdamW 总结对比

优化器 | 是否自适应 | 是否平滑方向 | 是否有 weight decay 正确实现 | 收敛速度 | 泛化能力 | 应用场景
SGD | 否 | 否 | 否 | 慢 | 强（图像任务） | CNN、小模型
SGD+Momentum | 否 | 是 | 否 | 中等 | 很强 | 大部分传统任务
Mini-batch SGD | 否 | 否 | 否 | 中等 | 强 | 全部深度学习
Adam | 是 | 是 | 否 | 快 | 一般 | NLP、大模型
AdamW | 是 | 是 | 是 | 快且稳 | 强 | Transformer、大模型标准

6. 最终总结（一句话记忆版）

SGD：用一个样本更新参数，但噪声太大

Mini-batch SGD：用一批样本的平均梯度更新，是训练标准

Adam：动量 + 自适应学习率，训练快、稳定

AdamW：修复 Adam 的 weight decay 问题，是 Transformer/GPT 的默认优化器