SIS:不硬clip,大部分token其实可转为on-policy

关于重要性采样系数,之前已经介绍过不少了,不过主要方案还是 clip,比如《GRPO“又一背锅侠”:Clip的各种拉扯 | 长琴[1]》中介绍的一系列文章,更进一步的优化是《GRPO优化在继续——CISPO和熵 | 长琴[2]》的 sg 和 特定 token mask,Minimax 后续模型也都用了自家的 CISPO,但是依然没有脱离 clip 和超参数设置。

Clip 有助于训练稳定,这没问题,但它最大的问题是会抑制来自高偏差策略样本的梯度,从而丢失有价值的学习信号。本文我们介绍的 SIS(Selective Importance Sampling)来自论文 Turning Off-Policy Tokens On-Policy: A Plug-in Approach for Improving LLM Alignment (arxiv:2607.04728)[3](文章图片、公式均来自此论文),在这个方向上再进一步。他们的出发点很简单——将那些 off-policy 的 token 转为 on-policy,自然就不需要 IS 了。具体怎么做的呢?他们将旧策略作为建议分布,执行 token 级别的拒绝测试:被接受的 token 自然就可以看作 on-policy 的,被拒绝的那就保持原来的 IS。

SIS 是即插即用的,仅修改重要性采样系数,而且它还有个正的外部性——提升训练的稳定性。关于稳定性我们在《GRPO“第一背锅侠”Token Level X:DAPO/DrGRPO与GSPO/GMPO的殊途同归 | 长琴[4]》提过,后面又专门写了两篇相关文章:《稳定压倒一切:MoE RL 训推不一致问题及解决策略 | 长琴[5]》、《MoE RL 训练不稳定性再思考:训推不一致,还是采样噪声? | 长琴[6]》,感兴趣的同学可以进一步阅读。

这里的问题或麻烦可能在于引入一个拒绝测试,不过论文给出了一个近似做法,使整个计算保持较低计算成本。效果和稳定性双全(见下表),值得一试。

核心图先放这里:

从off到on

来看看具体怎么做吧。对于每个位置 tt,计算常数:

Mt=maxvVπθ(vx,y<t)πθold (vx,y<t)(1)M_t=\max _{v \in \mathcal{V}} \frac{\pi_\theta\left(v \mid x, y_{<t}\right)}{\pi_{\theta_{\text {old }}}\left(v \mid x, y_{<t}\right)} \tag{1}

其中,V\mathcal{V} 表示词表,给定 token yty_t 和重要性系数:

wt(θ)=πθ(ytx,y<t)πθold (ytx,y<t)(2)w_t(\theta) = \frac{\pi_\theta\left(y_t \mid x, y_{<t}\right)}{\pi_{\theta_{\text {old }}}\left(y_t \mid x, y_{<t}\right)} \tag{2}

引入接受指示器:

ztBernoulli(wt(θ)Mt)(3)z_t \sim \operatorname{Bernoulli}\left(\frac{w_t(\theta)}{M_t}\right) \tag{3}

zt=1z_t=1 表示接受,意味着 yty_t 精确服从目标分布 πθ(ytx,y<t)\pi_{\theta}\left(y_t \mid x, y_{<t}\right)。公式上来看,wwMtM_t 接近,接受的概率越大。简单理解,其实就是把原来 clip 的给放开了,告诉 policy,没关系,虽然 ww 很大,但和咱们要的一样,你放心去更新。这里和 clip 还有个更本质的区别:clip 判断是否越界只看采样到的那一个 token 的比值,噪声很大;而拒绝测试的 MtM_t 是在整个词表分布上比较新旧策略,天然平滑得多

