吴恩达《深度学习》之看懂 Momentum 的“惯性天平”

现在把目光锁定在Momentum(动量法)的超参数β\betaβ上。我们在解构现代优化器时,曾把动量比喻为“让小球带着历史惯性滚下山”。但正如真实的物理世界一样,“惯性”是一把极其锋利的双刃剑:惯性太小,小球依然会随波逐流;惯性太大,小球在急转弯时就会直接冲出悬崖。

我现在描述的困境——“纵轴疯狂横跳,横轴举步维艰”——正是最经典的陡峭峡谷地形。你直觉地开启了 Momentum,并将β\betaβ设为了 0.5,但发现效果微乎其微。

核心知识点:

  • 场景问题:代价函数JJJ纵轴震荡剧烈、横轴推进缓慢(鞍点或峡谷地形)。目前β=0.5\beta=0.5β=0.5,效果不明显。
  • 核心决策:应该调大β\betaβ(例如调至工业标准 0.9)。
  • 数学与物理核心:指数加权平均的数学直觉为平均历史步数≈11−β\text{平均历史步数} \approx \frac{1}{1 - \beta}平均历史步数1β1
  • 副作用:如果β\betaβ过大(如 0.98),会导致模型的**“适应速度(Adaptability)”严重钝化**,在地形突变时产生严重的**冲过头(Overshoot)**和盲目漂移现象。

来,让我们通过一场关于“重量级赛车”的思维实验,把这个超参数背后的物理权衡(Trade-off)彻底剥得一干二净。

第一步:拆解β=0.5\beta = 0.5β=0.5的“轻量级滑板车”困境

首先,我们要用物理直觉来理解β\betaβ这个数字。在指数加权平均(Exponentially Weighted Moving Average)中,有一个经典的统计学经验公式:

平均历史步数≈11−β\text{平均历史步数} \approx \frac{1}{1 - \beta}平均历史步数1β1

提问:1. 当你设定β=0.5\beta = 0.5β=0.5时,代入公式11−0.5=2\frac{1}{1 - 0.5} = 210.51=2。这意味着当前这一步的更新,只包含了过去大约 2 次迭代的记忆。
2. 想象一下,小球在纵轴(上下方向)上由于坡度太陡,每 1 次迭代就会改变一次方向(上一秒往上,下一秒往下)。
如果你的小球只记得过去 2 步的记忆,那么当它在纵轴上疯狂来回横跳时,这短短 2 步的记忆,能够大义凛然地把上下相反的方向给抵消掉吗?此时的小球,究竟是一辆稳重的“重型坦克”,还是一个毫无定力、跟着地形到处乱晃的“轻量级滑板车”?

解析:根本抵消不掉!2 步的记忆太短了,正负梯度交替出现时,小球还没来得及把纵向的震荡相互抵消,就会立刻被当前这一步剧烈的纵向梯度给带偏,继续在峡谷两壁疯狂撞击。

因此,你的第一个决策:为了彻底压制纵轴的疯狂摆动,我们必须调大β\betaβ(比如工业标准的 0.9,平均过去 10 次的梯度),让历史的巨大惯性去强行抹平上下横跳的噪声。

第二步:当β→0.98\beta \to 0.98β0.98的“重型货轮”灾难

既然调大β\betaβ能带来平滑的路径,很多同学就会陷入另一个极端:“既然惯性这么好,那我为什么不直接把它拉满?我设β=0.98\beta = 0.98β=0.98(平均过去整整 50 次的梯度)不是更平滑、更完美吗?”

让我们推演一下,当参数空间的地形发生剧烈改变时,这颗“重型货轮”会发生什么。

提问:假设我们的优化路径原本是一条一直向右冲刺的高速公路。由于β=0.98\beta = 0.98β=0.98,你的小球已经连续往右狂奔了 100 步,身上凝聚了极其恐怖的、向右冲刺的巨大历史动量。
但就在此刻,地形突然发生了一个180∘180^\circ180的急转弯——全局最优解其实已经错过了,真正正确的方向现在变成了立刻向左转。请问:此时此刻,面对突然往左的全新梯度,你这颗背负着过去 50 步向右记忆的“重型货轮”,能够立刻敏锐地刹车并原地掉头吗?在它真正转过弯来之前,它会顺着原本的惯性,往错误的方向继续盲目地“漂移”多少步?

