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、改善稳定性,且未观察到性能受损。
- 实证主义("先开源,理论再说")
- 报告明确说,两项技术虽在训练中有效,其底层机制仍缺少完整理论理解,并公开这些经验以供社区继续研究。这里应把“实测有效”与“机制已被解释”分开。
1. 报告观察到什么:MoE outlier 与 loss spike 相关
简单回滚只能暂时恢复训练,不能阻止 spike 再次出现。报告进一步观察到,spike 持续伴随 MoE 层 outlier,routing 机制似乎会加剧 outlier。作者因此从两个方向处理问题:
- 解耦同步更新:用历史参数提前计算 routing indices;
- 直接限制异常值:对 SwiGLU 的线性和门控分量施加明确阈值。
2. Anticipatory Routing:路由的更新慢半拍
做法:路由 index 在 step $t-\Delta t$ 就用当时的 $W_r^{(t-\Delta t)}$ 算好缓存。当训练走到 step $t$ 时:
这条公式翻成大白话是"路由用旧权重选 expert,expert 内部用新权重算激活":
- $W_r^{(t-\Delta t)}$:提前计算 routing indices 时使用的历史路由参数;
- $x_t$:符号上表示 step $t$ 的数据特征;实现中,step $t$ 的数据会在 $t-\Delta t$ 时提前取出并完成路由计算;
- $\mathrm{topk}$:照常选 top-$k$ expert;
- $\mathrm{Expert}_i^{(t)}$:expert 内部权重用最新 $\theta_t$ —— 这是快的部分,正常学习;
- $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 门控:
V4 的钳位规则简单粗暴:
这两条钳位翻成大白话是"线性分量给上下界电压保护,门控分量只防爆顶":
- $g \leftarrow \mathrm{clamp}(g, -10, 10)$:线性分量同时设置上下界;报告没有披露正常激活的经验分布;
- $u \leftarrow \min(u, 10)$:门控经过 SiLU 后近似 ReLU(负值被压到 0 附近),只需要防上爆;
- 无下界:因为 SiLU 本身能处理负值(导数小但非 0),不需要钳。
钳位只会改变越过阈值的分量,因此阈值内激活保持不变。报告没有披露 99.9%/0.1% 的分布,也没有给出统一的 25× 降幅。
读图法:这是把两个分量都简化为同一个标量 $x$ 后得到的示意曲线,不是实际 SwiGLU 分布。它只说明乘性结构在输入变大时增长更快,以及钳位如何限制示例上界。
把滑条拉到 30 以上可以观察示意模型中的差距。实际收益取决于两个 SwiGLU 分量的联合分布;报告只给出“稳定性改善且不损性能”的经验结论。
4. 工程哲学:先承认子系统会发散,再把发散关在小窗口
Anticipatory Routing 和 SwiGLU Clamping 看似无关,但它们共享一种反"完美主义"的工程姿态:
- 直接约束已观察到的失稳路径:报告记录了 routing collapse 与异常 SwiGLU activation,并分别用历史路由参数和 clamping 缓解;
- 但限制爆炸的传播半径:路由爆 → 延迟 $\Delta t$ 步让反馈断;SwiGLU 爆 → 钳位让乘积有上界;
- 按需启用:Anticipatory Routing 只在检测到 spike 后短暂启用;报告没有披露触发率;
- 实证 > 解释:DeepSeek 老实承认理论尚不充分,但 1.6T 训练上反复验证有效。
两项机制都把稳定性问题转化为显式约束:routing indices 暂时使用历史参数计算,异常 SwiGLU activation 则被限制在阈值内。它们与 mHC、确定性 kernel 的目标不同,不宜归为同一种算法。
5. 一句话总结
报告观察到 spike 与 MoE outliers 相关,routing 可能进一步加剧它们。Anticipatory Routing 解耦 routing indices 与当前主干参数,Clamping 则限制 SwiGLU 数值范围。两项技术在 V4 训练中有效,但作者明确指出其完整理论机制仍待研究。