Ch 14 · Anticipatory + SwiGLU
第三部分 · 预训练 · 14

Anticipatory + SwiGLU — 长序列的稳定带

V4 用历史参数提前计算未来 batch 的 routing indices,并对 SwiGLU 两个分量分别施加 [-10,10] 与上界 10 的钳位。报告强调两者来自经验验证,完整理论解释仍是开放问题。

名词速通 · 一分钟看懂"两条稳定带"

Anticipatory Routing = 路由用 $\theta_{t-\Delta t}$ 算 index、特征用 $\theta_t$ 算激活;SwiGLU Clamping = 线性分量 $[-10, 10]$ / 门控分量 $\le 10$ 的硬钳位

一句话:报告观察到 loss spike 与 MoE outliers 相关,routing 可能加剧这些 outliers;Anticipatory Routing 解耦路由与主干参数时刻,Clamping 则直接限制 SwiGLU 的数值范围

Loss Spike(损失尖峰)
训练损失突然上升、随后可能需要回滚的现象。报告观察到 spike 与 MoE 层的异常值持续相关,并认为 routing 机制可能加剧异常值形成;没有披露固定损失幅度、出现周期或单一因果链。
MoE Router(路由网络)
根据 token 表示计算专家 affinity score,再选择 top-$k$ 专家。V4 使用 Sqrt(Softplus) 计算 affinity,并结合负载均衡机制。报告指出 routing 可能加剧 MoE outlier,但没有把过程具体归结为 softmax 塌缩。
$\theta_t$ vs $\theta_{t-\Delta t}$(参数解耦)
$\theta_t$ 是当前 step 的参数,$\theta_{t-\Delta t}$ 是历史参数。Anticipatory 的核心是:特征计算使用 $\theta_t$,路由 index 则提前用 $\theta_{t-\Delta t}$ 计算并缓存,从而解耦 backbone 与 routing network 的同步更新。
Anticipatory(前瞻 / 提前 fetch)
具体实现:在 step $t-\Delta t$ 时就把"将来 step $t$ 要用的路由 index"算好缓存起来。$\Delta t$ 步后,主干用最新 $\theta_t$ 算激活,但路由 index 直接读缓存(用的是历史 $\theta$)。开销 ~20%(要多跑一次 router 前向 + EP 通信,但与 EP 通信 overlap),仅在 spike 检测器触发时启用
SwiGLU(Shazeer 2020)
SwiGLU 将线性分量与经过 SiLU 的门控分量逐元素相乘,再经过输出投影。V4 分别限制这两个输入分量的数值范围,以直接抑制 MoE 层中的异常激活。
Outlier(异常激活值)
报告观察到 MoE 层中的 outliers 与 spike 一致出现,并认为 routing 会加剧其形成;没有将来源进一步归因于罕见 token、RoPE 频率或特定 expert,也没有给出 10–100 的数值范围。
Clamping(硬钳位 / 截断)
$\mathrm{clamp}(x, a, b) = \min(\max(x, a), b)$。V4 将线性分量限制在 $[-10,10]$,并把门控分量的上界设为 10。报告称这种做法有效消除 outlier、改善稳定性,且未观察到性能受损。
实证主义("先开源,理论再说")
报告明确说,两项技术虽在训练中有效,其底层机制仍缺少完整理论理解,并公开这些经验以供社区继续研究。这里应把“实测有效”与“机制已被解释”分开。
一句话定位:Anticipatory Routing 用历史参数计算 routing indices,SwiGLU Clamping 直接限制异常激活。两者均在 V4 训练中改善稳定性;报告没有披露训练持续 60 天,也没有证明它们完全消除 spike。

1. 报告观察到什么:MoE outlier 与 loss spike 相关

简单回滚只能暂时恢复训练,不能阻止 spike 再次出现。报告进一步观察到,spike 持续伴随 MoE 层 outlier,routing 机制似乎会加剧 outlier。作者因此从两个方向处理问题:

  1. 解耦同步更新:用历史参数提前计算 routing indices;
  2. 直接限制异常值:对 SwiGLU 的线性和门控分量施加明确阈值。
来源边界 报告没有披露触发 spike 的 token 类型、outlier 范数、路由分布、损失跳变量或逐 step 因果轨迹。因此不应把 base64、emoji、one-hot 路由或一组假设范数写成 V4 的实测过程。

2. Anticipatory Routing:路由的更新慢半拍

做法:路由 index 在 step $t-\Delta t$ 就用当时的 $W_r^{(t-\Delta t)}$ 算好缓存。当训练走到 step $t$ 时:

$$ \underbrace{r_t}_{\text{路由 index}} \;=\; \mathrm{topk}\!\left( W_r^{\,(t-\Delta t)} \cdot x_t \right), \qquad \underbrace{y_t}_{\text{激活}} \;=\; \sum_{i \in r_t} \mathrm{Expert}_i^{\,(t)}(x_t) $$
📖 公式白话翻译