w~t(θ)={1,zt=1(on-policy, weight removed),wt(θ),zt=0(off-policy, weight retained),(4)\widetilde{w}_t(\theta) = \begin{cases} 1, & z_t = 1 \quad (\text{on-policy, weight removed}), \\ w_t(\theta), & z_t = 0 \quad (\text{off-policy, weight retained}), \end{cases} \tag{4}

实验结果表明,无论是数学还是 agentic search,接受率都很高(后者偏低,因为交错使用多种工具会在策略之间引入更大的分布偏移),说明有相当大一部分 token 可以从 off-policy 转为 on-policy。

如上图 A 所示,这个比例比想象中要高不少。不过好像也正常,最近不是有些研究表明 RL 只需更新少量参数么……比如 Is One Layer Enough? Training A Single Transformer Layer Can Match Full-Parameter RL Training (arxiv:2607.01232)[7],之前也有过类似研究,就是说 RL 其实并不会更新很多参数。这个我们后面专门起一篇来聊。

近似计算

现在考虑计算问题,计算式 1 的最大常数需要在整个词表上进行,这不太现实,文章引入 top-K 近似。这里的依据是 LLM 的概率集中在词表的一个小子集上,因此可以通过将最大值计算限制在前 K 个词汇上来近似 MtM_t

M^t=maxvVKπθ(vx,y<t)πθold(vx,y<t),VK=TopK(πθold(x,y<t),K)(5)\widehat{M}_t = \max_{v \in \mathcal{V}_K} \frac{\pi_\theta(v \mid x, y_{<t})}{\pi_{\theta_{\text{old}}}(v \mid x, y_{<t})}, \quad \mathcal{V}_K = \operatorname{TopK}(\pi_{\theta_{\text{old}}}(\cdot \mid x, y_{<t}), K) \tag{5}

这里一个很自然的问题:K 取多少?请看上图 B,Agent 要的多一些,总体来看 Top10 就差不多 90% 了(ξK\xi_K 是目标策略在 VK\mathcal{V}_K 外的概率质量 ),这可省了相当多计算。简单来说,不在 VK\mathcal{V}_K 内的 token 不参加拒绝测试,直接保留原 IS 系数;在 VK\mathcal{V}_K 内的 token 比值天然 ≤ M^t\widehat{M}_t,接受概率恒合法。不过由于被接受 token 服从限制在 VK\mathcal{V}_K 上的条件分布(与真目标的 TV 距离恰好为 ξK\xi_K),所以图 B 的 ξK\xi_K 不只是“覆盖率指标”,也是近似版 SIS 的精确误差。

除了上面说的,SIS 还复用了生成过程中旧策略的 Logit 和训练过程中当前策略的 Logit,无需额外的模型前向传播。因此,每个 token 仅仅要「额外」做的是:在旧策略下选择 top-K 个候选,并从缓存的 Logit(注意,新策略不需要重新算)中计算它们的接受概率(K 个位置的 logprob 一减就行了),这只会增加每个 step ∼1% 的实际运行时间开销。

背景知识

我们先把目标写出来(简单起见,省略 KL):

J(θ)=ExD,yπθ(x)[r(x,y)](6)\mathcal{J}(\theta) = \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(\cdot \mid x)} [r(x, y)] \tag{6}

写成求和(更准确的应该是积分)形式:

J(θ)=xP(x)yπθ(yx)r(x,y)(7)\mathcal{J}(\theta) = \sum_x P(x) \sum_y \pi_\theta(y|x) r(x, y) \tag{7}

对参数 θ\theta 求导:

θJ(θ)=xP(x)yθπθ(yx)r(x,y)(8)\nabla_\theta \mathcal{J}(\theta) = \sum_x P(x) \sum_y \nabla_\theta \pi_\theta(y|x) \cdot r(x, y) \tag{8}

注意,P(x)P(x)rr 都不含 θ\theta。使用对数求导技巧:

θJ(θ)=xP(x)y[πθ(yx)θlogπθ(yx)]r(x,y)(9)\nabla_\theta \mathcal{J}(\theta) = \sum_x P(x) \sum_y \left[ \pi_\theta(y|x) \cdot \nabla_\theta \log \pi_\theta(y|x) \right] \cdot r(x, y) \tag{9}

重新写成期望:

θJ(θ)=ExD,yπθ(x)[r(x,y)θlogπθ(yx)](10)\nabla_\theta \mathcal{J}(\theta) = \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(\cdot \mid x)} \left[ r(x, y) \nabla_\theta \log \pi_\theta(y \mid x) \right] \tag{10}

