大家的AI
机器学习AI论文
加载中…

学习

🏅我的成就

Ch.02

优化算法:惯性与自适应学习率

训练 AI 模型就像蒙着眼在巨大山脉里寻找最深的谷(误差最小)。优化(Optimization)决定站在当前位置时,朝哪个方向、迈多大步下山。
Ch.01 定好起点后,本章学习如何顺着梯度安全、快速地下去:一步一步的 SGD、借惯性滑行的 动量,以及像自动驾驶一样调节步长的 Adam。把日常最常用的优化原理讲得直观好懂。
蒙眼爬同一座损失山,SGD、动量、Adam 会选不同路线(简化的谷底对比)。
loss
SGD动量Adam
红(SGD)在下降过程中左右摆动更明显,之字形感更强;到最后仍保留较多横向晃动。绿(动量)会减小摆动,但终盘停在略偏离谷底中心的位置;蓝(Adam)最先贴近谷底正中(示意)。

流程:前向 → 损失 → 反向 → optimizer.step

更新:θ←θ−η⋅(Adam 等生成的步长)\theta \leftarrow \theta - \eta \cdot(\text{Adam 等生成的步长})θ←θ−η⋅(Adam 等生成的步长)

  • ① SGD:每步沿梯度反方向(小批量噪声导致之字形)
  • ② 动量:累积速度 vvv,转弯更平滑
  • ③ Adam:按坐标自适应步长
  • ④ 实务:与日志、调度、Ch.01 初始化一起调参

优化算法:聪明地调节速度与方向

1. 梯度下降与 SGD:朝最陡的下坡走
概念: 下山最稳的办法是脚踩地面,沿着最陡的下坡方向一步一步走,这就是梯度下降的核心。
直觉: 想象浓雾里的汉拿山:步幅(学习率)太大可能坠崖或弹到对面山脊;太小则可能天黑还到不了谷底。
核心式:
θ←θ−η∇L(θ)\theta \leftarrow \theta - \eta \nabla L(\theta)θ←θ−η∇L(θ)
- θ\thetaθ:当前位置(权重)
- η\etaη:步幅,即学习率(常用 0.01、0.001 等)
- ∇L\nabla L∇L:当前坡度(梯度)
实务提示: 看整张地图太慢,所以默认用随机梯度下降(SGD):只看一块小批量,用 g^\hat{g}g^​ 快速定方向。
2. 动量:冰面上的保龄球
概念: SGD 只看眼前坡度,在窄谷里会之字形浪费时间。过去运动方向的惯性就是动量。
直觉: 纸杯会被小石子带偏;沉重的保龄球会碾过小障碍,沿原方向滚。动量给优化器这种“分量”。
核心式:
v←βv+(1−β)gv \leftarrow \beta v + (1-\beta)gv←βv+(1−β)g
θ←θ−ηv\theta \leftarrow \theta - \eta vθ←θ−ηv
- vvv:速度(惯性向量)
- β\betaβ:保留多少过去(常取 0.9)
- ggg:当前梯度
补充: Nesterov 在沿动量向前挪一点的位置算梯度。
3. 自适应(AdaGrad, RMSProp, Adam):每个轮子单独刹车
概念: 有的参数快到终点,有的还远。不用同一个 η\etaη,而是按参数自适应调节步长。
发展脉络:
- AdaGrad: “走得多的方向,步长再小些!”— 累积平方梯度。
- RMSProp: 缓解 AdaGrad 后期步长趋零的问题,用指数滑动慢慢忘掉远古历史。
- Adam: 把动量(方向)和 RMSProp 式缩放合在一起,是当今最常用的之一。
实务提示: 论文里常写 AdamW,把权重衰减与损失项分离以提升表现。
4. 三大目标:稳定性、速度、泛化
概念: 选优化器不只是“快下到谷底”。落在哪个谷,会影响测试集表现。
直觉: 坐高铁(Adam)可能先到;坐慢车(SGD+动量)也许能发现泛化更好的风景。
实务提示: 初期视野窄时用 warmup 慢慢加大步幅,接近终点时用学习率调度缩小步幅,与优化器配套使用。

公式导读

SGD 一步 θ←θ−ηg^\theta \leftarrow \theta - \eta \hat{g}θ←θ−ηg^​ — g^\hat{g}g^​ 为小批量估计,η\etaη 为步长。
动量 v←βv+(1−β)gv \leftarrow \beta v + (1-\beta)gv←βv+(1−β)g, θ←θ−ηv\theta \leftarrow \theta - \eta vθ←θ−ηv — 历史方向积存在 vvv 中,减轻之字形。
Adam(概念) — 对梯度及其平方做坐标级 EMA,并对初始步长做偏差校正。
自适应直觉 — 历史梯度大的坐标,有效步长相对更小。

为何重要

