SRPO:基于自我反思的逐 Token 训练信号#

进阶5 分钟阅读查看源文件 ↗

TL;DR#

本页内容7 个部分

SRPO:反思增强的教师为学生 token 打分

1. 终局评分与逐 token 训练信号#

模型的一次尝试最终失败,仅凭终局评分,无法判断错误来自哪些位置。若先根据这次失败生成反思,再让带有反思的教师评价学生新生成的回答,能否为其中不同 token 提供不同方向的训练信号?

GRPO 用一条回答的终局分数为所有 token 构造共享权重。终局错误评分本身不能区分各 token 对错误结果的贡献。SRPO 用终局反馈生成反思,再为学生新回答的不同位置构造训练信号。

2. 反思教师与学生的输入#

SRPO(Self-Reflective Policy Optimization)让模型先根据失败轨迹写反思,再由输入包含反思内容的教师模型评估学生生成 token 的概率。教师与学生可以使用同一模型,区别在于教师的输入额外包含反思。学生更新后,推理时仍只接收原问题。[1]

给定问题 qq,先生成一次尝试并取得终局反馈,例如答错或环境失败。这里的失败尝试用于生成反思,与随后用于更新的学生回答是两次生成。把问题、轨迹和反馈交给模型,生成简短的反思补丁 pp,说明应避免的错误与应采用的步骤。

随后回到任务起点。学生仅接收 qq,教师接收 [p;q][p;q]。两者使用相同规模的模型。

比较 token 概率时,固定学生已经生成的前缀,只改变教师接收的反思上下文。不同前缀下的学生与教师 token 概率不能直接用于该比较。

若学生生成前缀为 y<ty_{<t},教师就在这个相同前缀上计算 πT(a∣q,y<t)=πteacher(a∣[p;q],y<t)\pi_T(a\mid q,y_{<t})=\pi_{\mathrm{teacher}}(a\mid[p;q],y_{<t})。学生记为 πθ\pi_\theta。本轮更新前缓存教师分数并停止其梯度。[1]

反思后生成的另一条回答可以用于评估教师的任务表现,但它不直接充当 SFT 的目标文本。训练评分的对象仍是学生实际生成的 token。

3. 基于教师评分的学生策略更新#

3.1 基于教师概率的 token 评分#

用更新前的学生策略 old 生成回答 y=(a1,…,aT)y=(a_1,\ldots,a_T),其中 T>0T>0 是有效生成 token 数,st=(q,y<t)s_t=(q,y_{<t}) 是第 tt 个位置之前的状态。对每个有效位置,缓存:

ut=sg⁡ ⁣[log⁡πT(at∣st)−log⁡πold(at∣st)].u_t=\operatorname{sg}\!\left[\log\pi_T(a_t\mid s_t)-\log\pi_{\mathrm{old}}(a_t\mid s_t)\right].

Stop-gradient(停止梯度,记为 sg⁡\operatorname{sg})表示取数值,但不沿这条路径反传。这里用 utu_t 表示教师给出的 token 分数,以区别于 current/old 概率比。

若教师赋予已采样 token 的概率高于 old,ut>0u_t>0;若教师概率低于 old,ut<0u_t<0。[1]

手算设三个位置的 old 与教师概率如下。它们属于不同前缀,跨位置的概率之和无须等于 1。

位置 old 概率 教师概率 ut=log⁡(πT/πold)u_t=\log(\pi_T/\pi_{\mathrm{old}})
1 0.4 0.6 0.4055
2 0.4 0.2 −0.6931
3 0.2 0.3 0.4055

终局反馈先用于生成反思,再通过教师的条件概率影响 utu_t,不直接作为奖励项进入学生更新的 loss。因此,utu_t 是模型概率比较得到的训练信号,并非环境对每个 token 提供的真实奖励。[1]

3.2 中心化后构造 clipped 更新#

令 0<ϵ<10<\epsilon<1 为裁剪宽度。先按这条回答的有效位置求均值 uˉ=(1/T)∑tut\bar u=(1/T)\sum_tu_t,再用 A^t=ut−uˉ\hat A_t=u_t-\bar u 中心化。

