跳到正文
动手理解 · CONCEPT LAB

遇到一次 Loss Spike,先沿信号链排查

Loss 突然抬头可能来自数据与参数状态的交互、数值溢出、梯度异常、调度器错位、注意力/路由或通信状态。优化器只是链路中间一环;可靠训练要先留证,再从完整恢复状态做受控重放。

已经发生 正在观察 接下来
01 / 03

状态传导图

BATCH 数据批次
FWD 前向激活
LOSS Loss Spike
GRAD 梯度范数
SYS 吞吐 / 通信
LOG 完整遥测

橙色节点表示当前异常;原始 batch 标识与同一步系统遥测是后续重放的证据。

观察点 01

先确认它是单批噪声、持续漂移还是数值爆炸

把 loss 与裁剪前后梯度范数、学习率、有限值、激活范围、QK logits、MoE 路由、吞吐、rank 日志和数据批次 ID 对齐。单看一条平滑 loss 曲线无法区分原因。

此刻要记住

Spike 是报警信号,不是根因名称。

训练系统 · Optimizer & Stability

稳定训练不是一个优化器,而是一条证据链

优化器决定“这一步怎么走”,学习率决定“走多远”,裁剪与数值检查限制“坏步破坏多大”,监控和恢复状态则回答“为什么出事、能否复现”。预训练中的 loss spike(损失突增)可能来自数据、数值、注意力、MoE(Mixture of Experts,混合专家)路由或分布式状态;仅凭一条 loss 曲线不能定位根因。

先分清作用位置:全局梯度裁剪改的是优化器 step 前的梯度;AdamW 与 Muon 计算参数更新;Kimi K2 的 QK-Clip 是更新后的架构定向约束,在 MLA 中也不是无差别缩放全部 Q/K 权重。
00 · 先抓住

优化器像司机,稳定系统还需要护栏与行车记录

生活类比
AdamW 会按每个坐标近期梯度尺度调节步幅;Muon 则把部分参数的更新当作整块矩阵,压平更新中过强与过弱的奇异方向。学习率、裁剪、监控和 recovery checkpoint(恢复检查点)分别更像限速牌、护栏、仪表盘和行车记录。类比只解释分工,不能推出某种配方便必然不出事故。
诊断原则
如果某个 batch 的 token 分布或 loss mask 异常,它可能触发 spike;但相同 batch 在另一份参数状态上未必触发。先冻结 batch ID、优化器与调度器状态、随机数状态和逐层统计,再用受控重放区分“数据本身”与“数据 × 参数/系统状态”的交互。
层次它真正回答的问题不能单独证明什么
更新算法AdamW / Muon 怎样把梯度变成参数更新?不能保证任意模型、数据和精度配方都稳定。
保护机制warmup、全局梯度裁剪、有限值检查怎样限制危险更新?限制症状不等于修复根因。
证据与恢复出事时保存了什么,能否隔离变量、恢复短跑并验证?有 checkpoint 也不自动等于逐 bit 确定性重放。
01 · AdamW

AdamW:逐元素预条件,再单独做权重衰减

SGD(Stochastic Gradient Descent,随机梯度下降)的基础示意让各坐标共享一个全局学习率;AdamW 是带 decoupled weight decay(解耦权重衰减)的 Adam,用梯度的一阶矩和未中心化二阶矩做逐元素预条件。原论文的关键结论是:L2 正则与 weight decay 在标准 SGD 中可等价重参数化,却不再与 Adam 里的自适应缩放等价;它报告的是更清楚的超参数解耦与实验泛化,不是“AdamW 必然比 Adam 更稳”的普遍定律。

公式

方向、尺度、衰减是三笔账

first moment / uncentered second moment / decay
m_t = β1 · m_(t-1) + (1-β1) · g_t
v_t = β2 · v_(t-1) + (1-β2) · g_t²
θ_t = θ_(t-1) - η_t · m_hat_t / (sqrt(v_hat_t) + ε)
                  - η_t · λ · θ_(t-1)

m_hatv_hat 是偏差校正后的矩估计;v 是梯度平方的指数移动平均,不是中心化方差。最后一项直接按当前参数收缩,所以不会先混进 loss 梯度再被 Adam 的预条件器逐元素缩放。公式省略了实现中的参数分组、AMSGrad 等变体与精度细节。

手算:第一步为什么得到 1.988

θ₀=2g₁=0.5m₀=v₀=0β₁=0.9β₂=0.999η=0.01λ=0.1,忽略极小的 ε。则 m₁=0.05v₁=0.00025;偏差校正后 m̂₁=0.5v̂₁=0.25。自适应更新量为 0.01×0.5/√0.25=0.01,解耦衰减量为 0.01×0.1×2=0.002,所以 θ₁=2-0.01-0.002=1.988