这条公式翻成大白话是"路由用旧权重选 expert,expert 内部用新权重算激活"

  1. $W_r^{(t-\Delta t)}$:提前计算 routing indices 时使用的历史路由参数;
  2. $x_t$:符号上表示 step $t$ 的数据特征;实现中,step $t$ 的数据会在 $t-\Delta t$ 时提前取出并完成路由计算;
  3. $\mathrm{topk}$:照常选 top-$k$ expert;
  4. $\mathrm{Expert}_i^{(t)}$:expert 内部权重用最新 $\theta_t$ —— 这是快的部分,正常学习;
  5. $x_t$ 仍走 $\theta_t$ 主干:所以特征质量不受影响。

关键点:routing indices 与当前 backbone 特征不再由同一时刻的参数同步产生。报告实测这种解耦能改善稳定性,但也明确指出底层机制尚未得到完整解释,因此不把它扩写成已经证实的梯度反馈链。

2.1 触发条件 + 开销

Anticipatory 不是常开的。它只在spike 检测器报警时才启用:

  • 系统自动检测 loss spike,触发短回滚并启用 Anticipatory Routing;
  • 运行一段时间后恢复标准训练;报告没有披露检测指标、阈值或持续步数;
  • 启用时需要为未来数据额外进行一次前向,并通过流水与 EP 通信重叠,将 wall-clock 开销控制在约 20%;
  • 由于只在 spike 后动态启用,报告将总体额外训练开销描述为 negligible。

报告没有公开 spike 触发率、总 wall-time 百分比或“每 2K steps 一次”等频率,因此无法进一步推算总体触发次数。

3. SwiGLU Clamping:把乘性放大器加电压保护

SwiGLU 的核心结构是线性分量 × sigmoid 门控

$$ \mathrm{SwiGLU}(x) \;=\; \big(\underbrace{W_g x}_{\text{线性 }g}\big) \;\odot\; \big(\underbrace{\sigma(W_u x) \cdot W_u x}_{\text{SiLU 门控 }u}\big) $$

V4 的钳位规则简单粗暴:

$$ g \leftarrow \mathrm{clamp}(g, -10, 10), \qquad u \leftarrow \min(u, 10) $$
📖 公式白话翻译

这两条钳位翻成大白话是"线性分量给上下界电压保护,门控分量只防爆顶"

  1. $g \leftarrow \mathrm{clamp}(g, -10, 10)$:线性分量同时设置上下界;报告没有披露正常激活的经验分布;
  2. $u \leftarrow \min(u, 10)$:门控经过 SiLU 后近似 ReLU(负值被压到 0 附近),只需要防上爆;
  3. 无下界:因为 SiLU 本身能处理负值(导数小但非 0),不需要钳。

钳位只会改变越过阈值的分量,因此阈值内激活保持不变。报告没有披露 99.9%/0.1% 的分布,也没有给出统一的 25× 降幅。

Demo · SwiGLU 钳位前后的输出曲线(拖动 outlier 强度看放大效应)
交互
1 10 10² 10³ 10⁴ |SwiGLU 输出| (log) 0 10 20 30 40 50 输入激活范数 |x| 未钳位 SwiGLU [-10,10] 钳位后 当前 |x| = 3.0 · 未钳 |out| = 9.0 · 钳后 = 9.0 · 倍数差 = 1.0×

读图法:这是把两个分量都简化为同一个标量 $x$ 后得到的示意曲线,不是实际 SwiGLU 分布。它只说明乘性结构在输入变大时增长更快,以及钳位如何限制示例上界。
把滑条拉到 30 以上可以观察示意模型中的差距。实际收益取决于两个 SwiGLU 分量的联合分布;报告只给出“稳定性改善且不损性能”的经验结论。

4. 工程哲学:先承认子系统会发散,再把发散关在小窗口

两个 trick 共享的姿态

Anticipatory Routing 和 SwiGLU Clamping 看似无关,但它们共享一种反"完美主义"的工程姿态:

  1. 直接约束已观察到的失稳路径:报告记录了 routing collapse 与异常 SwiGLU activation,并分别用历史路由参数和 clamping 缓解;
  2. 但限制爆炸的传播半径:路由爆 → 延迟 $\Delta t$ 步让反馈断;SwiGLU 爆 → 钳位让乘积有上界;
  3. 按需启用:Anticipatory Routing 只在检测到 spike 后短暂启用;报告没有披露触发率;
  4. 实证 > 解释:DeepSeek 老实承认理论尚不充分,但 1.6T 训练上反复验证有效。

两项机制都把稳定性问题转化为显式约束:routing indices 暂时使用历史参数计算,异常 SwiGLU activation 则被限制在阈值内。它们与 mHC、确定性 kernel 的目标不同,不宜归为同一种算法。

5. 一句话总结

报告观察到 spike 与 MoE outliers 相关,routing 可能进一步加剧它们。Anticipatory Routing 解耦 routing indices 与当前主干参数,Clamping 则限制 SwiGLU 数值范围。两项技术在 V4 训练中有效,但作者明确指出其完整理论机制仍待研究。