堂前燕
计算机 / AI · 高中 · 优化 · 梯度下降 · Adam · 动量 · 神经网络

梯度下降 · 在 Himmelblau 地形里找谷底

点画布选起点,对比 SGD / 动量 / Adam 三种优化器,看它们怎么从同一座小山滚到不同的洞底。

梯度下降是什么

机器学习的核心循环只有一句话:

哪个方向能让损失变小一点,就往哪个方向挪一小步。

“那个方向”的数学名字叫负梯度

θt+1=θtηf(θt)\theta_{t+1} = \theta_t - \eta \, \nabla f(\theta_t)
  • θ\theta 是参数(这里是 (x, y))
  • f(θ)f(\theta) 是损失函数(这里是 Himmelblau)
  • f\nabla f 是梯度,指向函数上升最快的方向
  • η\eta(学习率 lr)控制每步走多远

这个简单循环驱动了几乎所有的机器学习:从 1986 年的反向传播到 2025 年的 GPT-5,本质都是它。

五种经典地形

每种地形考验优化器的不同方面 —— 切换”地形”按钮就能换一张地图:

Himmelblau · 4 谷

f(x,y)=(x2+y11)2+(x+y27)2f(x, y) = (x^2 + y - 11)^2 + (x + y^2 - 7)^2

4 个等高谷底,分别在 (3, 2)、(−2.81, 3.13)、(−3.78, −3.28)、(3.58, −1.85)。起点决定终点:从不同方位出发会落进不同的洞。

Rosenbrock · 香蕉谷

f(x,y)=(1x)2+100(yx2)2f(x, y) = (1-x)^2 + 100(y-x^2)^2

经典的”窄弯山谷”测试函数,谷底沿抛物线 y=x2y = x^2 蜿蜒延伸。SGD 会沿谷壁反复横跳(之字形路径),动量 / Adam 能识别”沿谷方向”加速,差距特别明显。

椭圆碗 · 凸函数

f(x,y)=x2+8y2f(x, y) = x^2 + 8y^2

最简单的二次凸函数,但 x 和 y 方向曲率差 8 倍。优化器友好但能看清 lr 行为:lr 太大就发散,太小就慢,刚好就直接收敛。

马鞍 · saddle point

f(x,y)=x2y2+0.1(x4+y4)f(x, y) = x^2 - y^2 + 0.1(x^4 + y^4)

中央是鞍点(一条方向是谷、另一条是山),两侧 y=±5y = \pm\sqrt{5} 处是真正的极小。SGD 容易卡在鞍点附近(梯度接近 0 但不是极小),动量能”冲过去”逃离。高维神经网络损失景观里,鞍点比局部最小常见得多 —— 这是动量/Adam 在实践中比 SGD 强的关键原因。

Rastrigin · 蛋筐

f(x,y)=20+x210cos(2πx)+y210cos(2πy)f(x, y) = 20 + x^2 - 10\cos(2\pi x) + y^2 - 10\cos(2\pi y)

整片地形布满小坑,每个间距 1,最深的那个在 (0, 0)。所有局部贪婪算法在这里都很惨 —— 想找到全局最优,要么 lr 大到能”跳过”小坑(但太大又发散),要么用模拟退火、遗传算法等全局策略。这是梯度下降的”噩梦地形”。

三种优化器的对照

SGD(普通梯度下降)

最朴素:每步 = −lr × ∇f。

  • 在陡的方向走得快,平的方向走得慢
  • 学习率太大 → 在谷底来回震荡甚至发散
  • 学习率太小 → 永远到不了
  • 在狭长山谷里会”之字形”反复横跳

Momentum(动量)

加一个”速度”项,让上一步的方向继续保留一部分:

vt+1=βvtηf(θt),θt+1=θt+vt+1v_{t+1} = \beta v_t - \eta \nabla f(\theta_t), \quad \theta_{t+1} = \theta_t + v_{t+1}
  • β\beta 越大,“惯性”越强
  • 优点:可以冲过小坑(避开浅的局部最优),在长直谷里加速
  • 缺点:到了真正的谷底可能冲过头,需要时间”刹车”

Adam(自适应矩估计)

2014 年发明的”现代默认选项”。对每个维度独立估计梯度的均值和方差,自动给每个维度调一个有效学习率:

mt=β1mt1+(1β1)gt(梯度的指数平均,相当于动量)m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t \quad \text{(梯度的指数平均,相当于动量)} vt=β2vt1+(1β2)gt2(梯度平方的平均,估梯度大小)v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2 \quad \text{(梯度平方的平均,估梯度大小)} θt+1=θtηmtvt+ϵ\theta_{t+1} = \theta_t - \eta \cdot \frac{m_t}{\sqrt{v_t} + \epsilon}
  • 大梯度的方向会被自动”压扁”,小梯度的方向被”放大”
  • 对学习率不太敏感(lr=0.001 是好默认)
  • 几乎所有现代深度学习都用 Adam 或它的变体(AdamW、LAMB 等)

试这几个对照实验

  1. 看起点决定终点:用 SGD + lr=0.02,分别点 (−4, 4)、(4, 4)、(4, −4)、(−4, −4),看四次分别落进哪个谷
  2. 学习率太大:lr 拉到 0.1,从中间点击,看路径震荡甚至飞出去
  3. 学习率太小:lr 调到 0.001,看路径几乎不动
  4. 动量威力:切到 Momentum,β=0.9,从一个陡坡起点(比如 (−4, 4))开始 —— 比 SGD 收敛快很多,但末尾会”冲过”再回来
  5. Adam 自适应:切到 Adam,lr 保持默认,看它如何稳定收敛 —— 即使从特别陡或特别平的位置都能滚到谷底

真实模型里有什么不同

这个 demo 是 2 维的。真实神经网络可能有 千亿维参数。差异:

  • 千亿维空间里几乎不存在严格的”局部最小” —— 大多数停止点是鞍点(一些方向上是谷,另一些方向上是山)
  • “好”的局部最小值其实很多,找到其中任何一个都行
  • 真实损失景观远不是光滑函数,而是充满陡崖、平台、噪声
  • 大批量数据让每步只看一部分(mini-batch),所以叫”随机梯度下降”(Stochastic GD)

但这个二维玩具里能感受到的核心直觉 —— 起点重要、学习率重要、动量加速、Adam 鲁棒 —— 在 GPT 训练里同样成立。

一个反直觉的结论

在高维空间,对参数过参数化(参数比数据多)的神经网络很难陷入”差的”局部最小。2015 年后的理论工作(Choromanska 等)指出:随着维度增长,几乎所有局部最小值的损失都接近全局最小,所以”找到 某个 谷”通常就够好。

这是为什么深度学习能用 SGD/Adam 这种简单算法就工作得这么好 —— 不是因为算法智能,是因为高维景观对它们”友善”。