直接使用奖励 r(x,y)r(x,y) 会导致方差很大,所以一般都会减掉一个基线,用 AA 代替(梯度期望不变),这点我们在《TRPO深度拆解:为什么做后训练应该读懂TRPO | 长琴[8]》等以往文章中提到过。

于是就得到下面这个常见的梯度形式:

θJ(θ)=ExD,yπθ(x)[A(x,y)θlogπθ(yx)](11)\nabla_\theta \mathcal{J}(\theta) = \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(\cdot \mid x)} \left[ A(x, y) \, \nabla_\theta \log \pi_\theta(y \mid x) \right] \tag{11}

有同学可能会问,这里好像没有重要性采样系数?是的,还没出来。因为梯度公式要求样本来自当前策略,但 rollout 来自旧策略,重要性采样系数就是用来把旧策略样本下的估计翻译回新策略。做法很简单,我们直接在公式 9 里面乘一个 πθold(yx)πθold(yx)\frac{\pi_{\theta_\text{old}}(y|x)}{\pi_{\theta_\text{old}}(y|x)},得到:

θJ(θ)=xP(x)y[πθold(yx)πθ(yx)πθold(yx)θlogπθ(yx)]r(x,y)(12)\nabla_\theta \mathcal{J}(\theta) = \sum_x P(x) \sum_y \left[\pi_{\theta_\text{old}}(y|x) \frac{ \pi_\theta(y|x)}{\pi_{\theta_\text{old}}(y|x)} \cdot \nabla_\theta \log \pi_\theta(y|x) \right] \cdot r(x, y) \tag{12}

写成期望形式,并把 rr 换成 AA,我们就得到了最为常见的带重要性采样系数的梯度形式:

θJ(θ)=ExD,yπθold(x)[w(θ)A(x,y)θlogπθ(yx)](13)\nabla_\theta \mathcal{J}(\theta) = \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_{\theta_{\text{old}}}(\cdot \mid x)} \left[ w(\theta) A(x, y) \nabla_\theta \log \pi_\theta(y \mid x) \right] \tag{13}

其实相关背景知识我们在《为什么TRPO在LLM里不能用?——FiberPO的起点 | 长琴[9]》、《你可能没那么懂 SFT:SFT 与 RL 的爱恨纠葛 | 长琴[10]》、《TRPO深度拆解:为什么做后训练应该读懂TRPO | 长琴[8]》、《GRPO“第一背锅侠”Token Level X:DAPO/DrGRPO与GSPO/GMPO的殊途同归 | 长琴[4]》等多篇文章中已经做过介绍,这里无非就是再重复一遍。

Token 粒度代理估计为(注意不是恒等变形,后面会有进一步推导):

g~(θ)=Eyπθold(x)[t=1Twt(θ)A(x,y)θlogπθ(ytx,y<t)](14)\tilde{g}(\theta) = \mathbb{E}_{y \sim \pi_{\theta_{\text{old}}}(\cdot \mid x)} \left[ \sum_{t=1}^T w_t(\theta) A(x, y) \nabla_\theta \log \pi_\theta(y_t \mid x, y_{<t}) \right] \tag{14}

我们在《为什么TRPO在LLM里不能用?——FiberPO的起点 | 长琴[9]》中提到过,虽然公式推导是严格的,但实际我们只能拿到近似结果,一是因为蒙特卡洛估计,另外就是策略偏离太远,ww 太大会导致方差爆炸。所以,所有 TRPO 的变种算法都限制策略不能离得太远。

理论证明

好了,有了前面的背景知识,我们可以开始证明了。主要目的是回答这个核心问题:「当行为策略发生漂移时,token 级与序列级梯度估计之间的差距如何增长,SIS 能否在理论上证明有效缩小这一差距?」

为了回答这个问题,我们首先刻画近似误差 E=gseqgtokE = \|g_{\text{seq}} - g_{\text{tok}}\|,即采用序列级修正比 w(θ)w(\theta) 的真实梯度 gseqg_{\text{seq}} 与采用 token 级修正比 wt(θ)w_t(\theta) 的代理梯度 gtokg_{\text{tok}} 之间的差距。即公式 13 和公式 14 之间的差距。

