Home / 大语言模型 / Adam:同时估计梯度方向与每个参数的更新尺度

009|Adam:同时估计梯度方向与每个参数的更新尺度

目录 · 上一篇 · 下一篇

论文:Diederik P. Kingma、Jimmy Ba,Adam: A Method for Stochastic Optimization,2014 年预印本、ICLR 2015。原文 · PDF。以下以算法 1 和第 6 节实验为主。Adam 是优化器,不是一种语言模型;将其列入主线,是因为训练算法决定了大模型能否有效利用数据与计算。

先接住前作的问题

NNLM与GloVe都把表示学习写成可微损失,但目标确定后仍要处理随机梯度的方向波动与不同坐标尺度。本篇讨论可组合的优化模块,而不是继续改造词表示结构;后来的Transformer才把 Adam 和自己的学习率计划组合使用。

五个前置概念

五个前置概念是随机梯度、指数滑动平均、未中心化二阶矩、坐标缩放和训练—验证区分。能解释这五项,才算理解了优化器正在保存什么、更新什么,以及曲线能够证明什么。

一、问题设定:一个学习率怎样兼顾方向噪声与坐标尺度

不同参数的梯度频率与尺度可能差别很大,小批量梯度 gtg_t 的方向还可能在相邻 batch 反转。直接使用当前梯度会摆动,只平滑方向又未必解决统一步长难兼顾各坐标的问题;本篇同时维护方向与平方尺度的滑动统计,再处理它们从零开始的偏差。

自适应方法利用过去梯度大小调整各坐标更新。这里的“自适应”指特定统计规则,不是优化器理解了任务语义。它看见的是梯度,而不是模型哪些参数代表事实、句法或推理。数据分布变化与极端梯度仍可能让历史统计暂时不合适。

另外,优化速度与泛化是不同指标。更快降低训练损失,可能提高固定预算下表现,也可能更快拟合噪声。需要把训练曲线、验证表现与计算资源分别报告,不能将“收敛快”当作所有意义的“模型更好”。

二、展开矩估计,推导零初始化的偏差修正

mt=β1mt−1+(1−β1)gt,vt=β2vt−1+(1−β2)gt2.m_t=\beta_1m_{t-1}+(1-\beta_1)g_t, \qquad v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2.

mtm_t 是一阶矩估计,vtv_t 是未中心化二阶矩估计,平方按坐标进行。二阶矩不是方差:方差还需要减去均值平方。β1,β2\beta_1,\beta_2 控制遗忘速度,越接近一,历史影响越长。

由于二者从零开始,早期估计偏小。算法采用:

m^t=mt1−β1t,v^t=vt1−β2t,θt=θt−1−αm^tv^t+ϵ.\hat m_t=\frac{m_t}{1-\beta_1^t},\qquad \hat v_t=\frac{v_t}{1-\beta_2^t},\qquad \theta_t=\theta_{t-1}-\alpha\frac{\hat m_t}{\sqrt{\hat v_t}+\epsilon}.

α\alpha 是基础学习率,ϵ\epsilon 避免分母过小。修正针对零初始化的指数平均偏差,不是让非平稳训练中的全部统计误差消失。学习率计划、梯度裁剪与正则化仍是另行指定的选择。

分母按坐标缩放,使历史上梯度较大的坐标获得较小的有效比例。但分子也受历史与方向抵消影响,所以不能只看 vtv_t 断言某个参数一定更新更大。更不能把 1/vt1/\sqrt{v_t} 当作完整曲率逆矩阵,它不包含一般的跨参数相关项。

偏差修正从几何级数得到

设 gkg_k 为第 kk 步梯度,mtm_t 为零初始化的一阶矩估计,0≤β1<10\leq\beta_1<1 为衰减系数。展开递推,mt=(1−β1)∑k=1tβ1t−kgkm_t=(1-\beta_1)\sum_{k=1}^t\beta_1^{t-k}g_k。若各步梯度期望近似同为 μ\mu,则 E[mt]=μ(1−β1t)\mathbb E[m_t]=\mu(1-\beta_1^t);除以括号才补回因零初始化缺失的总权重。对平方梯度同理。若真实期望随时间变化,修正后只是一个归一化的历史加权平均,不会变成当前梯度期望的无偏预言。这是“修正初始化偏差”比“消除估计偏差”准确的原因。

