English Version | 知乎版本 Zhihu

Mini-class

训推不一致和异步框架

最近看到不少关于大模型强化学习中“训推不一致”和“异步训推框架”的讨论,我自己的直觉是:这些看上去复杂多样的问题,很大一部分其实都围绕着一个更基础的矛盾——行为策略(behavior policy)和参考策略(reference policy)不一致。

本文先简单梳理一下我目前看到的相关工作,然后再尝试从“行为策略 vs 参考策略”的角度,把它们串到同一条线上,为读者提供一个补充视角。

在本文中我会用:

  • 行为策略 $\mu$:实际负责生成 rollout 的策略,也就是“你在什么分布下采样到了这些数据”。在现代 LLM-RL 系统里,它对应的是推理引擎里的那套实现(vLLM / SGLang 等),在异步框架下往往还是多个 worker 策略的混合分布
  • 参考策略 $\pi_{\theta_{\text{old}}}$:训练目标里拿来做重要性采样、clipping 或 KL 约束的策略,典型地就是 PPO / GRPO 里的“旧策略”(old policy)。
  • 目标策略 $\pi_\theta$:训练目标里要优化的策略,也就是“你想让模型变成什么样”。典型地就是 PPO / GRPO 里的“新策略”(new policy)。

在最经典、理想化的设定里,我们通常默认 $\mu = \pi_{\theta_{\text{old}}}$。但在现实系统中,受异步更新、不同推理 / 训练后端、MoE 路由波动甚至硬件数值差异等因素影响,二者往往会出现不同程度的偏离。

相关工作

下面按时间线简单列一下我印象比较深的一些工作(只代表我个人看到的片面子集):

  • Decoupled PPO 率先指出,在信赖域策略优化(TRPO 和 PPO)方法中,“旧策略”(old policy)实际承担了两个不同的角色:一是用于重要性采样进行异策略修正,在这个目的下,“旧策略”用于代表训练数据集所服从的行为策略(behavior policy);二是用于限制新策略的更新幅度,在这个目的下,“旧策略”被用于衡量新旧策略的变化程度,称作近端策略(proximal policy,对应本文中的“参考策略”)。文章指出这两个目的下的“旧策略”可以是不同的策略,从而提出了 Decoupled PPO 更新目标,把“采样用谁”和“对谁做 trust region”在形式上解耦开来。

  • AReaL 关注到了异步训练框架下行为策略与参考策略不一致的问题:rollout 往往由滞后的参数版本或不同 worker 产生。文章在异步框架下采用了 Decoupled PPO 风格的目标,将“行为策略分布”和“参考策略”显式区分开来,从而在异步场景下仍然维持类似 PPO 的优化性质。

  • GSPO 从 GRPO 在长序列和 MoE 模型上的稳定性问题出发,指出 token-level 的 PPO / GRPO 在专家路由高度波动(尤其是新旧策略之间的路由差异)时,会引入巨大的方差与不稳定。GSPO 提出在 sequence-level 定义 PPO-style 目标与比率约束,用整条序列的比率来约束更新,从而在 MoE 场景下显著缓解由路由不一致带来的训练崩溃问题。

  • Your Efficient RL Framework Secretly Brings You Off-Policy RL Training 关注到了现有的一些大模型强化学习训练框架(如 VeRL)中,推理框架和训练框架在不少相同的功能模块上有不同的实现(例如 vLLM 和 FSDP / Megatron 等算子上的差异),导致行为策略 $\mu$ 与参考策略 $\pi_{\theta_{\text{old}}}$ 不一致。这种不一致使得原本假定为同策略(on-policy)的训练,实际上变成了带有明显偏差的异策略(off-policy)训练。文章总结了两种处理这一问题的现有方法:PPO-IS 与 vanilla-IS,并提出在 token-level 做截断重要性采样(truncated IS, TIS),以减少训推不一致程度较重的样本在训练中的影响。作者还写了两篇更为基础的分析文章,从原理上分析训推不一致问题:Part IPart II

  • Defeating Nondeterminism in LLM Inference 指出,批处理大小不变性(batch-size invariance)的缺失是大模型推理框架随机性的核心来源之一:同一个输入在不同的 batch 组合和 kernel 路径下,得到的概率分布会发生可观差异。这意味着,即便“名义上”是同一套参数,真实运行时的行为策略 $\mu$ 也会因为系统负载和调度差异而波动,从而进一步加剧训推不一致。

  • Small Leak Can Sink a Great Ship—Boost RL Training on MoE with 𝑰𝒄𝒆𝑷𝒐𝒑! 观察到,上述训推不一致问题在 MoE 模型上会进一步加剧:路由本身就对微小扰动高度敏感,再叠加推理 / 训练实现差异和异步采样,很容易放大偏差。文章提出 IcePop 方法:在 token-level 通过计算重要性采样比率,对过于大或者过于小的比率进行双侧掩码(masking),将这些“噪声较大”的数据从梯度中丢弃,从而稳定 MoE 上的 RL 训练。

  • When Speed Kills Stability: Demystifying RL Collapse from the Training-Inference Mismatch 系统性分析了训推不一致的各种成因,包括智能体工作流中引入的大量分布外和低概率信息、硬件和内核 / kernel 实现带来的计算不确定性,并分析了在 token-level 进行重要性采样如何在长序列上引入严重的偏差。文章进一步提出在 sequence-level 计算重要性采样掩码(sequence-level masked IS, sequence-level MIS):只丢弃那些整条序列的重要性采样比率过大的数据,从而在控制偏差的同时,显著抑制由极端样本导致的训练崩溃。文中给出了较为完整的理论推导和丰富的实验支撑。

  • Stabilizing MoE Reinforcement Learning by Aligning Training and Inference Routers 聚焦于 MoE 架构下特有的 路由不一致(Routing Inconsistency) 问题。文章发现,推理端和训练端即便在输入完全相同的情况下,由于算子实现或并行的微小差异,Router 选中的专家往往不同。这种“物理路径”上的不一致,使得行为策略 $\mu$ 和参考策略 $\pi_{\theta_{\text{old}}}$ 之间的差异远超预期,极易导致训练崩溃。文章提出了 Rollout Routing Replay (R3):在推理阶段记录下每个 token 实际命中的专家索引,并在训练阶段强制回放这些路由决策,不再重新进行计算。通过这种方式,R3 在 MoE 拓扑结构上强制对齐了训推两端的计算路径。

  • RL 老训崩?训推差异是基石 则更多从实践角度出发,分享了如何在实现上尽可能靠近“训推一致”的经验,包括如何选用一致的算子和精度配置、如何监控与约束训练端和推理端 log-prob 的偏差等,更着力于从训推框架层面入手,在工程上尽量从根本缓解训推差异问题。

  • verl Rollout Importance Sampling 在其 rollout correction 模块中引入了 Token Veto(一票否决)机制:在 token-level 计算重要性比率 $\rho_t^{(\text{ref}\leftarrow\text{beh})}$,若轨迹中存在任意 token 使得 $\min_t \rho_t < \tau_{\text{veto}}$,则将整条序列从训练中剔除。这种”token 粒度检测、sequence 粒度否决”的设计体现了一种”一票否决”的保守策略。

  • INTELLECT-3 Technical Report 在其异步分布式 RL 训练框架中采用了类似的拒绝采样策略。INTELLECT-3 对每条 rollout 计算 token-level 重要性比率,若任意 token 的比率低于阈值(文中使用 $10^{-5}$),则对整条轨迹进行 masking。

