Anticipatory + SwiGLU — 长序列的稳定带
两个朴素到几乎"配方级"的稳定性 trick:把 router 的更新时刻往前挪 Δt 步、把 SwiGLU 的线性 / 门控分量分别钳到 [-10,10] / ≤10。论文罕见地写"理论解释还不够,先开源给社区"——这一章把"为什么有效"补上去。
Anticipatory Routing = 路由用 $\theta_{t-\Delta t}$ 算 index、特征用 $\theta_t$ 算激活;SwiGLU Clamping = 线性分量 $[-10, 10]$ / 门控分量 $\le 10$ 的硬钳位
一句话:spike 经常源自路由把 outlier 放大成全局正反馈,钳位经常是"局部 outlier 被 SwiGLU 的乘性结构指数放大"。 两个 trick 的核心都是把"会失控的子系统"短暂或永久地隔离出主路径 —— 与 mHC(Ch3)"残差矩阵从主干隔出"是同一个工程哲学。
- Loss Spike(损失尖峰)
- 训练曲线突然从 $\sim 2.0$ 跳到 $\sim 5.0$ 甚至 NaN 的现象。1.6T 模型上几乎周期性出现。根因之一:MoE 路由把某个 outlier token 推向所有 expert(路由分布塌陷成 one-hot),导致 expert 输出爆炸 → 残差爆炸 → 整层 NaN。是 LLM 工程化的头号敌人。
- MoE Router(路由网络)
- 计算 $r = \mathrm{softmax}(W_r \cdot x)$,按 top-$k$ 选 expert。$W_r$ 是路由权重矩阵。问题:$W_r$ 跟主干一起训,当 $x$ 出现 outlier 时 $W_r \cdot x$ 也出 outlier,softmax 塌成 one-hot,路由失稳。
- $\theta_t$ vs $\theta_{t-\Delta t}$(参数解耦)
- $\theta_t$ = 当前 step 的全部参数;$\theta_{t-\Delta t}$ = $\Delta t$ 步前的快照。Anticipatory 的核心:路由 index 用 $\theta_{t-\Delta t}$ 中的 $W_r$ 算,而 expert 内部权重和主干仍用 $\theta_t$。路由的更新慢半拍,从而对当前 batch 的 outlier 不敏感。
- Anticipatory(前瞻 / 提前 fetch)
- 具体实现:在 step $t-\Delta t$ 时就把"将来 step $t$ 要用的路由 index"算好缓存起来。$\Delta t$ 步后,主干用最新 $\theta_t$ 算激活,但路由 index 直接读缓存(用的是历史 $\theta$)。开销 ~20%(要多跑一次 router 前向 + EP 通信,但与 EP 通信 overlap),仅在 spike 检测器触发时启用。
- SwiGLU(Shazeer 2020)
- $\mathrm{SwiGLU}(x) = (W_g x \odot \sigma(W_g' x)) \cdot W_o$ —— 其中 $W_g x$ 是线性分量,$\sigma(W_g' x)$ 是 sigmoid 门控(亦写作 $\mathrm{SiLU}$ 形式 $\sigma(z)\cdot z$)。乘性结构是其表达力的来源,也是 outlier 放大器:两个 ~5 的值相乘成 ~25,再过 $W_o$ 又是一次放大。
- Outlier(异常激活值)
- 训练中正常激活范数 ~$O(1)$,但偶尔出现某个 channel 上 ~10–100 的极端值。来源多:(1) 罕见 token 在某 head 触发;(2) RoPE 在长序列下某些频率累积;(3) MoE 某个 expert 训练不足。SwiGLU 把它们指数放大,路由把它们变成 one-hot —— 两条都是稳定性杀手。
- Clamping(硬钳位 / 截断)
- $\mathrm{clamp}(x, a, b) = \min(\max(x, a), b)$。比 LayerNorm / RMSNorm 更暴力的截断方式,无参数。优点:单次前向就能杀掉 outlier;缺点:在边界处梯度为 0,模型可能"学不到"边界外的有用信号。V4 的实证结论:[-10,10] 阈值下,性能不掉、稳定性大涨。
- 实证主义("先开源,理论再说")
- 论文罕见地写"理论解释还不充分"。这是 DeepSeek 工程文化的体现:1.6T 训练上反复证明有效就值得公开,藏起来反而是社区损失。这种实证 > 解释的姿态,本身是 V4 报告值得学习的部分。
1. Loss Spike 的解剖:路由 + SwiGLU 的双正反馈
要理解这两条 trick 为什么有效,先看 spike 是怎么诞生的。在 1.6T MoE 训练里,一次 spike 的典型时序:
- $t=0$:某个 batch 含罕见 token 序列(如 base64 编码、emoji 集群);
- $t=0$ 内:该 token 在某层产生 outlier 激活 $\|x\|$ ~ 50(正常 ~1);
- $t=0$ 内:路由 $W_r \cdot x$ 也跟着 ~50,softmax 塌成 one-hot 全发某 expert;
- $t=0$ 内:那个 expert 收到全部流量,SwiGLU 乘性结构把 50 ×50 → 2500,再过 $W_o$ → 输出范数 ~200;
- $t=1$:反向梯度 $\nabla W_r \propto x \cdot \nabla r$ 也是 ~50 量级,$W_r$ 朝"再次塌成 one-hot 那个方向"被推 → 下次相似 token 时 spike 更严重;
- 几步内:路由完全固化,所有流量都去那个 expert,其他 expert 失活,loss 一路飞。
- SwiGLU 的双线性结构:线性分量 ~50,门控 sigmoid 饱和到 ~1,乘积 ~50。再过 $W_o$(按 Frobenius 范数 ~3),输出 ~150;
- 路由的 softmax 塌陷:$\mathrm{softmax}([50, 1, 1, ..., 1])$ 第一项 $\approx 1$,其余 $\approx 0$。top-6 被压成 top-1;
- 残差累积:mHC 残差 $\|B\| \approx 1.05$ 下放大 $1.05^{61} \approx 18\times$,输出 ~2700;
- loss 跳变:cross-entropy 对 logits 范数敏感,$\|z\| = 2700$ 量级让 softmax 塌成 one-hot 错误预测,单 token loss 从 ~2 跳到 ~20。
2. Anticipatory Routing:路由的更新慢半拍
做法:路由 index 在 step $t-\Delta t$ 就用当时的 $W_r^{(t-\Delta t)}$ 算好缓存。当训练走到 step $t$ 时:
这条公式翻成大白话是"路由用旧权重选 expert,expert 内部用新权重算激活":
- $W_r^{(t-\Delta t)}$:$\Delta t$ 步前缓存下来的路由权重 —— 这是慢的部分,对当前 batch 的 outlier 不敏感;
- $x_t$:当前 step 真实激活 —— 即使 $x_t$ 出现 outlier,乘以的 $W_r$ 是旧版,没有被它"教坏"过;
- $\mathrm{topk}$:照常选 top-$k$ expert;
- $\mathrm{Expert}_i^{(t)}$:expert 内部权重用最新 $\theta_t$ —— 这是快的部分,正常学习;
- $x_t$ 仍走 $\theta_t$ 主干:所以特征质量不受影响。
关键洞察:spike 的正反馈环 是 "outlier $x$ → $W_r \cdot x$ outlier → $\nabla W_r$ 朝 outlier 方向 → 下次更 outlier"。把 $W_r$ 推迟 $\Delta t$ 步 等于在反馈环里插了一段"延时电路",它来不及响应这个 batch 的 outlier,等几步后噪声平均掉了,反馈环就断了。这就是为什么"治标"(不修 $W_r$ 本身)也能治住 spike。
2.1 触发条件 + 开销
Anticipatory 不是常开的。它只在spike 检测器报警时才启用:
- 检测器:监控 router output 的熵,当熵在几步内 ↓ 超过阈值(说明分布在塌陷成 one-hot)→ 触发;
- 触发后 ~100 step 持续启用 anticipatory,让反馈环冷却;
- 稳定后回退 standard router;
- 开销:anticipatory 模式下 ~20%(多算一次 router 前向、与 EP 通信 overlap),正常模式 0 开销。
所以训练总开销几乎无感(按 spike 触发率 ~2% step 估算,wall-time 增加 0.4%),但 spike 频率从每 2K step 一次降到几乎为 0。
3. SwiGLU Clamping:把乘性放大器加电压保护
SwiGLU 的核心结构是线性分量 × sigmoid 门控:
V4 的钳位规则简单粗暴:
这两条钳位翻成大白话是"线性分量给上下界电压保护,门控分量只防爆顶":
- $g \leftarrow \mathrm{clamp}(g, -10, 10)$:线性分量是对称的(可正可负),$\pm 10$ 双向截断。$\pm 10$ 这个值远超正常激活的 ±3-4,所以正常 token 不受影响;
- $u \leftarrow \min(u, 10)$:门控经过 SiLU 后近似 ReLU(负值被压到 0 附近),只需要防上爆;
- 无下界:因为 SiLU 本身能处理负值(导数小但非 0),不需要钳。
这条 clamp 的关键性质是对正常激活完全无感 —— 99.9% 的 token 激活在 $|g| \le 4$ 区间,钳位不触发。但 0.1% 的 outlier 触发后,乘积 $g \cdot u \le 100$,而非未钳位时的 $\sim 50 \times 50 = 2500$。一刀斩掉 25× 的乘性放大。
读图法:横轴是输入激活范数 $|x|$,纵轴是 SwiGLU 输出范数(log 标度)。红线是未钳位的 SwiGLU $\sim x^2$ 增长(线性 × 门控),$|x|=50$ 时输出已 ~2500。绿线是钳位后:在 $|x| \le 10$ 段两条重合(钳位不触发,正常学习),$|x| > 10$ 后绿线被截断在 ~100。
把滑条拉到 30 以上看"倍数差" —— 钳位让最严重的 outlier 输出降低 25×+,这就是单步 spike 被切断的根因。99.9% token 在 $|x| \le 4$ 区间,钳位对它们等同 no-op。
4. 工程哲学:先承认子系统会发散,再把发散关在小窗口
Anticipatory Routing 和 SwiGLU Clamping 看似无关,但它们共享一种反"完美主义"的工程姿态:
- 不假装子系统永远正常:路由会塌陷、SwiGLU 会爆,这是物理事实,不可能靠纯优化消除;
- 但限制爆炸的传播半径:路由爆 → 延迟 $\Delta t$ 步让反馈断;SwiGLU 爆 → 钳位让乘积有上界;
- 正常路径完全无干扰:trigger 触发率 <1%,正常 token 走原路径;
- 实证 > 解释:DeepSeek 老实承认理论尚不充分,但 1.6T 训练上反复验证有效。
这与 mHC(Ch3)"残差矩阵从主干隔出"、Ch9 "批不变换可调试性"是同一种姿态:把"难驯服"的子系统物理隔离,而不是花无穷力气让它"完美"。这就是 V4 工程文化的核心。
5. 一句话总结
spike 是"outlier → router 塌陷 / SwiGLU 放大"两条正反馈环的合谋;Anticipatory 把 router 那条延迟 $\Delta t$ 步打断,Clamping 把 SwiGLU 那条加电压保护。两者都不治本(outlier 仍然存在),但都"治标"得极好 —— 这就是 V4 在 1.6T 规模下能稳定训练 60 天的关键之一。