TCPO:Verifier 给的分数很稠密,但"分数"和"信用"从来就不是一回事

不知道大家有没有在训练多轮 agent 的时候遇到过这种别扭的场景:模型第一轮写了个 60 分的答案,第二轮改成 90 分,第三轮又手贱改回 60 分。你手里握着每一轮的 verifier 分数——60、90、60,信号够稠密了吧?但问题来了,第二轮那个"90"到底该奖励多少?第三轮那个"60"又该惩罚多狠?

直觉的答案是"看分数差"。但这个直觉是错的。一篇新论文(arXiv:2608.01667)把这个问题讲透了:分数衡量的是当前输出的质量,信用衡量的是这一轮对整个修正过程的贡献。这是两回事,而几乎所有现有的多轮 RL 方法都在混用它们。

核心摘要:这篇论文提出 TCPO(Turn-Level Credit Policy Optimization),把多轮 verifier 引导的 RL 中的信用分配重新定义为"分数到信用的转换"问题。方法用三类参照系来构造轮级优势——回顾历史最优的 retrospective credit、对照未来最优的 hindsight credit、以及对最不确定轮次做固定历史反事实采样的 counterfactual credit。效果上,Qwen3-4B 在 MATH-500 上 Pass@8 从 MT-GRPO 的 82.4% 提到 86.8%,DeepSeek-R1-Distill-Llama-8B 上四个任务全部压过 GVPO,且训练开销只增加 3%–5%。我的判断:这不是一个颠覆性的框架创新,但它把一个被广泛忽视的概念混淆讲清楚了,并用很干净的消融证明了"转换"这一步本身值多少钱。做 agent RL 的人都值得读。

论文信息: - 标题:TCPO: Turn-Level Credit Policy Optimization - 作者:Sicong Liao, Zhi Chen, Yaohua Tang(arXiv 页面未列出机构信息) - 提交日期:2026 年 8 月 3 日 - 链接:https://arxiv.org/abs/2608.01667


🎯 问题动机:稠密的分数 ≠ 稠密的信用

先交代一下背景。现在训练 LLM agent 的主流玩法是 verifier-guided multi-turn RL:模型生成一版答案,verifier(答案检查器、代码测试套件、环境模拟器)给个分数,模型拿着反馈再改,如此循环,直到成功或者轮数用尽。相比只看最终结果的单轮 RL,这个设置最大的卖点就是"过程反馈更丰富"。

但作者在引言里直接泼了盆冷水:更稠密的 verifier 分数,并不会自动带来更好的信用分配

他们举了三个具体的现象,每个都很扎心:

  1. 保持不等于进步:某个轮次拿了高分,但它可能只是守住了上一轮已经修好的状态。给它发和"修复错误"一样多的奖励,模型就学会了摸鱼。
  2. 延迟贡献:某个轮次分数没涨,但它做了关键的铺垫(比如定位到了真正的 bug 位置),成功发生在两轮之后。只看即时分数变化,这一轮的贡献完全是隐形的。
  3. 成功后退化:答案已经对了,模型又"优化"了一把,把对的改错了。trajectory-level 的方法把最终成功广播到所有轮次,等于连这个帮倒忙的家伙一起奖励了。

再看现有方法,个个都有盲区。trajectory-level 方法(比如经典 GRPO 直接搬过来用)把最终奖励撒给整条轨迹,失败尝试、有效修复、成功后退化混在一起发;直接拿逐轮分数当优势,奖励的是状态质量而不是边际贡献;看相邻轮次分数差的,既不知道当前状态有没有超过历史最优,也看不到未来的回报。

说实话,这个问题我之前在做代码修复 agent 的时候也隐约感觉到过——reward 曲线在涨,但仔细看轨迹,模型学会了"别乱动"而不是"会修复"。看到这篇论文把 preservation、regression、delayed repair 三种轮次类型明确拆开,还是挺有共鸣的。


