动量跳跃导致亏损激增 | AI生成和翻译
问题: 为什么动量不连续性(0.90 → 0.97)会在训练过程中导致损失尖峰?
回答:
动量从 0.90 跳变到 0.97 会导致暂时的损失尖峰,因为它中途改变了有效步长和梯度历史整合。
物理原理
在 Muon(以及带有动量的 AdamW)中,更新规则为:
m_t = β * m_{t-1} + (1 - β) * g_t
θ_t = θ_{t-1} - α * m_t
其中:
β是动量(你的情况:0.90 → 0.97)m_t是累积的动量g_t是当前梯度α是学习率
为什么 0.97 动量“更强”:
- 当
β=0.90时:每个新梯度对更新的贡献为10% - 当
β=0.97时:每个新梯度对更新的贡献仅为3%
当你在不缩放动量缓冲区的情况下从 0.90 跳到 0.97 时,你突然施加了相对于当前梯度信号大约 7 倍的历史惯性。模型仍处于损失景观中的同一点,但优化器现在严重偏向于过时的梯度方向。
为什么会引起尖峰
- 第 130k 步的模型:累积动量
m_{130k}是在β=0.90背景下建立的(近期梯度权重较高) - 第 130k+1 步:你应用
β=0.97,因此m_{130k+1} = 0.97 * m_{130k} + 0.03 * g_{130k+1}- 旧的动量被原样重用,但现在它被解释为具有更高的历史权重
- 新梯度仅贡献 3%,而不是 10%
- 结果:更新方向被过时的梯度信息主导 → 过度偏移或向略错误的方向移动 → 损失尖峰
为什么会恢复(约 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% 内衰减动量,从而完全避免尖锐的不连续性。对于未来的运行,这比事后缓冲区缩放更干净。