首先看定理 1,对一个长度为 TT 的序列,有:

EA(x,y)(eD1)t=1Tst(15)E \leq |A(x,y)| \left(e^{D} - 1\right) \sum_{t=1}^{T} \|s_t\| \tag{15}

其中,D=t=1Tlogwt(θ)D = \sum_{t=1}^{T} |\log w_t(\theta)|st=θlogπθ(ytx,y<t)s_t = \nabla_\theta \log \pi_\theta(y_t \mid x, y_{<t})

现在来证明这个定理。给定一个 response,seq 级别的梯度式可以写为:

gseq=A(x,y)(j=1Twj(θ))(t=1Tst)(16)g_{seq} = A(x, \mathbf{y}) \left( \prod_{j=1}^T w_j(\theta) \right) \left( \sum_{t=1}^T s_t \right) \tag{16}

先看后面那个括号,对比式 13,因为整句话的概率等于每个 token 条件概率的连乘,因此对全概率取对数后,其梯度会变成各个 token 梯度的求和。对两边同时求关于 θ\theta 的梯度,得到:

θlogπθ(yx)=t=1Tθlogπθ(ytx,y<t)=t=1Tst(17)\nabla_\theta \log \pi_\theta(y\vert{}x) = \sum_{t=1}^T \nabla_\theta \log \pi_\theta(y_t \vert{} x, y_{<t}) = \sum_{t=1}^T s_t \tag{17}

再看第一个括号的 ww 连乘,这里和 sts_t 的展开一个道理:

w(θ)=πθ(yx)πθold(yx)=j=1Tπθ(yjx,y<j)πθold(yjx,y<j)=j=1Twj(θ)(18)w(\theta) = \frac{\pi_\theta(\mathbf{y}\vert{}x)}{\pi_{\theta_{old}}(\mathbf{y}\vert{}x)} = \prod_{j=1}^T \frac{\pi_\theta(y_j\vert{}x, \mathbf{y}_{<j})}{\pi_{\theta_{old}}(y_j\vert{}x, \mathbf{y}_{<j})} = \prod_{j=1}^T w_j(\theta) \tag{18}

gtokg_\text{tok} 可以写为:

gtok=A(x,y)t=1Twt(θ)st(19)g_{tok} = A(x, \mathbf{y}) \sum_{t=1}^T w_t(\theta) s_t \tag{19}

可以看到,它和式 16 非常相似,我们展开看就更直观了,先看 gseqg_\text{seq}

gseq=A(x,y)[(j=1Twj(θ))s1+(j=1Twj(θ))s2++(j=1Twj(θ))sT](20)g_{seq} = A(x, \mathbf{y}) \cdot \left[ \left(\prod_{j=1}^T w_j(\theta)\right)s_1 + \left(\prod_{j=1}^T w_j(\theta)\right)s_2 + \dots + \left(\prod_{j=1}^T w_j(\theta)\right)s_T \right] \tag{20}

再看 gtokg_\text{tok}

gtok=A(x,y)[j=1Tw1(θ)s1+w2(θ)s2++wT(θ)sT](21)g_{tok} = A(x, \mathbf{y}) \cdot \left[ \vphantom{\prod_{j=1}^T} w_1(\theta)s_1 + w_2(\theta)s_2 + \dots + w_T(\theta)s_T \right] \tag{21}

这里的关键区别是:对 gseqg_\text{seq} 来说,在第 tt 个 token 计算梯度 sts_t 时,它的权重是整句话所有 token 的权重连乘。这意味着什么呢?意味着即使某些 token 新旧策略概率很接近,但只要这句话里其他任何一个地方的新旧策略漂了,这个连乘积就会爆炸或塌陷,导致那些概率接近的 token 梯度受到牵连,这就是方差爆炸的根源。也就是说,每一个 token 的梯度都在被迫承受“全序列所有 token 累积的分布漂移”。