🏗️ TCPO 怎么做:三个参照系翻译分数

TCPO 的核心思路一句话讲完:每一轮的 verifier 分数只是一个观测值,要通过和"参照物"比较才能变成信用。作者用了三个参照系,分别对付三类不同性质的轮次。

图1:TCPO 总览

图1:TCPO 的完整流水线。上半部分是多轮 rollout——同一个 prompt 采样多条轨迹,每个节点标注 verifier 分数,橙色节点是高 surprisal 轮次,粉色虚线圈出被选中做反事实分支的轮次,绿色虚线圈出"非改进轮次组"。中间部分是三个信用计算模块:retrospective(和历史最优比)、hindsight(和同组非改进轮次的未来最优比)、counterfactual(固定历史,换输出重采样)。下半部分是统一信用公式、组内归一化加 early-turn 衰减,最后把轮级优势广播到该轮所有 token,用 GRPO 式裁剪目标优化。

设定:固定预算 rollout

形式上,给定 prompt \(x\),第 \(i\) 条轨迹第 \(k\) 轮的状态是 \(s_{i,k}=(x,\ T_{i,<k},\ F_{i,<k},\ E_{i,k})\)——之前所有轮次的 transcript、verifier 反馈、以及外部环境快照(数学和代码任务里这个 \(E\) 是空的,AppWorld 里是模拟器状态)。模型采样输出,verifier 返回归一化分数 \(r_{i,k}\in[0,1]\)

有个细节很妙:训练时即使提前成功,rollout 也强制跑满 \(K\)。这是故意让成功后的保持和退化行为暴露在训练信号里——如果一成功就停,regression 这种现象在训练数据里根本不会出现,模型永远学不会"对的别乱动"。这个设计我觉得很聪明,成本也不高。

参照系一:Retrospective Credit——和历史最优比

先定义历史最优分数 \(m_{i,k}=\max_{t \lt k} r_{i,t}\) 和进步量 \(\Delta_{i,k}=[r_{i,k}-m_{i,k}]_{+}\),然后:

\[c^{\mathrm{ret}}_{i,k}=\alpha_{+}\Delta_{i,k}+\alpha_{0}I^{\mathrm{keep}}_{i,k}-\alpha_{-}I^{\mathrm{succ}}_{i,k}[m_{i,k}-r_{i,k}]_{+}\]

三项各管一件事:超越历史最优给进步奖励;已经成功且守住了历史最优给保持奖励(\(\alpha_0\) 项);成功后把分数改低了就罚。注意这里比较的对象是历史最优而不是上一轮——这是和"相邻分数差"方法的关键区别。上一轮 60 分、这轮 90 分,如果历史最优本来就是 90,那这轮只是"恢复",不是"进步",奖励应该打折。

但这个参照系有个结构性盲区:对于还没成功、且没有即时进步的轮次,三个项全是零。这类轮次的贡献只能等未来揭晓——这就是第二个参照系存在的理由。

参照系二:Hindsight Delayed Credit——和未来最优比

对于成功前没进步的轮次(用门控 \(b_{i,k}=\mathbf{1}[m_{i,k}\lt\tau]\,\mathbf{1}[\Delta_{i,k}=0]\) 筛出来),TCPO 回头看这条轨迹在第 \(k\) 轮之后达到的最好分数 \(u_{i,k}=\max_{t\geq k}r_{i,t}\),然后和同 prompt、同轮次索引、同样"没进步"的其他轨迹的未来最优做留一比较:

\[c^{\mathrm{hin}}_{i,k}=b_{i,k}\cdot\big(u_{i,k}-\bar{u}^{-i}_{x,k}\big)\]

翻译成人话:同样是在第 3 轮原地踏步,别人的轨迹后来修到了 95 分,你的只修到 70 分,那你这轮"原地踏步"的质量就是比人家差。这其实就是 GRPO 组内相对比较的思想,只不过被挪到了"轮次类型对齐"的切片上做。完全复用已有 rollout,不花一分额外的 verifier 调用。

