IT 论文精读 · PAPER 49
Kingma & Ba · University of Amsterdam / University of Toronto · ICLR 2015
2014 年底,两位研究者(Kingma 与 Ba)提出了一个叫 Adam 的「优化器」。训练一个神经网络(比如 ChatGPT 背后的模型),本质是让它一步步把几十亿个「旋钮」拧到刚好——优化器就是决定每一步该往哪拧、拧多大的那套规则。Adam 的贡献是:让这件事几乎不用手动调,拿默认设置就能稳稳跑起来。它简单、稳、好用到今天几乎每个深度模型都在用它训练。
把训练想成蒙着眼下山:你只能用脚感觉脚下的坡度,然后朝下坡迈一步。迈多大,就是「学习率」。麻烦在于——整座山只让你用一个固定的步幅。可有的方向是陡崖,步子稍大就冲过头、来回弹;有的方向是平缓的长坡,步子太小就得爬到天荒地老。一个步幅同时伺候陡崖和平原,怎么都不对。于是调这个步子成了苦差事,像走钢丝:大一点就震荡发散,小一点就慢得没边。
Adam 把两个朴素的想法合到一起。第一个是「惯性」:别只看当下这一步的坡度(它被随机的噪声搞得忽左忽右),而是记住「我最近一直大致朝哪个方向走」,顺着这个平均方向走——就像下坡的球有惯性,不会被每个小坑绊停。第二个是「给每个方向配自己的步幅」:不再全山一个步子,而是每个方向按它自己的脾气自动定步长——一直剧烈晃动的方向,就小步、谨慎;几乎不动的方向,就大步、大胆。
Adam 给每个旋钮各记两本小账。第一本记「这个方向我平均在往哪走」(把最近几步的坡度做个带惯性的平均,抹掉抖动);第二本记「这个方向的坡有多大、多爱抖」(把最近几步坡度的大小也平均一下)。走的时候,它朝第一本账的方向迈步,但用第二本账去缩放步幅:这个方向一向坡大又抖,就把步子除小一点、走稳;一向平缓,就放开步子。
妙处在于:坡度整体是大是小、单位是什么,都被这一「除」自动抵消掉了——你不用再为每个方向、每个阶段手调步子,每一步大约都走「一个合适的距离」。还有个贴心设计:这两本账刚开局时是空的、会把人往「不敢动」的方向带偏,Adam 用一个小小的开局校正把这个偏差抹平,让最初几步也走得对。
结果是:训练一个新模型,从「先花几天调学习率」变成「用 Adam 默认值先跑起来」。它对设置不挑、开箱即用、又快又稳,于是成了深度学习十年里的默认选择——今天你听过的大模型,绝大多数是用 Adam(或它的改良版)训出来的。
也说句实在话:它不是万灵药。在某些任务上,老老实实调好的简单方法反而能得到泛化略好一点的模型;而且它每个旋钮要多记两本账,吃掉不少额外内存——模型越大越肉疼。
训练模型就是蒙眼下山、每步决定往哪迈多大。Adam 给每个方向各记两本账——「平均往哪走」(惯性)和「这里坡多大多抖」(幅度)——朝平均方向走、按幅度自动缩放步子,于是几乎不用手调就又快又稳。它是当代几乎所有深度模型的默认优化器。
想看更新公式、两个「矩」的滑动平均与偏差校正、以及后来发现的收敛漏洞? → 切到精读版
Adam(Adaptive Moment Estimation,自适应矩估计)把「动量(momentum)」和「按参数自适应学习率」两个想法合到一起,再补上一步「偏差校正(bias correction)」:它为每个参数各维护梯度的一阶矩(均值,可理解为带惯性的方向)与二阶矩(未中心化方差,衡量该方向梯度的大小与抖动),用 θ ← θ − α·m̂/(√v̂+ε) 更新——朝平滑后的方向走、步长按各维梯度自身的尺度自动缩放。一套默认超参 α=0.001, β₁=0.9, β₂=0.999 几乎开箱即用,令它成为深度学习十余年里事实上的默认优化器。
a_t = β·a_{t-1} + (1-β)·x_t,只保留最近若干步、旧值按 β 逐步遗忘的「带记忆的平均」。β 越接近 1,记得越久。作者 Diederik P. Kingma(时在阿姆斯特丹大学,后为 OpenAI)与 Jimmy Lei Ba(多伦多大学),论文发在 ICLR 2015(arXiv 2014 年底放出)。它上承动量法、AdaGrad(Duchi 等 2011)、RMSProp(Hinton 课堂未发表)与 AdaDelta(Zeiler 2012);下启 AdamW(解耦权重衰减)等改良,几乎所有现代大模型——Transformer、BERT、GPT、扩散模型——都用 Adam 或其变体训练。它是被引最多的机器学习论文之一。
最朴素的 SGD 用一个全局学习率给所有参数、所有阶段一刀切。痛点有三:学习率太大则震荡甚至发散、太小则慢得离谱;不同参数需要的步长天差地别——稀疏特征(很少出现、对应梯度大多为 0 的参数)需要大步才追得上,而频繁更新的参数需要小步才稳;同一参数在训练前后期需要的步长也不同。手调这一个数、再配个衰减时间表,成了训练里最烦人的一环。
AdaGrad 迈出第一步:给每个参数按「历史梯度平方的累加和」的平方根去除步长——不常动的参数分母小、步子大,正好补偿稀疏。可它累加的是全部历史,分母只增不减,于是学习率单调衰减到零,在长训练或非凸的深度网络里过早「熄火」、还没到底就走不动了。RMSProp 把「累加和」换成「指数滑动平均」——只记最近、旧的遗忘,分母不再无限膨胀,熄火问题解决。但 RMSProp 没有动量、也没有对滑动平均起步偏差的校正。Adam 要做的,就是把 RMSProp 的自适应缩放、动量的方向平滑、以及一个关键的偏差校正,三者合成一个既快又稳、还几乎不用调的更新规则。
Adam 为每个参数各维护两个指数滑动平均。记第 t 步该参数的梯度为 g_t:
一阶矩 m(方向 / 动量):m_t = β₁·m_{t-1} + (1−β₁)·g_t——梯度本身的滑动平均。它是「最近我平均朝哪走」,把 mini-batch 带来的随机抖动平滑掉,等价于动量。
二阶矩 v(幅度 / 抖动):v_t = β₂·v_{t-1} + (1−β₂)·g_t²——梯度平方的滑动平均。它衡量「这个方向的梯度一向有多大、多抖」,是给步长做缩放的尺子。
核心就一步:θ_t = θ_{t-1} − α · m̂_t /(√v̂_t + ε)。直觉是——朝平滑后的方向 m 迈步,但把步长除以该方向梯度的典型幅度 √v:某维梯度一向又大又抖 → √v 大 → 除下来步子小、走得稳;某维一向平缓 → √v 小 → 步子放大、走得快。于是梯度整体的尺度、乃至各维单位的差异,都被这一除自动约掉,不用再逐维手调。
为什么除 √v 而不是 v?为了量纲对齐——√v 与梯度同量纲,比值 m/√v 近似一个「信噪比」:方向确定(信号强、噪声小)就大胆走,不确定就走小步。一个附带的好处是自动退火:接近最优时平均梯度 m 趋于 0、而抖动 v 仍在,比值自然变小,步子自己收住。作者还证明有效步长大致被 α「封顶」(|Δθ| ≲ α),相当于给每步划了一个信任域(trust region)——你大致知道每步最多走多远,且对把整个梯度乘以任意常数不敏感。ε(默认 10⁻⁸)只是防止除零的小量。
还差一块拼图。m 和 v 都从 0 起步,滑动平均在前几步会被这个「0」严重拉低——尤其 β 接近 1 时(β₂=0.999 意味着新梯度每步只掺进 0.1%),头几十步的 v 估计得极小、偏向 0。若直接拿它去除,步长会被算错。Adam 用一个精确的偏差校正把这个系统性偏差除掉:m̂_t = m_t/(1−β₁ᵗ)、v̂_t = v_t/(1−β₂ᵗ)——随 t 增大,1−βᵗ→1,校正在后期自动淡出,只在开局起作用。正是这一步,让 Adam 在训练最初就走出正确的步长,也是它相对 RMSProp 的关键补丁。作者另给了一个变体 AdaMax,把二阶矩换成梯度的 L∞ 范数(取历史最大幅度),在某些情形更稳定。默认超参 α=0.001, β₁=0.9, β₂=0.999, ε=10⁻⁸ 在大量任务上几乎无需改动。
论文在几个(以今天眼光看规模不大的)任务上对比 Adam 与 SGD-Nesterov、AdaGrad、RMSProp、AdaDelta:MNIST 逻辑回归、MNIST 多层神经网络、CIFAR-10 卷积网络、以及带 dropout 的 IMDB 词袋文本分类。结论一致:Adam 收敛更快、更稳,在带 dropout、目标本身很「吵」的设置下优势尤为明显。作者还给了一个在线凸优化的 O(√T) regret 界作为理论支撑(这条证明后来被发现有漏洞,见下)。诚实说:这些实验规模很小,Adam 真正被「证明」是靠后来十年里整个领域的普遍采用——它在无数超出论文实验范围的模型上一次次开箱即用地 work。
Adam 把「训练一个新模型」从一门需要经验的手艺,变成了一个稳定的默认起点。它对超参鲁棒、几乎不用调、在异构与稀疏梯度下都稳,于是迅速成为深度学习的默认优化器:从 CNN 到 RNN,再到 Transformer、BERT、GPT、扩散模型,绝大多数现代大模型都由 Adam 或其改良版 AdamW 训练。你今天能「拿来一个新架构、用 Adam 默认值先跑起来看效果」,很大程度就是这篇论文给的底气。作为工程基础设施,它的影响力不亚于任何一个具体的模型结构。
v 可能下降(不像 AdaGrad 那样单调不减),破坏了原证明的关键假设,某些简单凸问题上 Adam 竟不收敛;他们提出 AMSGrad(改用历史 v 的最大值)修补。m、v 两份状态,约 3 倍参数内存——在千亿参数级别是实打实的负担,也催生了大量省显存的优化器变体。① 一句话:Adam = 动量(一阶矩)+ 逐参数自适应步长(二阶矩)+ 偏差校正,更新 θ ← θ − α·m̂/(√v̂+ε)。
② 痛点:SGD 单一学习率一刀切——太大震荡、太小奇慢,稀疏与陡缓不同方向需要不同步长,手调很痛。
③ 前辈:AdaGrad 按历史梯度平方缩放但学习率衰减到零「熄火」;RMSProp 用滑动平均救熄火,但缺动量与偏差校正。
④ 机制:m 记方向(抹平噪声)、v 记幅度(做尺子);朝 m 走、除以 √v——梯度尺度被自动约掉,每步约走「一个合适的距离」。
⑤ 信噪比 + 自动退火:m/√v 近似信噪比,确定就大胆、不定就小步;近最优时比值自然变小、步子自己收。
⑥ 偏差校正:m、v 从 0 起步前期偏小,÷(1−βᵗ) 抹平开局偏差、让最初几步也走对,是相对 RMSProp 的关键补丁。
⑦ 默认超参 α=.001, β₁=.9, β₂=.999 几乎开箱即用;变体 AdaMax 用 L∞ 范数。
⑧ 影响:成为深度学习默认优化器,Transformer/BERT/GPT/扩散模型多由 Adam 或 AdamW 训练。
⑨ 局限:原收敛证明有误(AMSGrad 修补);有时泛化不如 SGD;权重衰减需解耦(AdamW);常需 warmup;多存两份状态吃内存。