跳到主要内容

同一条路的五种走法 — 碗形函数与三维鞍点上的五条轨迹

这一章讲三件事: 训练效果由哪三根杠杆决定;五种主流走法各自改了其中哪一根; 以及把五种走法放在同一只「碗」和同一个「鞍点」上,会看到什么差别。

它在全书链条里的位置: 第 04 章把「怎么挪」命名为五要素之一,当时只用了一种最朴素的挪法。 这一章把「挪」这件事拆开,给出五种主流版本——后面第 20 章训练那个会写字的小模型时, 用的正是这一章的最后一种。

需要的基础: 第 03 章的训练五步;第 04 章的学习率(每次更新时参数挪多远)。

1. 先看现象:同一个模型,只换「每步挪多远」,损失就冲上天

第 03 章那个训练循环里有一步是「把每个数朝那个方向挪一丁点」。 这一丁点是多大? 第 04 章给了它正式名字——学习率。

挪太小,几万步都走不到底;挪太大,一步冲过头,损失不降反升。 第 10 章那个梯度爆炸实验就是现成的例子:批大小调到 64、学习率调到 0.2、损失求和不取平均, 三个旋钮一起放大,梯度先冲上天再坍塌为零。

所以「怎么挪」不是一个旋钮,而是一组需要配套的决定。 书里把它拆成三根杠杆1:

影响优化效果的三大杠杆
──────────────────────────────────────────────
① 批大小 K 每一步用多少条样本来估方向
② 学习率 α 每一步沿着方向挪多远
③ 梯度估计 g 这一步实际使用的「方向」怎么算
──────────────────────────────────────────────
后续各种优化算法,基本都是在这三处做文章

第 ① 根我们其实已经见过:第 03 章的训练骨架是一口全塞(批量梯度下降), 真跑起来要分成一小撮一小撮——每步抽出一小批,就叫小批量梯度下降2。 真实数据集动辄数百万条,样本之间高度冗余,全量算一遍的边际收益很低3, 所以工程上几乎都用小批量——差别只在那一小撮是多大。

全章主走查:同一只碗,同一个起点,五种走法
═══════════════════════════════════════════════════════════════════
碗形函数 f(x) = 0.2·x₁² + 2·x₂² 最优点在原点 (0, 0)
起点 (3, 4)
梯度 (0.4·x₁, 4·x₂) 起点的梯度 = (1.2, 16)
───────────────────────────────────────────────────────────────────
§3 ① AdaGrad 分母记住全部历史 → 第一步 (-0.5, -0.5)
§4 ② RMSprop 分母会忘 → 第一步 (-0.316, -0.316)
§5 ③ 动量 方向带惯性 → 第一步 (-0.012, -0.16)
§6 ④ Adam 惯性 + 分母 → 第一步 (-0.2, -0.2)
§2 ⑤ 朴素版 什么都不加 → 第一步 (-0.24, -3.2)
§7 ⑥ 换三维鞍点 f(x) = x₁⁴ − 2x₁² + x₂²,从 (0.2, 1.5) 跑 150 步
§8 ⑦ 换真拟合任务,五种各跑 30 轮
═══════════════════════════════════════════════════════════════════

2. 两根杠杆是联动的:批大小放大几倍,步子也跟着放大几倍

先把第 ①② 根杠杆的关系量出来。 书里在手写数字数据上跑了五组对照4:

一批喂多少每步挪多远
1160.01
2320.02
3640.04
41280.08
52560.16

注意这两列是同步翻倍的。 这是经验上的一条做法: 批大小翻倍时,学习率也按比例放大——书里叫它「线性缩放规则」4。 背后的账很直白:一批的样本多一倍,估出来的方向就稳一倍,步子自然敢迈大一倍。

结果:按回合看,批越小(学习率同步越小)的那一組,损失下降越快5

但书里紧接着泼了两盆冷水5:

  1. 这不是单变量(一次只改一个变量、其余条件全部锁死)对照。 小批次在一个回合内的更新次数更多,加上学习率也在缩放, 回合维度的优势不能全归因于批大小本身;
  2. 批小不代表更好。 小批的梯度噪声大,泛化不一定更好; 实际项目里常见的批大小落在 32 到 256 之间, 最终取舍取决于显存预算、单步耗时和验证集表现6

「按回合看」和「按迭代看」结论可能不一样,书里把这个留成了练习7—— 第 8 节那个真拟合实验会把两种画法并排,到时能看到差别。