当然这个信号是间接的——它比较的是不同轨迹的已实现未来,可能把后续修正的功劳或锅错安在当前轮头上。作者自己也承认这一点,所以才有了第三个参照系。

参照系三:Selective Fixed-History Counterfactual——固定历史,换个答案重问

最模糊、最难归因的轮次,值得花真金白银做反事实估计。但全做太贵,怎么办?TCPO 用平均 surprisal(当前轮输出在旧策略下的负对数概率均值)当"信用模糊度"的代理指标,每个 prompt 只挑 surprisal 最高的 \(L\) 个合格轮次(数学 \(L=5\),代码和 AppWorld \(L=10\)),对这些轮次固定住完全相同的历史 \(h_{i,k}\),重采样 \(M=8\) 个替代输出,分别送 verifier 打分:

\[c^{\mathrm{cf}}_{i,k}=q_{0}-\frac{1}{M}\sum_{m=1}^{M}q_{m}\]

原始输出比替代品的平均分高多少,就是这一轮的真实贡献。有状态的环境(AppWorld)里,所有替代输出都从同一个前轮模拟器快照出发评估,评完恢复现场——保证比较是严格受控的。

两个设计选择值得说说。一是只做一步 verifier 比较而不是完整反事实 rollout,刻意隔离"当前输出"这一个变量的效应;对二元精确匹配的 verifier 这是保守的——原始输出和替代品全挂,信号就是零,正信用留给 hindsight 补。二是有个非退化门控:只有当替代输出的分数方差大于零时才用反事实覆盖 hindsight 估计,否则回退。不会出现"反事实全失败把 hindsight 的正信号洗掉"的事故。

组装与优化

最终轮级信号是三部分的加权和,组内归一化后乘一个 early-turn 先验 \(\gamma^{k-1}\)

\[A^{\mathrm{TCPO}}_{i,k}=\gamma^{k-1}\tilde{\phi}_{i,k}\]

早轮次的信用被放大,鼓励模型尽早做有用的修复而不是拖到最后一轮。然后把这个轮级优势广播到该轮响应的所有 token 上,套标准的 GRPO 裁剪目标训练。整个方法实际上只替换了优势估计器,优化器、采样框架完全不动——工程上接入成本很低,这点对实际落地很友好。


🧪 实验:三个领域、两种模型规模、四种 verifier

实验覆盖数学推理(MATH-500、AIME 2024–2026,训练数据 DAPO-Math-17K)、代码生成(LiveCodeBench v6、HumanEval,训练数据 TACO-Verified)和 AppWorld 交互式 agent 任务。模型用 Qwen3-4B 和 DeepSeek-R1-Distill-Llama-8B 做主实验,AppWorld 上沿用 GVPO 原设置的 Qwen2.5-32B-Instruct。框架是 verl + vLLM 异步 rollout,跑在 H200 上,每个 prompt 采 8 条轨迹,数学 3 轮、代码 5 轮。baseline 是 Base、GRPO、MT-GRPO、GVPO 四个。

主实验:全线最优或并列最优

Qwen3-4B 上的结果(Pass@8 / 平均成功轮数):

方法 MATH-500 AIME LiveCodeBench HumanEval
Base 79.6% / 1.42 47.8% / 1.53 38.7% / 1.96 84.1% / 1.35
GRPO 80.8% / 1.26 50.0% / 1.49 42.2% / 1.61 85.9% / 1.31
MT-GRPO 82.4% / 1.21 48.9% / 1.37 43.5% / 1.42 86.6% / 1.23
GVPO 85.2% / 1.22 51.1% / 1.36 44.3% / 1.39 86.6% / 1.18
TCPO 86.8% / 1.19 51.1% / 1.33 45.1% / 1.27 87.2% / 1.12

DeepSeek-R1-Distill-Llama-8B 上的结果