为什么常用

  • 逐元素预条件能适应各参数不同的梯度尺度。
  • weight decay 与 loss 更新解耦,学习率和衰减系数的含义更清楚。
  • 框架、混合精度与 ZeRO(Zero Redundancy Optimizer,零冗余优化器)/ FSDP(Fully Sharded Data Parallel,全分片数据并行)生态成熟。

成本与边界

  • 通常保存一阶、二阶两个状态张量;实际显存还取决于状态精度、master weights 和分片。
  • bias、Norm 或 embedding 是否衰减是参数组策略,不是 AdamW 公式自动决定。
  • 换成 AdamW 不会自动修好过高学习率、错误 mask、NaN/Inf 或通信状态错误。
02 · Learning Rate

优化器决定方向,学习率调度决定每一步有多大

LR(Learning Rate,学习率)与优化器是两个维度。warmup(预热)常把学习率从较小值逐步升到峰值,让早期参数、激活和矩估计还在快速变化时不要立刻迈大步;但 2024 年的实证研究把主要收益联系到可用峰值学习率,以及 loss Hessian 的 sharpness(损失曲率最大特征值;对 Adam 还看预条件后的 sharpness),而不是证明 warmup 在数学上永远必需。

手算

线性 warmup 只是一种调度

linear warmup example
η_t = η_peak · t / T_warmup      (0 ≤ t ≤ T_warmup)

η_peak = 3e-4, T_warmup = 2000
step 500: η_500 = 3e-4 × 500/2000 = 7.5e-5

这是教学计算,不是推荐参数。warmup 之后可以保持常数、cosine decay(余弦衰减)或采用稳定段再衰减;调度器状态与当前 step 必须跟 checkpoint 一起恢复,否则“同一模型权重”会走出不同的下一步。

公开配方论文中的做法正确读法
原始 Transformer(2017)前 4,000 steps 线性升高,之后按 step 的逆平方根衰减。这是该模型、batch 与 Adam 配方的一部分,不是所有 Transformer 的固定常数。
Moonlight(2025)2,000 steps 线性升到 4.2e-4;约 33B–5.2T tokens 走余弦衰减,5.2T–5.7T cooldown 先在 100 steps 升到 1e-4,再线性降到 0。它与 Muon 的 update-RMS 校准、模型规模和数据配方共同生效;末段 cooldown 不是前一段余弦的简单延续。
Kimi K2(2025)500 steps warmup,之后经历恒定 LR、余弦衰减和末段 annealing。不能只复制 500 这个数字;token/batch 规模、峰值 LR 与架构均不同。
03 · Muon

Muon 正交化的是更新矩阵,不是模型权重

Muon 为二维隐藏层矩阵维护 momentum buffer(动量缓冲);代表性实现先算 Bₜ=μBₜ₋₁+gₜ,再把 Nesterov-style(Nesterov 风格)的 gₜ+μBₜ 送入 Newton–Schulz 迭代,近似其 orthogonal polar factor(正交极因子)。若用 SVD(Singular Value Decomposition,奇异值分解)写送入正交化的矩阵 M=UΣVᵀ,精确极因子是 UVᵀ。它不会把权重 W 强制变成正交矩阵,也不是把权重整体“旋转一下”。

名称公开机制不要混在一起的边界
基础 Muon(早期配方)为二维隐藏层矩阵维护 momentum buffer;代表性实现把 Nesterov 风格缓冲送入有限次 Newton–Schulz 正交化。早期基础配方不等于后来用于大模型的 weight decay、形状缩放与分布式完整方案。
Scalable Muon(Moonlight 采用)加入 weight decay,并按矩阵形状校准 update RMS(Root Mean Square,均方根);论文实现用 Muon 管二维隐藏层矩阵,用 AdamW 管 embedding、LM head(Language Model head,语言模型输出头)、RMSNorm(Root Mean Square Layer Normalization,均方根层归一化)等参数组。embedding 与 LM head 张量也可能是二维;分流是该配方的参数组策略,不是仅看 tensor rank 的数学定律。
PyTorch 2.13 torch.optim.Muon当前官方实现包含 Nesterov、weight decay 与矩阵形状相关的学习率缩放;adjust_lr_fn="match_rms_adamw" 才选择 Moonshot 的 RMS matching。默认 adjust_lr_fnoriginal,不是 Moonlight 模式;API 也不会替用户自动把 embedding、bias、Norm 等参数路由给 AdamW。
MuonClip(Kimi K2 采用)在 scalable Muon 上再加入 QK-Clip,按每个 attention head 的最大 softmax 前 logit 约束特定 Query–Key(查询—键)投影分量。这是 Kimi K2 针对其注意力结构的做法,不是“Muon 自带 QK-Clip”。

手算:2×2 对角动量的精确极因子