3. 改法一:让每个参数自带步长,分母只增不减

从这一节起进入主走查。 先把那只碗摆出来:

碗形函数 f(x) = 0.2·x₁² + 2·x₂²
────────────────────────────────────────────────
它是最优点在原点的一只扁碗:
x₁ 方向曲率小(0.2),坡缓;x₂ 方向曲率大(2),坡陡
梯度 = (0.4·x₁, 4·x₂)
起点 (3, 4) 处的梯度 = (1.2, 16)
────────────────────────────────────────────────
书里把它实现成一个「带前向也带反向」的零件(第 02 章那种),
朴素版走法每步挪 0.2,走 20 步

朴素版的第一步: x ← (3, 4) − 0.2 × (1.2, 16) = (2.76, 0.8)看到问题没有:x₂ 方向一步从 4 冲到 0.8,而 x₁ 方向只从 3 挪到 2.76。 陡的方向被大梯度拖着猛走,缓的方向磨磨蹭蹭—— 同一个学习率,对两个方向都不合适。

(主走查里每一步的数,都是按书里的公式与设定逐步算出来的; 书里只画了轨迹图,没有打印逐步数值。)

第一种改法(名字AdaGrad,「自适应梯度」的缩写)的思路:给每个参数各配一个分母, 分母是这个参数历史梯度的平方累积8:

AdaGrad 的一步
────────────────────────────────────────────────
G ← G + g² 把这一步的梯度平方累进分母
Δ = −α / √(G + ε) ⊙ g 梯度大的方向,分母大,步长自动收紧
────────────────────────────────────────────────
ε 是一个防除零的小常数,常取 10⁻⁷ ~ 10⁻¹⁰
书里这一版 α = 0.5,ε = 10⁻⁷,走 50 步

主走查第一步: G = (1.2², 16²) = (1.44, 256); Δ = −0.5 × (1.2/√1.44, 16/√256) = −0.5 × (1, 1) = (−0.5, −0.5)

注意这个第一步的形状:两个方向走了一样远。 梯度差 13 倍的两个方向,被各自的分母拉平到了同一步长——这正是它要的效9第二步 G 变成 (1.44+1.0², 256+14²) = (2.44, 452), Δ = −0.5 × (1.0/√2.44, 14/√452) ≈ (−0.320, −0.329),已经在收紧。

它的病根也在这个分母上:G 只增不减。 迭代时间一长,分母越积越大,步长被压到极小,还没走到最优点就迈不动了10

4. 改法二:让分母会忘

修补办法顺理成章:把「全部历史的累积」换成「近期历史的滑动平均」。

这个滑动平均我们在第 13 章还会遇到:每一步都让旧值打一个折扣、再掺一点新值—— 旧值每步乘 0.9,十步之前的事就只剩三分之一,分母于是可升可降11:

RMSprop 的一步(与 AdaGrad 的唯一差别在第一行)
────────────────────────────────────────────────
G ← β·G + (1−β)·g² β 常取 0.9:分母只看最近若干步
Δ = −α / √(G + ε) ⊙ g 其余与 AdaGrad 相同
────────────────────────────────────────────────
书里这一版 α = 0.1,β = 0.9,走 50 步
这个算法的名字叫 RMSprop

主走查第一步: G = 0.1 × (1.44, 256) = (0.144, 25.6); Δ = −0.1 × (1.2/√0.144, 16/√25.6) = −0.1 × (3.162, 3.162) ≈ (−0.316, −0.316)

又是两个方向一样远——和 AdaGrad 的第一步同理。 区别在于往后:G 会忘,步长不会像上一节那样被永久压死12

5. 改法三:给方向加惯性

前两节改的是第 ② 根杠杆(步长)。这一节改第 ③ 根(方向)。

小批量估计的方向天然带噪声:这一批算出来朝东,下一批可能朝东北。 朴素版每一步都全信当前这批,路线就呈锯齿。 动量法的做法是把「这一步实际走的方向」换成近期方向的滑动平均13:

动量法的一步
────────────────────────────────────────────────
Δ ← ρ·Δ − α·g ρ 是动量因子,常取 0.9
x ← x + Δ
────────────────────────────────────────────────
书里这一版 α = 0.01,ρ = 0.9,走 50 步

这条更新式的效果分两种情形14:

  • 连续几步梯度方向一致 → Δ 越累越大,加速;
  • 方向互相打架 → 滑动平均互相抵消,减速

