Intro

GLM5.2

最近发布的GLM5.2博客中,提到了一个算法思路上的变更:在后训练中agentic rl这个环节,相比GRPO,critic-based PPO formulation从单独的rollout中学习,依赖一个critic模型来评估token-level的优势,而不是组间的comparisons。这种单 rollout 形式天然适合处理 compaction:它既不要求每个 prompt 只能产生固定数量的 trace,也不要求这些 trace 长度相近。因此,将所有 compaction 后形成的子 trace 都作为可训练轨迹纳入训练,并通过 token 级别的 loss 来缓解不同子轨迹长度不均衡带来的影响。

  • Anti-Hack

同时,在hacking问题上,Coding RL 尤其容易受到 reward hacking 的影响,因为它的奖励通常是一个可验证的 pass/fail 信号。博客中表示,相比 GLM-5.1,GLM-5.2 表现出更多潜在的 hacking 行为。这类验证信号虽然很容易被优化,但并不能真正提升模型的基础能力。Agent 可能会读取受保护的评测文件,从参考答案或上游 commit 中复制答案内容,或者在 GitHub 相关任务中直接获取目标源码。这些行为会虚高 reward,并污染训练信号,因此需要一个清晰的机制,将真正的问题求解能力与投机取巧的捷径区分开。

为了解决这个问题,GLM团队在 RL 训练和评测中都引入了一个 anti-hack 模块。检测过程分为两个阶段:首先使用基于规则的过滤器捕捉潜在作弊行为,以尽可能提高召回率;然后由 LLM judge 检查这些被标记动作的意图,从而保持较高的精确率。通过采用一种在线策略,在每一步监控 tool call。如果检测到 hack 行为,系统会阻断该调用,并返回 dummy information 作为结果。重要的是,这种在线防护机制允许模型在作弊动作被捕获后继续完成 rollout。通过只处理具体的无效行为,而不是直接拒绝整条 trajectory,这种方法有助于避免 rollout 被突然中止时可能导致的训练不稳定和模型坍塌。

Credit Assignments In Agentic RL

目前基于GRPO做Agentic RL,有很多关于credit assignments的工作,主要问题在于传统GRPO在agentic rollout中,没发区分不同的step的好坏,而只能对整体trajectory所有token相同的优势的。

GDPO

NVIDIA.

本质上这篇不算做credit assignments范畴,是对于多reward的grpo场景下的优化工作。

GDPO主要解决GRPO在多reward场景下 advantage collapse 问题,也就是模型不知道一个rollout好,是哪个reward贡献的,多reward的细粒度信号被压没了。

对每个reward单独归一化,再加advantage:

$$ A_k^{(i,j)} = \frac{r_k^{(i,j)}-\text{mean}(r_k^{(i,1:G)})}{\text{std}(r_k^{(i,1:G)})} $$

然后再合并:

$$ A^{(i,j)}_{\text{sum}}=A_1^{(i,j)}+A_2^{(i,j)} + \cdots + A_n^{(i,j)} $$

再做一次batch-wise advantage normalization,避免reward数量变多后advantage尺度膨胀:

$$ \hat A_{\text{sum}} = \frac{A_{\text{sum}}-\text{mean}_{\text{batch}}(A_{\text{sum}})}{\text{std}_{\text{batch}}(A_{\text{sum}})+\epsilon} $$

这里的normalization是在一个batch内的所有query的所有rollout做norm,比如batch=32,N=8,相当于256条rollout的adv sum做一次norm。

GD2PO

GD2PO从GDPO出发,虽然GDPO保留了各个维度reward的信息,但是最终还是要做:

$$ A_j^{\text{GDPO}}=\sum_k\omega_kA_{j,k} $$

这会产生新的问题:同一个rollout在不同reward上可能得到方向相反的advantage。比如rollout在reward1上号,reward2上差,但最终相加后却得到一个接近0的训练信号。

GD2PO认为:这种rollout的多维reward对它的更新方向没有形成共识,直接聚合容易产生“破坏性抵消”。因此它在GDPO基础上增加两层处理。

先计算GDPO的各维advantage:

$$ A_{j,1},A_{j,2},\cdots,A_{j,K} $$

再判断该rollout是否存在严重冲突。论文提出两种方法:hard filtering和SNR filtering

Hard Filtering

