Adam Optimizer(Adam 优化器)

Adam 就是给每个参数各配了一个会自动调节的学习率,梯度大的参数学得慢一点,梯度小的参数学得快一点,省去了手动调学习率的麻烦。

亦作、亦称:Adam 优化器 · Adam · Adaptive Moment Estimation · 自适应矩估计

Adam 优化器是深度学习中最流行的参数更新算法之一,通过同时追踪梯度的一阶矩与二阶矩,为每个参数自动分配自适应学习率。它在 2014 年由 Kingma 和 Ba 提出后迅速成为训练神经网络的默认选择,并衍生出 AdamW、AMSGrad 等重要变体。

概述

Adam 全称 Adaptive Moment Estimation,是当前深度学习训练中使用最广泛的优化算法之一。

  • 提出背景:传统 SGD 需要手动调整全局学习率,AdaGrad 在稀疏梯度场景有优势但学习率单调递减,RMSProp 改进了非平稳场景但缺乏动量;Adam 将二者融合并加入偏差修正。
  • 核心思想:同时维护梯度的一阶矩估计(指数加权移动平均,捕捉方向)和二阶矩估计(指数加权移动平均的平方,捕捉幅度),为每个参数独立计算自适应学习率。
  • 论文与影响:Kingma & Ba 于 2014 年提交至 arXiv(arXiv:1412.6980),发表于 ICLR 2015,被引量超过 20 万次,是深度学习史上引用最多的论文之一。
  • 默认地位:PyTorch、TensorFlow、Keras 等主流框架均将 Adam 作为推荐默认优化器。

工作原理

Adam 在每步更新时执行以下计算流程。

  • 一阶矩更新:m_t = β1 · m_{t-1} + (1 - β1) · g_t,其中 g_t 为当前梯度,β1 默认 0.9,相当于对梯度方向做指数移动平均,起到动量效果。
  • 二阶矩更新:v_t = β2 · v_{t-1} + (1 - β2) · g_t²,β2 默认 0.999,追踪梯度幅度的历史,用于对学习率进行自适应缩放
  • 偏差修正:初始阶段 m_t 和 v_t 偏向 0,需除以 (1 - β1^t) 和 (1 - β2^t) 进行修正,得到 m̂_t 和 v̂_t。
  • 参数更新:θ_t = θ_{t-1} - α · m̂_t / (√v̂_t + ε),其中 ε(默认 1e-8)防止除零;梯度大的参数步长自动缩小,梯度小的参数步长相对较大。
  • 超参数直觉:β1 控制动量记忆长度,β2 控制自适应缩放的历史窗口,实践中大多数任务使用默认值即可良好收敛。

重要变体

Adam 衍生出多个改进变体,各自针对不同缺陷进行修正。

  • AdamW(2017,Loshchilov & Hutter):将 weight decay 从梯度更新中解耦,直接作用于参数而非梯度,修复了原版 Adam L2 正则化被自适应缩放扭曲的问题;是训练 Transformer 模型(GPT、BERT 等)的事实标准。
  • AMSGrad(2018,Reddi 等):保证二阶矩估计单调不减,解决原版 Adam 在部分场景下不收敛的理论问题,但实践提升有限。
  • Nadam:将 Nesterov 加速动量(NAG)引入 Adam,先利用预测位置的梯度更新动量,通常收敛更快。
  • RAdam(Rectified Adam,2019):在预热阶段使用自适应修正系数,减少训练初期学习率方差过大的问题,可替代 warmup 调度。
  • Lion(2023,Google DeepMind):只追踪一阶矩符号,内存占用更小,部分视觉和语言任务上超越 AdamW。

应用场景

Adam 及其变体广泛应用于几乎所有深度学习领域。

  • 自然语言处理:BERT、GPT 系列、T5 等大语言模型的预训练和微调均以 AdamW 为首选,配合学习率预热(warmup)和余弦退火调度。
  • 计算机视觉:ResNet、ViT 等图像模型训练;但对于部分经典 CNN 任务,精调的 SGD+Momentum 仍可取得更好泛化性能。
  • 生成模型:GAN、VAE、扩散模型等生成式任务普遍使用 Adam,因其对超参数不敏感、收敛稳定。
  • 强化学习:策略梯度(PPO、A3C)和 Q 学习系的网络参数更新常用 Adam。
  • 推荐系统:大规模稀疏 Embedding 场景下 Adam 的自适应特性尤为有用。