所以,gtokg_\text{tok} 其实是退而求其次的做法,它强行把未来和过去的权重全砍了,只保留了当前 token 的权重。但这样做的结果是,当新旧策略发生偏差时,gtokg_\text{tok} 可能会严重高估或低估正确的梯度大小(理论值是序列连乘的),再考虑 clip,很多时候会导致过大或过小更新。而 SIS 的做法是让新旧策略接近的 token 放开更新,而且还是精准更新,没有偏差。

好了,言归正传,回到证明。两种梯度的差异可以写为:

E=A(x,y)t=1T(j=1Twj(θ)wt(θ))stA(x,y)t=1T(j=1Twj(θ))wt(θ)st(22)E = \left\| A(x,y) \sum_{t=1}^{T} \left( \prod_{j=1}^{T} w_j(\theta) - w_t(\theta) \right) s_t \right\| \le |A(x,y)| \sum_{t=1}^{T} \left| \left( \prod_{j=1}^{T} w_j(\theta) \right) - w_t(\theta) \right| \|s_t\| \tag{22}

R=j=1Twj(θ)R=\prod_{j=1}^{T} w_j(\theta),根据logwt(θ)logwt(θ)\log w_t(\theta) \le \vert{}\log w_t(\theta)\vert{}ex1ex1\vert{}e^x - 1\vert{} \le e^{\vert{}x\vert{}} - 1 有:

Rwt(θ)=wt(θ)jtwj(θ)1=wt(θ)ejtlogwj(θ)1wt(θ)(ejtlogwj(θ)1)elogwt(θ)(ejtlogwj(θ)1)=elogwt(θ)+jtlogwj(θ)elogwt(θ)=ej=1Tlogwj(θ)elogwt(θ)=eDelogwt(θ)eD1(23)\begin{aligned} |R - w_t(\theta)| &= w_t(\theta) \left| \prod_{j \neq t} w_j(\theta) - 1 \right| \\ &= w_t(\theta) \left| e^{\sum_{j \neq t} \log w_j(\theta)} - 1 \right| \\ &\le w_t(\theta) \left( e^{\sum_{j \neq t} |\log w_j(\theta)|} - 1 \right) \\ &\le e^{|\log w_t(\theta)|} \left( e^{\sum_{j \neq t} |\log w_j(\theta)|} - 1 \right) \\ &= e^{|\log w_t(\theta)| + \sum_{j \neq t} |\log w_j(\theta)|} - e^{|\log w_t(\theta)|} \\ &= e^{\sum_{j=1}^{T} |\log w_j(\theta)|} - e^{|\log w_t(\theta)|} \\ &= e^D - e^{|\log w_t(\theta)|} \\ &\le e^D - 1 \end{aligned} \tag{23}

其中,D=j=1Tlogwj(θ)D=\sum_{j=1}^{T} |\log w_j(\theta)|。代入式 22 就得到式 15。

可以看到,总对数重要性偏差 D 是控制近似误差的关键,这也和咱们刚刚的分析贴近,也解释了为什么当行为策略发生漂移时,off-policy 会迅速失稳。从公式上看,漂移导致 wt(θ)1w_t(\theta) \neq 1,进而 wt(θ)w(θ)=wt(θ)w_t(\theta) \neq w(\theta) = \prod w_t(\theta)

SIS 情况会咋样呢?我们将 wt(θ)w_t(\theta) 换成式 4 的 w~t(θ)\widetilde{w}_t(\theta),定理 1(式15)变为:

EA(x,y)(eDSIS1)t=1Tst(24)E \leq |A(x,y)| \left( e^{D_{\text{SIS}}} - 1 \right) \sum_{t=1}^{T} \|s_t\| \tag{24}

考虑式 4 的定义,有:

DSIS=t=1Tlogw~t(θ)=t=1T(1zt)logwt(θ)(25)D_{\text{SIS}} = \sum_{t=1}^{T} |\log \widetilde{w}_t(\theta)| = \sum_{t=1}^{T} (1 - z_t) |\log w_t(\theta)| \tag{25}

