稳定压倒一切:MoE RL 训推不一致问题及解决策略

TL;DR

  • 核心矛盾:MoE 模型对输入极度敏感,训练引擎与推理引擎在算子实现、数值精度上的微小差异,会导致同一 Token 在两端选择不同的专家。
  • 现象严重性:实验显示约 94% 的 Token 在一次前向传播中至少有一层路由决策不一致,直接导致策略梯度出现剧烈噪声,引发训练不稳定。
  • 不同策略:算法鲁棒化的 GSPO/GMPO,数学偏差补偿的 TIS/IcePop,系统强行对齐的 R3/DeepSeek。

本文来讨论一下 MoE RL 的稳定性问题。其实,我自己还没用过 MoE,基本还是 Dense,所以讨论也谈不上,纯粹是整理了。 ̄□ ̄||

另外,本文的图片和公式绝大多数来自原文,特在此声明。

问题

在 RL 时,训练和推理经常是不同的引擎,比如推理用 VLLM 或 SGLang,训练用 FSDP 或 Megatron。这就导致 rollout 时的分布和训练时的需要的分布可能不一样。有同学可能会问了,rollout 只是采样轨迹呀,怎么和后面的更新参数、计算 log_prob 有关呢?嘿,在 RL 中,它们不仅有关,还强耦合。因为在损失函数有个很重要的前提:期望是在策略上取的,trace 从哪个策略采样,本身就是目标函数的一部分。rollout 看似在生成数据,其实是定义一个行为分布。后面的计算 log_prob 是应该在选定分布上进行。

我们来看看具体的现象,来自 R3[1](Stabilizing MoE Reinforcement Learning by Aligning Training and Inference Routers),

图(a)展示的是每一个 token 和每一层 MoE,MoE Router 在训推阶段选择专家不同的次数,约有 10% 的 token 在训练时选择了和推理阶段不同的专家。

图(b)展示的是针对每一个 token,MoE Router 在所有层中做出不同专家选择的次数。结果显示,在一次前向传播过程中,94% 的 token 至少在一层中选择了不同的专家。

图(c)展示每一条序列每个 token 的路由分布差异,然后在 token 维度上取平均,得到该序列的平均差异。结果显示,每个 token 的平均差异是 6 个路由。也就是说,一次前向传播大约有 6 次路由决策表现出训推不一致。

带来的结果就是训推概率分布的不一致(用 KL K3 计算衡量),

前 3 个图无需多言,最后一个是极端(训推分布概率比值超过阈值τ)token 所占比例。

以上现象表明,MoE 模型在训练与推理阶段之间存在显著更高程度的分布差异。而这种差异会让训练不稳定,甚至崩溃。比如 IcePop[2] 给出的现象,如下图所示:

接下来我们看看大家如何各显神通来解决这个问题。

解决策略

GSPO

Qwen 发布的,这个我们在《GRPO“第一背锅侠”Token Level X:DAPO/DrGRPO与GSPO/GMPO的殊途同归 | 长琴[3]》中专门介绍过,虽然 GSPO 的出发点不是解决这个问题,但它有个正向的外部性:稳定 MoE 训练。其原因是序列级别关注,对 token 没那么敏感。效果如下:

嗯,看起来比 GRPO + Routing Replay 效果还要好一些。

还有同时期的 GMPO 其实和 GSPO 非常像(从出发点到解决方案),我们在刚刚那篇文章中也提到过了,这里不再赘述。

TIS

来自《2508 Your Efficient RL Framework Secretly Brings You Off-Policy RL Training | Notion[4]》,其方案是:调整模型更新方式,使其感知到这种训推不匹配。具体做法很简单,对重要性采样(比率)进行校正,经典的做法是“截断”——在原目标前面乘一个截断的重要性比率系数。

公式表达了一切信息,前面是新增的 TIS 系数,后面是 PPO 目标,θ 是 policy 参数。

你可能会想,就不能把后面的重要性采样系数换成 TIS 吗?嘿,有的,文章后面做了两个变体实验:

结果如下图所示,

两个变体看起来都不怎么样。

