基础 · 12

优化器:从 SGD 到 Adam

梯度下降只是起点。Momentum 用惯性冲出 Z 字形,RMSprop 把椭圆压成圆,Adam 兼取两者——训练神经网络的真正引擎。

16 min read

SGD 的三种形态

微积分篇讲了梯度下降的核心公式:wwηL(w)w \leftarrow w - \eta \nabla L(w)。但这里有一个没回答的问题:L(w)\nabla L(w) 到底是用多少数据算出来的?

损失函数通常是所有样本上的平均:

L(w)=1Ni=1Ni(w)L(w) = \frac{1}{N}\sum_{i=1}^{N} \ell_i(w)

NN 可能有几百万甚至几十亿——每次更新都把所有数据跑一遍,太慢了。实践中按每次用多少数据算梯度分成三种:

批量梯度下降(Batch GD)——每次用全部 NN 个样本算梯度。方向最准,但一步的代价是 O(N)O(N)。如果 NN 是十亿,等一步的时间够喝完一杯咖啡。

随机梯度下降(Stochastic GD, SGD)——每次只用1 个随机样本。单步极快,但梯度方向充满噪声,轨迹像布朗运动一样到处乱晃。收敛需要的总步数远多于 Batch GD。

小批量梯度下降(Mini-batch GD)——每次用 BB 个样本(常见 B=32,64,256B = 32, 64, 256)。这是深度学习的默认选择

为什么 Mini-batch 胜出?两个原因:

  1. GPU 喜欢批量并行——同时算 256 个样本的梯度,比串行算 256 次单个样本快几十倍。
  2. 噪声是免费的正则化——单批次的梯度方向带有随机性,这种随机性实际上帮助优化器逃离尖锐的局部极小值,倾向于收敛到平坦的极小值。而平坦极小值在没见过的数据上表现更好——这就是泛化。

现代深度学习理论把 mini-batch 的噪声视为一种隐式正则化:同样的模型、同样的损失函数,只是因为我们故意用了不精确的梯度,最终解的泛化能力就更好了。

变体单步数据量单步代价梯度方向收敛步数
Batch GDNN(全部)最准
Mini-batchBB(32 ~ 512)较准
SGD11噪声大

注意术语的一个坑:深度学习中大家口中的「SGD」通常指的其实是 mini-batch SGD,而不是真正的单样本随机梯度下降。

学习率调度

学习率 η\eta 应该是个常数吗?直觉告诉我们不是:训练初期,参数还在高损失区域,大步快跑比较合理;接近谷底时,步子太大就会来回弹跳。让学习率随训练进程变化——这就是学习率调度(learning rate schedule)

步衰减(Step Decay):每隔固定 epoch 数把学习率乘以一个小于 1 的因子。经典的 ResNet 训练用「每 30 epoch 除以 10」:

ηt=η0γt/d\eta_t = \eta_0 \cdot \gamma^{\lfloor t / d \rfloor}

余弦退火(Cosine Annealing)

ηt=ηmin+12(ηmaxηmin)(1+cos(πtT))\eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})\left(1 + \cos\left(\frac{\pi \cdot t}{T}\right)\right)

学习率沿余弦曲线从 ηmax\eta_{\max} 平滑降到 ηmin\eta_{\min}。比步衰减更柔和——没有突然的「跳水」。这是现代大模型训练的标配衰减曲线。

还有一个反直觉但极其重要的技巧:warm-up。训练的最初几百步,不从 ηmax\eta_{\max} 开始,而是从零线性增长到 ηmax\eta_{\max}

ηt=ηmaxtTwarm\eta_t = \eta_{\max} \cdot \frac{t}{T_{\text{warm}}}

为什么?因为训练初期参数是随机初始化的,梯度方向极不稳定且幅度很大。如果一上来就用大学习率,参数会被推向完全不可控的方向。Warm-up 让模型先「稳住脚跟」,等梯度方向变得可靠之后再加速。

Warm-up + Cosine Decay 几乎是所有 Transformer 训练的标准配置。GPT-3 的训练就用了 375 步 warm-up,然后余弦衰减到峰值学习率的 10%。

动量法与 RMSprop

回到微积分篇看到的 Z 字形问题。两种不同的思路,各自解决它的一半。

动量法(Momentum) 的几何直觉:把优化过程想象成一个球在山坡上滚动。球有惯性——它不会每一步都完全听梯度的指挥,而是带着之前的运动方向继续前进。

vt=βvt1+gt,wwηvtv_t = \beta \cdot v_{t-1} + g_t, \quad w \leftarrow w - \eta \cdot v_t

