1. 首页
  2. 精选文章
  3. 人大 & 京东|关于 RL中 Off-Policy 修正,我们可能一直在走弯路

人大 & 京东|关于 RL中 Off-Policy 修正,我们可能一直在走弯路

  • 发布于 2026-07-10
  • ·
  • 2 次阅读
  • ·
  • ·

做 LLM RL 后训练,最干净的做法本该是on-policy:拿当前策略 \pi_\theta现采一批数据,算梯度,更新,再采下一批。policy gradient的理论就建立在"数据来自当前策略"这个前提上,只要严格on-policy,梯度就是无偏的,训练也最稳。

问题是,严格 on-policy 太贵了。每更新一步就要重新 rollout 一整批长序列,而 LLM 的自回归生成本身就是整个 pipeline 里最慢的一环。为了把 GPU 喂饱、把吞吐提上去,工程上普遍会利用异步rollout、样本复用等技术。这些手段的共同代价是——训练数据不再来自当前策略\pi_\theta,而是来自一个"慢半拍"的旧策略\pi_{\theta_{\rm old}}

于是我们被迫回到 off-policy 的世界:数据和模型之间存在分布漂移,而且复用次数越多、异步程度越高,漂移越严重。后果是实实在在的:梯度估计有偏、训练不稳定,严重时直接崩溃。

现状:大家都在 clip,但 clip 是在丢信号

针对off policy问题,标准的修正手段是重要性采样(Importance Sampling),每个 token 乘一个比值:

w_t = \frac{\pi_\theta(y_t \mid x, y_{<t})}{\pi_{\theta_{\rm old}}(y_t \mid x, y_{<t})}

理想情况下,整条序列应该乘一个统一的修正系数w(\theta)=\prod_{t=1}^T w_t。但问题在于:这个乘积在长序列上会指数级爆炸或衰减,梯度直接炸了。

于是实际工程里做了这么个近似:把乘积拆开,每个 token 只用自己的w_t独立修正,即梯度估计变成 \sum_tw_tA\nabla\log\pi_\theta(y_t)。这一近似等价于假设不同位置的修正彼此独立,忽略掉了序列层面的累积偏差。但只要w_t\approx 1(即新旧策略足够接近),近似就是可接受的。

问题是,训练过程中策略一定会漂移,w_t偏离1越来越远。为了不让少数极端w_t掀翻整个batch,出现了 clipping——GRPO clip、DAPO clip-higher、GSPO 等等,本质都是在"压"这个比值。

Clipping 的trade-off很清楚:它靠牺牲信息换稳定。那些highly off-policy的token梯度被直接截掉,信号也就丢了。

换个思路:不再"压制"off-policy token,是把它"转"成 on-policy

回到问题的根源:数据是 采的,所以需要乘 来修正。那如果——这个 token 本身就可以被视为从 采的呢?

这就引出了​**接受-拒绝采样(Rejection Sampling)**​。它解决的问题是:目标分布 (target)难以直接采样,但存在一个易采的 proposal 分布 ,即存在常数 使 对所有 成立。算法很简单:从 采一个样本 ,再以概率 接受它,否则丢弃重采。数学上可以证明接受下来的样本严格服从 。

把这个框架套到 off-policy 上,proposal 和 target 是现成的:数据由旧策略 采出(proposal),而我们想要的是当前策略 下的样本(target)。于是对序列每个位置 独立做一次接受-拒绝判定。

对应地,上界常数 取该位置全词表上的最大比值

M_t = \max_{v \in \mathcal V} \frac{\pi_\theta(v \mid x, y_{<t})}{\pi_{\theta_{\rm old}}(v \mid x, y_{<t})}

然后以概率w_t/M_t接受该token:

z_t \sim \mathrm{Bernoulli}\!\left(\frac{w_t}{M_t}\right)

关键性质:如果z_t = 1(接受),那么y_t的条件分布精确等于\pi_\theta。也就是说,这个 token 已经是on-policy的,不需要任何修正。

于是我们得到一个极简的修改——把重要性权重改成:

\widetilde w_t = \begin{cases} 1, & z_t = 1 \quad \text{(on-policy, 不需要修正)} \\ w_t, & z_t = 0 \quad \text{(off-policy, 照常修正)} \end{cases}

剩下的事情就是把这个\widetilde w_t塞回任何一个policy gradient 目标里。GRPO、DAPO、GSPO 全都只需要改这一处。 我们把这个方法叫 Selective Importance Sampling(SIS)

工程细节:Top-K 近似,几乎零开销

全词表上算 M_t=\max_{v\in \mathcal V}\pi_\theta/ \pi_{\theta_{\rm old}}显然不现实。但 LLM 的概率分布极其集中——top几个token就占了绝大部分概率质量。所以我们只在\pi_{\theta_{\rm old}}的top-K集合\mathcal V_K里求max:

\widehat M_t = \max_{v \in \mathcal V_K} \frac{\pi_\theta(v)}{\pi_{\theta_{\rm old}}(v)}

可以证明,此时接受 token 的条件分布与真实\pi_\theta的TV距离恰好等于top-K之外的tail质量\xi_K。实测 K=5\sim 10\xi_K就已经很小了。

开销几乎为零:rollout和训练阶段本来就要算logits,SIS只是从已算好的logits里挑top-K做一次采样,实测额外时间消耗 < 1%。

理论保障:SIS 接受 token 越多,梯度估计偏差越小

token-level 近似用逐 token 的 w_t 替代了整条序列的统一修正,这会让估计出的梯度偏离真实梯度。把这个偏差记为token-level与 sequence-level梯度估计之差E = \|g_{\rm seq} - g_{\rm tok}\|,可以推出:

E \le |A| \cdot (e^D - 1) \cdot \sum_t \|s_t\|, \quad \text{其中 } D = \sum_t |\log w_t|

D是"累计 log重要性偏差"——它衡量behavior policy和target policy在整个序列上的分布偏移量。D越大,近似误差指数级膨胀。

SIS的改动直接作用于D

D_{\rm SIS} = \sum_t (1 - z_t) \cdot |\log w_t| \le D

因为接受token的\|\log \widetilde w_t\| = 0,直接从求和里扣掉。接受得越多,D越小,界越紧。 这就是SIS有效性的理论支撑。

理论说的"D 变小"在训练里能直接看到:两个任务上,GRPO+SIS(蓝)的 D全程低于Vanilla GRPO(红),中间灰色Reduction区域就是 SIS 明显减少的那部分偏差。

一个需要说清楚的点:SIS 并不声称对整个梯度估计"无偏"。它保证的是接受分支上的token是 on-policy 的,并且相对 vanilla token-level IS,向真梯度 \nabla J 的偏差 bound 被严格收紧(D\to D_{\rm SIS})。

实验结果:

性能优异:

三种 backbone、三种算法、十个 benchmark,一致涨点

SIS 天然和所有 trick 正交

一个观察:GRPO、DAPO、GSPO、CISPO、DPPO-TV、Clip-Cov等稳定性技巧,本质都是在"改造"重要性权重 w\mapsto g(w)。而SIS做的事完全不一样——它在token层面做二分

  • 接受 → \widetilde w=1(直接消除修正需求)
  • 拒绝 → 交给任意g(w)处理

也就是说,SIS可以和任何trick自由组合。SIS(vanilla),即接受token用w=1、拒绝token不做任何额外处理(g(w)=w),就已经打过了绝大多数trick方法(相对GRPO 涨 5.63%)。再叠上DAPO的clip-higher,达到最佳 +12.4%

这很像一个"保底+上限"结构:SIS自己就是保底,叠什么trick都能再往上走。

稳定性:stale rollout、MoE 路由 mismatch

做RL训练的人都知道,真实场景比标准benchmark脏得多。我们测了三个压力场景:

Stale rollout(N=4/8/16 数据陈旧度)。baseline随 staleness增加明显退化;SIS在每个staleness级别都稳压baseline,且退化幅度更小。

MoE 路由 mismatch。Qwen3-30B-A3B 上,vanilla DAPO 直接训练崩溃。R3(专门解决 MoE 路由 mismatch 的方法)与SIS各能缓解一部分;SIS+R3 稳定性最强、准确率最高,二者从不同角度修正 off-policy,可以互补叠加。

Token 层面的可解释性:SIS 在"挑"什么 token?

我们对比了被接受和被拒绝的 token 的词云分布:

  • 接受的主要是数学推理相关 token(fracsqrt 等)
  • 拒绝的主要是格式化字符和网页 artifact(image、markdown 标记等)

SIS天然倾向于把和目标推理分布一致的token转成on-policy,把"噪声 token"留给IS修正。有趣的是:这个行为不是我们设计的,是rejection sampling机制自动产生的。

总结

过去应对 off-policy,主流思路是通过压制偏离太远的 token 梯度以换取稳定性。SIS换了个角度:与其压制,不如转换——用token级 Rejection Sampling 把 off-policy token直接变回 on-policy,从根上解决这一问题。方法简单、通用、有理论保障。


本文基于我们近期的工作 Selective Importance Sampling(SIS),代码即将放出。欢迎讨论、转发,也欢迎直接接到你手头的Post-train pipeline 里试试。更多细节可以参考论文或与我们联系。

Paper: Turning Off-Policy Tokens On-Policy: A Plug-in Approach for Improving LLM Alignment
https://arxiv.org/abs/2607.04728
目录