三策略 TRPO 视角下的最小统一理解

上面列的这些工作,看上去各自解决的是:

  • 算法层:PPO / GRPO 的目标怎么写,token-level 还是 sequence-level,用 clip 还是 mask;
  • 系统层:推理框架和训练框架怎样对齐;
  • 模型层:MoE 模型路由问题如何放大训练不稳定,等等。

但如果我们把“行为策略 vs 参考策略”这条线拉直,会发现相当一部分问题,其实都可以放到一个相对简单的理论框架里理解:三策略 TRPO

下面这节我会用尽量简单的数学,把这个三策略版 TRPO 摊开——它可以被看作是“TRPO + 三角不等式”的一个小扩展,但在分析大模型 RL 里的训推不一致时非常好用:

  • 一方面让我们重新理解“训推不一致”和“异步训练框架”到底在影响什么;
  • 另一方面,也帮我们统一理解 TIS、IcePop、sequence-level MIS 等,在本文的视角下,它们其实都是在实施下文的“约束 2”。

三个策略

沿用前文的记号,我们在一个折扣 MDP 上工作,折扣因子为 $\gamma\in(0,1)$:

  • 状态 $s\in\mathcal{S}$,动作 $a\in\mathcal{A}$;
  • 策略 $\pi(a\mid s)$;
  • 折扣状态分布: \(d_\pi(s) := (1-\gamma)\sum_{t=0}^\infty \gamma^t \Pr_\pi(s_t = s)。\)
  • 回报(episode 视角): \(\mathcal{J}(\pi) := \mathbb{E}_\pi\Big[\sum_{t=0}^\infty \gamma^t r_t\Big]。\)
  • 值函数 / 优势函数: \(V_\pi(s),\quad Q_\pi(s,a),\quad A_\pi(s,a) := Q_\pi(s,a) - V_\pi(s)。\)

稍微赘述一下,在“三策略”设定里,我们有:

  • 行为策略(behavior policy):$\mu$,真正用来 rollout 的策略;数据 $(s,a,r,\dots)$ 都是从它来的。
  • 参考策略(reference policy):$\pi_{\theta_{\text{old}}}$,优化目标里拿来做 ratio、clip 或 KL 约束的那一份“旧策略”。
  • 目标策略(target policy):$\pi_\theta$,我们这一步想要优化的策略。