构造一个标量梯度 g1=2g_1=2,取 β1=0.9\beta_1=0.9、β2=0.999\beta_2=0.999。从零开始得到 m1=0.2m_1=0.2、v1=0.004v_1=0.004;修正后 m^1=2\hat m_1=2、v^1=4\hat v_1=4。忽略很小的 ϵ\epsilon,第一步更新约为 −α-\alpha。

若去掉修正,比例约为 0.2/0.004≈3.160.2/\sqrt{0.004}\approx3.16,并不是同样一步。这个自构例子解释为何两个看似“只是除个系数”的步骤会影响早期稳定性。它不意味着之后更新总是符号梯度,因为历史方向与大小会不断变化。

接着算第二步。 沿用 g1=2g_1=2,令 g2=−2g_2=-2,则 m2=−0.02m_2=-0.02、v2=0.007996v_2=0.007996,修正后 m^2≈−0.1053\hat m_2\approx-0.1053、v^2=4\hat v_2=4。第二步更新为约 +0.0526α+0.0526\alpha,远小于单看当前梯度得到的 +α+\alpha。动量抵消抑制来回震荡,也说明Adam不是逐步把梯度变成符号。

第一次更新怎样受epsilon影响

偏差修正后,第一步的一阶量等于当前梯度,二阶量等于其平方。若忽略epsilon,非零标量梯度的更新近似只取正负号;梯度极小时epsilon不可忽略,步长会缩小。由此做实现检查应同时测试普通梯度、接近零的梯度和全零梯度,不能只用大数样例验证偏差修正。

三、连同矩状态和步数保存完整更新过程

输入:参数 theta、可微随机损失、alpha、beta1、beta2、epsilon
m ← 0; v ← 0; t ← 0
重复训练:
    t ← t + 1
    g ← 当前小批量损失对 theta 的梯度
    m ← beta1*m + (1-beta1)*g
    v ← beta2*v + (1-beta2)*(g*g)
    m_hat ← m/(1-beta1^t)
    v_hat ← v/(1-beta2^t)
    theta ← theta - alpha*m_hat/(sqrt(v_hat)+epsilon)
输出:优化后的参数及可用于恢复训练的矩状态

检查点必须保存矩状态和步数,才能忠实恢复同一优化轨迹。只保存模型权重再重启,会重新经历早期统计阶段。Adam 的额外内存也正来自每个参数对应的状态,这与后面的 ZeRO 分片问题直接相连。

四、按相同调参条件比较损失与墙钟时间

恢复轨迹与单步成本明确后,再比较同样初始化和调参预算下的训练进展。

项目 原文第 6 节
凸任务 MNIST 多类逻辑回归、IMDB 稀疏词袋逻辑回归
非凸任务 MNIST 多层网络和 CIFAR-10 卷积网络
基线 动量 SGD、Adagrad、RMSProp、AdaDelta 或 SFO,按实验分别列出
初始化 比较优化器时使用相同参数初始化
调参 密集网格搜索后报告最佳超参数设置,并非所有方法只用默认值
指标 训练目标随数据遍历次数变化,部分同时比较墙钟时间
理论边界 原文明确其分析不直接适用于非凸网络实验

证据一,算法 1 与第 2—3 节。给出矩估计和偏差修正,明确实现机制。参数默认值是实践建议,不能被解释为所有训练任务都无需选择超参数。

证据二,图1。逻辑回归比较涉及密集与稀疏特征,说明不同梯度结构下方法关系并不相同。这些图的横轴是迭代或遍历数据次数,纵轴是训练负对数似然或训练代价。下降更快首先表示优化更快,不能直接读成测试准确率或泛化提高。

