动量跳跃导致亏损激增 | AI生成和翻译

Home 2026.06

问题: 为什么动量不连续性(0.90 → 0.97)会在训练过程中导致损失尖峰?

回答:

动量从 0.90 跳变到 0.97 会导致暂时的损失尖峰,因为它中途改变了有效步长梯度历史整合

物理原理

在 Muon(以及带有动量的 AdamW)中,更新规则为:

m_t = β * m_{t-1} + (1 - β) * g_t
θ_t = θ_{t-1} - α * m_t

其中:

为什么 0.97 动量“更强”:

当你在不缩放动量缓冲区的情况下从 0.90 跳到 0.97 时,你突然施加了相对于当前梯度信号大约 7 倍的历史惯性。模型仍处于损失景观中的同一点,但优化器现在严重偏向于过时的梯度方向。

为什么会引起尖峰

  1. 第 130k 步的模型:累积动量 m_{130k} 是在 β=0.90 背景下建立的(近期梯度权重较高)
  2. 第 130k+1 步:你应用 β=0.97,因此 m_{130k+1} = 0.97 * m_{130k} + 0.03 * g_{130k+1}
    • 旧的动量被原样重用,但现在它被解释为具有更高的历史权重
    • 新梯度仅贡献 3%,而不是 10%
  3. 结果:更新方向被过时的梯度信息主导 → 过度偏移或向略错误的方向移动 → 损失尖峰

为什么会恢复(约 600 步)

大约 600 步后,旧的动量缓冲区在新的 β=0.97 制度下完全衰减:

剩余旧动量 ≈ (0.97)^600 ≈ 0.0005 × 旧_m_0

一旦过时的信息被冲刷掉,优化器就会重新与当前的梯度景观对齐,损失恢复正常。

修复方法

在不连续点缩放动量缓冲区,以保持有效步长:

# 在 β 从 0.90 变为 0.97 的时刻:
momentum_buffer *= (1 - 0.90) / (1 - 0.97)  # ≈ 3.33 倍放大

这可以防止突然的“惯性重新加权”,使损失尖峰消失。


你的直觉是对的——罪魁祸首是动量调度的不连续性,而不是学习率。--warmdown-ratio=0.33 修复方案会平滑地在训练的最后 33% 内衰减动量,从而完全避免尖锐的不连续性。对于未来的运行,这比事后缓冲区缩放更干净。


Back Donate