决定项目时间与成本
学习率太大模型会发散;太小则一小时能跑完的训练拖成一周。合适的优化设置能省下昂贵的 GPU 与加班。
改变“考试成绩”(泛化)
同一数据,不同优化器结果质量可以不同——落在哪个极小值,会改变测试预测力。
模型不舒服时先量的“体温”
损失不降或突然 NaN,第一嫌疑人往往是学习率与优化器。懂原理就能冷静排查。

如何使用

① 记录实验,一次只改一个旋钮
各库 API 不同,但习惯相通:记下学习率、批量、优化器、随机种子。出问题时一次只改一项以定位原因。损失剧烈波动→先看批量、学习率、动量;长时间训练后更新几乎停滞→可考虑从 AdaGrad 类思路转向 RMSProp / Adam。练习把现象和调节手段对应起来。
② 实务速查表
  • 场景先要快速 baseline
  • 推荐`Adam` 或 `AdamW`
  • 理由自适应步长,对初始 lr 不那么敏感
  • 场景NLP、Transformer
  • 推荐`AdamW`
  • 理由稀疏结构与复杂目标上往往更稳
  • 场景CNN 冲极限精度
  • 推荐`SGD + Momentum`
  • 理由调参难,但调好常泛化更强
场景推荐理由
先要快速 baseline`Adam` 或 `AdamW`自适应步长,对初始 lr 不那么敏感
NLP、Transformer`AdamW`稀疏结构与复杂目标上往往更稳
CNN 冲极限精度`SGD + Momentum`调参难,但调好常泛化更强
③ 监控:别移开眼睛
起飞不等于落地。用 TensorBoard、W&B 看损失曲线是否顺滑下滑;若像锯齿狂抖,该考虑降低学习率。

小结

优化是把梯度信息转换为更新步长,从而持续降低损失 L(θ)L(\theta)L(θ) 的过程。
SGD 用小批量梯度 g^\hat{g}g^​ 更新,动量 用速度 vvv 抑制之字震荡,Adam/AdamW 用一阶/二阶矩按坐标自适应步长。
实务排查摘要(症状 → 优先检查)
- 损失振荡:`lr`、动量、批量大小
- 初期发散/NaN:初始化、`lr`、`grad_norm`、clipping
- 学习停滞:调度器(含 warmup)、优化器切换(SGD↔AdamW)
- 验证停滞:weight decay、数据增强、early stopping
调参顺序(快速决策)
1) 先确认日志正常 → 2) 先调 `lr` → 3) 再选优化器 → 4) 结合调度策略 → 5) 追加稳定化手段 → 6) 按平均性能+方差+可复现性做最终选择
操作原则:一次只改一个变量,并记录 `optimizer/lr/batch_size/weight_decay/seed/scheduler` 以便对比。

解题提示

优化是用反向传播得到的梯度决定如何更新参数 θ\thetaθ、从而降低损失 L(θ)L(\theta)L(θ) 的过程。基础 SGD 用小批量梯度 g^\hat{g}g^​ 做一步 θ←θ−ηg^\theta \leftarrow \theta - \eta \hat{g}θ←θ−ηg^​,学习率 η\etaη 直接决定步长。动量 累积速度 vvv 以减轻窄谷里的之字震荡,Adam/AdamW 用一阶/二阶矩对各坐标自适应步长。损失剧烈波动或发散时,不要只换优化器名字,应同时检查 学习率、批量大小、学习率调度器。
示例(定义)
“动量(Momentum)的核心作用是?
① 把学习率设为 0
② 累积历史方向以减少振荡
③ 跳过反向传播”
动量通过速度 vvv 保留方向惯性。→ 答案 2

示例(场景)
“训练损失剧烈振荡时,优先检查哪组项?
① 学习率、动量、批量大小
② 训练数据为 0
③ 删除全部层”
振荡与步长和梯度噪声相关,应先看
①。→ 答案 1

示例(计算)
若 η=0.001\eta=0.001η=0.001, g=20g=20g=20,SGD 更新量 ηg\eta gηg 为?
0.001×20=0.020.001 \times 20 = 0.020.001×20=0.02。→ 答案 0.02
定义例 — “Adam 同时使用的关键信息是?
① 一阶与二阶矩
② 仅批次索引
③ 仅 dropout 掩码” → Adam 使用一阶和二阶矩。答案 1

判断例 — “RMSProp 使用梯度平方的指数移动平均(EMA)。” → 正确。答案 1

场景例 — “训练早期不稳定时,先看什么?
① warmup + 学习率调度
② 关闭反向传播
③ 删除数据” → 先检查 warmup 与调度。答案 1

选择例 — “Nesterov 的特征是?
① 前瞻点梯度
② 只看当前点
③ 不使用梯度” → 使用前瞻点。答案 1

概念例 — “在 AdaGrad 中,频繁更新坐标的有效步长趋势是?
① 变小
② 不变
③ 变大” → 因累积效应通常变小。答案 1

计算例 — “样本数 64、批量大小 16 时,每个 epoch 的步数是多少?” → 64/16=464/16=464/16=4。答案 4