Adam与其他优化器在MNIST和IMDB逻辑回归上的训练损失
原文图形摘引:Diederik P. Kingma、Jimmy Ba,2014,图1,PDF第6页;核对原文。原版权保留。

证据三,图2、图3。全连接和卷积实验观察非凸优化,在图2 的相关比较中还讨论每次迭代成本。训练进度与时间同时呈现,是区分“更新次数少”和“实际更快”的必要步骤,但这些硬件条件不能直接映射到今天的大语言模型。

Adam与其他优化器在CIFAR10卷积网络早期及完整训练中的损失
原文图形摘引:Diederik P. Kingma、Jimmy Ba,2014,图3,PDF第7页;核对原文。原版权保留。

读图2的三个面板。 左侧在带dropout的网络上按遍历整份数据的次数比较训练损失,纵轴是对数刻度;右侧另做Adam与SFO的比较,上面按数据遍历次数,下面按归一化墙钟时间。要判断实际速度,应在同一个右侧面板里比较达到相同损失的位置,不能把不同网络设置的曲线拼成一次排名。

Adam与其他优化器在MNIST多层网络训练中的损失曲线
原实验图摘引:Diederik P. Kingma、Jimmy Ba,2014,图2,PDF第7页;核对原文。原版权保留。

算法论文的常见误读是忽略调参预算。如果新方法被精细搜索,而对照只用一个不合适学习率,结果无法说明更新规则更好。原文说明进行了超参数搜索,阅读时应把这点保留,而不是将曲线误称为零调参比较。

五、更快优化不提供无条件收敛或泛化保证

再设接下来梯度突然变为相反方向。mtm_t 不会立即翻转,历史惯性可以过滤偶发噪声,也可能拖慢对真实分布变化的响应。滑动统计的收益与延迟是同一个机制的两面。

每步按参数线性计算,易于大规模实现;代价是额外矩状态、超参数及与精度、正则化、学习率计划的交互。

本篇不把 Adam 与 AdamW 混同:在自适应缩放下,把 L2 项加进梯度与直接按比例衰减权重通常不是同一个操作。若实现使用解耦权重衰减,应明确它是后续变体,而非原算法 1 的所有配置天然如此。

外部后续研究补充:Reddi、Kale、Kumar 的 On the Convergence of Adam and Beyond(ICLR 2018,2019年存档)明确给出Adam在简单凸优化中不收敛的反例,并指出原收敛分析的问题。因此限制并非仅存在于深度网络的非凸场景。此处核对其原始摘要所陈述的结论,未在本文展开反例推导;这不否定Adam的经验价值,但排除了无条件的收敛保证。

六、把本篇机制再推进一步

1. 把训练分成两段但只将第二段的步数归零,会发生什么?

参考答案:偏差修正分母会与已经积累的一阶、二阶矩不再匹配,更新不再等价于不中断轨迹,也不等价于完整重置优化器。忠实恢复要同时恢复参数、两个矩和步数;若研究重启策略,应明确哪些状态重置,并将其当作不同训练协议。

七、将更新规则接入模型,再分片存储状态

状态恢复和逐参数矩缓存还会影响大模型训练。Transformer给出优化器与调度的模块组合,ZeRO再追问这些训练状态由谁保存;二者都不改变Adam原本的统计量定义。

自测与参考答案

1. vtv_t 为什么不能直接叫梯度方差?

它平均的是 gt2g_t^2,属于未中心化二阶矩。方差还要减去均值的平方。这个区别影响对分母的解释:Adam 并不只是根据梯度“噪声大小”调节步长。

2. 恢复训练只加载权重,会与不中断训练相同吗?

通常不同。矩估计和步数决定下一次更新,丢失它们会改变有效方向与尺度。若刻意重置优化器,可以是一种实验策略,但应明确记录,而不是声称完全恢复。

3. 训练损失下降更快,是否证明最终测试泛化更强?

不能。它证明特定训练目标被更快优化。还需比较相同数据、调参和计算预算下的验证及测试指标;更快拟合也可能包括更快拟合噪声。