所以它叫动量:像一个小球,方向稳定时越滚越快,方向乱晃时自己慢下来。 训练初期方向通常一致,它加速;接近最优点时方向开始震荡,它自动稳态化14。 书里也点了一句:这相当于借用了曲面的走向信息, 但本质上仍是一阶梯度的加权平均,并没有真正用到曲率14

主走查第一步: Δ = −0.01 × (1.2, 16) = (−0.012, −0.016)—— 五种走法里最小的一步。但第二步它就把上一步的 0.9 倍也带上了, 后面会越滚越快。

补充(不在书里,来自通用知识):同样是「惯性」,有两个写法不一样的版本。 书里这一版是「学习率乘在每一步梯度上,再一起累进惯性」; 框架内置的随机梯度下降是「先把梯度累进惯性,最后才乘学习率」。 学习率固定时两者等价;但学习率随时间变化时(第 9 节),差别就出来了—— 书里这版的旧步子带着旧学习率,内置版则让全部历史都吃当前学习率。 读源码时对不上,先查这条。

6. 改法四:惯性加自适应,外加一步冷启动修正

最后一种走法把前两节的两个改动合在一起——它叫 Adam。 它同时维护两份滑动平均:一份管方向(动量),一份管步长(分母)15:

Adam 的一步
────────────────────────────────────────────────
M ← β₁·M + (1−β₁)·g 方向的滑动平均 (β₁ 常取 0.9)
G ← β₂·G + (1−β₂)·g² 梯度平方的滑动平均 (β₂ 常取 0.99)
M̂ = M / (1−β₁ᵗ) 冷启动修正,见下
Ĝ = G / (1−β₂ᵗ)
Δ = −α / √(Ĝ + ε) ⊙ M̂
────────────────────────────────────────────────
学习率 α 通常取 0.001

中间那两行「冷启动修正」是 Adam 特有的一步,值得单独说。 两份滑动平均都从 0 起步:第一步的 M 只有真实方向的 (1−β₁) = 十分之一, 相当于初期系统性低估了方向与分母,β 越接近 1 低估越明显16。 除以 (1−βᵗ) 正好把这个初期偏差补回来;t 一大,分母趋近 1,修正自动退场16

主走查第一步(书里这一版 α = 0.2,走 20 步): M = 0.1 × (1.2, 16),修正后 M̂ = (1.2, 16); G = 0.01 × (1.44, 256),修正后 Ĝ = (1.44, 256)。 Δ = −0.2 × (1.2/√1.44, 16/√256) = (−0.2, −0.2)

又是两个方向一样远——这一步很能说明 Adam 的性格: 经过冷启动修正,第一步的每个坐标恰好走一个学习率的距离, 与梯度是 1.2 还是 16 完全无关。

现在把五种第一步并排(起点同是 (3,4),梯度同是 (1.2, 16)):

走法第一步这一步的大小由什么决定
朴素版(−0.24, −3.2)正比于梯度——被陡方向拖着走
AdaGrad(−0.5, −0.5)几乎与梯度大小无关,由 α 决定
RMSprop(−0.316, −0.316)同上
动量(−0.012, −0.016)正比于梯度,但会逐步累积放大
Adam(−0.2, −0.2)几乎与梯度大小无关,由 α 决定

一句话:三种带分母的走法,第一步就已经「方向归一」了; 而朴素版和动量的第一步仍正比于梯度。 (五种各自的学习率是书里分别调好的,所以步长的绝对值里既有算法性格也有学习率差别; 但「与梯度大小有没有关」是结构性的,与学习率无关。)

书里的轨迹图显示:Adam 的路线相比前几种更加「顺滑」, 沿等值线下滑时几乎不再震荡17——方向有惯性稳着,步长有分母压着。

7. 换一个更刁钻的考场:三维鞍点

碗形函数太乖了。书里又换了一个会骗人的地形18:

f(x) = x₁⁴ − 2·x₁² + x₂²
────────────────────────────────────────────────
原点 (0, 0) 是一个鞍点:
沿 x₁ 方向它是一道向两侧下降的「脊」(局部极大)
沿 x₂ 方向它是一条「谷」(局部极小)
真正的最小值在脊的两侧:(±1, 0),函数值 −1
────────────────────────────────────────────────
考场的问题:从脊附近出发,各走法能不能绕开鞍点、滚向最小值?