只要不同reward advantage出现正负冲突,就过滤,也就是这条rollout不会不会参与最终的损失计算,相当于被废弃掉了。

SNR-Based Filtering

Hard版本可能过于激进,所以文章还定义了一种类似信噪比的指标:

$$ \delta_j=\frac{\vert\sum_k\omega_kA_{j,k}\vert}{\sum_k\vert\omega_kA_{j,k}\vert+\epsilon} $$

所有advantage同向时,$\delta_j\rightarrow 1$,所有正负严重抵消时,$\delta_j\rightarrow 0$

然后设置一个阈值(文中$\tau=0.8$)

$$ m_j=\mathbb I(\delta_j\ge \tau) $$

最终过滤后的advantage:

$$ \tilde{A}_j=m_j\sum_k\omega_kA_{j,k} $$

本质上是,不是协调冲突,而是冲突严重的rollout直接不参与本次更新。

query-level加权

经过rollout过滤,不同query剩下的有效rollout数量可能不同,设原始query有$G$个rollout,最终保留了$M_i$个:

$$ M_i\sum_{j=1}^G m_{i,j} $$

定义query权重:

$$ q_i=\frac{M_i}{G} $$

如果某个query的大多数rollout都发生reward冲突,说明这个query的监督信号不可靠,就整体降低其更新强度:

$$ \tilde{A}_j\leftarrow q_j\tilde{A}_j $$

Hard和SNR哪个更好?

论文实验,两个reward场景:Hard通常更好:

  • Tool Calling:correctness + length, Hard的correctness基本高于SNR
  • Helpfulness-Safety:useful + harmless:两个backbone上都是Hard的overall average更高

三个reward的场景:SNR更好:

Tool Calling使用correctness + format + length时,SNR的correctness:

  • Qwen2.5-1.5B:SNR 56.01 > Hard 54.47
  • Qwen2.5-3B:SNR 60.97 > Hard 60.80
  • Llama3.1-8B:SNR 62.75 > Hard 61.37

整体结论可以概括:

  • reward较少,冲突判断简,Hard更合适
  • reward较多,SNR更合适,避免过滤过度

Query权重的消融

消融实验证明,Hard和SNR设定下,添加Query权重的结果优于不添加Query权重的结果。

GiGPO

GRPO只给整条trajectory算advantage,没法区分多轮Agent里每一步action的好坏

GRPO类似:

$$ A_E(\tau_i)=\frac{R(\tau_i)-\text{mean}(R)}{\text{std}(R)} $$

其中$A_E$是trajectory-level的advantage,整条rollout共用。

GiGPO在这个基础上加了一层 step-level advantage

它会在同一个sample的多个rollout里,找出重复出现的state:

$$ G_S(\tilde{s})=\{(a_t^{(i)},R_t^{(i)})\vert s_t^{(i)}=\tilde{s}\} $$

然后在这个state group内部算:

$$ A_S(a_t^{(i)}) = \frac{R_t^{(i)}-\text{mean}_{G_S(\tilde{s})}(R)}{\text{std}_{G_S(\tilde{s})}(R)} $$

最终每个step的advantage是:

$$ A_t^{(i)}=A_E(\tau_i)+\omega A_S(a_t^{(i)}) $$

其中:

  • $A_E$:这条trajectory整体好不好
  • $A_S$:在同一个state下,这个action相对好不好
  • $\omega$:step-level advantage权重。

Insight-1

不需要每个step都有reward,如果只有终局reward:

$$ r_T=R_T,\quad r_{< T}=0 $$

呢么第$t$步的future return是:

$$ R_t=\gamma^{T-t}R_T $$

Insight-2

step-level advantage之作用在当前step的action tokens上。不是作用在这个step之后所有token上。也就是这批相同state的下一个policy的action对应的token。

Insight-3

如果同一个state在同一条rollout出现多次,则每次出现都会被放进group:

$$ s\rightarrow a_1\rightarrow\cdots\rightarrow s\rightarrow a_2 $$

那么$G_S(s)$里会同时有:

$$ (a_1, R_1),(a_2,R_2) $$

如果只有终局reward:

$$ \begin{align*} R_1&=\gamma^{T-1}R_T \\ R_2&=\gamma^{T-2}R_T \end{align*} $$

同一个rollout多次回到同一个state,future return会因为step位置不同而不同。

Insight-4

