帮你快速理解、总结文档立即下载

CISPO(剪裁重要性采样策略优化)

最近更新时间:2026-10-19 21:18:02
我的收藏
CISPO(Clipped Importance Sampling Policy Optimization,剪裁重要性采样策略优化)是一种在大语言模型 RL/Alignment(对齐与强化学习)阶段使用的策略梯度(Policy Gradient)损失函数算法(Chen et al., 2024;Khatri et al., 2024)。CISPO 使用裁剪后重要性比率作为系数的策略梯度,与直接裁剪目标函数的 PPO 不同,CISPO 裁剪的是比率本身,并将其从计算图中分离,再用它对对数概率加权。

CISPO 的目标函数为:

与 PPO 的关键区别:裁剪掩码是分离的(sg = 停止梯度),因此它只作为一个纯粹的加权系数,而不会影响梯度流动。

实现

# Compute probability ratio
prob_ratio = torch.exp(target_logprobs - sampling_logprobs)
# Apply clipping
clipped_ratio = torch.clamp(prob_ratio, clip_low_threshold, clip_high_threshold)
# Compute CISPO objective (detach the clipped ratio — this is the key difference from PPO)
cispo_objective = clipped_ratio.detach() * target_logprobs * advantages
# CISPO loss is negative of objective
loss = -cispo_objective.sum()

输入张量

Key
Shape
说明
target_tokens
(N,)
目标 token ID(来自采样器 q)
logprobs
(N,)
这些 token 的 sampling_logprobs
advantages
(N,)
RL 中的优势值

输出张量

Key
Shape
说明
logprobs
(N,)
这些 token 的 target_logprobs

诊断信息

loss:sum(标量):CISPO 损失之和

裁剪阈值的选择

由于裁剪后的比率是对 log pθ 的一个分离系数(而不是像 PPO 那样直接裁剪目标函数本身),CISPO 永远不会把某个 token 的梯度置零 —— 它只是约束系数的量级。这正是阈值(尤其是下界)的取值之所以重要的原因。

默认是单侧裁剪。CISPO 默认关闭下界,只对上限作封顶(clip_low_threshold=0.0、clip_high_threshold=4.0),因此不传 loss_fn_config 就能得到这一行为。若要显式指定:
fwd_bwd_future = await training_client.forward_backward_async(
data=data,
loss_fn="cispo",
loss_fn_config={"clip_low_threshold": 0.0, "clip_high_threshold": 4.0}
)
fwd_bwd_result = await fwd_bwd_future.result_async()
在任何场景下这都是一个安全的默认值。没有下界时,最坏情况不过是系数退回到普通的重要性采样权重,而这本身表现良好。相反,一个正的 clip_low_threshold(例如 0.8)会为那些比率已远低于 1 的 token 也作托底,这些是策略已经远离的 token,从而抹掉了重要性采样为陈旧 token 提供的衰减作用。

在 on-policy 下这很少产生影响,但在 off-policy(异步场景,采样器 q 落后于训练器 pθ)下,它可能形成正反馈循环:采样器与训练器之间的 KL 增大,更多 token 落到区间之外,偏差增大,KL 进一步增大。因此,去掉下界几乎没有代价,在 off-policy 下却有实实在在的收益。

这与引入并扩展 CISPO 的两篇论文都一致。MiniMax-M1(Chen et al., 2024)报告称:“我们没有对 IS 权重施加下界,而是把 ϵlowIS 设为一个很大的值;我们只调了 ϵhighIS。”ScaleRL(Khatri et al., 2024)使用 clip(r, 0, ϵmax),并发现 CISPO 对上限基本不敏感, ϵmax 取 4、5、8 时表现相同。因此在该范围内取一个宽松的上限是安全的默认值。