梯度下降 · 在 Himmelblau 地形里找谷底
点画布选起点,对比 SGD / 动量 / Adam 三种优化器,看它们怎么从同一座小山滚到不同的洞底。
梯度下降是什么
机器学习的核心循环只有一句话:
哪个方向能让损失变小一点,就往哪个方向挪一小步。
“那个方向”的数学名字叫负梯度:
- 是参数(这里是 (x, y))
- 是损失函数(这里是 Himmelblau)
- 是梯度,指向函数上升最快的方向
- (学习率 lr)控制每步走多远
这个简单循环驱动了几乎所有的机器学习:从 1986 年的反向传播到 2025 年的 GPT-5,本质都是它。
五种经典地形
每种地形考验优化器的不同方面 —— 切换”地形”按钮就能换一张地图:
Himmelblau · 4 谷
4 个等高谷底,分别在 (3, 2)、(−2.81, 3.13)、(−3.78, −3.28)、(3.58, −1.85)。起点决定终点:从不同方位出发会落进不同的洞。
Rosenbrock · 香蕉谷
经典的”窄弯山谷”测试函数,谷底沿抛物线 蜿蜒延伸。SGD 会沿谷壁反复横跳(之字形路径),动量 / Adam 能识别”沿谷方向”加速,差距特别明显。
椭圆碗 · 凸函数
最简单的二次凸函数,但 x 和 y 方向曲率差 8 倍。优化器友好但能看清 lr 行为:lr 太大就发散,太小就慢,刚好就直接收敛。
马鞍 · saddle point
中央是鞍点(一条方向是谷、另一条是山),两侧 处是真正的极小。SGD 容易卡在鞍点附近(梯度接近 0 但不是极小),动量能”冲过去”逃离。高维神经网络损失景观里,鞍点比局部最小常见得多 —— 这是动量/Adam 在实践中比 SGD 强的关键原因。
Rastrigin · 蛋筐
整片地形布满小坑,每个间距 1,最深的那个在 (0, 0)。所有局部贪婪算法在这里都很惨 —— 想找到全局最优,要么 lr 大到能”跳过”小坑(但太大又发散),要么用模拟退火、遗传算法等全局策略。这是梯度下降的”噩梦地形”。
三种优化器的对照
SGD(普通梯度下降)
最朴素:每步 = −lr × ∇f。
- 在陡的方向走得快,平的方向走得慢
- 学习率太大 → 在谷底来回震荡甚至发散
- 学习率太小 → 永远到不了
- 在狭长山谷里会”之字形”反复横跳
Momentum(动量)
加一个”速度”项,让上一步的方向继续保留一部分:
- 越大,“惯性”越强
- 优点:可以冲过小坑(避开浅的局部最优),在长直谷里加速
- 缺点:到了真正的谷底可能冲过头,需要时间”刹车”
Adam(自适应矩估计)
2014 年发明的”现代默认选项”。对每个维度独立估计梯度的均值和方差,自动给每个维度调一个有效学习率:
- 大梯度的方向会被自动”压扁”,小梯度的方向被”放大”
- 对学习率不太敏感(lr=0.001 是好默认)
- 几乎所有现代深度学习都用 Adam 或它的变体(AdamW、LAMB 等)
试这几个对照实验
- 看起点决定终点:用 SGD + lr=0.02,分别点 (−4, 4)、(4, 4)、(4, −4)、(−4, −4),看四次分别落进哪个谷
- 学习率太大:lr 拉到 0.1,从中间点击,看路径震荡甚至飞出去
- 学习率太小:lr 调到 0.001,看路径几乎不动
- 动量威力:切到 Momentum,β=0.9,从一个陡坡起点(比如 (−4, 4))开始 —— 比 SGD 收敛快很多,但末尾会”冲过”再回来
- Adam 自适应:切到 Adam,lr 保持默认,看它如何稳定收敛 —— 即使从特别陡或特别平的位置都能滚到谷底
真实模型里有什么不同
这个 demo 是 2 维的。真实神经网络可能有 千亿维参数。差异:
- 千亿维空间里几乎不存在严格的”局部最小” —— 大多数停止点是鞍点(一些方向上是谷,另一些方向上是山)
- “好”的局部最小值其实很多,找到其中任何一个都行
- 真实损失景观远不是光滑函数,而是充满陡崖、平台、噪声
- 大批量数据让每步只看一部分(mini-batch),所以叫”随机梯度下降”(Stochastic GD)
但这个二维玩具里能感受到的核心直觉 —— 起点重要、学习率重要、动量加速、Adam 鲁棒 —— 在 GPT 训练里同样成立。
一个反直觉的结论
在高维空间,对参数过参数化(参数比数据多)的神经网络很难陷入”差的”局部最小。2015 年后的理论工作(Choromanska 等)指出:随着维度增长,几乎所有局部最小值的损失都接近全局最小,所以”找到 某个 谷”通常就够好。
这是为什么深度学习能用 SGD/Adam 这种简单算法就工作得这么好 —— 不是因为算法智能,是因为高维景观对它们”友善”。