定义 C=t=1Tztlogwt(θ)0C = \sum_{t=1}^{T} z_t |\log w_t(\theta)| \geq 0,有 DSIS=DCDD_{\text{SIS}} = D - C \leq D,因为 f(u)=eu1f(u) = e^u - 1 严格递增,有:

eDSIS1=eDC1eD1(26)e^{D_{\text{SIS}}} - 1 = e^{D-C} - 1 \leq e^D - 1 \tag{26}

最终得到:

EA(x,y)(eDSIS1)t=1TstA(x,y)(eD1)t=1Tst(27)E \leq |A(x,y)| \left( e^{D_{\text{SIS}}} - 1 \right) \sum_{t=1}^{T} \|s_t\| \leq |A(x,y)| \left( e^{D} - 1 \right) \sum_{t=1}^{T} \|s_t\| \tag{27}

其实这点本身是非常直观的——w(θ)=wt(θ)w(\theta) = \prod w_t(\theta) 是由每个 off-policy 的 token 重要性系数 wt(θ)w_t (\theta) 共同贡献的,SIS 将大多数的 off-policy token 转为 on-policy token,这本来就减少了偏差,开头图里的 C 图也说明了这点。SIS 始终保持着比原始 GRPO 更低的偏差,这直接转化为更紧的近似误差界和更稳定的策略优化。论文甚至还做了个实验:完全关掉 clip,GRPO+SIS 依然胜过 clip 版 GRPO——标题的“不硬 clip”甚至可以是字面意思。

小结

本文主要介绍了 SIS(Selective Importance Sampling),它对重要性采样系数给出了新的优化思路——不 clip,哪怕动态的也不,而是通过 token 级拒绝测试,识别那些可以看作是 on-policy 的 token,剩余 token 保持原 clip 思路。最关键的是,这种 token 比例很高(60%-80%),这与“RL 只更新少量参数” 的研究相呼应,我们后面专门聊。工程上则通过 top-K 近似和新旧策略 logprob 复用,额外开销仅 ~1%。Clip 是稳定为先,但 SIS 告诉我们,稳定自然要,但不牺牲梯度也能获得。

Reference

[1] GRPO“又一背锅侠”:Clip的各种拉扯 | 长琴: https://yam.gift/2025/09/12/NLP/LLM-Training/2025-09-12-GRPO-Clip/
[2] GRPO优化在继续——CISPO和熵 | 长琴: https://yam.gift/2025/06/19/NLP/LLM-Training/2025-06-19-CISPO-and-Entropy/
[3] Turning Off-Policy Tokens On-Policy: A Plug-in Approach for Improving LLM Alignment (arxiv:2607.04728): https://arxiv.org/abs/2607.04728
[4] GRPO“第一背锅侠”Token Level X:DAPO/DrGRPO与GSPO/GMPO的殊途同归 | 长琴: https://yam.gift/2025/08/14/NLP/LLM-Training/2025-08-14-Token-Level-GSPO-GMPO/
[5] 稳定压倒一切:MoE RL 训推不一致问题及解决策略 | 长琴: https://yam.gift/2026/01/17/NLP/LLM-Training/2026-01-17-RL-MoE-Stable/
[6] MoE RL 训练不稳定性再思考:训推不一致,还是采样噪声? | 长琴: https://yam.gift/2026/01/22/NLP/LLM-Training/2026-01-22-RL-MoE-Stable-2/
[7] Is One Layer Enough? Training A Single Transformer Layer Can Match Full-Parameter RL Training (arxiv:2607.01232): https://arxiv.org/abs/2607.01232
[8] TRPO深度拆解:为什么做后训练应该读懂TRPO | 长琴: https://yam.gift/2026/05/11/NLP/LLM-Training/2026-05-11-TRPO/
[9] 为什么TRPO在LLM里不能用?——FiberPO的起点 | 长琴: https://yam.gift/2026/06/22/NLP/LLM-Training/2026-06-22-TRPO-Vanishing/
[10] 你可能没那么懂 SFT:SFT 与 RL 的爱恨纠葛 | 长琴: https://yam.gift/2026/06/01/NLP/LLM-Training/2026-06-01-SFT-vs-RL/