跳到主要内容

0.4 导数与梯度:往哪边走能下山

蒙眼下山​

想象你被蒙着眼睛放在一座山上,任务是走到谷底。你看不见全局,能依靠的只有一件事:脚底板的感觉——踩一踩,就知道哪边高、哪边低、有多陡。

策略其实很简单:感受坡度,朝下坡方向迈一步;再感受,再迈一步。只要每步都往低处走,总能走进某个谷底。

现在把这个故事翻译回机器学习(0.1 节的语言):

  • 山的高度 = 模型的损失(错得有多离谱);
  • 你站的位置 = 模型当前的参数取值;
  • 脚下的坡度 = 梯度:它告诉你参数往哪边调、损失会下降得最快;
  • 迈一步 = 更新一次参数。

「迈多大步」也有个名字,叫学习率。于是整个「学习」动作浓缩成一句话:

新位置=旧位置−学习率×坡度\text{新位置} = \text{旧位置} - \text{学习率} \times \text{坡度}

这就是梯度下降——从 0.1 节那条小直线到 GPT,所有模型的训练发动机都是它。

亲自下一次山​

下面的山谷里有一颗小球(它就是「参数」)。红色虚线是它脚下的切线——坡度的可视化。

🎮 动手实验
梯度下山:蒙着眼睛找谷底
小球只知道脚下的坡度(切线),沿着下坡方向一步步走。拖动小球换起点,调学习率,点「自动下山」。试试:学习率调到 1.0 以上会发生什么?
全局最低点局部最低点
当前位置 x
3.00
高度 f(x)(损失)
2.750
坡度 f′(x)(梯度)
3.100
已走步数
0
💡 要点:训练大模型时,「山谷高度」就是损失,「小球位置」就是几千亿个参数。模型看不到整座山的形状,只能靠脚下坡度(梯度)一步步挪。学习率太大→飞出山谷(训练崩掉);太小→挪不动(训练太慢);起点不好→掉进局部最低点。

请按顺序做三个实验,每个都会撞见大模型训练中的真实事故现场:

实验 ①:正常下山。 保持学习率 0.1,点「▶ 自动下山」。小球一步步走到左边谷底,「坡度 f′(x)」逐渐归零——坡度为零意味着到底了,走不动了,训练收敛。

实验 ②:步子太大,当场起飞。 点「↺ 重置(右坡出发)」,把学习率拉到 1.2 以上,再「▶ 自动下山」。小球不但不下山,反而越荡越高,最后💥飞出山谷——因为每一步迈得比山谷还宽,一脚跨到了对面更高的坡上。真实训练里这叫 loss 爆炸,工程师只能调小学习率、从上一个存档重来。

实验 ③:掉进小坑出不来。 点「↺ 重置(右坡出发)」,学习率调回 0.1 左右,自动下山。小球停在了右边的浅谷——那是局部最低点:四周都是上坡,但它不是全场最低。只会「往低处走」的算法,永远出不去。再点「↺ 换左坡出发」对比:起点不同,终点也不同。

学习率的两难由此清晰可见:太大会飞出山谷,太小则挪一万步也到不了谷底(你可以把学习率调到 0.01 感受一下什么叫「望山跑死马」)。真实训练中,学习率是最重要、也最难调的超参数之一。

这个类比在哪里不准确?

图里的「山」只有 1 个维度(横轴),而 GPT 的「山」有几千亿个维度——每个参数都是一个可以移动的方向,没人能画出它的样子。有趣的是,维度一高,实验 ③ 的恐怖程度反而下降:要在几千亿个方向上同时都是上坡才算真正的局部最低点,这种点非常罕见(更常见的是「鞍点」——有的方向上坡、有的方向下坡,绕一绕就能溜走)。此外,真实训练每一步只用一小批数据估算坡度,自带的「手抖」噪声反而常常帮小球晃出小坑。

小结​

本节要点
  • 梯度 = 坡度:告诉你每个参数往哪边调能让损失下降最快。
  • 梯度下降:新位置 = 旧位置 − 学习率 × 坡度,重复到坡度趋近零。
  • 学习率太大 → 发散(loss 爆炸);太小 → 收敛极慢;起点不同 → 可能落进不同的谷。
  • 真实的损失「山」有几千亿维,局部最低点不如 1 维直觉中可怕,鞍点才是常见麻烦。
📝 动手自测0/3
1. 梯度下降中,坡度(梯度)的作用是什么?
2. 实验 ② 里把学习率调到 1.2 以上,小球飞出了山谷。对应真实训练中的什么现象?
3. 为什么说「局部最低点」在真实大模型训练里没有 1 维图中那么可怕?

延伸阅读​