方法 MATH-500 AIME LiveCodeBench HumanEval
Base 29.8% / 2.25 21.1% / 2.67 12.6% / 2.83 84.8% / 1.33
GRPO 56.6% / 1.84 35.6% / 2.08 27.9% / 2.45 87.2% / 1.24
MT-GRPO 59.0% / 1.71 35.6% / 1.92 30.3% / 2.21 87.2% / 1.19
GVPO 62.8% / 1.62 36.7% / 1.87 31.8% / 2.13 87.8% / 1.19
TCPO 65.2% / 1.59 38.9% / 1.86 32.2% / 2.13 88.4% / 1.15

两个观察。其一,TCPO 的提升在弱模型上更明显——8B 模型相比 MT-GRPO 在 MATH-500 上涨了 6.2 个点,而 4B 模型涨 4.4 个点。这符合直觉:基础能力弱的模型轨迹更乱,保持、退化、延迟修复的轮次更多,信用翻译的收益自然更大。其二,平均成功轮数也在降——LiveCodeBench 上从 Base 的 1.96 轮降到 1.27 轮,说明 early-turn 先验确实在起作用,模型学会了早点修对而不是来回折腾。

不过坦率地讲,AIME 上 TCPO 和 GVPO 打平(51.1%),HumanEval 这种一轮就能解决的简单任务上优势也只有零点几个点。TCPO 的价值和多轮轨迹的"混乱程度"是绑定的,轨迹越短越干净,信用翻译的空间越小。这个趋势论文没明说,但数据里看得很清楚。

AppWorld:长程 agent 任务也成立

AppWorld 上是真正的状态型环境,verifier 是模拟器状态检查,TCPO 对比 GVPO(TGC/SGC,越高越好):

方法 Dev TGC Dev SGC Test-N TGC Test-N SGC Test-C TGC Test-C SGC
GVPO 84.2 73.7 72.6 55.4 49.4 28.8
TCPO 88.3 75.0 74.4 57.1 49.9 28.8

Dev TGC 涨了 4.1 个点,Test-N 上 TGC/SGC 双升,Test-C 上 TGC 微升、SGC 持平。提升幅度不如数学代码,但考虑到 AppWorld 的轮次更长、环境状态更复杂,能在不换 backbone 不换数据的情况下稳定压过 GVPO,说明这套信用翻译对"真环境"也是有效的。Test-C(挑战集)的 SGC 卡在 28.8 没动,也说明难场景下信用分配不是唯一的瓶颈。

消融:每一刀都割在点子上

这张表是我觉得全文最值钱的部分(DeepSeek-R1-Distill-Llama-8B):

变体 MATH-500 LiveCodeBench
Trajectory 奖励 56.6% 27.9%
逐轮原始分数 59.0% 30.3%
相邻分数差 \(\Delta\) 59.8% 30.4%
Retrospective(进步+保持+退化) 62.2% 31.5%
Retro + Hindsight 63.4% 31.7%
TCPO 完整版 65.2% 32.2%

这条阶梯特别漂亮。从轨迹奖励到逐轮分数,涨 2.4 个点——这是"稠密化"本身的价值;从逐轮分数到相邻差,只涨 0.8——局部差分几乎没提供更多有效信息,这直接打脸了"看分数变化就够了"的直觉;换到和历史最优比较的 retrospective,一下涨 2.4 个点;hindsight 补延迟贡献再涨 1.2;反事实精修再涨 1.8。每个组件都有独立贡献,而且贡献的排序和论文的叙事完全自洽。这种消融做出来是需要点诚意的——很多论文的消融第二个组件就开始不涨分了。

反事实预算:钱花在哪比花多少重要

变体 MATH-500 Pass@8 训练开销 LCB Pass@8 训练开销
No-CF 63.4% 1.00× 31.7% 1.00×
随机选轮次做 CF 63.4% 1.03× 31.8% 1.05×
TCPO(Top-L 高 surprisal) 65.2% 1.03× 32.2% 1.05×
All CF(全部合格轮次) 66.8% 1.11× 33.1% 1.16×
CF-Aug(反事实样本也拿去训练) 69.2% 1.25× 34.5% 1.33×

