Ch.02
优化算法:惯性与自适应学习率
训练 AI 模型就像蒙着眼在巨大山脉里寻找最深的谷(误差最小)。优化(Optimization)决定站在当前位置时,朝哪个方向、迈多大步下山。
Ch.01 定好起点后,本章学习如何顺着梯度安全、快速地下去:一步一步的 SGD、借惯性滑行的 动量,以及像自动驾驶一样调节步长的 Adam。把日常最常用的优化原理讲得直观好懂。
蒙眼爬同一座损失山,SGD、动量、Adam 会选不同路线(简化的谷底对比)。
SGD动量Adam
红(SGD)在下降过程中左右摆动更明显,之字形感更强;到最后仍保留较多横向晃动。绿(动量)会减小摆动,但终盘停在略偏离谷底中心的位置;蓝(Adam)最先贴近谷底正中(示意)。
流程:前向 → 损失 → 反向 → optimizer.step
更新:
- ① SGD:每步沿梯度反方向(小批量噪声导致之字形)
- ② 动量:累积速度 ,转弯更平滑
- ③ Adam:按坐标自适应步长
- ④ 实务:与日志、调度、Ch.01 初始化一起调参
优化算法:聪明地调节速度与方向
1. 梯度下降与 SGD:朝最陡的下坡走
概念: 下山最稳的办法是脚踩地面,沿着最陡的下坡方向一步一步走,这就是梯度下降的核心。
直觉: 想象浓雾里的汉拿山:步幅(学习率)太大可能坠崖或弹到对面山脊;太小则可能天黑还到不了谷底。
核心式:
- :当前位置(权重)
- :步幅,即学习率(常用 0.01、0.001 等)
- :当前坡度(梯度)
实务提示: 看整张地图太慢,所以默认用随机梯度下降(SGD):只看一块小批量,用 快速定方向。
2. 动量:冰面上的保龄球
概念: SGD 只看眼前坡度,在窄谷里会之字形浪费时间。过去运动方向的惯性就是动量。
直觉: 纸杯会被小石子带偏;沉重的保龄球会碾过小障碍,沿原方向滚。动量给优化器这种“分量”。
核心式:
- :速度(惯性向量)
- :保留多少过去(常取 0.9)
- :当前梯度
补充: Nesterov 在沿动量向前挪一点的位置算梯度。
3. 自适应(AdaGrad, RMSProp, Adam):每个轮子单独刹车
概念: 有的参数快到终点,有的还远。不用同一个 ,而是按参数自适应调节步长。
发展脉络:
- AdaGrad: “走得多的方向,步长再小些!”— 累积平方梯度。
- RMSProp: 缓解 AdaGrad 后期步长趋零的问题,用指数滑动慢慢忘掉远古历史。
- Adam: 把动量(方向)和 RMSProp 式缩放合在一起,是当今最常用的之一。
实务提示: 论文里常写 AdamW,把权重衰减与损失项分离以提升表现。
4. 三大目标:稳定性、速度、泛化
概念: 选优化器不只是“快下到谷底”。落在哪个谷,会影响测试集表现。
直觉: 坐高铁(Adam)可能先到;坐慢车(SGD+动量)也许能发现泛化更好的风景。
实务提示: 初期视野窄时用 warmup 慢慢加大步幅,接近终点时用学习率调度缩小步幅,与优化器配套使用。
公式导读
SGD 一步 — 为小批量估计, 为步长。
动量 , — 历史方向积存在 中,减轻之字形。
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 看损失曲线是否顺滑下滑;若像锯齿狂抖,该考虑降低学习率。
小结
优化是把梯度信息转换为更新步长,从而持续降低损失 的过程。
SGD 用小批量梯度 更新,动量 用速度 抑制之字震荡,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` 以便对比。
解题提示
优化是用反向传播得到的梯度决定如何更新参数 、从而降低损失 的过程。基础 SGD 用小批量梯度 做一步 ,学习率 直接决定步长。动量 累积速度 以减轻窄谷里的之字震荡,Adam/AdamW 用一阶/二阶矩对各坐标自适应步长。损失剧烈波动或发散时,不要只换优化器名字,应同时检查 学习率、批量大小、学习率调度器。
示例(定义)
“动量(Momentum)的核心作用是?
① 把学习率设为 0
② 累积历史方向以减少振荡
③ 跳过反向传播”
动量通过速度 保留方向惯性。→ 答案 2
示例(场景)
“训练损失剧烈振荡时,优先检查哪组项?
① 学习率、动量、批量大小
② 训练数据为 0
③ 删除全部层”
振荡与步长和梯度噪声相关,应先看
①。→ 答案 1
示例(计算)
若 , ,SGD 更新量 为?
。→ 答案 0.02
定义例 — “Adam 同时使用的关键信息是?
① 一阶与二阶矩
② 仅批次索引
③ 仅 dropout 掩码” → Adam 使用一阶和二阶矩。答案 1
判断例 — “RMSProp 使用梯度平方的指数移动平均(EMA)。” → 正确。答案 1
场景例 — “训练早期不稳定时,先看什么?
① warmup + 学习率调度
② 关闭反向传播
③ 删除数据” → 先检查 warmup 与调度。答案 1
选择例 — “Nesterov 的特征是?
① 前瞻点梯度
② 只看当前点
③ 不使用梯度” → 使用前瞻点。答案 1
概念例 — “在 AdaGrad 中,频繁更新坐标的有效步长趋势是?
① 变小
② 不变
③ 变大” → 因累积效应通常变小。答案 1
计算例 — “样本数 64、批量大小 16 时,每个 epoch 的步数是多少?” → 。答案 4