物理直觉瞬间觉醒:它根本停不下来!它会像一辆在冰面上失控的重型卡车,在错误的方向上滑行很久(冲过头,Overshoot),直到向左的新梯度产生的力量,把过去庞大的向右动量一点点磨损、消耗干净后,模型才能艰难掉头。

第三步:总结——适应速度的“钝化”副作用

这就是高β\betaβ(如 0.98)会带来的致命副作用:模型对地形变化的“适应速度(Adaptability)”严重钝化。

  • 历史包袱太重:网络在当前时刻做出的决策,极大地受到了“遥远历史”的拖累,导致无法对突变的地形做出即时反馈。
  • 延迟与迟钝:当网络真正进入平缓的谷底(最优解附近)时,它不会优雅地停下来,而是会由于身上的巨大惯性,在谷底中心来回反复冲刺、荡秋千,导致收敛变得极其拖泥带水。

💻 第四步:PyTorch 里的“黄金平衡点”代码落地

正是由于这种“压制摆动”与“丧失灵敏度”之间的天平两端平衡,科学家通过无数次工业实验,在 PyTorch 中为 Momentum 设定了一个几乎雷打不动的黄金平衡点——0.9(平均过去 10 步的合力)。

importtorchimporttorch.optimasoptim# 场景重现:面对纵轴横跳、横轴缓慢的网络# ❌ 错误写法:momentum=0.5 (惯性太小,压不住摆动,沦为滑板车)# ⚠️ 极端写法:momentum=0.98 (惯性太大,急转弯时会失控冲过头,沦为重型货轮)# ✨ 工业黄金黑客决策:# 设为 0.9,既能用 10 步的历史期望完美抵消纵轴的上下震荡,# 又保留了足够的灵敏度,不至于在地形突变时掉进盲目漂移的泥潭。optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.9)

总结

让我们用一行最雅致的极客因果链,复盘这场关于惯性的中庸之道:

β=0.5 ⟹ 记忆太短 (2 步) ⟹ 沦为滑板车,对剧烈摆动毫无抵抗力\beta = 0.5 \implies \text{记忆太短 (2 步)} \implies \text{沦为滑板车,对剧烈摆动毫无抵抗力}β=0.5记忆太短(2)沦为滑板车,对剧烈摆动毫无抵抗力

β→0.98 ⟹ 记忆太长 (50 步) ⟹ 沦为重型货轮,面对急转弯严重“冲过头”,钝化自适应力\beta \to 0.98 \implies \text{记忆太长 (50 步)} \implies \text{沦为重型货轮,面对急转弯严重“冲过头”,钝化自适应力}β0.98记忆太长(50)沦为重型货轮,面对急转弯严重冲过头,钝化自适应力

β=0.9 ⟹ 黄金中庸 (10 步) ⟹ 既用历史合力强消无谓震荡,又保留随时掉头的黑客灵敏度\beta = 0.9 \implies \text{黄金中庸 (10 步)} \implies \text{既用历史合力强消无谓震荡,又保留随时掉头的黑客灵敏度}β=0.9黄金中庸(10)既用历史合力强消无谓震荡,又保留随时掉头的黑客灵敏度

在深度学习的哲学里,超参数的微调从来都不是一味地追求极端。大智慧的优化器,应该像一个经验丰富的赛车手:既懂得借助历史的下坡势能大步流星,又时刻保持着对脚下未知盲区微小变化的警惕与敬畏。


欢迎在评论区留下你的思考:我们今天讨论了 Momentum(动量法)通过调大β\betaβ来利用历史梯度压制震荡。那么在如今大行其道的Adam 优化器中,它不仅有一阶动量β1\beta_1β1(默认 0.9),还引入了二阶动量β2\beta_2β2(默认 0.999)。为什么二阶动量(控制步长缩放的动态感知器)的β2\beta_2β2居然可以放心地设到 0.999 这么大,而不会像一阶动量一样产生严重的“冲过头”灾难?