在理想设定里我们默认 $\mu = \pi_{\theta_{\text{old}}}$;现实系统里二者往往不等,这就是“训推不一致”的数学影子。

两策略 TRPO

熟悉 TRPO 的读者可以直接跳到后面的“三策略 TRPO”小节。

TRPO 的所有理论保证,都是建立在某个“基准策略”的优势函数之上的。既然实际能算清楚的只有 $A_\mu$(数据是按 $\mu$ 采的),那我们就直接把 $\mu$ 当成基准。

一个经典的结论是 性能差分引理(Performance Difference Lemma)

对任意两策略 $\mu$ 和 $\pi_\theta$,有

\[\mathcal{J}(\pi_\theta) - \mathcal{J}(\mu) = \frac{1}{1-\gamma}\; \mathbb{E}_{s\sim d_{\pi_\theta},\, a\sim\pi_\theta}[A_\mu(s,a)]。\]

直觉非常简单:

  • $A_\mu(s,a)$ 就是在说“如果在 $s$ 里本来按 $\mu$ 行动,现在换成动作 $a$,长期回报会多或少多少”;
  • 把所有时刻、所有状态、所有动作的“增益”累积起来,就得到新策略比行为策略总共赚了多少。

TRPO 的问题在于,我们没法准确算

\[\mathbb{E}_{s\sim d_{\pi_\theta}, a\sim\pi_\theta}[A_\mu(s,a)],\]

因为 $d_{\pi_\theta}$ 是“新策略”的状态分布,我们没有在它下面采样过。

于是 TRPO 引入了一个替代目标:把状态分布换成行为策略的:

\[L_\mu(\pi_\theta) := \mathcal{J}(\mu) + \frac{1}{1-\gamma}\mathbb{E}_{s\sim d_\mu,\,a\sim \pi_\theta}[A_\mu(s,a)]。\]

$L_\mu$ 的直觉解释是:在行为策略的状态分布下,让新策略试着去选动作,看优势有多大。

从性能差分引理出发,两者之差是:

\[\mathcal{J}(\pi_\theta) - L_\mu(\pi_\theta) = \frac{1}{1-\gamma}\; \sum_s \big(d_{\pi_\theta}(s) - d_\mu(s)\big) \,\mathbb{E}_{a\sim\pi_\theta(\cdot\mid s)}[A_\mu(s,a)]。\]

如果我们定义

\[\epsilon_\mu := \max_{s,a} |A_\mu(s,a)|,\]

那么有一个直接的上界:

Lemma 1

\[|\mathcal{J}(\pi_\theta) - L_\mu(\pi_\theta)| \le \frac{\epsilon_\mu}{1-\gamma}\; \|d_{\pi_\theta} - d_\mu\|_1。\]

这里出现了第一个关键量:

状态分布偏移 $|d_{\pi_\theta} - d_\mu|_1$,也就是“新策略和行为策略看到的世界,到底差了多少”。

我们通常不会直接对 $|d_{\pi_\theta} - d_\mu|_1$ 施加约束,反而是对“每一步 action 分布”的差异施加约束,比如 trust region、KL、clip 等。

记总变差距离(total variation):

\[D_{\mathrm{TV}}(p,q) := \frac{1}{2}\|p-q\|_1。\]

假设存在常数 $\beta$,使得

对所有 $s$,行为策略和目标策略之间的 TV 被 $\beta$ 上界:

\[D_{\mathrm{TV}}\big(\mu(\cdot\mid s), \pi_\theta(\cdot\mid s)\big) \le \beta。\]

直观含义:在任意状态里,“新策略”和“生成数据的策略”选动作的分布都不会离太远。

一个经典结果(可以用 coupling 证明)是:

Lemma 2 在上述条件下有

\[\|d_{\pi_\theta} - d_\mu\|_1 \le \frac{2\gamma}{1-\gamma}\,\beta。\]

把它和 Lemma 1 结合:

\[|\mathcal{J}(\pi_\theta) - L_\mu(\pi_\theta)| \le \frac{\epsilon_\mu}{1-\gamma}\; \frac{2\gamma}{1-\gamma}\,\beta = \frac{2\epsilon_\mu\gamma}{(1-\gamma)^2}\,\beta。\]

于是我们得到一个形式上相当简洁的两策略 TRPO 下界(基准为行为策略)

Theorem 1(两策略 TRPO)

\[\mathcal{J}(\pi_\theta) \;\ge\; L_\mu(\pi_\theta) \;-\; \frac{2\epsilon_\mu\gamma}{(1-\gamma)^2}\,\beta。\]

这说明:

  • 真正决定“替代目标 $L_\mu$ 靠不靠谱”的,是行为策略 $\mu$ 和目标策略 $\pi_\theta$ 的差异: \(\beta = \max_s D_{\mathrm{TV}}\big(\mu(\cdot\mid s), \pi_\theta(\cdot\mid s)\big)。\)