vtv_t 是过去所有梯度的指数移动加权和。当梯度方向反复在 Z 字形的两壁之间切换时,动量把这些来回的力部分抵消(方向相反的梯度互相削弱),而沿山谷方向的力被累积加强。结果:Z 字形被压平,球沿谷底加速前进。

β=0.9\beta = 0.9 意味着球大约「记住」过去 10 步的梯度方向。

Nesterov 动量更进一步:先按当前速度向前「偷看一眼」,再在前方位置计算梯度——相当于球能预判地形,过冲更小。

RMSprop(Hinton, 2012)走完全不同的路:给每个参数自适应调整步长

E[g2]t=βE[g2]t1+(1β)gt2,wwηE[g2]t+ϵgtE[g^2]_t = \beta \cdot E[g^2]_{t-1} + (1-\beta) \cdot g_t^2, \quad w \leftarrow w - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \cdot g_t

E[g2]tE[g^2]_t 衡量「这个参数最近的梯度典型有多大」。梯度大的方向步长被压低,梯度小的方向步长被放大。几何上,RMSprop 把拉长的椭圆压成了接近圆形——然后梯度下降在圆形碗里直奔圆心。

Adam 优化器

Adam(Adaptive Moment Estimation, Kingma & Ba, 2014)把 Momentum 和 RMSprop 合并——同时追踪梯度的一阶矩和二阶矩:

SGDL = 0.0000
MomentumL = 0.0144
RMSpropL = 0.0000
AdamL = 0.0090
步数 50 / 50起点 (2.4, −1.4) · 损失函数 0.3x² + 1.5y²
SGD
Momentum
RMSprop
Adam
四种优化器在同一片椭圆形山谷上赛跑。 普通 SGD 在两侧反复 Z 字弹射;Momentum 用惯性冲出振荡方向; RMSprop 把椭圆压成圆;Adam 兼取两者。

一阶矩估计(Momentum 的速度):mt=β1mt1+(1β1)gtm_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t

二阶矩估计(RMSprop 的分母):vt=β2vt1+(1β2)gt2v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2

Adam 的独到之处是偏差校正:由于 m0=v0=0m_0 = v_0 = 0,训练初期估计被拉向零。除以 (1βt)(1 - \beta^t) 消除偏差:

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}

更新规则:

wwηv^t+ϵm^tw \leftarrow w - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \cdot \hat{m}_t

m^t\hat{m}_t 提供方向v^t\sqrt{\hat{v}_t} 提供自适应步长。默认:β1=0.9\beta_1 = 0.9β2=0.999\beta_2 = 0.999ϵ=108\epsilon = 10^{-8}

AdamW(Loshchilov & Hutter, 2017)把权重衰减从梯度更新中分离:

wwηλwηv^t+ϵm^tw \leftarrow w - \eta \lambda w - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \cdot \hat{m}_t

这让正则化效果与梯度大小解耦。2026 年的 LLM 训练几乎全部使用 AdamW。

二阶方法

梯度下降只用一阶导数。如果我们还能测量曲率(二阶导数),就能找到更聪明的路。

Hessian 矩阵 Hij=2LwiwjH_{ij} = \frac{\partial^2 L}{\partial w_i \partial w_j} 描述每个方向的弯曲程度。牛顿法用 Hessian 的逆来校正:

wwηH1L(w)w \leftarrow w - \eta \cdot H^{-1} \cdot \nabla L(w)

H1LH^{-1} \nabla L 会自动把椭圆压成圆形——步长在曲率大的方向缩小、小的方向放大。对二次函数一步收敛

问题:nn 参数的 Hessian 是 n×nn \times n 矩阵,求逆是 O(n3)O(n^3)n=108n = 10^8 时完全不可行。

实用的近似

  • L-BFGS——用过去 mm 步的梯度差近似 H1H^{-1},适合中小规模问题。
  • K-FAC——利用神经网络分层结构,把 Hessian 近似为 Kronecker 积。
  • Shampoo——把预条件器分解为左右矩阵的 Kronecker 积,在大规模分布式训练中越来越流行。

二阶方法还有一个优势:逃离鞍点。高维 loss landscape 中鞍点远多于局部极小值,一阶方法在鞍点附近停滞(梯度趋零),而牛顿法利用 Hessian 的负特征值方向快速逃离。

但二阶方法假设损失局部近似。神经网络高度非凸——远离最优点时 H1H^{-1} 可能指向上山方向。这就是为什么 Adam 系列仍是 LLM 训练的主力:一阶信息在非凸地形中更鲁棒。

这个想法在前沿里