设满秩动量矩阵 M=diag(3,1)。其 SVD 为 U=IΣ=diag(3,1)V=I,所以精确正交极因子 UVᵀ=I:原更新两个奇异方向的强度从 3:1 变成 1:1。实际 Muon 用有限次 Newton–Schulz 迭代得到近似值;论文中的 weight decay 与 update-RMS matching 是可扩展配方再加上的工程层。

52% FLOPs 是特定 scaling-law 拟合
Muon scaling-law 论文在不含 embedding 的 399M–1.5B、8K context 的 dense 模型族和团队专有数据上做 compute-optimal 拟合,报告匹配 AdamW loss 约需其 52% 训练 FLOPs,常被概括为“接近 2× compute efficiency”。该拟合用 C=6ND 约计模型训练 FLOPs,没有把 Newton–Schulz、优化器通信、kernel 效率或故障恢复折成端到端墙钟,因此 52% 不等于训练时间固定缩到 52%。Moonlight 则是另一项 MoE 训练:不含 embedding 时约 2.24B activated / 15.29B total,含 embedding 时常概括为 3B / 16B,以 5.7T tokens 训练;两种实验不能拼成“16B 模型已证明普遍快 2×”。
04 · Gradient Clipping

全局梯度裁剪是保险丝,不是维修工

global norm clipping(全局梯度范数裁剪)把所有待更新梯度视作拼接后的一个向量:只有总范数超过阈值 C 时才整体等比例缩小,因此保留方向、限制幅度。它能降低单个坏步的破坏半径,却不会解释坏梯度从哪里来。

公式

同一缩放因子作用于全部梯度

global L2 norm clipping
||g||₂ = sqrt(Σ_i g_i²)
scale = min(1, C / (||g||₂ + ε))
g_clipped = scale · g

g = [3,4], ||g||₂ = 5, C = 2
scale = 2/5 = 0.4  →  g_clipped = [1.2,1.6]

手算忽略极小的 ε。若梯度已经含 NaN/Inf,乘一个有限系数不能把它修好;应拒绝或跳过该 step,并追查上游数值与数据。阈值过小还会让大量正常 step 都被压缩,所以要同时记录“裁剪前 norm、裁剪比例和触发频率”。

工程位置正确顺序常见误区
FP16(16-bit Floating Point,16 位浮点)+ loss scalingscaled backward → unscale gradients → 计算/裁剪 norm → scaler step 检查有限值并决定是否跳步。直接裁剪仍被放大的梯度,会让阈值失去原有单位;BF16(Brain Floating Point 16,脑浮点 16)因指数范围更大,也不代表所有实现都必须或都不必用 scaler。
分片 / 多卡训练范数必须覆盖该更新所代表的全局梯度;通常由 FSDP/ZeRO 或训练框架执行必要的归约。只在每张卡上独立算本地 norm,可能让各 rank 使用不一致的缩放因子。
QK-ClipKimi K2 在参数更新后,复用当前 forward 已得到的每头最大 attention logit 来缩放特定 Q/K 分量。它不改当前 step 已完成的 forward/backward,也不等同于优化器前的全局梯度裁剪;MLA(Multi-head Latent Attention,多头潜在注意力)的共享 rotary 分量不在其裁剪范围。
05 · Loss Spike

Spike 是现象名,根因必须靠联动证据

“loss spike”没有跨论文统一阈值:可以是一个 batch 的尖峰,也可以是再也回不来的发散。候选原因应写成待验证假设,而不是看到曲线后直接下结论。最有价值的不是一张平滑图,而是同一 step 的数据标识、学习率、梯度、激活、注意力、路由、吞吐、通信与有限值状态。

学习率 / 状态

峰值 LR、warmup、调度器 step 或恢复后的 optimizer moments 是否一致?不要用“先降 LR”覆盖恢复错位。

梯度 / 数值

看裁剪前后 global norm、逐层 norm、NaN/Inf、FP16 loss scale 或 FP8(8-bit Floating Point,8 位浮点)amax;先确认异常在哪一步首次出现。

注意力 logits

看每层/每头 softmax 前 logit、Q/K norm 与 attention entropy。谱增长可能是线索,但需结合参数更新与架构定位。

MoE 路由

MoE(Mixture of Experts,混合专家)需查专家负载、容量丢弃、router 概率和 all-to-all 尾延迟;负载不均与 spike 之间仍需时间对齐证据。

数据 / mask

保留样本 ID、长度、token 分布、来源混合、目标难度和 loss mask。乱码或重复并不自动等于根因。

分布式 / 恢复

查 rank 日志、collective 超时、梯度分片、数据 cursor、随机状态、checkpoint 完整性与并行拓扑是否一致。

06 · 真实案例

公开报告能给机制线索,不能替你完成因果归因

