跳到主要内容

优化 — 下山的一百种走法

这一章讲五件事: 梯度下降为什么有效、什么时候失效; 凸性这个最理想的地形长什么样; SGD 的噪声为什么既是麻烦又是福利; momentum 与 Adam 家族各自在修什么; 学习率调度——和算法本身同等重要的另一半。 读完你会理解:「用 Adam、学习率 3e-4」这句话背后,是六十年的问题史。

1. 先校准:优化目标 ≠ 学习目标

第 04 章说过的事,这里再钉一次,因为它是本章全部讨论的边界: 优化算法只管把训练损失降到最低; 而机器学习的目标是泛化误差——两者的最小点位置不同1。 所以本章全部内容都在回答「怎么把损失降下去」, 「降下去算不算数」是第 04、06 章的地盘。

深度学习优化的三大障碍2:

  • 局部极小:梯度为零、附近最低,但不是全局最低。 有趣的是,minibatch SGD 的噪声恰好是解药之一—— 批与批之间梯度的自然抖动,能把参数从局部极小里震出来3;
  • 鞍点:梯度也为零,但既不是极小也不是极大(f(x,y)=x²−y² 的原点: 对 x 是极小、对 y 是极大)。高维下,Hessian(二阶导矩阵) 特征值有正有负的概率很高——鞍点比局部极小更常见,它是更隐蔽的停滞点;
  • 梯度消失:tanh 在 x=4 处导数只有 0.0013—— 优化会卡很久。ReLU 流行之前,这是训练深网的大敌(第 06 章已详)。

2. 凸性:最理想的地形

凸函数:任意两点的连线上,函数值不超过端点值的线性插值 (函数图像像个碗)。它的三条性质解释了为什么优化理论从它讲起4:

  1. 局部极小 = 全局极小——「不会卡住」 (但全局极小可以不唯一,也可以不存在);
  2. 判定容易:Hessian 半正定 ⇔ 凸;
  3. Jensen 不等式 E[f(X)] ≥ f(E[X]) 给了大量估计的下界。

深度学习大多非凸;但作者指了一个实用的细节: 在局部极小的附近,深网损失面常常近似凸—— 凸地形的结论可以局部借用(比如沿训练路径平均参数的技巧 SWA)。

3. 梯度下降与 Newton:一阶与二阶的账本

梯度下降为什么下山?一阶 Taylor 展开: f(x−ηf′) ≈ f(x) − η·f′²——只要 η 够小,函数值必然下降5。 走查:f(x)=x²,从 x=10 出发:

  • η=0.2:10 步内稳稳逼近 0;
  • η=0.05:10 步还离得很远(太慢);
  • η=1.1:越过最优点,振荡发散——步长太大时一阶近似失效6

学习率没有安全值,只有与地形匹配的值。

二阶的 Newton 法用曲率修正步长:ε = −H⁻¹∇f, 对 f=½x² 这种纯二次面一步收敛。 两个死因:Hessian 的存储是 O(d²),几千亿参数想都别想; 非凸时负曲率会领着你上山——这是致命缺陷,要额外修补7。 Newton 法在深度学习中不可行,但它的精神(按曲率调步长) 被 Adam 家族用便宜的方式继承了(第 5 节)。

4. SGD:噪声是麻烦,也是福利

全量梯度下降每步成本 O(n),SGD 每次随机抽一条样本,成本 O(1)—— 且随机梯度是全梯度的无偏估计(期望上就是全梯度)8

但 SGD 有个本性:到了最优点附近,噪声不消失—— 瞬时梯度照样拽着你晃。唯一的出路是让学习率随时间衰减9:

策略形式性格
分段常数停滞就降一档深网最常用的土办法
指数衰减η₀·e^{−λt}常常降得太快,没收敛就停了
多项式衰减η₀(βt+1)^{-α},α=0.5凸情形有理论保证

(非凸问题的收敛保证一般是 NP hard—— 所以这一节的理论都只在凸地形上成立,作者照实交代10。)

5. momentum 与 Adam 家族:四个发明,一条线

这一节是本章的主干。四个算法各修一个具体的病,按时间顺序叠起来就是 Adam。

momentum(1964,Polyak):治窄峡谷病。 病态地形 f=0.1x₁²+2x₂²:x₁ 方向极缓、x₂ 方向极陡, 梯度下降被迫二选一——步长大则 x₂ 方向振荡,步长小则 x₁ 方向龟速。 momentum 把瞬时梯度换成历史梯度的指数加权平均(leaky average): v_t = β·v_{t-1} + g_t。 缓的方向,各步梯度同号累积,步幅自然加大; 陡的方向,各步梯度振荡相消,步幅自然减小——一种地形,两个病同治11。 代价要注意:展开后 v 的等效步长是 η/(1−β)(β=0.9 就是 10 倍), 所以开 momentum 要相应调小学习率12

