SGD 的三种形态
微积分篇讲了梯度下降的核心公式:。但这里有一个没回答的问题: 到底是用多少数据算出来的?
损失函数通常是所有样本上的平均:
可能有几百万甚至几十亿——每次更新都把所有数据跑一遍,太慢了。实践中按每次用多少数据算梯度分成三种:
批量梯度下降(Batch GD)——每次用全部 个样本算梯度。方向最准,但一步的代价是 。如果 是十亿,等一步的时间够喝完一杯咖啡。
随机梯度下降(Stochastic GD, SGD)——每次只用1 个随机样本。单步极快,但梯度方向充满噪声,轨迹像布朗运动一样到处乱晃。收敛需要的总步数远多于 Batch GD。
小批量梯度下降(Mini-batch GD)——每次用 个样本(常见 )。这是深度学习的默认选择。
为什么 Mini-batch 胜出?两个原因:
- GPU 喜欢批量并行——同时算 256 个样本的梯度,比串行算 256 次单个样本快几十倍。
- 噪声是免费的正则化——单批次的梯度方向带有随机性,这种随机性实际上帮助优化器逃离尖锐的局部极小值,倾向于收敛到平坦的极小值。而平坦极小值在没见过的数据上表现更好——这就是泛化。
现代深度学习理论把 mini-batch 的噪声视为一种隐式正则化:同样的模型、同样的损失函数,只是因为我们故意用了不精确的梯度,最终解的泛化能力就更好了。
| 变体 | 单步数据量 | 单步代价 | 梯度方向 | 收敛步数 |
|---|---|---|---|---|
| Batch GD | (全部) | 高 | 最准 | 少 |
| Mini-batch | (32 ~ 512) | 中 | 较准 | 中 |
| SGD | 低 | 噪声大 | 多 |
注意术语的一个坑:深度学习中大家口中的「SGD」通常指的其实是 mini-batch SGD,而不是真正的单样本随机梯度下降。
学习率调度
学习率 应该是个常数吗?直觉告诉我们不是:训练初期,参数还在高损失区域,大步快跑比较合理;接近谷底时,步子太大就会来回弹跳。让学习率随训练进程变化——这就是学习率调度(learning rate schedule)。
步衰减(Step Decay):每隔固定 epoch 数把学习率乘以一个小于 1 的因子。经典的 ResNet 训练用「每 30 epoch 除以 10」:
余弦退火(Cosine Annealing):
学习率沿余弦曲线从 平滑降到 。比步衰减更柔和——没有突然的「跳水」。这是现代大模型训练的标配衰减曲线。
还有一个反直觉但极其重要的技巧:warm-up。训练的最初几百步,不从 开始,而是从零线性增长到 :
为什么?因为训练初期参数是随机初始化的,梯度方向极不稳定且幅度很大。如果一上来就用大学习率,参数会被推向完全不可控的方向。Warm-up 让模型先「稳住脚跟」,等梯度方向变得可靠之后再加速。
Warm-up + Cosine Decay 几乎是所有 Transformer 训练的标准配置。GPT-3 的训练就用了 375 步 warm-up,然后余弦衰减到峰值学习率的 10%。
动量法与 RMSprop
回到微积分篇看到的 Z 字形问题。两种不同的思路,各自解决它的一半。
动量法(Momentum) 的几何直觉:把优化过程想象成一个球在山坡上滚动。球有惯性——它不会每一步都完全听梯度的指挥,而是带着之前的运动方向继续前进。
是过去所有梯度的指数移动加权和。当梯度方向反复在 Z 字形的两壁之间切换时,动量把这些来回的力部分抵消(方向相反的梯度互相削弱),而沿山谷方向的力被累积加强。结果:Z 字形被压平,球沿谷底加速前进。
意味着球大约「记住」过去 10 步的梯度方向。
Nesterov 动量更进一步:先按当前速度向前「偷看一眼」,再在前方位置计算梯度——相当于球能预判地形,过冲更小。
RMSprop(Hinton, 2012)走完全不同的路:给每个参数自适应调整步长。
衡量「这个参数最近的梯度典型有多大」。梯度大的方向步长被压低,梯度小的方向步长被放大。几何上,RMSprop 把拉长的椭圆压成了接近圆形——然后梯度下降在圆形碗里直奔圆心。
Adam 优化器
Adam(Adaptive Moment Estimation, Kingma & Ba, 2014)把 Momentum 和 RMSprop 合并——同时追踪梯度的一阶矩和二阶矩:
一阶矩估计(Momentum 的速度):
二阶矩估计(RMSprop 的分母):
Adam 的独到之处是偏差校正:由于 ,训练初期估计被拉向零。除以 消除偏差:
更新规则:
提供方向, 提供自适应步长。默认:,,。
AdamW(Loshchilov & Hutter, 2017)把权重衰减从梯度更新中分离:
这让正则化效果与梯度大小解耦。2026 年的 LLM 训练几乎全部使用 AdamW。
二阶方法
梯度下降只用一阶导数。如果我们还能测量曲率(二阶导数),就能找到更聪明的路。
Hessian 矩阵 描述每个方向的弯曲程度。牛顿法用 Hessian 的逆来校正:
会自动把椭圆压成圆形——步长在曲率大的方向缩小、小的方向放大。对二次函数一步收敛。
问题: 参数的 Hessian 是 矩阵,求逆是 。 时完全不可行。
实用的近似:
- L-BFGS——用过去 步的梯度差近似 ,适合中小规模问题。
- K-FAC——利用神经网络分层结构,把 Hessian 近似为 Kronecker 积。
- Shampoo——把预条件器分解为左右矩阵的 Kronecker 积,在大规模分布式训练中越来越流行。
二阶方法还有一个优势:逃离鞍点。高维 loss landscape 中鞍点远多于局部极小值,一阶方法在鞍点附近停滞(梯度趋零),而牛顿法利用 Hessian 的负特征值方向快速逃离。
但二阶方法假设损失局部近似凸。神经网络高度非凸——远离最优点时 可能指向上山方向。这就是为什么 Adam 系列仍是 LLM 训练的主力:一阶信息在非凸地形中更鲁棒。