五种走法从同一点 (0.2, 1.5) 出发,各跑 150 步。 起点的梯度是 (4×0.2³ − 4×0.2, 2×1.5) = (−0.768, 3)—— x₂ 方向把它往谷底带,x₁ 方向把它往右侧盆地推。

结果书里描述为:五种都成功绕开鞍点、滚向右侧最小值 (1, 0), 但路径与速度各不相同19:

  • 朴素版沿曲面缓慢下滑,150 步内还没完全到谷底;
  • AdaGrad、RMSprop、Momentum、Adam 都快得多;
  • 动量类(Momentum、Adam)在冲下谷底时会略微越过,再回摆收敛—— 这正是惯性「刹不住车」的一面。

书里特意加了一句 caution,这句话必须照抄: 这只能说明这些方法在该函数上收敛更快,而非谁就是「最佳优化器」; 具体任务里用哪种,仍需结合数据规模、损失曲面形态和工程预算综合权衡20

8. 换到真拟合任务上再看一遍:两种画法,两个结论

二维地形图毕竟是玩具。书里还给每种走法配了一个真任务21: 1 000 条二维输入,真实关系 y = 0.5·x₁ + 0.8·x₂ + 0.01·噪声, 单层线性网络,均方误差损失,批 64,训 30 轮22。 数据不打乱顺序,保证多次运行的曲线完全可复现23

五种走法各跑一遍,每种都画两张图:按迭代的损失曲线、按回合的损失曲线。

为什么要画两张? 一批 64 条,1 000 条数据一个回合只有约 16 次迭代; 横轴换成回合,等于把横轴压扁 16 倍。 第 2 节那个「按回合看批越小降得越快」的结论, 换一根横轴就可能翻案——书里把「按迭代重画一遍」留成了练习7, 这两张图就是读这种实验时的标准动作:报成绩前先问横轴是什么。

这个考场上各走法的表现24:

  • 朴素版(每步挪 0.01):损失稳步下降,按预期收敛——它是基线;
  • 动量(每步挪 0.01):前期比朴素版更快接近极小值,后期没有明显发散;
  • AdaGrad、RMSprop、Adam(每步分别挪 0.1、0.1、0.1):损失同样降到低位, 三种自适应走法在这个平滑任务上拉不开质的差距。

这个考场要读的不是「谁赢」,而是「差距有多大」: 在一个没有尖谷、没有鞍点的平滑任务上,最朴素的走法也能走完。 五种走法的差别,要到第 7 节那种刁钻地形、或真实深网络里才拉得开。

9. 学习率本身也可以随时间变:三段式调度

前面所有实验里,学习率都是一个固定数。工程上它几乎总是随时间变的。

书里把学习率调整分成两类25: 按规则调整(衰减、预热——训练开头先把学习率从很小逐步拉起来、周期性循环)与自适应调整(第 3、4、6 节那三种)。 两类不冲突,可以叠着用——Adam 负责「每个参数各挪多远」, 规则调度负责「整体步子随时间怎么变」。

最常用的一套规则调度是三段式,长这样:

阶段一 预热(warmup) 前若干步,学习率从 0 线性升到峰值
阶段二 余弦衰减 之后沿余弦曲线的前半段缓缓下降
阶段三 最低学习率 衰减到一个非零下限,不归零

预热管的是开头: 训练初期参数离好点还很远,方向估计也还没稳定, 一上来就全速冲,容易一头扎进坏地形再也出不来——先小步热身再加速。 最低学习率管的是结尾: 衰减到零等于宣布「后面不再学了」, 留一个非零下限,后期还能继续微调。

这套三段式不是这一章的实验内容——书里把它放进了第 10 章那个会写字的小模型的真实训练里: 前 100 步线性升到 3×10⁻³,再余弦(曲线先快后慢地滑落)衰减到 10⁻⁴26它在真实训练曲线上长什么样,第 20 章第 5 节讲。

10. 作者的判断与证据

书里给了证据的:

  • 批小(学习率同步缩小)按回合降得更快——五组对照画在同一张图上5, 并且书里自己点明了这不是单变量对照5;
  • 五种走法的轨迹风格——同一只碗、同一个起点的五张轨迹图17, 外加三维鞍点上 150 步的五条轨迹动画19;
  • 动量前期更快——真拟合任务上与朴素版的对比图24

