33

学习率——太大爆炸、太小不动

阅读约 4 分钟第 33/60 课

学习率是训练中最重要的超参数——它决定了每一步更新的步长。

参数_new = 参数_old − 学习率 × 梯度方向

学习率太大,参数每一步跳得太远,容易跳过最优点,甚至让 loss 越来越大直到训练崩溃。学习率太小,每一步只挪动一点点,可能需要天文数字的步数才能到达好的位置——而 GPU 时间是有限的。

一个直觉

想象你在一片山地里找最低的山谷。

学习率 = 100:你穿着弹簧鞋,一步能跳 100 米。你可能直接跳过山谷,落在另一座山的顶上。下一步又跳了 100 米,落到更远的地方。你永远找不到山谷——你在群山之间弹来弹去。

学习率 = 0.000001:你在地上爬行,每一步挪动一毫米。理论上你总会爬到山谷,但可能需要一辈子。

学习率 = 合适的值:你正常走路,能看到坡度往下就走,步子不太大也不太小。在陡坡上稳步下降,在接近谷底时自然放慢。

用数字感受

回到第 25 章节的例子:loss = (z − 20)²,梯度大约在 50 左右。

学习率 = 0.1(太大):

更新量 = 0.1 × 50 = 5.0
参数一步跳 5 个单位——参数本身才是 3 到 4 的量级
loss:16 → 2847 → 崩溃

学习率 = 0.001(合适):

更新量 = 0.001 × 50 = 0.05
参数一步移动 0.05——温和的微调
loss:16 → 10.3 → 6.7 → ... → 逐渐趋近 0

学习率 = 0.0000001(太小):

更新量 = 0.0000001 × 50 = 0.000005
参数一步移动 0.000005——几乎没动
需要上百万步才能看到明显变化

差别只在一个乘数——但结果从「崩溃」到「高效收敛」到「停滞不前」,跨度是天壤之别。

Sophia 的学习率

Sophia 预训练的峰值学习率是 3 × 10⁻⁴(0.0003)。

这个数字是怎么确定的?主要靠经验和小规模实验。在正式训练之前,通常会用较小的数据和较短的训练步数做几次试跑,测试不同的学习率——看哪个让 loss 下降得最快且最稳定。

一种常用的方法叫学习率扫描(learning rate sweep):从一个很小的学习率开始,在几百步内线性增大到一个很大的值,同时记录每一步的 loss。画出「学习率 vs loss」的曲线——loss 下降最快的那段区间,就是合适的学习率范围。

loss
  ↑
  │ ╲                          ╱ ← loss 开始上升,学习率过大
  │   ╲                      ╱
  │     ╲                  ╱
  │       ╲_______________╱
  │         ↑
  │     这个范围的学习率最有效
  └───────────────────────────→ 学习率

但学习率不是从头到尾固定不变的。训练的不同阶段需要不同的学习率——这引出了下面两个章节的主题:warmup 和 cosine decay。

下一章节来看训练开始时为什么不能直接用峰值学习率。