案例论文 / 团队披露可迁移的结论边界
PaLM 540B(2022/2023)论文称最大模型尽管用了梯度裁剪,仍大约出现 20 次 loss spike;团队从 spike 前约 100 steps 的 checkpoint 重启,并跳过覆盖异常附近的约 200–500 个 data batches。同一批附近数据从更早 checkpoint 重放时不一定复现。裁剪不是零事故保证;证据更支持“batch 与参数状态交互”,不能把每次 spike 都叫作坏数据。
Muon dense scaling law(2025)不含 embedding 的 399M–1.5B dense 模型在团队专有数据上做 compute-optimal 拟合,报告匹配 AdamW loss 约需其 52%、按 C=6ND 估算的 FLOPs。这是特定模型族与代理口径,不含优化器和系统墙钟开销,不是跨模型固定快 2×。
Moonlight MoE(2025)团队以 scalable Muon 配方训练含 embedding 时常概括为 3B activated / 16B total 的 MoE,共 5.7T tokens这是单次 MoE 训练,与 dense scaling-law 是两类证据,不能拼成 16B 模型已证明快 2×。
Kimi K2(2025)团队定义 MuonClip = Muon + weight decay + RMS matching + QK-Clip,并报告 15.5T tokens 预训练零可观察 loss spike;公开曲线逐 step、无平滑/抽样,但为清晰省略了训练最开头。这是 1.04T total / 32B activated 模型的一次团队报告,不是 QK-Clip 对其他架构的零 spike 保证。
DeepSeek-V3(2024/2025)技术报告披露 671B total / 37B activated、14.8T tokens、FP8 mixed precision,以及以动态 bias 为主的 auxiliary-loss-free batch-wise 负载均衡;它仍保留系数 0.0001 的 complementary sequence-wise balance loss。团队称训练没有不可恢复的 loss spike 或 rollback。“没有不可恢复 spike”不等于从无波动;组件并列出现也不能证明每个组件分别防住了哪类故障。
07 · 排障与恢复

先冻结现场,再做最小重放,最后恢复长跑

阶段必须保留 / 核对通过标准
1 · 冻结证据step、样本/数据 cursor、loss mask、LR、裁剪前后 norm、逐层有限值、QK logits、MoE 路由、rank 与通信日志。异常前后窗口可按同一时间轴关联,原始数据没有被平滑曲线覆盖。
2 · 恢复状态模型权重、optimizer、scheduler、AMP(Automatic Mixed Precision,自动混合精度)scaler、训练 step、RNG(Random Number Generator,随机数生成器)、sampler/data cursor、路由/并行配置与 checkpoint 完整性。优先在 optimizer-step 边界保存;若允许 gradient-accumulation micro-step 中途保存,还要带累积梯度、micro-step 计数和流水线阶段状态。关键状态齐全且版本兼容;“只有 model weights”不能声称是完整续训。
3 · 隔离变量同 batch + 同状态、替换 batch + 同状态、同 batch + 较早状态;必要时缩小到单卡或更小拓扑。每次只改一个可解释变量;“同一步复现”提高某条假设优先级,但仍不是单独的因果证明。
4 · 保护性短跑先验证有限值、loss 回落、裁剪触发率、路由与吞吐,再扩大步数和集群。连续短跑通过回归阈值,且根因修复与临时护栏分开记录。
Checkpoint 边界
这里的 checkpoint 指用于训练恢复的状态快照,不是 activation checkpointing(用重算换显存)。即便保存了完整软件状态,分布式 collective 顺序、非确定性 kernel、硬件故障或拓扑变化仍可能让逐 bit 重放失败;恢复目标应是“证据可比较、行为可验证”,不要轻率承诺绝对确定性。
资料来源原论文 / 官方文档
AdamWDecoupled Weight Decay Regularization
学习率 warmupAttention Is All You Need · Why Warmup the Learning Rate?
梯度裁剪 / 混合精度On the difficulty of training RNNs · Mixed Precision Training
PyTorch 工程顺序clip_grad_norm_ · AMP examples · Saving & Loading · Reproducibility
Muon / MoonlightMuon is Scalable for LLM Training · PyTorch 2.13 Muon
Kimi K2Kimi K2: Open Agentic Intelligence
DeepSeek-V3DeepSeek-V3 Technical Report
PaLMPaLM: Scaling Language Modeling with Pathways

页面于 2026-07-15 逐项复核。Muon 的 52% FLOPs 来自特定 dense 模型族、专有数据与 C=6ND 代理下的 compute-optimal scaling-law 拟合;PyTorch 当前实现按 2.13 文档核对。Moonlight、Kimi K2 与 DeepSeek-V3 数字来自各自团队报告;PaLM 的 spike 恢复细节来自 JMLR 论文。诊断表是候选原因树,实际事故必须用保存的数据、优化器/随机状态与逐层遥测验证。