属于作者的判断、并明确给了警告的:

  • 「在该函数上更快 ≠ 最佳优化器」——书里原话,第 7 节末20;
  • 常见批大小落在 32 到 256——经验区间,书里给了取舍维度 (显存、单步耗时、验证集表现),没给理论依据6

判断(我们的,不是书里的):这一章最有价值的对照设计是「同一起点」。 五种走法从 (3, 4) 出发、从 (0.2, 1.5) 出发,轨迹才有可比性; 而每种走法的学习率是分别调过的——这意味着读轨迹图时, 「走法的性格」可比,「走法的绝对速度」不可比。 如果错,会错在: 如果读者本来就只关心「哪个先到底」,那分别调参反而是公平做法。 判据是:书里有没有任何一种走法,在同一任务上用同一学习率与另一种并排——答案是没有。

11. 边界与局限

这一章没覆盖的:

没讲什么依据 / 为什么值得知道
学习率衰减的其他规则(分段、指数)书里只把它们列进了动手练习27
AdaDelta同样留成了练习28
超参数怎么自动搜第 7 章知识点图里列了「超参数优化」,但全章没有对应实验29
二阶优化方法章首明说:参数规模庞大,承担不起二阶方法的计算代价,只能依赖一阶方法30
AdamW第 14 章第 6 节讲——它要解决的是「权重衰减在 Adam 下不等效」的问题,得先讲过权重衰减

出门会撞见的名字:

  • SGD(随机梯度下降) —— 名字里有「随机」,实际工程里说的就是小批量版本; 本书第 2、8 节的 torch.optim.SGD 就是它;
  • AdaGrad / RMSprop / Momentum / Adam —— 第 3–6 节那四种走法; 框架里对应 torch.optim 下的同名类31;
  • 学习率调度器(lr scheduler) —— 第 9 节那套随时间改学习率的规则;
  • ** warmup(预热)** —— 第 9 节阶段一;大模型训练的标配;
  • Nesterov 加速梯度 —— 动量的一个变体,书里只点了名32

12. 可带走的

  1. 训练效果由三根杠杆决定:一批喂多少、每步挪多远、方向怎么估;
  2. 批大小与学习率是联动的:批翻倍、步子跟着翻倍,是经验上的默认搭配;
  3. 「批小降得快」可能是横轴的把戏——按回合和按迭代画,结论可能相反;
  4. AdaGrad 给每个参数配一个分母,但分母只增不减,走着走着就迈不动;
  5. RMSprop 把累积换成滑动平均,分母可升可降;
  6. 动量改的是方向:方向一致加速、方向打架减速,但它仍是一阶方法;
  7. Adam = 动量 + 自适应分母 + 冷启动修正;它的第一步每个坐标恰好走一个学习率;
  8. 三种带分母的走法,第一步就与梯度大小无关——这是它们和朴素版的结构性差别;
  9. 鞍点上五种都绕得开,快慢不同——但书里明说这不评「最佳」;
  10. 学习率可以随时间变:预热、余弦衰减、最低学习率,三段各管一件事。

13. 原文地图

主题原书章原文位置
三根杠杆第7章 网络优化与正则化text/08-ch07.txt:208(搜「影响优化效果的三大杠杆」)
小批量与三种形式第7章 网络优化与正则化text/08-ch07.txt:191(搜「批量梯度下降用全部样本」)
线性缩放五组对照第7章 网络优化与正则化text/08-ch07.txt:218(搜「线性缩放规则」) · text/08-ch07.txt:236(搜「实验组合为」)
按回合看的结果与两盆冷水第7章 网络优化与正则化text/08-ch07.txt:303(搜「批大小越小、学习率同步缩小」)
碗形函数与朴素版轨迹第7章 网络优化与正则化text/08-ch07.txt:349(搜「采用Sphere函数」) · text/08-ch07.txt:407(搜「设定初始值」)
AdaGrad第7章 网络优化与正则化text/08-ch07.txt:638(搜「借鉴」) · text/08-ch07.txt:719(搜「学习率会被压到极小」)
RMSprop第7章 网络优化与正则化text/08-ch07.txt:748(搜「学习率单调衰减、过早收敛」)
动量法第7章 网络优化与正则化text/08-ch07.txt:862(搜「用历史梯度的累积」) · text/08-ch07.txt:871(搜「近期梯度的加权和」)
Adam 与冷启动修正第7章 网络优化与正则化text/08-ch07.txt:962(搜「既维护梯度的指数加权平均」) · text/08-ch07.txt:972(搜「冷启动偏差」)
三维鞍点第7章 网络优化与正则化text/08-ch07.txt:1103(搜「在原点 (0, 0) 处有一个鞍点」) · text/08-ch07.txt:1237(搜「五种优化器都成功绕开」)
真拟合任务第7章 网络优化与正则化text/08-ch07.txt:447(搜「生成 1 000 条二维输入」) · text/08-ch07.txt:618(搜「同时跑这两组实验」)
学习率调整两类第7章 网络优化与正则化text/08-ch07.txt:632(搜「按规则调整」)
三段式调度(第 10 章)第10章 大语言模型与智能体text/11-ch10.txt:504(搜「学习率预热」) · text/11-ch10.txt:517(搜「def get_lr」)