与相邻概念的区别

Adam 常与其他优化器混淆,以下为关键区别。

  • Adam vs SGD:SGD 使用统一全局学习率,对所有参数一视同仁;Adam 为每个参数独立计算步长,对超参数不敏感但有时泛化不如 SGD。
  • Adam vs RMSProp:RMSProp 只维护二阶矩(无动量),且无偏差修正;Adam 在此基础上增加了一阶矩动量和偏差修正,通常更稳定。
  • Adam vs AdamW:原版 Adam 的 weight decay 与自适应学习率耦合,等效 L2 正则化被扭曲;AdamW 将二者解耦,正则化效果更纯粹,是大模型训练的推荐选择。
  • Adam vs AdaGrad:AdaGrad 累加所有历史平方梯度,学习率单调递减最终趋零;Adam 用指数移动平均只记住近期历史,避免了这一问题。

局限与常见误区

尽管 Adam 功能强大,仍存在若干已知局限和实践中的误区。

  • 泛化差距:研究表明在部分 CNN 图像分类任务上,Adam 收敛到更尖锐的极小值,泛化性能劣于精调后的 SGD+Momentum。
  • weight decay 陷阱:误区一——给 Adam 直接设 weight_decay 参数等于正确的 L2 正则化;实际上应改用 AdamW,否则正则化效果被自适应缩放破坏。
  • 学习率敏感性:虽然 Adam 对学习率不敏感,但在 Transformer 训练中若不搭配 warmup 预热调度,初期更新方差过大会导致训练不稳定。
  • 内存开销:Adam 需要为每个参数额外存储两个状态向量(m 和 v),显存占用是 SGD 的约 3 倍,超大规模模型训练时成本显著。
  • 不保证收敛:理论上 Adam 在某些非凸场景下不保证收敛(AMSGrad 提出即针对此问题),实践中一般无影响但需注意异常情况。

发展脉络

Adam 的提出与演进反映了深度学习优化理论的持续进步。

  • 2011 年:Duchi 等提出 AdaGrad,首次实现参数级自适应学习率,适合稀疏梯度。
  • 2012 年:Hinton 在 Coursera 讲义中提出 RMSProp,用指数移动平均解决 AdaGrad 学习率递减问题。
  • 2014 年:Kingma & Ba 将动量与 RMSProp 结合并加入偏差修正,提出 Adam(arXiv:1412.6980),ICLR 2015 正式发表。
  • 2018 年:Reddi 等指出 Adam 不收敛问题,提出 AMSGrad;Loshchilov & Hutter 提出 AdamW,修复 weight decay 解耦问题,成为 BERT/GPT 时代的标配。
  • 2019 年:Liu 等提出 RAdam(Rectified Adam),用自适应预热替代人工 warmup 调度。
  • 2023 年起Lion 等低内存优化器挑战 Adam 的统治地位;Lion 仅追踪符号信息,在大规模视觉和语言任务上表现竞争力强。

常见误解

日常交流中容易听到的简化说法,未必准确,但能帮助理解误解从何而来。

  • 「Adam 就是给每个参数各配了一个会自动调节的学习率,梯度大的参数学得慢一点,梯度小的参数学得快一点,省去了手动调学习率的麻烦。」
  • 「Adam = 动量 + 自适应学习率,既记住了历史梯度的方向,又会根据历史梯度的大小缩放步长。」
  • 「很多人以为 Adam 加了 weight decay 就等于正则化,其实原版 Adam 的 L2 weight decay 被自适应缩放扭曲了,真正做对正则化的是 AdamW。」

相关术语

和本术语关联紧密的其他词条,便于串联理解。

延伸阅读

从知识库精选 3 篇文章,帮助深入理解该术语。

  1. 1

    优化器:SGD, Momentum, Adam, AdamW

    从梯度下降到 AdamW,系统梳理深度学习优化器演进与选择策略

  2. 2

    梯度下降算法全解:从 SGD 到 Adam 的优化之路

    系统掌握从最基础的梯度下降到高阶自适应优化算法的完整演进路径,理解每种优化器的数学原理、适用场景与现代深度学习中的最佳实践

  3. 3

    正则化:BatchNorm, LayerNorm, Dropout

    从 Dropout 到 LayerNorm,掌握防止过拟合的核心技术

外部参考

维基百科:查看「Adam Optimizer」词条

本页内容为本站原创撰写;维基百科链接仅作延伸参考。