跳转到主要内容
杨月昌的软件博客
返回

Adam 优化算法详解:从原理到现代实践

引言

在深度学习模型训练中,优化器直接决定了收敛速度、训练稳定性和最终泛化性能。

传统的随机梯度下降(SGD)及其带动量变体虽然理论性质良好,但在高维非凸问题中常面临以下挑战:

Adam(2014 年提出)通过融合 动量法RMSProp 的核心思想,实现了每个参数独立的自适应学习率,极大地降低了超参数调试难度,成为过去十年深度学习事实上的“默认优化器”。

即使到了 2026 年,Adam 及其改进版本(尤其是 AdamW)仍然是训练大语言模型(LLM)、扩散模型、视觉Transformer 等大型架构的主流选择。


1. Adam 的核心思想

Adam 为每个参数维护两个指数移动平均量:

  1. 一阶矩估计(动量项):梯度的指数衰减平均,类似于 Momentum 的速度累积
  2. 二阶矩估计(均方项):梯度平方的指数衰减平均,用于自适应缩放步长,类似 RMSProp

通过这两者的结合 + 偏差校正 + 数值稳定技巧,Adam 实现了高效、稳定的参数更新。


2. 完整数学推导(LaTeX 版)

给定参数 $\theta$,在第 $t$ 步的梯度为 $g_t = \nabla_\theta L_t$,Adam 的更新规则如下:

2.1 动量(一阶矩)与均方(二阶矩)估计

$$ m_t \leftarrow \beta_1 m_{t-1} + (1 - \beta_1) g_t \qquad \text{(一阶矩估计,带偏的期望)} $$

$$ v_t \leftarrow \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 \qquad \text{(二阶矩估计,带偏的非中心方差)} $$

2.2 偏差校正(非常重要)

由于 $m_0 = v_0 = 0$,训练早期估计值会严重偏向 0,因此需要校正:

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

2.3 参数更新

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

常用默认超参数(几乎已成为行业标准):


3. PyTorch 中的标准实现方式(2026 常用写法)

import torch
import torch.optim as optim

model = MyModel(...)           # 你的模型
optimizer = optim.Adam(
    model.parameters(),
    lr=1e-3,                   # 常见初始值
    betas=(0.9, 0.999),
    eps=1e-8,
    weight_decay=0             # 注意:原版 Adam 的 weight_decay 实现有缺陷
)

# 现代更推荐使用 AdamW(见第5节)
# optimizer = optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.01)

# 典型训练一步
optimizer.zero_grad()
loss = compute_loss(model, batch)
loss.backward()
optimizer.step()

4. Adam 的主要优势(至今仍然成立)


5. Adam 的已知局限与现代解决方案(2025–2026 视角)

问题表现主流解决方案(2026 年常用)
原版 Adam 的 weight decay 实现不正确(与 SGD 的 L2 正则不等价)泛化能力偏弱,尤其在大模型中几乎全部切换为 AdamW(解耦权重衰减)
在某些 CV 任务中最终精度不如精心调参的 SGD+momentum测试集精度低 1–3%后期 warm-up → linear decay + 切换 SGD,或直接全程 AdamW
二阶矩累积过大 → 后期学习率过小,提前“卡住”曲线出现平台期使用 cosine decay with warm-up 或尝试 Adan / Lion 等新优化器
对超大 batch size 适应性一般不稳定结合 LAMB / LARS 或直接使用 AdamW + gradient clipping

2026 年工业界共识


6. 推荐进阶变体(2026 年仍活跃)


总结与建议

Adam 系列优化器降低了深度学习训练的门槛,让研究者和工程师能更专注于模型结构而非超参数调试。

2026 年实用建议排序(从稳妥到进阶):

  1. 先用 optim.AdamW(lr=1e-3 ~ 3e-4, weight_decay=0.01~0.1)
  2. 配合 linear warm-up + cosine decay 学习率调度
  3. 必要时开启 gradient clipping(norm=1.0)
  4. 如果追求极致性能或显存极度受限,再尝试 Lion / Adan / Sophia 等新玩家

希望本文能帮助你更好地理解并驾驭 Adam 家族优化器。



上一篇
快速上手 Sanity CMS:构建高效、可扩展的解耦式内容管理系统
下一篇
如何使用镜像源加速 NPM 包管理器(2026 避坑版)