Adagrad(2011):给每个坐标配独立学习率。 稀疏特征(「preconditioning」这种词,语料里没几次)的参数, 好不容易出现一次,统一衰减的学习率却已经快降没了—— 常见特征的参数早已收敛,稀有特征的还没学几次。 Adagrad 的修法:累计每个坐标梯度平方的历史 s_t, 用它当该坐标的「曲率代理」除以它—— 大梯度坐标自动缩小步长,小梯度坐标得到温和待遇13。 代价:s 单调增长,学习率按 O(t^{-1/2}) 单调衰减到近乎零,深网不适用。

RMSProp(2012):把 s 换成 leaky average。 s_t ← γ·s_{t-1} + (1−γ)·g²——坐标自适应保留, 但不再无限累积,学习率衰减与坐标缩放解耦14

Adam(2014):momentum + RMSProp 合体。 两条状态变量:v(梯度的一阶矩,β₁=0.9)与 s(梯度的二阶矩,β₂=0.999, 方差估计比动量慢得多);初始为零会有偏,做偏差校正 (除以 1−βᵗ);更新 g′ = η·v̂/(√ŝ+ε)15

判断(我们的,不是书里的): Adam 不是「终极答案」。 书里自己给了反例:二阶矩估计在稀疏或高方差更新下会失控, Adam 在凸问题上也能发散(Reddi et al. 2019); Yogi 的修法是把更新量改成 g²⊙sgn(g²−s), 让步长不再依赖偏差大小16。 实践含义:Adam 发散或效果不好时,先退回 SGD+momentum 做对照—— 很多视觉任务上后者仍然更稳。 如果错,会错在: 语言模型与 Transformer 系训练中 Adam 系几乎无可替代, 「退回 SGD」的建议主要适用于视觉与小模型场景。

6. 学习率调度:和算法同等重要的另一半

学习率的四个维度,书里分得很清17:

  • 幅度:太大发散、太小吃不饱;
  • 衰减形状:分段常数(走到驻点再降一档,拿更高质量的局部极小)、 多项式、cosine(开头缓降、结尾用极小学习率精修—— 一个「莫名但好用」的经验发现);
  • warmup(热身):开头几步用小学习率—— 初始参数是随机的,最初的更新方向可能毫无意义, 大踏步可能直接把模型带进沟里;
  • 循环调整(SWA 等):让学习率周期性起伏,沿路径平均参数。

书里还有一个实验事实值得记住: 加了调度之后,训练曲线更平滑,过拟合也更小—— 为什么调学习率能减过拟合,理论上同样没有公论18

7. 作者的判断与证据

书里给了证据的: Taylor 展开与学习率发散的走查; 凸函数局部极小=全局极小的证明;momentum 在病态二次面上的对照实验; Adam 的完整算法与 Yogi 的修复;调度对过拟合的实验。

作者标为经验或未决的: momentum 在深网中为何有效(凸情形有理论,非凸靠经验); cosine 调度「莫名但好用」;调度减过拟合无公论; 「SGD 噪声有益」是反复观察到的现象,不是定理。

8. 边界与局限

  • 本章全部收敛理论在凸地形上;非凸只有经验与局部结论;
  • 二阶方法(K-FAC、Shampoo 等)原书只点名未展开;
  • 大 batch 训练的学习率调整(线性缩放规则等)在多 GPU 一章(第 15 章)才用到;
  • Adam 的失效模式(发散、泛化争议)只有初步交代。

9. 可带走的

  1. 优化目标(训练损失)≠ 学习目标(泛化误差);
  2. 三大障碍:局部极小、鞍点(高维下更常见)、梯度消失;
  3. 凸函数:局部极小=全局极小;深网局部极小附近常近似凸;
  4. 学习率决定生死;SGD 噪声要衰减学习率来驯,但它也能震出局部极小;
  5. momentum:同号方向累积加速,振荡方向相消减速;等效步长 η/(1−β),记得降 η;
  6. Adagrad(梯度平方累计)→ RMSProp(leaky average)→ Adam(合体+偏差校正);
  7. Adam 也会发散(二阶矩失控);视觉任务先和 SGD+momentum 做对照;
  8. 调度四要素:幅度、衰减形状、warmup、循环;warmup 防开头乱走。

10. 原文地图

