如何让大模型强化学习“不翻车”:30B MoE 实测 30 万 GPU 小时后的 7 条血泪教训
核心问题:
“用 token 级目标去优化序列级奖励”为什么总崩溃?
答案一句话:只有当“训练-推理差距”和“策略陈旧”同时被压到足够小,一阶近似才成立,训练才不会爆炸;否则,Importance Sampling、Clipping、Routing Replay 就是三根救命稻草。
0. 一张图速览全文结论
| 场景 | 必须打开的三板斧 | 常见翻车点 | 实测最优组合 |
|---|---|---|---|
| 纯 on-policy | Importance Sampling | 训练-推理 KL 爆掉 | MiniRL(带 IS) |
| 轻度 off-policy(N=2) | IS+Clipping+R2 | 熵崩、奖励震荡 | MiniRL+R2 |
| 重度 off-policy(N≥4) | IS+Clipping+R3 | 专家路由漂移 | MiniRL+R3 |
1. 为什么序列级奖励直接优化不了?
核心问题:REINFORCE 算出的序列似然比方差大到无法训练,怎么办?
答案:用 token 级似然比做一阶近似,但得先满足两个前提:
-
训练引擎与推理引擎算出的 logits 几乎一样(训练-_inference discrepancy →0) -
rollout 策略与待更新策略足够接近(policy staleness →0)
只要任一前提被破坏,近似就失效,梯度噪声指数级放大。
血泪教训:FP8 推理+BF16 训练, discrepancy 直接被放大 10×,第一轮更新就炸。
2. 一阶近似失效时,长什么样?
下面这段代码复制粘贴即可复现“熵崩塌”现场(基于原文 MiniRL 超参):
# 伪代码:移除训练-推理 IS 权重
for step in range(1000):
ratio = πθ(y_t) / μθ_old(y_t) # ← 把 IS 权重整行注释掉
loss = -ratio * A_hat * logπ
loss.backward()
运行 200 步后,熵从 0.9 掉到 0.1,benchmark 得分直接腰斩——这就是论文 Figure 1 里“MiniRL – train-infer-IS”曲线突然坠崖的原因。
3. 三板斧之一:Importance Sampling 只能补“引擎差距”
场景示例:
你用了 vLLM 做 rollout,训练却在 Megatron 里,两者 kernel 实现不同,同一输入 logits 差 0.02。
做法:
把 token 级 IS 权重 πθ(y_t)/μθ_old(y_t) 留在 loss 里,别偷懒。
反思:
我曾以为“只差 2% 没关系”,结果 600 步后 KL divergence 飙到 0.01 以上,奖励方差直接翻 3 倍。——作者备注
4. 三板斧之二:Clipping 负责“策略陈旧”
核心问题:mini-batch 拆分多步更新后, rollout 策略和最新策略差距拉大怎么办?
答案:用 PPO 式 Clipping 把 ratio 限制在 [1-ε_low, 1+ε_high] 之外就停梯度。
场景示例:
全局 8192 条回答拆成 8 个 mini-batch,第 8 批回答实际上是用“7 次更新前”的老策略采的。
实验结论:
Figure 4 里,不开 Clipping 的曲线在 1500 步熵跌至 0.05;开了 Clipping 后能稳到 4000 步。
5. 三板斧之三:MoE 模型必须“Routing Replay”
5.1 专家路由带来的双重漂移
| 漂移类型 | 产生根源 | 后果 |
|---|---|---|
| 训练-推理不一致 | 路由 kernel 不同 → 专家选错 | logits 差被放大 |
| 策略陈旧 | 参数更新 → 同 token 换专家 | 激活参数集变天 |
5.2 Vanilla Routing Replay(R2)与 Rollout Routing Replay(R3)
-
R2:梯度阶段固定用 rollout 训练引擎选的专家 e^π_old -
R3:更激进,直接把推理引擎选的专家 e^μ_old搬到训练阶段
使用建议:
-
拆分比例 N=2→R2 足够;N≥4→R3 更稳。 -
轻度 off-policy 用 R3 反而掉点,因为它动了“第一 mini-batch”的目标策略,见 Table 1。
6. 我的实验:30B MoE 如何走完 30 万 GPU 小时?
6.1 任务与数据
-
数学竞赛题 4096 道,二值奖励:答案对=1,其余=0 -
评测集 HMMT25 / AIME25 / AIME24 共 90 题
6.2 关键超参
| 参数 | 值 |
|---|---|
| 最大生成长度 | 32 k token |
| FP8 推理 | 开(加大 discrepancy 压力测试) |
| TIS 截断阈值 | 5 |
| ε_high / ε_low | 0.27 / 0.2 |
6.3 结果速览
-
on-policy:MiniRL(带 IS)→ 1200 步 0.75 分,熵 0.35,KL 10^-3 级 -
off-policy N=8:MiniRL+R3 → 5000 步 0.77 分,熵 0.32,无崩溃
7. 冷启动不重要,稳定训练才决定终点
核心问题:不同教师模型蒸馏出的冷启动,会影响最终天花板吗?
答案:只要 RL 过程稳,三份冷启动(Qwen3-Max / DeepSeek-R1 / GPT-oss-120B)600 步后收敛到同一 0.86 分区间,差异<0.01。
作者感悟:
与其花两周调“最佳冷启动”,不如把 Clipping、Routing Replay 开好,然后放心堆算力——这才是 ROI 最高的路线。
8. 实用摘要 / 操作清单
-
训练-推理精度不同?务必保留 token 级 IS 权重。 -
拆分 mini-batch 多步更新?一定加 Clipping(ε≈0.2-0.3)。 -
MoE 场景: -
N≤2 → 用 R2 -
N≥4 → 用 R3
-
-
观察两个健康指标: -
熵 < 0.3 且持续下降 → 快崩了 -
KL(μ||π_old) > 0.01 → 引擎差距过大
-
-
冷启动差距会被长 RL 抹平,把精力留给稳定算法。
9. One-page Summary
We formulate RL with LLMs as “token-level surrogate = first-order approximation of sequence-level reward”. The approximation holds only if training-inference discrepancy and policy staleness are both small. Extensive 30B-MoE experiments show:
-
Importance Sampling corrects engine gap. -
Clipping reins in stale policy. -
Routing Replay (R2/R3) tames expert-routing drift.
Once stability is secured, prolonged RL erases cold-start differences and consistently pushes models to the same performance ceiling.
10. FAQ
-
Q:直接把序列似然比截断行不行?
A:方差依旧大,且 MoE 里 expert 不一致问题没解决,仍会崩。 -
Q:Clipping 阈值怎么选?
A:0.2-0.3 是 sweet spot;再大约束不足,再小更新太慢。 -
Q:R2 与 R3 能一起开吗?
A:没必要,两者互斥且会引入双重偏差,选其一即可。 -
Q:BF16 推理是不是就没必要做 IS?
A: discrepancy 降到 10^-4 以下可忽略,但保留 IS 几乎零成本,建议保守留。 -
Q:为什么不用 PPO 的 value 模型?
A:序列奖励难以给 token 级 value 打可靠分数,实验发现 variance 更高。 -
Q:长度归一化到底哪不好?
A:它把不同长度回答的梯度拉到同一量级,违背“长回答应负更大责任”的直觉,一阶近似不再等于原目标。 -
Q:entropy 掉到多少要停?
A:一旦低于 0.25 且仍在降,基本 50 步内必崩,建议提前重启。 -
Q:算力有限,只能跑 N=2,该怎么组合?
A:MiniRL + Clipping + R2 是最稳性价比方案,能把 4096 条 batch 拆 2 步更新且无崩溃。

