跳到主内容

什么是优化器?Adam 和 SGD 有什么不同

2026-10-06 发布 来源:我告诉你AI导航 阅读

训练一个 AI 模型,两份几乎相同的代码,只把优化器从 Adam 换成带动量的 SGD,前五百步的损失曲线差出一大截:Adam 那边早早降下去,SGD 还在原地磨。把训练拉到三万步,结论反过来,SGD 的验证集分数高出一档。同一份梯...

训练一个 AI 模型,两份几乎相同的代码,只把优化器从 Adam 换成带动量的 SGD,前五百步的损失曲线差出一大截:Adam 那边早早降下去,SGD 还在原地磨。把训练拉到三万步,结论反过来,SGD 的验证集分数高出一档。同一份梯度,走出的路线可以完全不同,这正是优化器要解决的问题——每一步迈多大、往哪个方向修正。

梯度给方向,优化器给步长

反向传播算出的梯度只说明一件事:在当前参数点上,损失增长最快的方向。它没说该走多远。走得太小,训练慢;走太大,直接跨过谷底,损失震荡甚至发散。梯度下降的基本形式里,学习率是全局的缩放系数,优化器则决定这个系数怎么分配到每个参数上。

这一步的差别在参数量上亿时会被放大。同一套参数里,嵌入层的梯度可能极稀疏,偏置项几乎每步都有梯度,用一个统一的学习率照顾两边,必然有一边不合适。

两条路线,四个维度上的差别

把 SGD(含动量)与 Adam 放在同一张表里比,差别集中在四件事上:

维度SGD + 动量Adam
更新规则沿梯度反方向走一步,动量项累积历史方向做平滑;所有参数共用一个学习率用一阶矩估方向、二阶矩估缩放,每个参数有自己的有效步长
对学习率的敏感度高。差三倍就可能一个不收敛、一个震荡,通常要配调度和预热低。默认千分之一大多能跑,但训练后期仍需衰减
内存开销低。除参数和梯度外只多存一份动量,约为参数量的一倍高。要存一阶矩和二阶矩,额外约为参数量的两倍
失效场景特征尺度差异大、梯度稀疏时统一学习率照顾不过来;对初始化敏感批量小、梯度噪声大时二阶矩不稳;学习率不衰减容易停在次优
典型用途视觉分类与检测,有成熟配方可照搬语言模型、生成模型,默认首选

第三行的数字是实打实的显存账。七亿参数的模型做混合精度训练,SGD 的动量状态约占 2.8GB,Adam 的两份状态约占 5.6GB。显存吃紧时,这一项经常是换优化器的真正原因,而不是效果。

Adam 的自适应是怎么算出来的

它给每个参数维护两个滑动平均:梯度的均值(一阶矩)和梯度平方的均值(二阶矩)。更新时用一阶矩当方向,除以二阶矩的平方根当缩放。梯度一直很大的参数,分母大,实际步长被压小;梯度一直很小的参数,分母小,步长被放大。这一步把「不同参数尺度差得远」的问题就地解决了。

训练初期两个平均值都从零起步,会偏向零,所以要做偏差修正,除以一个随步数接近 1 的系数。不修正的话,前几百步的有效学习率会明显偏小,曲线起步比预期平,容易让人误判模型没学到东西。

SGD 的泛化优势是经验,不是定理

很多视觉任务上,调好的 SGD 在测试集上比 Adam 高零点几个点。一种解释是 SGD 的梯度噪声更大,倾向于停在比较平坦的极小值区域,对分布偏移更耐受;另一种解释是 Adam 早期收敛太快,过早进入一个尖锐的解。两种解释都还没有定论,能确定的只是这个现象在部分任务上稳定复现。

实践含义很直接:指标已经压到瓶颈,值得花时间调一次 SGD 的学习率调度;还在探索阶段,用 Adam 快速拿到能用的结果更划算。

权重衰减那一处,两条路线不等价

在 SGD 里,把 L2 正则加进损失,等价于每步把参数往零缩一点。在 Adam 里这个等价关系断了:L2 项会进入梯度,被二阶矩的除法一起缩放,梯度大的参数反而被衰减得更少。结果是你以为在加正则,实际效果被自适应机制打了折。

解法是把衰减从梯度里拿出来,直接作用在参数上,也就是常说的解耦权重衰减。这个改动在 transformer 类模型上影响明显,不少训练不稳定的案例最后追到这一处。正则化到底在约束什么可以对照着看。

什么时候它会骗你

Adam 号称对学习率不敏感,这个说法有边界。批量很小时,二阶矩的估计波动大,分母不稳,训练会抖;梯度极稀疏时,没被激活的参数二阶矩长期接近零,一旦有梯度就会迈出异常大的一步。

学习率不衰减也是常见坑。固定千分之一跑完全程,损失会在后期来回跳,验证指标停在离最优点一段距离的地方。SGD 那边的问题相反:对学习率极其敏感,还得配预热,否则前几百步就可能把模型带坏。两者都救不了数据本身的问题——标签错了、分布偏了,换什么优化器都没用。学习率怎么影响收敛与动量为什么能压住震荡是这两条路线的共同底座。

选型的判断顺序

先看显存。参数规模大、卡不够,Adam 的两份状态存不下,就得考虑省内存的变体,或者退回 SGD。再看任务类型:视觉任务有成熟配方,直接照搬 SGD 加调度;语言模型、生成模型,Adam 类几乎是默认。最后看时间预算,调参窗口只有一两天,先用 Adam 的默认设置跑通,别一上来就调 SGD。

还有一条容易被忽略:换优化器要连学习率一起换。把 Adam 的千分之一直接搬到 SGD 上,多半不收敛;反过来把 SGD 常用的零点一搬到 Adam 上,前几十步就可能发散。两个超参是绑在一起的,不能单独调。

速查:Adam 与 SGD 怎么选

  • SGD 统一学习率、内存省、对超参敏感
  • Adam 每参数自适应、收敛快、多存两份状态
  • 显存紧张时先算优化器状态这一笔账
  • Adam 配 L2 衰减会被削弱,要用解耦写法
  • 换优化器必须连学习率一起换

反馈页面信息

请描述需要更正的地方,页面标题和网址会自动附上。

也可以发邮件至 [email protected]