外观
优化与梯度下降
一句话定义:优化是"沿着梯度把损失踩到尽量低"的过程——深度学习里的优化器负责回答"下一步参数往哪走、走多远"。梯度怎么算由反向传播与自动微分负责,梯度怎么用就是本文的主题。
一、梯度下降原理与学习率直觉
损失函数 L(θ) 是参数空间里的一张"地形图"。梯度 ∇L(θ) 指向损失上升最快的方向,于是参数沿负梯度走就能下山:
θ ← θ − η · ∇L(θ)η(学习率)是步长,是全部超参数中最敏感的一个:
- η 太大:跨过山谷、来回震荡甚至发散(loss → NaN)。
- η 太小:走得太慢,训练半天没进展,浪费算力。
- η 刚好:稳定下降、收敛。
一条直觉:学习率决定训练是"稳健还是激进",动量与调度决定它"怎么从激进过渡到稳健"。后面所有优化器,本质都是在回答"这个步长怎么给"。
二、SGD 与随机性
朴素梯度下降要用全部数据的平均梯度,一次更新成本太高。**随机梯度下降(SGD)**改成:每次从数据里抽一小批(mini-batch)算梯度就更新。
随机性不是缺陷而是特性:
- 省算力:mini-batch 的梯度是全体梯度的无偏估计,样本足够多时噪声相互抵消。
- 自带隐式正则:batch 梯度的噪声能帮参数跳出尖锐的局部极小(sharp minima 泛化通常差),这与过拟合与正则化里的泛化讨论直接相关。
- batch size 是新的自由度:越大越接近全梯度、越稳但越贵;越小噪声越大、越震荡。
三、动量:Momentum 与 Nesterov
SGD 在"长而窄的山谷"里会来回震荡、前进缓慢。动量(Momentum) 模拟物理惯性:保留历史梯度方向,当次更新 = 历史方向的衰减 + 当前梯度:
v ← γv + ∇L(θ) # γ ≈ 0.9,历史动量
θ ← θ − η·v好处:山谷横向上来回震荡的力互相抵消,纵向(前进方向)的力不断叠加——加速收敛。Nesterov 动量更进一步:先在动量方向上"探头"一步,再算那个位置的梯度("向前看再迈步"),收敛更稳、更快,PyTorch 的 SGD(momentum=0.9, nesterov=True) 即是。
四、自适应方法:AdaGrad、RMSProp、Adam 与 AdamW
动量是"沿同一方向加速",另一条路线是"每个参数用不同的步长"——重要方向走小步、次要方向走大步。
| 方法 | 核心思想 | 关键特性与问题 |
|---|---|---|
| AdaGrad(2011) | 按历史梯度平方累积缩放学习率 | 累积只增不减,学习率单调衰减到 0,提前停步 |
| RMSProp(2012) | 用指数滑动平均替代累积和 | 学习率不再单调归零,适合非平稳目标 |
| Adam(2015) | RMSProp + 动量 + 偏差修正 | 结合两者优点、几乎免调参,成为事实标准 |
| AdamW(2019) | 权重衰减与梯度更新解耦 | 解决 Adam 里 L2 与自适应学习率的耦合问题,LLM 训练标配 |
Adam 的更新式为(含一阶矩 m、二阶矩 v 与偏差修正):
m ← β1·m + (1−β1)·∇L v ← β2·v + (1−β2)·∇L²
θ ← θ − η·m̂/(√v̂ + ε)为什么 AdamW 更优?Adam 的 θ ← θ − η·λ·θ 里 L2 正则被 1/√v̂ 缩放,小梯度参数被正则得更狠,且与 η 耦合。AdamW 把"衰减"从梯度里拆出来直接对参数做:θ ← θ·(1−ηλ) − η·m̂/√v̂——解耦后权重衰减语义清晰,泛化更好。BERT、GPT 系列全部用它。
五、学习率调度:warmup、step、余弦退火
训练中单一固定学习率几乎不是最优。常见调度:
- Warmup:前几千步从小学习率线性/多项式升到目标值。大模型训练几乎必用——避免初始化不稳时大步长把参数推飞(初始阶段的梯度噪声大)。
- Step 衰减:每隔固定轮数乘以
γ(如每 30 epoch ×0.1)。经典、好调。 - 余弦退火(Cosine Annealing):学习率按余弦曲线从峰值平滑降到接近 0。配合 warmup(warmup → 峰值 → 余弦下降)是现代训练的标准配方。还有一种"带重启的余弦"(SGDR),利用周期性升温跳出局部极小。
调度策略与优化器要配套:Adam 系列对调度不那么敏感(自适应步长),SGD+动量则非常依赖调度——一个常见的经验组合是"SGD + 大动量 + 余弦退火"适合刷 SOTA,Adam/AdamW + warmup + 余弦是稳定默认。
六、梯度裁剪
梯度范数过大(梯度爆炸,根源见反向传播与自动微分)时,一步更新就把参数弹飞。梯度裁剪(gradient clipping) 把梯度的范数限制在阈值内:
if ‖∇L‖ > C: ∇L ← C·∇L/‖∇L‖实现上 PyTorch 用 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)。它在 RNN、Transformer、GAN 训练里几乎必备。注意裁剪的是"梯度范数"而不是"损失值",别搞混。
七、batch size 与学习率的联动:线性缩放
经验规律(Goyal 等,2017,ImageNet 大规模训练):batch size 翻倍,学习率大致也应翻倍。理由:n 个样本的梯度是 n 个独立梯度之和,方差随 batch 增大而增大,步长应相应放大以保持"每 epoch 的有效步数"不变。
但这条规律只在临界 batch size 以下成立:超过某阈值后,大 batch 的梯度已经是全梯度的好近似,继续放大学习率会不稳定,反而需要更长的 warmup 或更小的峰值 LR。实践中大 batch 往往配合更多 warmup 与更高学习率。
工程记忆
小 batch(32–128)配 AdamW + warmup + 余弦退火是最省心的默认;大 batch(>1024)要记得按比例放大学习率并加长 warmup,否则泛化通常变差。
八、损失面几何直觉:鞍点与局部极小
高维损失面与低维直觉不同:局部极小在低维常见,高维里真正的"谷底"反而罕见,更常见的是鞍点(某些方向下坡、另一些上坡)。Dauphin 等 2014 年指出,鞍点周围梯度接近 0、但根本不是极小,朴素 SGD 会在那里"陷住"。
这正是自适应方法(二阶矩把每个方向的步长独立化)与动量能走出鞍点的原因:动量靠惯性冲过平坦区,自适应靠"逐方向步长"逃离梯度为 0 的退化方向。另一个有趣发现是:深度网络找到的"极小"之间性能差别很大,而动量/批大小等选择会系统性地影响最终泛化——这属于"优化与泛化的耦合",详见深度学习总体架构解剖。
九、二阶方法简述
一阶方法只用梯度,二阶方法(牛顿法、拟牛顿、K-FAC 等)利用曲率信息(Hessian 矩阵):
θ ← θ − H⁻¹·∇L理论上收敛更快、对病态条件数不敏感。但 Hessian 是参数量平方规模——十亿参数模型的 Hessian 有 10¹⁸ 个元素,存不下也求不动。工程上:
- 牛顿法仅在小型问题或最终精调可行;
- K-FAC 等近似方法在特定场景(如强化学习、大规模分布式训练)有应用;
- 实用策略是"一阶方法 + 好的调度/归一化",把曲率问题交给初始化与归一化去缓解。
十、工程默认配方表
| 场景 | 默认配方 | 说明 |
|---|---|---|
| 通用小中规模 CV/NLP | AdamW, lr≈3e-4~1e-3, warmup+余弦 | 最稳、最省心 |
| 图像分类刷点 | SGD + momentum=0.9 + lr=0.1×batch/256 + step/余弦 | 配合 BN,收敛指标常更好 |
| 大模型预训练(>1B) | AdamW + warmup + 余弦 + 梯度裁剪 + BF16 混合精度 | 配合 Adam betas=(0.9, 0.95) |
| GAN | Adam, lr 生成器/判别器分开(如 1e-4/4e-4),可加梯度惩罚 | 训练不稳定,见VAE 与 GAN |
| 强化学习 | Adam + 梯度裁剪 + 低 lr(1e-4~3e-4) | RL 对超参数极敏感,见深度强化学习 |
配方的完整调参流程与"改哪个超参看哪个信号"的决策树见训练配方与调参。
十一、权衡与取舍
权衡与取舍
SGD 的泛化 vs Adam 的稳定:实证上 SGD+动量常取得更好的最终泛化(尤其 CV),但需要精心调调度;Adam 几乎免调、鲁棒,适合快速迭代。折中方案:先用 Adam 把结构调通,最后用 SGD 精调,或直接 AdamW。
收敛速度 vs 泛化质量:大学习率+大 batch 收敛快但泛化略差;小学习率+小 batch 泛化好但慢。这是最典型的"快 vs 好"权衡。
自适应步长的便利 vs 隐式正则的丢失:Adam 把每个方向独立缩放,牺牲了 SGD 部分隐式正则,这也是"Adam 泛化差一点点"的机制解释之一。
显存 vs 优化效果:大 batch 显存压力小(每步更少),但收敛需要更多 epoch;梯度累积(gradient accumulation)可模拟大 batch 而不爆显存,但牺牲一定随机性。
优化器与调度是"训练配方"的核心,但永远记得:优化只能抵达损失面上已有的低点,损失函数与数据决定了这个面长什么样。先看损失函数与输出层与数据与数据工程,再谈调优。训练失败的快速排查见调试与诊断。
延伸阅读
- 深度学习评估与实验——实验纪律与评估指标
- 神经网络基础——被优化的对象长什么样
- 初始化与归一化——让优化从好的起点出发
- 损失函数与输出层——优化的目标面由谁定义
- 训练配方与调参——配方与调参决策树
- 调试与诊断——loss 发散/不降的排查
参考资料
- Duchi, Hazan, Singer. Adaptive Subgradient Methods for Online Learning and Stochastic Optimization (2011, AdaGrad)
- Kingma, Ba. Adam: A Method for Stochastic Optimization (2015)
- Loshchilov, Hutter. Decoupled Weight Decay Regularization (2019, AdamW)
- Goyal et al. Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour (2017)
- Loshchilov, Hutter. SGDR: Stochastic Gradient Descent with Warm Restarts (2017)
- Dauphin et al. Identifying and Attacking the Saddle Point Problem in High-Dimensional Non-convex Optimization (2014)