随机选轮次的对照组是点睛之笔:同样的反事实预算,随机选几乎零增益(63.4→63.4),高 surprisal 选择涨 1.8 个点。这证明了关键不是反事实计算本身,而是把预算花在最不确定的轮次上。同时也留下了上限空间——All CF 和 CF-Aug 还能再涨 1.6 到 4 个点,只是开销到了 1.11×–1.33×。默认配置选在 1.03×–1.05× 这个价位,是个很务实的工程权衡。

分析图:信用分配确实长成了设计的样子

图2a:不同轮次类型的平均归一化信用

图2a:按轮次类型统计的平均归一化信用。改进轮次拿到接近 1.0 的最高正信用,保持轮次拿到小幅正信用,延迟修复轮次也有正信用,而退化轮次吃到接近 -1.0 的惩罚。MATH-500 和 LiveCodeBench 两个任务上的分布形态一致。

图2b:成功修复轨迹上按轮次索引的平均信用

图2b:成功轨迹上,Turn 1 的平均信用约 0.8–1.0,Turn 2 降到 0.65 左右,Turn 3 进一步降到 0.4–0.55——越早的修复轮次信用越大,和 early-turn 先验的设计意图吻合。

图2c:训练轮数敏感性

图2c:相对饱和性能随训练轮数的变化。MATH-500 大约 3 轮就饱和,LiveCodeBench 约 5 轮到平台期,AppWorld 从 1 轮的约 84% 一路爬到 20 轮才到 100%。这解释了为什么数学设 3 轮、代码设 5 轮——不是拍的,是按饱和点选的。


🤔 我的判断

这篇论文最值钱的地方,是把"score ≠ credit"这个概念混淆从工程直觉提升成了明确的问题定义。做多轮 agent RL 的人多少都踩过这些坑——成功后被改坏的答案没人罚、原地踏步的轮次信号为零——但把它们系统性拆开、分别配一个参照系、再用消融逐一证明每个参照系值多少分,这是第一次有人做得这么干净。

方法层面,说实话三个组件单拎出来都不算新:和历史最优比是 best-so-far 差分,hindsight 是 GRPO 组内基线在轮次切片上的挪用,反事实重采样是经典操作。真正的贡献在"组装逻辑"——每个组件精确覆盖一类轮次,互相之间用门控隔离,不重叠不冲突。这种设计品味比单点创新更难能可贵。

批判的话也说几句。一是 surprisal 作为"信用模糊度"的代理终究是个启发式——高 surprisal 的轮次可能只是模型在胡说八道,不一定是归因最模糊的轮次;随机对照实验证明了它有效,但没有和"按 verifier 反馈长度/类型选择"等其他代理比较过。二是反事实对二元 verifier 的保守性问题:精确匹配场景下,原始输出和替代品全挂时信号为零,这种"全都是错但错得不一样"的轮次恰恰可能是信息量最大的。三是 AIME 上和 GVPO 打平、HumanEval 上优势微弱,说明收益和任务的多轮混乱程度强相关——如果你的场景轨迹本来就短而干净,这套东西的收益会打折。

工程建议:如果你已经在用 GRPO 系的多轮 RL,TCPO 的接入成本几乎就是换一个优势估计函数,3%–5% 的额外开销换 2–6 个点的 Pass@8 提升,这笔账怎么算都划算。哪怕不整个照搬,"retrospective 和历史最优比而不是和上一轮比"、"成功后强制跑满轮数暴露退化行为"这两个点,单独拎出来用也是稳赚的。

信用分配这个老问题,在多轮 agent 时代有了新的形状。这篇论文未必是终局,但它把问题的形状描清楚了——这往往比给一个答案更有价值。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我