如果你能直接约束住这个 $\beta$,就能直接把 TRPO 的单调性保证搬到行为策略视角下。

三策略 TRPO

现实问题在于:大模型强化学习训练里我们可能无法直接控制 $\beta$ 本身。

在大部分 PPO / GRPO / GSPO / 现有 RLHF 框架里,实际发生的是:

  • rollout 数据是由某个行为策略 $\mu$ 产生的(推理引擎里的“那一版参数” + 若干系统细节);
  • 更新时,我们希望利用参考策略 $\pi_{\theta_{\text{old}}}$ 来限制目标策略 $\pi_\theta$ 的更新幅度。

也就是说,实际可以“动手”的是两个量:

  1. 参考 vs 目标:我们可以通过 KL / clip 等手段控制 \(D_{\mathrm{TV}}\big(\pi_{\theta_{\text{old}}}(\cdot\mid s),\pi_\theta(\cdot\mid s)\big)。\)
  2. 行为 vs 参考:我们希望间接控制 \(D_{\mathrm{TV}}\big(\mu(\cdot\mid s),\pi_{\theta_{\text{old}}}(\cdot\mid s)\big)。\)

于是自然就定义两个“proxy 差异”:

  • 约束 1:参考 vs 目标 \(\alpha_0 := \max_s D_{\mathrm{TV}}\big(\pi_{\theta_{\text{old}}}(\cdot\mid s), \pi_\theta(\cdot\mid s)\big);\)
  • 约束 2:行为 vs 参考 \(\alpha_1 := \max_s D_{\mathrm{TV}}\big(\mu(\cdot\mid s), \pi_{\theta_{\text{old}}}(\cdot\mid s)\big)。\)

直觉上:

  • $\alpha_0$:新策略到底离“你宣称的那份旧策略”有多远——这就是 trust region 控制的那部分;
  • $\alpha_1$:你用来训练的参考策略,到底跟真实采样时的行为策略差了多少——这就是训推不一致或异步的影子。

现在,可以把这两个量塞回 TRPO 的下界里。

对任意状态 $s$,有

\[\begin{aligned} D_{\mathrm{TV}}\big(\mu(\cdot\mid s),\pi_\theta(\cdot\mid s)\big) &\le D_{\mathrm{TV}}\big(\mu(\cdot\mid s),\pi_{\theta_{\text{old}}}(\cdot\mid s)\big) \\ &\quad + D_{\mathrm{TV}}\big(\pi_{\theta_{\text{old}}}(\cdot\mid s),\pi_\theta(\cdot\mid s)\big)。 \end{aligned}\]

对 $s$ 取上确界:

\[\beta := \max_s D_{\mathrm{TV}}\big(\mu(\cdot\mid s),\pi_\theta(\cdot\mid s)\big) \;\le\; \alpha_1 + \alpha_0。\]

把这个不等式塞回两策略 TRPO 的结论(Theorem 1)里,记

\[C := \frac{2\epsilon_\mu\gamma}{(1-\gamma)^2},\]

即得到:

\[\mathcal{J}(\pi_\theta) \;\ge\; L_\mu(\pi_\theta) \;-\; C\,\beta \;\ge\; L_\mu(\pi_\theta) \;-\; C\,(\alpha_0 + \alpha_1)。\]

于是,我们得到一个非常直接的三策略 TRPO 下界

Theorem 2(三策略 TRPO)

\[\epsilon_\mu := \max_{s,a} |A_\mu(s,a)|,\quad C := \frac{2\epsilon_\mu\gamma}{(1-\gamma)^2},\]

以及

\[\alpha_0 := \max_s D_{\mathrm{TV}}\big(\pi_{\theta_{\text{old}}}(\cdot\mid s), \pi_\theta(\cdot\mid s)\big), \quad \alpha_1 := \max_s D_{\mathrm{TV}}\big(\mu(\cdot\mid s), \pi_{\theta_{\text{old}}}(\cdot\mid s)\big)。\]

则对任意目标策略 $\pi_\theta$ 有

\[\boxed{ \mathcal{J}(\pi_\theta) \;\ge\; L_\mu(\pi_\theta) \;-\; C\,(\alpha_0 + \alpha_1) }\]

其中

\[L_\mu(\pi_\theta) := \mathcal{J}(\mu) + \frac{1}{1-\gamma} \mathbb{E}_{s\sim d_\mu,a\sim\pi_\theta}[A_\mu(s,a)]。\]

这个结论的含义其实很直接:

  • 替代目标 $L_\mu(\pi_\theta)$ 与真实性能 $\mathcal{J}(\pi_\theta)$ 之间的 gap,可以拆成两部分:
    • 参考 vs 目标的偏移 $\alpha_0$;
    • 行为 vs 参考的偏移 $\alpha_1$。

只要这两个量都小,优化 $L_\mu$ 就有希望有效提升 $\mathcal{J}$

这两个差异各自怎么约束?