初始状态也会算进去,因为初始状态也是rollout里的state。但所有的初始状态肯定都是相同的,所以第一个action必定会单独计算一个$A_S$,如果只有终局reward且$\gamma=1$,那么第一步的$A_S$和trajectory-level的$A_E$高度重复。但论文保持这种做法。

Insight-5

如果同一个state下相同的action出现多次,可能会出现相同的action下最终的结果不同导致reward不同,那么这些相同的action会得到不同的step级别的advantage,这里可以对于相同state+action,可以先做reward的聚合:

$$ \tilde{R}(s,a)=\text{mean}\{R_t^{(i)}\vert s_t^{(i)}=s,a_t^{(i)}=a\} $$

Insight=6

最难的一个点是,怎么定义相同的state,这里可能对于不同的agentic任务,会有不同的定义。

Tree-GRPO

也是针对outcome reward稀疏,credit assignment粒度粗的问题。

传统GRPO:

$$ \text{prompt}\rightarrow H_1, H_2, \cdots, H_G $$

每条$H_i$都是独立完整的rollout

Tree-GRPO逻辑:

$$ \text{prompt}\rightarrow H_1,H_2,\cdots,H_G\rightarrow \text{从中间节点继续扩展新分支} $$

主要分以下三步:

  • 对每个prompt $x_i$,先并行采样$M$条完整的agent trajectory,作为$M$棵树的初始backbone:
$$ Y=\{H_i\sim\pi_\theta(\cdot\vert x_i)\}_{i=1}^M $$
  • 从这M棵树里面,每棵树采样$N$个非叶子节点(response),作为扩展点。

  • 对每个被选中的节点,取从root到该节点的上下文,再让当前policy从这里继续生成后续trajectory,形成新分支并插入树中。重复$L$次,最终单个prompt得到的rollout group size为:

$$ G=M\times(L\times N + 1) $$

这类树状采样可以在固定token/tool-call budget下拿到更多rollout,适合多轮agent任务。

Tree-based Advantage怎么算

Tree-GRPO做了两层advantage:

  • intra-tree advantage

在同一棵树内部比较不同分支的最终outcome reward

  • inter-tree advantage

把所有树里面的rollout放一起估计一个更稳定的group adv:

最后advantage是两者相加:

$$ \hat A_{tree}(H_i)=\hat A_{Intra-tree}(H_i) + \hat A_{Inter-tree}(H_i) $$

理解Intra和Inter adv

对一个query $x$,初始化$M$棵树:

$$ T_1,T_2,\cdots,T_M $$

每棵树最终包含$1+NL$条完整trajectory

所以第$m$棵树里面的trajectory集合:

$$ \mathcal H_m=\{H^0_m,H^1_m,\cdots,H_m^{NL}\} $$

其中:

  • $H_m^0$: 初始化主干trajectory;
  • $H_m^1,\cdots,H_m^{NL}$: 后续从这棵树中间节点拓展出来的分支trajectory

因此整个query的全部trajectory是:

$$ \mathcal H=\cup_{m=1}^M\mathcal H_m $$

最终每条完整trajectory都会得到一个终局reward: $R(H_m^j)$

Intra-advantage是在每个$\mathcal H_m$范围内基于终局reward做优势计算,但是每棵树最终计算损失的部分取决于其rollout的初始节点:如果是$H_m^0$,那么会作用于其全部step上,如果是基于中间节点rollout出来的trajectory,那么计算损失时只会计算初始节点之后的那部分step

Inter-advantage是在$\mathcal H$范围内基于终局reward做优势计算,和Intra-advantage类似,每棵树计算损失只会计算rollout这个trajectory时的初始节点之后的step上。

Insight

理解起来,和GiGPO相比,credit assignment的颗粒度会粗一点,但比常规的GRPO会好一些。但整体rollout的Infra改造还挺大的,需要支持对中间part-traj的继续rollout。

References

[1] GLM-5.2: Built for Long-Horizon Tasks

[2] GDPO: Group reward-Decoupled Normalization Policy Optimization for Multi-reward RL Optimization

[3] GD2PO: Mitigating Multi-Reward Conflicts via Group-Dynamic reward-Decoupled Policy Optimization

[4] Group-in-Group Policy Optimization for LLM Agent Training

[5] TREE SEARCH FOR LLM AGENT REINFORCEMENT LEARNING