三个 token 的平均分 uˉ≈0.0393\bar u\approx0.0393,于是 A^≈[0.3662,−0.7324,0.3662]\hat A\approx[0.3662,-0.7324,0.3662]。第二个 token 得到负权重,其他两个得到正权重。

设 rt(θ)=πθ(at∣st)/πold(at∣st)r_t(\theta)=\pi_\theta(a_t\mid s_t)/\pi_{\mathrm{old}}(a_t\mid s_t),经验 Actor loss 为:

LSRPO(θ)=−1T∑t=1Tmin⁡ ⁣(rtA^t,clip⁡(rt,1−ϵ,1+ϵ)A^t).L_{\mathrm{SRPO}}(\theta)=-\frac1T\sum_{t=1}^{T}\min\!\left(r_t\hat A_t,\operatorname{clip}(r_t,1-\epsilon,1+\epsilon)\hat A_t\right).

这是要最小化的 loss。教师、old、utu_t 和中心化结果都固定;梯度只经过 current 概率。题目、轨迹与小批次之间的进一步聚合需另行说明。[1]

不同位置可以得到不同的 A^t\hat A_t;这些权重来自教师概率比较,并非精确的 Qπ−VπQ^\pi-V^\pi。

再取 current/old ratio 为 [1.1,0.9,1.3][1.1,0.9,1.3],ϵ=0.2\epsilon=0.2。三个 clipped 目标约为 [0.4028,−0.6592,0.4394][0.4028,-0.6592,0.4394],平均约 0.06100.0610,所以 loss 约为 −0.0610-0.0610。

最后一个 token 的概率比超过上裁剪界,正权重任务项已进入常数分支;第二项仍提供降低该 token 概率的梯度系数。这是一条回答内部的差异化更新,不需要先用终局任务分数为所有 token 分配相同符号的权重。

4. 反思生成、教师评分与学生更新#

  1. 模型生成一次尝试,取得终局反馈,再据此生成反思补丁。
  2. 学生仅根据原问题生成新回答;教师接收反思补丁,在相同的学生前缀下为已生成 token 评分。
  3. 缓存 old 与教师的 token 概率,计算对数概率差,再减去轨迹内均值,得到固定的更新权重。
  4. 用 current 重算概率比,执行 clipped 更新。更新后重新采样,生成新的反思与训练信号。

5. 教师信号的局限性与 KL 对应条件#

5.1 与局部 reverse KL 的联系#

在固定前缀下,若动作按 old 采样,E[ut∣st]=−KL(πold(⋅∣st)∥πT(⋅∣st))\mathbb E[u_t\mid s_t]=-\mathrm{KL}(\pi_{\mathrm{old}}(\cdot\mid s_t)\|\pi_T(\cdot\mid s_t))。单个 token 的分数可以为正,但在该前缀下对全部候选 token 按 old 概率取期望,结果仍非正。

把教师固定,只看一个前缀,负 reverse KL 的梯度为 Ea∼πθ[(log⁡πT(a)−log⁡πθ(a))∇log⁡πθ(a)]\mathbb E_{a\sim\pi_\theta}[(\log\pi_T(a)-\log\pi_\theta(a))\nabla\log\pi_\theta(a)]。因此在 current 等于 old、动作采样匹配且不另加数据依赖变换时,缓存的 log-ratio 可以提供相应局部梯度信号。

实际 SRPO 还包括轨迹内中心化、clipping 和多次复用。尤其 uˉ\bar u 含有当前样本,也随整条轨迹变化,不满足动作独立 baseline 的简单证明。不能因此宣称完整 SRPO 始终无偏优化整条回答的 reverse KL;RLOO 与 KL Regularization 分别解释这两类条件。

5.2 额外反馈的作用与成本#

与 ERPO 调整问题正则不同,SRPO 改的是训练信号的来源与粒度。反思生成和教师评分增加了训练开销。若反思补丁把失败原因归错,教师会在错误上下文下为新回答评分;因此,细分到 token 的概率信号仍可能强化错误行为。

学生在推理时仅接收原问题。训练希望将反思提供的信息转化为参数更新,提高这一输入条件下的任务正确率;是否达到该目的,仍需实际评测。

参考资料#

  1. Self-Reflective Policy Optimization(2026). §3.2、算法 1:反思补丁、教师评分与学生更新。