现在,我们可以从 Theorem 2 回头看各种实际方法:

  • 绝大多数 “PPO / GRPO / GSPO” 类工作,其实是在控制 约束 1:$\alpha_0$
  • 绝大多数 “TIS / IcePop / MIS” 类工作,在本文的统一视角下,可以理解为主要是在控制 约束 2:$\alpha_1$

本文下面只讨论 约束 2

约束 2 的目标是:保证用来训练的数据,尽可能来自“接近参考策略”的行为策略。

这里通常既有系统层的机制,也有算法层(importance sampling)的机制。

  1. 系统层:让行为策略别飘太远
    • 异步框架:给每个样本打上策略版本号,只能用与 $\pi_{\theta_{\text{old}}}$ 相差不大的参数版本采样的数据;
    • 训推对齐:强调训练框架和推理框架用相同精度、相同算子、相近的内核 / kernel 行为。

    这些机制的目标是:从“算法外部”让 $\mu$ 和 $\pi_{\theta_{\text{old}}}$ 靠近,从而压缩 $\alpha_1$。

  2. 算法层:样本修正

    在算法层,我们不再试图“纠正整个行为策略”,而是用重要性采样比率在样本层面做筛选和重加权,让“真正参与训练的样本子集”上的行为策略尽量接近参考策略,或者减小差异较大的样本在训练上的权重。

    具体来说,就是下面这些方法,它们本质上都可以看作是“实现约束 2 的不同方式”。

重要性采样与掩码:四种约束 2 实现

下面延续前文的记号体系来写这三种方法的目标函数,只聚焦在“行为策略 vs 参考策略”这一维的设计。记 token 级的 PPO / GRPO 风格更新项为

\[g_\theta(t) = \min\big(r_t(\theta) A_t,\ \text{clip}(r_t(\theta),1-\epsilon,1+\epsilon) A_t\big),\]

其中

\[r_t(\theta) = \frac{\pi_\theta(a_t\mid s_t)}{\pi_{\theta_{\text{old}}}(a_t\mid s_t)}, \quad (s_t,a_t)\sim\mu,\quad A_t := A_\mu(s_t,a_t)。\]

也就是说:

  • $r_t(\theta)$ 是 目标 vs 参考 的比率(对应约束 1);
  • $A_t$ 基于行为策略采样的数据,是我们能估到的优势函数。

为了把 token 级的 $(s_t,a_t)$ 与序列级的 $(x,y)$ 记号打通,在以 RLHF(reinforcement learning from human feedback,人类反馈强化学习)为代表的 LLM-RL 设定中,我们约定:

  • prompt 记为 $x$;回复记为 $y = (y_1,\dots,y_{ y })$;
  • token 级状态 $s_t := (x, y_{\lt t})$,动作 $a_t := y_t$;
  • 因此行为策略和参考策略在序列上的分布可写成 \(\mu(y\mid x) = \prod_{t=1}^{|y|}\mu(a_t=y_t\mid s_t),\quad \pi_{\theta_{\text{old}}}(y\mid x) = \prod_{t=1}^{|y|}\pi_{\theta_{\text{old}}}(a_t=y_t\mid s_t)。\)

此外,为了描述“参考 vs 行为”的偏移,统一定义 token 级重要性比率

\[\rho_t^{(\text{ref}\leftarrow\text{beh})} := \frac{\pi_{\theta_{\text{old}}}(a_t\mid s_t)}{\mu(a_t\mid s_t)},\]

以及其对应的序列级版本

\[\rho(y\mid x) := \frac{\pi_{\theta_{\text{old}}}(y\mid x)}{\mu(y\mid x)} = \prod_{t=1}^{|y|} \rho_t^{(\text{ref}\leftarrow\text{beh})}。\]

接下来,TIS / IcePop / MIS 的区别,就体现在“如何利用这些 $\rho$ 来实现约束 2”。

1. TIS:token-level 截断 IS

TIS 直接对上述 $\rho_t^{(\text{ref}\leftarrow\text{beh})}$ 做截断,记

\[\color{blue}{w_t = \min\big(\rho_t^{(\text{ref}\leftarrow\text{beh})},\ C_{\text{IS}}\big)}。\]

更新目标写成

\[L_{\text{TIS}}(\theta) = - \mathbb{E}_{(s_t,a_t)\sim\mu}\big[\,\color{blue}{w_t}\; g_\theta(t)\big]。\]
  • 蓝色的 $\color{blue}{w_t}$ 是被截断的 IS 权重:极端大的比率被压到常数 $C_{\text{IS}}$。
  • 从三策略 TRPO 的角度看,这相当于在 token 分布 上“软削弱”行为策略和参考策略严重不一致的样本,从而在梯度中有效减小那部分样本对 $\alpha_1$ 的贡献。

2. IcePop:MoE 场景下的 token-level 双侧 Mask

IcePop 同样以 $\rho_t^{(\text{ref}\leftarrow\text{beh})}$ 为度量,但采用 双侧掩码