主题原书章原文位置
优化≠学习目标Optimization and Deep Learningtext/78-optimization-and-deep-learning.txt:12(搜「fundamentally different」)
噪声震出局部极小Optimization and Deep Learningtext/78-optimization-and-deep-learning.txt:137(搜「dislodge」)
鞍点与 HessianOptimization and Deep Learningtext/78-optimization-and-deep-learning.txt:152(搜「saddle」) · text/78-optimization-and-deep-learning.txt:190(搜「Hessian」)
凸函数不会卡住Convexitytext/79-convexity.txt:172(搜「get stuck」)
η=1.1 发散Gradient Descenttext/80-gradient-descent.txt:107(搜「diverges」)
Newton 一步收敛与 O(d²)Gradient Descenttext/80-gradient-descent.txt:239(搜「prohibitively large」) · text/80-gradient-descent.txt:250(搜「step is sufficient to converge perfectly」)
SGD 无偏、必须衰减Stochastic Gradient Descenttext/81-stochastic-gradient-descent.txt:57(搜「unbiased estimate」) · text/81-stochastic-gradient-descent.txt:117(搜「dynamically」)
NP hardStochastic Gradient Descenttext/81-stochastic-gradient-descent.txt:165(搜「NP hard」)
momentum 窄峡谷Momentumtext/83-momentum.txt:32(搜「narrow canyon」) · text/83-momentum.txt:101(搜「cancel each other out」)
等效步长 η/(1−β)Momentumtext/83-momentum.txt:136(搜「step of size」)
Adagrad 稀疏特征Adagradtext/84-adagrad.txt:9(搜「sparse features」) · text/84-adagrad.txt:40(搜「proxy」)
RMSProp 解耦RMSProptext/85-rmsprop.txt:7(搜「decouple」)
Adam 发散、YogiAdamtext/87-adam.txt:12(搜「diverge」) · text/87-adam.txt:23(搜「beta_2 = 0.999」)
warmupLearning Rate Schedulingtext/88-learning-rate-scheduling.txt:8(搜「warmup」)
分段与 cosineLearning Rate Schedulingtext/88-learning-rate-scheduling.txt:350(搜「stationary point」) · text/88-learning-rate-scheduling.txt:373(搜「cosine」)

Footnotes

  1. 出处:「Optimization and Deep Learning」第 12 段(text/78-optimization-and-deep-learning.txt:12,搜「fundamentally different」)。

  2. 出处:「Optimization and Deep Learning」第 109 段(text/78-optimization-and-deep-learning.txt:109,搜「local minima, saddle points, and vanishing gradients」)。

  3. 出处:「Optimization and Deep Learning」第 137 段(text/78-optimization-and-deep-learning.txt:137,搜「dislodge」)。

  4. 出处:「Convexity」第 172 段(text/79-convexity.txt:172,搜「get stuck」)与第 198 段(text/79-convexity.txt:198,搜「positive semidefinite」)。

  5. 出处:「Gradient Descent」第 17 段(text/80-gradient-descent.txt:17,搜「first-order approximation」)。

  6. 出处:「Gradient Descent」第 107 段(text/80-gradient-descent.txt:107,搜「diverges」)。

  7. 出处:「Gradient Descent」第 239 段(text/80-gradient-descent.txt:239,搜「prohibitively large」)、第 250 段(text/80-gradient-descent.txt:250,搜「step is sufficient to converge perfectly」)与第 282 段(text/80-gradient-descent.txt:282,搜「walk into the direction」)。

  8. 出处:「Stochastic Gradient Descent」第 57 段(text/81-stochastic-gradient-descent.txt:57,搜「unbiased estimate」)。

  9. 出处:「Stochastic Gradient Descent」第 117 段(text/81-stochastic-gradient-descent.txt:117,搜「dynamically」)。

  10. 出处:「Stochastic Gradient Descent」第 165 段(text/81-stochastic-gradient-descent.txt:165,搜「NP hard」)。

  11. 出处:「Momentum」第 32 段(text/83-momentum.txt:32,搜「narrow canyon」)与第 101 段(text/83-momentum.txt:101,搜「cancel each other out」)。Polyak 1964;Goh 2017 的 distill.pub 专文是最佳延伸读物。

  12. 出处:「Momentum」第 136 段(text/83-momentum.txt:136,搜「step of size」)。

  13. 出处:「Adagrad」第 9 段(text/84-adagrad.txt:9,搜「sparse features」)与第 40 段(text/84-adagrad.txt:40,搜「proxy」)。

  14. 出处:「RMSProp」第 7 段(text/85-rmsprop.txt:7,搜「decouple」)。Tieleman & Hinton 2012。

  15. 出处:「Adam」第 23 段(text/87-adam.txt:23,搜「beta_2 = 0.999」)与第 30 段(更新式)。Kingma & Ba 2014;ε 常取 10⁻⁶。

  16. 出处:「Adam」第 12 段(text/87-adam.txt:12,搜「diverge」)与第 50 段(Yogi 更新式)。Reddi et al. 2019;Zaheer et al. 2018。

  17. 出处:「Learning Rate Scheduling」第 8 段(text/88-learning-rate-scheduling.txt:8,搜「warmup」)。

  18. 出处:「Learning Rate Scheduling」第 276 段(text/88-learning-rate-scheduling.txt:276,搜「less overfitting」)与第 373 段(text/88-learning-rate-scheduling.txt:373,搜「cosine」)。