Footnotes

  1. 出处:「第7章 网络优化与正则化」第 208 段(text/08-ch07.txt:208,搜「影响优化效果的三大杠杆」)。原文:影响优化效果的三大杠杆是 1) 批大小 K;2) 学习率 α;3) 梯度估计 g(如何从样本批中得到「更好」的梯度);后续的各种优化算法基本都是在这三处做文章。

  2. 出处:「第7章 网络优化与正则化」第 191 段(text/08-ch07.txt:191,搜「批量梯度下降用全部样本」)。原文:按每一步计算梯度时使用的样本数,可分为三种形式——批量梯度下降用全部样本、随机梯度下降只用单条样本、小批量梯度下降居中,每步抽出一小批;三者的关键差异就在批大小这一个超参上。

  3. 出处:「第7章 网络优化与正则化」第 217 段(text/08-ch07.txt:217,搜「样本高度冗余」)。原文:实际训练数据集动辄数百万乃至数亿条样本,每步都跑全量梯度既慢又浪费——大数据集中样本高度冗余,全量计算的边际收益很低;因此深度模型几乎都采用小批量梯度下降。

  4. 出处:「第7章 网络优化与正则化」第 218 段(text/08-ch07.txt:218,搜「线性缩放规则」)与第 236 段(text/08-ch07.txt:236,搜「实验组合为」)。原文:经验上有一条「线性缩放规则」——批大小翻倍时,学习率也按比例放大;实验组合为 (K, α) ∈ {(16, 0.01), (32, 0.02), (64, 0.04), (128, 0.08), (256, 0.16)};实验用 LeNet 在 MNIST 上做图像分类,优化器取 torch.optim.SGD,训 30 个回合。 2

  5. 出处:「第7章 网络优化与正则化」第 303 段(text/08-ch07.txt:303,搜「批大小越小、学习率同步缩小」)。原文:按回合观察,批大小越小、学习率同步缩小的设置下损失下降更快;但这并不意味着「批越小越好」——小批次在一个回合内的迭代次数更多,加上学习率也在缩放,回合维度的优势并不能完全归因于批大小本身;而且小批次的梯度噪声大,泛化不一定更好。 2 3 4

  6. 出处:「第7章 网络优化与正则化」第 306 段(text/08-ch07.txt:306,搜「批大小落在 32 到 256」)。原文:实际项目中常见的批大小落在 32 到 256 之间,最终取舍取决于显存预算、单步耗时和验证集表现。 2

  7. 出处:「第7章 网络优化与正则化」第 310 段(text/08-ch07.txt:310,搜「按迭代步」)。这是动手练习 7.1:改为按迭代步(而非回合)绘制损失曲线,对比不同批大小下损失下降速度的差异;思考「按回合」和「按迭代」两个视角下结论是否一致。 2

  8. 出处:「第7章 网络优化与正则化」第 638 段(text/08-ch07.txt:638,搜「借鉴」)。原文:AdaGrad(Adaptive Gradient Algorithm)借鉴 ℓ2 正则化的思想,让每个参数都有自己的学习率——先累积该参数历史梯度的平方,再用累积量缩放当前梯度得到更新量;ε 为数值稳定项,常取 10⁻⁷ ∼ 10⁻¹⁰;直觉上,梯度大的方向被分母约束、更新步长变小,小梯度的方向则相对放大。

  9. 出处:「第7章 网络优化与正则化」第 717 段(text/08-ch07.txt:717,搜「频繁出现大梯度的参数」)。原文:轨迹显示,AdaGrad 在前几步更新幅度较大,随着累积量增加,分母变大,步长被迅速压缩;直觉上,频繁出现大梯度的参数学习率会自动收紧,而梯度较小的参数则被相对放大。

  10. 出处:「第7章 网络优化与正则化」第 719 段(text/08-ch07.txt:719,搜「学习率会被压到极小」)。原文:然而 G 只增不减,当迭代时间一长、还没找到最优点时,学习率会被压到极小,模型就难再继续逼近最优。

  11. 出处:「第7章 网络优化与正则化」第 748 段(text/08-ch07.txt:748,搜「学习率单调衰减、过早收敛」)。原文:RMSprop 针对 AdaGrad「学习率单调衰减、过早收敛」的缺陷做了改进——用指数移动平均替代累计求和,让 G 既能升也能降;β 是衰减率,常取 0.9,相当于关注最近若干步的梯度统计。

  12. 出处:「第7章 网络优化与正则化」第 760 段(text/08-ch07.txt:760,搜「学习率可升可降」)。原文:RMSprop 与 AdaGrad 的唯一区别就在于 G 用指数加权平均替换累积和,因此学习率可升可降,长时间训练也不会被压到几乎为零。

  13. 出处:「第7章 网络优化与正则化」第 862 段(text/08-ch07.txt:862,搜「用历史梯度的累积」)。原文:动量法(Momentum Method)用历史梯度的累积「动量」代替单次梯度,相当于把每一步梯度当作加速度而非位移;ρ 是动量因子(常用 0.9)。

  14. 出处:「第7章 网络优化与正则化」第 871 段(text/08-ch07.txt:871,搜「近期梯度的加权和」)。原文:如果最近若干步梯度方向不一致(互相抵消),更新幅度会缩小;如果方向一致,则不断累加产生加速效应;训练初期梯度方向通常较一致,动量起到加速作用,接近收敛时梯度方向开始震荡,动量则起到减速、稳态化的作用;换一个视角看,把当前梯度与历史梯度叠加,在效果上类似于利用了曲面的走向信息,但它本质上仍是一阶梯度的加权平均,并未真正利用曲率(Hessian)信息。 2 3

  15. 出处:「第7章 网络优化与正则化」第 962 段(text/08-ch07.txt:962,搜「既维护梯度的指数加权平均」)。原文:Adam(Adaptive Moment Estimation)把 RMSprop 的自适应学习率和动量法的方向修正合二为一——既维护梯度的指数加权平均(提供动量),又维护梯度平方的指数加权平均(提供自适应学习率);β₁、β₂ 通常取 0.9、0.99;从统计意义看,M 近似梯度的一阶矩(均值),G 近似未中心化的二阶矩;学习率 α 通常取 0.001。

  16. 出处:「第7章 网络优化与正则化」第 972 段(text/08-ch07.txt:972,搜「冷启动偏差」)。原文:初始值 M₀ = G₀ = 0 使得迭代初期 M、G 都偏向零,相当于低估了真实均值和方差;尤其当 β 接近 1 时,这一偏差在前若干步会非常显著;为消除这种「冷启动偏差」,Adam 对两个量做除以 (1−βᵗ) 的修正。 2

  17. 出处:「第7章 网络优化与正则化」第 1067 段(text/08-ch07.txt:1067,搜「更加“顺滑”」)。原文:轨迹相比前几种算法更加「顺滑」——Adam 同时享受了动量带来的方向修正和 RMSprop 带来的自适应步长,沿等值线下滑时几乎不再震荡。 2

  18. 出处:「第7章 网络优化与正则化」第 1103 段(text/08-ch07.txt:1103,搜「在原点 (0, 0) 处有一个鞍点」)。原文:该函数在原点 (0, 0) 处有一个鞍点——沿 x₁ 方向它是一道向两侧下降的「脊」(局部极大),沿 x₂ 方向却是一条「谷」(局部极小),因此既非极大值也非极小值;脊的两侧各有一个真正的最小值 (±1, 0);我们的关注点是:不同优化器能否绕开鞍点、继续滚向某个最小值。

  19. 出处:「第7章 网络优化与正则化」第 1237 段(text/08-ch07.txt:1237,搜「五种优化器都成功绕开」)。原文:从动画结果看,五种优化器都成功绕开原点的鞍点、滚向右侧的最小值 (1, 0),但路径和速度各不相同——SGD 沿曲面缓慢下滑,150 步内还没完全到达谷底;AdaGrad、RMSprop、Adam、Momentum 都快得多,其中动量类(Momentum、Adam)在冲下谷底时会略微越过、再回摆收敛。起点 (0.2, 1.5) 与五种优化器的学习率设定见第 1122–1143 段。 2

  20. 出处:「第7章 网络优化与正则化」第 1240 段(text/08-ch07.txt:1240,搜「而非谁就是」)。原文:需要强调的是——这只能说明这些自适应或带动量的方法在该函数上收敛更快,而非谁就是「最佳优化器」;具体任务里采用哪种优化器,仍需结合数据规模、损失曲面形态和工程预算综合权衡。 2

  21. 出处:「第7章 网络优化与正则化」第 618 段(text/08-ch07.txt:618,搜「同时跑这两组实验」)。这是书里的提醒框:本节后面介绍的每一种优化算法都会同时跑这两组实验(2D 轨迹 + 拟合损失),便于横向比较。

  22. 出处:「第7章 网络优化与正则化」第 447 段(text/08-ch07.txt:447,搜「生成 1 000 条二维输入」)与第 585 段(text/08-ch07.txt:585,搜「num_epochs=30, batch_size=64」)。数据按真实关系 y = 0.5x₁ + 0.8x₂ + 0.01ε 生成;模型是单层前馈网络 Linear(2),损失取均方误差,训 30 个回合、批大小 64。

  23. 出处:「第7章 网络优化与正则化」第 520 段(text/08-ch07.txt:520,搜「不打乱训练数据顺序」)。原文:为了能横向对比不同优化器,这里做了两点权衡——一是不打乱训练数据顺序,确保多次运行的曲线完全可复现,便于不同优化器之间的对比;二是保留显式的优化器基类,便于切换。

  24. 出处:「第7章 网络优化与正则化」第 615 段(text/08-ch07.txt:615,搜「损失稳步下降」)与第 951 段(text/08-ch07.txt:951,搜「相比纯 SGD」)。朴素版:损失稳步下降,模型按预期完成收敛;动量版:相比纯 SGD,动量法在前期更快接近极小值,且后期没有明显的发散迹象。 2

  25. 出处:「第7章 网络优化与正则化」第 632 段(text/08-ch07.txt:632,搜「按规则调整」)。原文:常用的学习率调整手段大致可以分成两类——一类是按规则调整,包括学习率衰减、预热、周期性循环等;另一类是自适应调整,根据梯度历史动态调整每个参数的学习率。

  26. 出处:「第10章 大语言模型与智能体」第 504 段(text/11-ch10.txt:504,搜「学习率预热」)与第 517 段(text/11-ch10.txt:517,搜「def get_lr」)。原文训练流程第 4 条:学习率预热(线性升)+ 余弦衰减;get_lr 的实现是前 100 步从 0 线性升到 3×10⁻³,之后按余弦曲线衰减到 10⁻⁴。

  27. 出处:「第7章 网络优化与正则化」第 628 段(text/08-ch07.txt:628,搜「多种学习率衰减策略」)。这是动手练习 7.4:查阅主书第 7.2.3.1 节列出的多种学习率衰减策略(分段、指数、余弦等),分别接入到本节的优化实验中比较。

  28. 出处:「第7章 网络优化与正则化」第 850 段(text/08-ch07.txt:850,搜「动手实现 AdaDelta」)。这是动手练习 7.5。

  29. 出处:「第7章 网络优化与正则化」第 167 段(text/08-ch07.txt:167,搜「超参数优化」)。这是图 7.1 的知识点回顾,「超参数优化」列在网络优化分支下,但全章没有对应的实验节。

  30. 出处:「第7章 网络优化与正则化」第 152 段(text/08-ch07.txt:152,搜「承担不起计算代价高昂的二阶优化方法」)。这是本章引言:损失函数高度非凸,全局最优难以触及;参数规模庞大,承担不起计算代价高昂的二阶优化方法,只能依赖效率有限的一阶方法。

  31. 出处:「第7章 网络优化与正则化」第 1253 段(text/08-ch07.txt:1253,搜「同名优化器做一次对账」)。这是动手练习 7.8:把本章从零实现的五个优化器与 torch.optim 中的同名优化器做一次对账,找出数值差异最大的那一个并分析差异来源。

  32. 出处:「第7章 网络优化与正则化」第 335 段(text/08-ch07.txt:335,搜「Nesterov」)。原文把梯度估计修正的代表方法列为动量法、Nesterov 加速梯度等;正文只展开了动量法。