\[\color{blue}{m_t = \mathbf{1}\big[C_{\text{low}} \le \rho_t^{(\text{ref}\leftarrow\text{beh})} \le C_{\text{high}}\big]}。\]

更新目标写成

\[L_{\text{IcePop}}(\theta) = - \mathbb{E}_{(s_t,a_t)\sim\mu}\big[\,\color{blue}{m_t}\; g_\theta(t)\big]。\]
  • 蓝色的 $\color{blue}{m_t}$ 决定某个 token 是否参与更新:比率太大或太小的 token 直接被丢弃。
  • 这相当于硬性裁掉“行为策略和参考策略极度不一致”的 token,只在 $\rho_t$ 适中的区域上优化,从样本集合层面实施更强的“约束 2”。

3. sequence-level MIS:按整条序列 Mask 的重要性采样

MIS 的核心操作是:只保留 IS 比率不超过阈值 $C$ 的序列,其余序列的损失直接置零。写成

\[\color{blue}{ \rho(y\mid x) \leftarrow \rho(y\mid x)\,\mathbf{1}\{\rho(y\mid x)\le C\} }\]

在统一的损失形式下,可以写成

\[L_{\text{MIS}}(\theta) =-\,\mathbb{E}_{(x,y)\sim\mu} \Big[ \color{blue}{\rho(y\mid x)\,\mathbf{1}\{\rho(y\mid x)\le C\}} \;\cdot\; \sum_{t=1}^{|y|}g_\theta(t) \Big],\]

简而言之:

  • 对于 IS 比率较小的序列:保留完整的 $\rho(y\mid x)$ 权重,正常做 off-policy 修正;
  • 对于 IS 比率超过阈值 $C$ 的序列:整个序列的 policy loss 被 mask 掉(权重变成 $0$)。

从三策略 TRPO 的角度看,MIS 不再在 token 上做截断,而是直接在序列级筛掉“行为策略和参考策略严重不一致”的轨迹,只在 $\rho(y\mid x)\le C$ 的子分布上优化,从而在 trajectory 粒度上实现对“约束 2”($\mu$ vs $\pi_{\theta_{\text{old}}}$ 偏移)的控制。

4. Worst Token Reject Sampling:按最差 token 拒绝整条序列

verl 中的 veto 机制 与 INTELLECT-3 分别在各自的训练框架中采用了一种可统称为 Worst Token Reject Sampling(WTRS) 的拒绝采样策略:

  • verl Token Veto:在其 rollout correction 模块中,若轨迹中存在任意 token 使得 $\min_t \rho_t < \tau_{\text{veto}}$,则通过 responsemask 将整条序列剔除。阈值 $\tau{\text{veto}}$ 可由用户配置。

  • INTELLECT-3 Token Masking:在其异步分布式 RL 框架中,若任意 token 的比率低于 $10^{-5}$,则对整条轨迹进行 masking。

二者的核心操作一致:若轨迹中存在任意 token 的 IS 比率低于阈值 $\tau$,则将整条序列从训练中剔除。写成

\[\color{blue}{ m(y\mid x) = \mathbf{1}\Big\{\min_{t=1}^{|y|} \rho_t^{(\text{ref}\leftarrow\text{beh})} \ge \tau\Big\} }\]

在统一的损失形式下,可以写成

\[L_{\text{WTRS}}(\theta) =-\,\mathbb{E}_{(x,y)\sim\mu} \Big[ \color{blue}{m(y\mid x)} \;\cdot\; \sum_{t=1}^{|y|}g_\theta(t) \Big],\]

简而言之:

  • 对于 所有 token 的 IS 比率均不低于 $\tau$ 的序列:正常参与训练;
  • 对于 存在任意 token 的 IS 比率低于 $\tau$ 的序列:整条序列的 policy loss 被 mask 掉。

从三策略 TRPO 的角度看,WTRS 采用了”token 粒度检测、sequence 粒度否决”的混合策略:在 token-level 检测极端不一致的信号,一旦发现则在 sequence-level 执行拒绝。这种”一票否决”的设计体现了一种保守思路——当轨迹中存在”行为策略生成但参考策略几乎不可能生成”的 token 时,整条轨迹的可信度都将受到质疑,从而在 trajectory 粒度上实现对”约束 2”($\mu$ vs $\pi_{\theta_{\text{old}}}$ 偏移)的控制。

MoE 路由回放:它在三策略 TRPO 中到底做了什么?

在 MoE(Mixture-of-Experts)模型上,训推不一致往往首先表现为路由不一致(routing inconsistency):即便参数相同,推理端与训练端也可能因为算子、并行或数值细节的微小差异而路由到不同专家。一个很自然的工程应对是路由回放(routing replay):在 rollout(推理)时记录实际命中的专家路径,训练时强制复用这些路由决策。

这类方法经常被直觉性地理解为“在实现约束 2、压小 $\alpha_1$”。但从三策略 TRPO 的视角看,更准确的说法是:

路由回放并不是在原 surrogate objective 上收紧约束,而是在把 surrogate objective 改写成另一个“带路由条件/替换”的目标。 它让路由不一致在 loss 里“不可见”,但并没有让真实策略距离里的 $\alpha_0$ 或 $\alpha_1$ 变小。

下面用一个尽量简单但足够说明问题的建模来把这件事写清楚。

MoE 下的 surrogate objective:把“路由”和“token 生成”拆开

把 MoE 抽象成两阶段随机决策:“先选专家 $z$,再在该专家条件下生成 token $a$”。 因此目标策略可以分解为

\[\pi_\theta(a,z\mid s)=\omega_\theta(z\mid s)\,\pi_\theta(a\mid s,z),\]

其中:

  • $\omega_\theta(z\mid s)$ 是路由器(router)的分布;
  • $\pi_\theta(a\mid s,z)$ 是在专家 $z$ 条件下的 token 分布。

在三策略 TRPO 中,我们真正想优化的 surrogate objective 为

\[L_\mu(\pi_\theta) = \mathcal{J}(\mu) + \frac{1}{1-\gamma} \mathbb{E}_{s\sim d_\mu} \bigg[ \sum_z \omega_\theta(z\mid s)\,F_\theta(s,z) \bigg],\]

其中我把专家层的优势聚合写成

\[F_\theta(s,z) := \sum_a \pi_\theta(a\mid s,z)\,A_\mu(s,a,z).\]

关键点:在原始的 $L_\mu(\pi_\theta)$ 里,路由分布是当前要更新的 $\omega_\theta$。也就是说,MoE 的 RL 训练不仅在更新 token 生成分布,也在更新路由器本身。

1)回放行为策略的路由(behavior-router replay / R3 类)

R3 的做法是:rollout 时记录推理端实际命中的专家集合 $M_\mu(s)$,训练时强制当前策略只在该集合内路由。可以把它写成对路由分布的“条件化投影”:

\[\omega_\theta^{\text{R3}}(z\mid s) := \frac{\omega_\theta(z\mid s)\,\mathbf{1}\{z\in M_\mu(s)\}} {\sum_{z'\in M_\mu(s)}\omega_\theta(z'\mid s)} .\]

从而训练时实际优化的 surrogate objective 变为

\[L_\mu^{\text{R3}}(\pi_\theta) = \mathcal{J}(\mu) + \frac{1}{1-\gamma} \mathbb{E}_{s\sim d_\mu} \bigg[ \sum_{z\in M_\mu(s)} \omega_\theta^{\text{R3}}(z\mid s)\,F_\theta(s,z) \bigg].\]

和原始 $L_\mu(\pi_\theta)$ 对比可以看到,R3 并没有让 $\omega_\theta$ 逼近 $\omega_{\text{old}}$ 或 $\omega_\mu$;它做的是:

  • 把对 $z\sim\omega_\theta$ 的期望,改成了对 $z\sim\omega_\theta(\cdot\mid z\in M_\mu(s))$ 的条件期望
  • 等价地说,把路由的可行 support 缩到了 $M_\mu(s)$。

因此 R3 训练的是一个“被行为路由集合条件化后的 surrogate objective”,而不是原来的 $L_\mu(\pi_\theta)$。 好处是显著降方差、提升稳定性;代价是在每个状态上都收缩了路由器探索 / 更新的自由度

2)回放参考策略的路由(reference-router replay)

另一类 routing replay 复用的是参考策略(old policy)的路由器 $\omega_{\text{old}}$。这等价于训练一个混合策略

\[\hat\pi_\theta(a,z\mid s) := \omega_{\text{old}}(z\mid s)\,\pi_\theta(a\mid s,z),\]

对应 surrogate objective 为

\[L_\mu^{\text{ref-replay}}(\pi_\theta) = \mathcal{J}(\mu) + \frac{1}{1-\gamma} \mathbb{E}_{s\sim d_\mu} \bigg[ \sum_z \omega_{\text{old}}(z\mid s)\,F_\theta(s,z) \bigg].\]

这意味着:

  • 在 surrogate objective 中,路由器被固定为旧路由器,路由相关的“参考 vs 目标”差异在 loss 里被直接抹掉;
  • 训练对“新路由器 $\omega_\theta$ 是否偏离 $\omega_{\text{old}}$”不再敏感,于是路由不一致导致的不稳定被绕开。

但注意这同样是换目标

  • 真实策略空间里的 $\alpha_0$ 并没有因此变小,只是被“用旧路由器重定义目标”而在 loss 中不可见;
  • 路由器的学习被强行冻结或极度削弱。

路由回放只是在改写 surrogate objective

