1246 字
6 分钟
Adam 优化算法详解:从原理到现代实践

引言#

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

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

  • 收敛速度慢
  • 对学习率极其敏感
  • 容易陷入鞍点或平坦区域
  • 不同参数的梯度尺度差异巨大

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

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


1. Adam 的核心思想#

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

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

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


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

给定参数 θ\theta,在第 tt 步的梯度为 gt=θLtg_t = \nabla_\theta L_t,Adam 的更新规则如下:

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

mtβ1mt1+(1β1)gt(一阶矩估计,带偏的期望)m_t \leftarrow \beta_1 m_{t-1} + (1 - \beta_1) g_t \qquad \text{(一阶矩估计,带偏的期望)}vtβ2vt1+(1β2)gt2(二阶矩估计,带偏的非中心方差)v_t \leftarrow \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 \qquad \text{(二阶矩估计,带偏的非中心方差)}

2.2 偏差校正(非常重要)#

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

m^t=mt1β1t,v^t=vt1β2t\hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t}

2.3 参数更新#

θt+1θtαm^tv^t+ϵ\theta_{t+1} \leftarrow \theta_t - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}

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

  • α\alpha(学习率)= 0.001(或 1e-3 ~ 3e-4 范围)
  • β1\beta_1 = 0.9
  • β2\beta_2 = 0.999
  • ϵ\epsilon = 1e-8(防止除零)

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 的主要优势(至今仍然成立)#

  • 快速收敛:尤其在训练早期表现优异
  • 对学习率不敏感:默认参数在绝大多数任务上都能较好工作
  • 参数尺度无关:天然适应梯度大小差异极大的参数(如 Embedding 层 vs. 输出层)
  • 内存开销适中:仅需为每个参数保存 m 和 v 两个动量(相比 AdaGrad 等更节省)

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 年工业界共识

  • 小型实验 / 快速迭代 → AdamAdamW
  • 中大型模型(>100M 参数)、LLM、扩散模型 → AdamW(几乎成为标配)
  • 追求极致精度(尤其是图像分类)→ 可尝试 SGD + momentum + cosine scheduleLion / Sophia 等极新兴优化器

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

  • AdamW(最重要!):解耦权重衰减,目前绝大多数论文和工业代码的默认选择
  • AdamWR / RAdam:改进偏差校正与方差整流,早期更稳定
  • Adam8bit / 8-bit Adam:大幅降低显存占用,适合消费级显卡训练大模型
  • Lion(2023–2025 流行):sign 操作代替自适应步长,显存更省、速度更快
  • Adan:在部分任务上表现出比 AdamW 更强的鲁棒性

总结与建议#

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 家族优化器。

Adam 优化算法详解:从原理到现代实践
https://sw.rscclub.website/posts/rgznzadamyhsf/
作者
杨月昌
发布于
2022-05-12
许可协议
CC BY-NC-SA 4.0