对于 Vanilla-IS,如果 IS 比较大,方差会更大(平方放大),进而导致不稳定。而对于 PPO-IS,实验效果也比较差,文章的解释是:这种情况下即便 θ 相同,由于 policy 不同,可能导致系数不等于 1,这和 PPO 的设计(θ 相等时比率=1)是有偏差的。其结果就是,PPO 的 clip 被系统噪声提前触发,梯度还没来得及反映“真实 policy 更新”就被 clip 掉了。

而 TIS 其实是做了一个因式分解:

  • 第一项就是 TIS 前面的那个 IS,属于系统性偏差,截断变成 TIS 是防止方差过大;
  • 第二项是 policy update 的 IS,用 PPO 的 clip。

我此刻的真实感觉就是:“这,好微妙呀”。后续实验还表明 TIS 可以缓解熵坍缩、稳定 KL 估计、提升下游任务等。

还有一大部分内容是分析可能导致 Rollout-Training 不匹配的具体因素的:

  • 并行(TP、SP)策略的差异和较长的响应长度会导致这种不匹配。

  • 采样器后端的选择本身影响甚微。

文章最后提到和 GSPO/GMPO 的区别:TIS 旨在解决系统层面(训推引擎不一致)的分布不匹配问题;而 GXPO 主要改进重要性采样比率的计算方法,提高了策略更新的稳定性。

IcePop

蚂蚁的 2509 Small Leak Can Sink a Great Ship—Boost RL Training on MoE with 𝑰𝒄𝒆𝑷𝒐𝒑![5],中文名字“棒冰”或“冰棒”,很有意思的名字,据文中说,这是吃冰棒时想出这个名字的,冰棒能降温,该算法通过截断极端概率比并屏蔽差异过大的 token,来“冷却”不稳定的训练。

IcePop 有两个机制:

  • 双向 clip:既 clip 训练概率 ≫ 推理概率 的 token,也 clip 训练概率 ≪ 推理概率 的 token。
  • Mask:从梯度更新中移除差异过大的 token。

损失函数如下:

看到这个 Mask,很容易就想起了 CISPO[6] 有没有,就 Mask 的这个作用来看,它们其实是一致的,只不过对象不同。

大家都是为了稳定呀。

IcePop 看起来和 TIS 有点像,文中解释了两者的区别:

  • 当 IS < α 时,π_train 倾向于给 action 较小的 value,π_infer 输出较高的概率。如果比率足够小,意味着训推引擎存在巨大差异,TIS 引入一个小的系数来缓解梯度更新中的噪声。但本文发现,随着训练进行,这种微小扰动会逐渐放大,最终导致平台期。
  • 当 IS > β 时,TIS 会乘以一个适中的系数持续更新 policy。而 IcePop 梯度为零,这意味着放弃所有噪声更新,只保留那些健康的策略梯度。

其实 IcePop 看起来像是 token 级别截断的 TIS。效果如下:

后续的分析表明,TIS 和 IcePop 都能将训练-推理概率的 KL 散度控制在合理范围内,但 IcePop 的差异一直相对较小,TIS 始终表现出更大的极端差异和更快的增长速度。作者猜测这可能由于 TIS 在训练过程中包含了噪声策略更新导致。

R3

来自罗福莉挂名,小米的《2510 Stabilizing MoE Reinforcement Learning by Aligning Training and Inference Routers[7]》,R3 = Rollout Routing Replay。不知道为啥,每次看到 Replay 都会莫名想到 “重放攻击”……

这里的重放是:从推理引擎捕获序列生成时的路由分布,并直接重放到训练引擎中。注意,这里重放的是 Experts 的路由分布,其他的依然由策略生成。

Itrain = TopKMask (strain ,K)\mathbf{I}_{\text {train }}=\text { TopKMask }\left(\mathbf{s}_{\text {train }}, K\right)

s_train 是 router 的 logits。

gate 权重从

gtrain ,i=Itrain ,iexp(strain ,i)j=1MItrain ,jexp(strain ,j) for i=1,,M.g_{\text {train }, i}=\frac{I_{\text {train }, i} \exp \left(s_{\text {train }, i}\right)}{\sum_{j=1}^M I_{\text {train }, j} \exp \left(s_{\text {train }, j}\right)} \quad \text { for } i=1, \ldots, M .