把两类 replay 放在一起看,它们的共同点是:

  1. 优化的都不是原始的 $L_\mu(\pi_\theta)$,而是某个“路由被条件化 / 替换后的 surrogate objective”。
  2. 它们没有直接收缩三策略 TRPO 下界里的 $\alpha_0,\alpha_1$。replay 让路由不匹配不再显式出现在 loss 中,但不匹配在真实策略距离里仍然存在。
  3. 实践上是在“用偏差换方差”:回放往往显著降低方差、提升稳定性,但也可能限制了 MoE 在 RL 目标下学到更优的路由模式。

所以,从三策略 TRPO 的视角,更准确的理解是:

routing replay 是一种 surrogate objective 的改写,而不是对 $\alpha_0$ 或 $\alpha_1$ 的直接实现。

小结

如果把这篇文章压缩成一句话,就是:

许多“大模型 RL 训推不一致”和“异步训练”问题,在本文的视角下,其实都可以理解为:在 TRPO 框架下,当行为策略 $\mu$ 和参考策略 $\pi_{\theta_{\text{old}}}$ 不一致时,二者之间的偏移($\alpha_1$)被严重低估了。

从两策略到三策略,我们做的事情其实很简单:

  • 把 TRPO 的下界从“旧策略 vs 新策略”的叙述,改写成“行为策略 – 参考策略 – 目标策略”三者的关系;
  • 显式地拆出了两个 TV 距离:
    • 约束 1:参考 vs 目标 $\alpha_0$,对应 PPO / GRPO / GSPO 等工作里最常见的 KL / clip / trust region;
    • 约束 2:行为 vs 参考 $\alpha_1$,对应异步框架、训推差异、MoE 路由、kernel 非确定性等现实因素;
  • 得到了一个非常直接的结论: 替代目标 $L_\mu(\pi_\theta)$ 和真实性能 $\mathcal{J}(\pi_\theta)$ 的 gap 正比于 $\alpha_0 + \alpha_1$。

在这个视角下(当然这只是众多可能视角之一):

  • Decoupled PPO / AReaL 可以被看作是在形式上承认“三策略存在”,并尝试在目标函数上将“行为分布”和“参考策略”解耦;
  • TIS、IcePop、MIS、WTRS 则是通过 IS 或者掩码机制在样本层面实施”约束 2”:
    • TIS:用 token-level 截断权重削弱比率过大样本的影响;
    • IcePop:在 MoE 场景下用 token-level 双侧掩码硬性丢弃”极端不一致”的 token;
    • MIS:在 sequence-level 直接屏蔽整条”比率过大”的轨迹;
    • WTRS:在 token-level 检测比率过小的信号,一旦发现则在 sequence-level 拒绝整条轨迹;
  • routing replay(路由回放)在三策略 TRPO 的视角下更像是“改写 surrogate objective”而非“直接实现约束”:无论回放行为路由(R3 类)还是回放参考路由,它们都把原本的 $L_{\mu}(\pi_{\theta})$ 改成了一个路由被条件化/替换后的 surrogate objective,用一定的目标偏差与路由学习自由度的收缩换取降低方差与提升稳定性。因此它并不会真正收缩 $\alpha_0$ 或 $\alpha_1$,而是让路由不一致在 loss 中“不可见”;
  • 《RL 老训崩?训推差异是基石》、以及前文提到的 Defeating Nondeterminism in LLM Inference 等工程经验,则可以理解为在系统侧和数值实现侧,尽可能把 $\alpha_1$ 压低,让算法层的假设不至于完全失效。

从这个统一视角出发,也许有助于回答几个实际问题(这里只是抛几个开放性问题):

  • 在什么条件下,我们还能把“大模型 RL 训练”理解成某种意义上的“近似 TRPO / PPO”?
  • 对一个具体的 RL 系统,我们究竟应该把主要精力花在:
    • 收紧 $\alpha_0$(更强的 KL / 更稳的 sequence-level 目标),还是
    • 压低 $\alpha_1$(更一致的训推框架、更激进的 MIS / TIS / IcePop)?
  • 在 MoE、异步采样、复杂 agent workflow 这些现实设定下,我们还能安全地假装“$\mu \approx \pi_{\theta_{\text{old}}}$”多久?

本文只是在 TRPO 这个老框架上做了一个非常“最小化”的延展,把“三策略”显式写出来,并用它来整理现有的一些工作。难免有理解偏差或遗漏之处,如果你也关注实际大模型 RL 训练的情况,欢迎把你自己的设定抽象成“$\mu,\pi_{\theta_{\text{old}}},\pi_\theta$ 三者的关系”,再回头看看 Theorem 2 里的那条不等式,或许会有不一样的直观感受。

@misc{WangZhang2025ThreePolicyTRPO,
  author       = {Wang, Xihuai and Zhang, Shao},
  title        = {From Two Policies to Three: Extending TRPO under Behavior-Reference Policy Mismatch in LLM RL},
  year         = {2025},
  month        = nov,
  day          = {15},
  url          = {https://xihuai18.github.io/reinforcement-learning/2025/11/15/three-policy-en.html},
  urldate      = {2025-11-23}
}