调整为:

greplay ,i=Iinfer ,iexp(strain ,i)j=1MIinfer ,jexp(strain ,j) for i=1,,M.g_{\text {replay }, i}=\frac{I_{\text {infer }, i} \exp \left(s_{\text {train }, i}\right)}{\sum_{j=1}^M I_{\text {infer }, j} \exp \left(s_{\text {train }, j}\right)} \quad \text { for } i=1, \ldots, M .

MoE 层的输出为:

yreplay =i=1Mgreplay ,iEi(xtrain ).\mathbf{y}_{\text {replay }}=\sum_{i=1}^M g_{\text {replay }, i} \mathcal{E}_i\left(\mathbf{x}_{\text {train }}\right) .

其中,ε 是 expert 网络。

这个设计出于两个目的:

  • 对齐训练和推理:训推使用同样的专家。
  • 保持梯度传递:只重放路由分布(而不是固定权重),梯度仍然可以回传到 logits(权重可以改变)。类似软对齐和硬对齐的区别。

我们还是看一下最终效果,毕竟里面还有 GSPO 和 TIS。

括号里的是最佳步数。看起来 GRPO + R3 好像就可以了。

路由保持

DeepSeek V3.2 的策略,这个我们在《DeepSeekV3.2后训练:稳定压倒一切 | 长琴[8]》中介绍过,他们的做法是比较粗暴的:直接在推理框架中保留采样时使用的专家路由路径,并在训练阶段强制使用相同的路由路径。显然,这肯定是有效果的,应该说是最有效果了。论文虽然没有给出对比图,但明确提到这一操作对稳定性至关重要。

和 R3 很像啊,不过 DeepSeek V3.2 在权重计算上看起来有点倾向于完全固定(暗示了路径一致),梯度是否回传不太确定。总之,策略一样,但实现可能略有不同。

小结

本文主要介绍了 RL 训练中由于训推不一致导致的不稳定问题,这在 MoE 中更甚,因为 Experts 选择的不一致会导致训练更加不稳定。为此,业界也提出了一些相应的解决策略,有改进重要性采样比率的计算方法的 GSPO/GMPO,也有系统调整模型更新方式使其感知到训推不匹配的 TIS/IcePop,当然,还有从根源上直接在训练时重放推理轨迹的 R3/路由保持等。虽然大家方案不同,但归根结底都是为了训练的稳定性——真是稳定性压倒一切呀!

最后,依然放上一张 AI 总结的表格:

策略分类 代表方案 核心手段 评价
分布解耦 GSPO/GMPO 采用序列级关注,降低对 Token 级波动的敏感度。 间接优化,稳定性提升明显。
重要性修正 TIS / IcePop 引入校正系数或直接 Mask 掉训推概率比(IS)过大的 Token。 系统性优化,IcePop 比 TIS 更激进、更干净。
强制对齐 R3 / DeepSeek 训练时强制复用推理时记录的专家路径。 直接且有效地解决不一致问题。

References

[1] R3: https://arxiv.org/abs/2510.11370
[2] IcePop: https://ringtech.notion.site/icepop
[3] GRPO“第一背锅侠”Token Level X:DAPO/DrGRPO与GSPO/GMPO的殊途同归 | 长琴: https://yam.gift/2025/08/14/NLP/LLM-Training/2025-08-14-Token-Level-GSPO-GMPO/
[4] 2508 Your Efficient RL Framework Secretly Brings You Off-Policy RL Training | Notion: https://fengyao.notion.site/off-policy-rl
[5] 2509 Small Leak Can Sink a Great Ship—Boost RL Training on MoE with 𝑰𝒄𝒆𝑷𝒐𝒑!: https://ringtech.notion.site/icepop
[6] CISPO: https://yam.gift/2025/06/19/NLP/LLM-Training/2025-06-19-CISPO-and-Entropy/
[7] 2510 Stabilizing MoE Reinforcement Learning by Aligning Training and Inference Routers: https://arxiv.org/abs/2510.11370
[8] DeepSeekV3.2后训练:稳定压倒一切 | 长琴: https://yam.gift/2025/12/03/NLP/LLM-Training/2025-12-03-DeepSeek-V32-PostTraining/