跳到主要内容
SecondHome

信用分配三层楼:一个 0/1 的功劳记到哪一步

15 分钟进阶6aL11 p.3-17 ↗p.55 ↗p.58 ↗录像 ↗支撑材料 5 篇

一条多步轨迹只值一个 0/1:纯 REINFORCE 里失败尝试(R=0)整条零梯度、不产生任何更新,成功轨迹里混着的错误动作反而跟着沾光(L11 p.5-6)。本篇沿贯穿案例(coding agent 修 retry_count 的 bug,R(τ)=1 当且仅当 4 条测试全过,p.3-4)爬三层楼:组内比较让失败轨迹开口——同任务采 4 条奖励 1,0,0,0,基线取组均值 0.25,更新权重 +0.75 与 −0.25×3(p.8),但组权重对整条轨迹所有 turn 相同(p.9);reward-to-go 与 critic 把预期细化到每个历史——R3=0+0+1=1、V^μ(h3)≈0.3,平方损失 MSE 0.30 对 0.21 的条件均值账(p.10-14,MIXER,Ranzato et al. ICLR 2016 §3.2.1),TD 误差 δ=+0.3/−0.2/−0.4 经 GAE 以 λ=0.5 指数加权摊到步得 Â=0.1(p.15-16,Schulman et al. ICLR 2016;γ=1 约定见 p.58);过程奖励模型干脆把打分本身改成步级——解 5x=6x−14 得 x=14,「x=7」一步被人工标错,PRM800K 80 万步级标签、PRM 一致优于 ORM(p.17,Lightman et al. 2023),PRIME 免显式标注训隐式 PRM、生成式 PRM 先思考再打分(2025)。收束在 p.55:有用反馈 = 组比较 / critic / 过程奖励。

修 bug 的 coding agent 跑完一条五步轨迹,到手的反馈只有末尾一个 0/1:四条单元测试全过,或者没全过。奖励不会说哪一步立了功、哪一步闯了祸,梯度公式只会把这个标量平摊给轨迹上每个动作。

这枚 0/1 该记到谁头上,就是信用分配(credit assignment)要回答的问题。L11 在 p.3-17 用三层楼作答:一层组内比较让失败轨迹开口,二层 critic 与 GAE 把预期和信用细化到步,三层过程奖励模型干脆把打分本身改成步级。

一、病灶:一个标量平摊给整条轨迹

先看贯穿案例的形状,出自 L11 p.3-4。任务是修一个函数的 bug:

def retry_count(config):
    return config.get("retries") or 3

规格四条:缺 retries 键 → 3;值为 None → 3;值为 0 → 0;值为 2 → 2。

陷阱在 Python 的 falsy 语义:or 3 连显式配置 0 次也吞成 3,于是四条里恰有一条不通过。

一次尝试就是一条轨迹 τ = Inspect → Edit → Test → Revise → Test again。中间步奖励全为 0,R (τ)=1 当且仅当 4 条测试全过。

把它喂给上一讲「从零推 REINFORCE」推过的那条损失(L11 p.5-6):

LPG=−R(τ)∑tlog⁡πθ(at∣ht)\mathcal{L}_{PG} = -R(\tau)\sum_t \log \pi_\theta(a_t \mid h_t)

R (τ)=0 时整条轨迹梯度为零。失败的尝试不教任何东西,哪怕其中的 Revise 一步改得完全正确。

反过来 R (τ)=1 时,五个动作同享一个正权重,哪怕其中某一步是 mistake。

失败不说话,成功好坏不分。

user: 修 retry_count——Missing→3、None→3、0→0、2→2assistant: a1 Inspect—— 读代码,注意到 or 3 吞掉 falsy 值assistant: a2 Edit—— 改成 config.get (“retries”, 3):修好 0→0,弄坏 None→3tool: Test——4 条挂 1 条:默认值不覆盖「键存在但值为 None」assistant: a4 Revise—— 先取值、再用 is None 判断,补上漏洞tool: Test again——4 条全过Observation: R (τ)=1,损失给五个动作同一个正权重 ——a2 那半处错也跟着涨概率Thought: 若最后仍有一条没过,R (τ)=0,a4 的正确改法同样白教 —— 平摊,两头都是浪费

二、第一层:组内比较 —— 失败轨迹开口,粒度仍是轨迹

第一层不动公式结构,只换权重来源。L11 p.8 的例子:同一任务采 4 条轨迹,奖励 1,0,0,0,基线取组均值 0.25,更新权重变成 +0.75 与 −0.25×3。

失败轨迹第一次产生信号,含义是比同题的平均水平差,整条往下压。这级台阶就是上一讲「GRPO 家谱」里的组均值,L11 把它放回信用分配的语境:基线负责回答预期多少,组内比较是最省钱的预期。

但粒度没变(L11 p.9):组权重对整条轨迹所有 turn 相同。成功轨迹里 a1 是 mistake,照样乘着 +0.75 一起上调;失败轨迹里 a3 是 helpful,照样乘着 −0.25 一起下压。层一解决的是失败不说话;好坏不分,留给楼上。

层一的盲区在粒度,不在幅度

把组从 4 条扩到几十条、把基线估得再准,权重也还是每条轨迹一个标量,轨迹内部谁该背锅,组比较天生看不见。要细化粒度,得上二楼。

跨讲分工在这里划清。上一讲问基线减什么:组均值怎么取、Dr.GRPO 为什么去掉 σ_R 与长度偏置;本篇问信号细到哪一层:从轨迹级下探到步级,再到过程级。

三、第二层:critic 与 GAE—— 预期按历史细化,信用按步摊派

第二层动的是预期:组均值是每任务一个数,这里要细化到每个历史一个数,两件工具都出自 L11 p.10-14。

先是 reward-to-go(后续回报)。轨迹 A 只有末端奖励 r6=1,从 h3 往后看,R3 = 0+0+1 = 1,见 p.10-11。比当前动作更早的奖励与它无关,剔掉是纯降方差,上一讲已经预告过这一步。

再是 critic,也就是 value function。换一条轨迹 B,从它的 h3 出发用当前策略 μ 续采 10 次、3 次成功,那么 V^μ(h3) = E_μ[R3|h3] ≈ 0.3(p.12)。

组均值看的是同任务的平均表现,critic 看的是这个历史之后的期望回报。同一个任务里,走到不同 h_t 的轨迹各有各的预期。

critic 自己也要训练,目标是最小化平方误差 L_V (φ) = E_t [(V_φ(h_t) − R_t)²](p.13,出处 MIXER,Ranzato et al. ICLR 2016 §3.2.1)。

这笔账值得亲手算一遍。h3 处 10 次续采的目标是三个 1、七个 0;若 V_φ(h3)=0.6,MSE = [3×(0.6−1)² + 7×(0.6−0)²]/10 = 0.30;把预测挪到均值 0.3,误差降为 0.21。平方损失的最优解就是条件均值。

critic 学的是走到这里,通常还能拿几分。

单独一个网络,value loss 训练整个网络 —— 例:InstructGPT 附录 C.4。表达力足,但要养第二套前向。

挂在 policy body 上的线性 head,stop-gradient 断开反传、只训 head—— 例:MIXER。省一套参数,表达力受限于 head。

有了 V_φ,信用就能按步摊派。TD 误差(temporal difference error,p.15):

δt=rt+1+Vφ(ht+1)−Vφ(ht)\delta_t = r_{t+1} + V_\varphi(h_{t+1}) - V_\varphi(h_t)

含义是用这一步之后的现实,减这一步之前的预期,为正即超预期。算 slides 的例子:值序列 0.3→0.6→0.4→0.0、中途奖励为 0,得 δ = +0.3 / −0.2 / −0.4。第一步超预期,后两步把虚高的预期逐步还回去。

一步 δ 只看前后两个历史,稳但短视;整段 reward-to-go 无偏但方差大。GAE(generalized advantage estimation,Schulman et al. ICLR 2016)在两者之间取指数加权(p.16;γ=1 约定见 p.58):λ=0.5 时后续误差权重逐项减半。

A^=0.3+0.5×(−0.2)+0.25×(−0.4)=0.1\hat{A} = 0.3 + 0.5\times(-0.2) + 0.25\times(-0.4) = 0.1

等价的递推是 Â_t = δ_t + λÂ_{t+1}。λ 压向 0 退化成单步 TD,λ 抬向 1 回到 reward-to-go。一个旋钮,在偏差与方差之间连续调档。

四、第三层:过程奖励 —— 把打分本身改成步级

前两层都在奖励末尾给一个 0/1 的前提下加工信号,第三层动的是奖励本身。过程奖励模型(process reward model,PRM)用人工步骤标注当 value 的代理,这是 L11 p.17 的做法。

算例是解 5x = 6x−14,正确解是 x=14。解到中途一步写下「x=7」,标注者就在这一步打错:错误被定位到步,不用等最终答案才整体判 0。

出处是 Let’s Verify Step by Step(Lightman et al. 2023,Fig.1)。作者标注了 PRM800K,80 万步级标签;实验里 PRM 一致优于只看结局的 ORM(outcome reward model)。

人工逐步标注的贵,催生 2025 年两条新枝。PRIME 免显式标注、直接训隐式 PRM,只靠结果标签即可与策略同步更新;Process Reward Models That Think(arXiv 2504.16828)把 PRM 改成生成式模型,先思考、再打分,打分器自己也学会了推理。

与本讲的连接

本篇是讲次页大纲卡里信用分配的下钻层,收束在 L11 p.55 三要点之一:有用反馈 = 组比较 /critic/ 过程奖励,三层楼各占其一。粒度从轨迹级的组权重,压到历史级的 critic 预期、步级的 δ,再到过程级的逐步打分,每下一层,奖励里的信息多榨出一截。五张资料卡按层各就各位:

  • m6-gae:GAE 原典,指数加权与递推式
  • m6-mixer:critic 平方损失与线性 head 挂法的出处
  • m6-lets-verify:PRM800K 与 PRM 一致优于 ORM 的实证
  • m6-prime、m6-prm-think:2025 年免标注与会思考两条新枝

下次打开 RL 训练日志,先问一句:失败轨迹到底有没有产生负信号?

本节论文与规范

本节资料

  • 经典·高引(2015,ICLR 2016)。用 TD 误差的指数加权和估计优势,γ/λ 两旋钮调偏差-方差;L11 p15-16 的 δ 递推与 λ=0.5 数值例(Â=0.3+0.5(−0.2)+0.25(−0.4)=0.1)直接出自这里。λ→0 退化为单步 TD、λ→1 逼近蒙特卡洛,中间谱系一图看懂;再配 critic 网络可进一步压方差。

  • Let's Verify Step by Step 论文2305.20050进阶

    经典·高引(2023,ICLR 2024)。人工标注 PRM800K(80 万步级标签)证明过程监督 PRM 一致优于结果监督 ORM;L11 p17「用人工步骤标注作 value 代理」(5x=6x−14 例)的直接出处。best-of-n 重排里 PRM 选出的解更稳,负例样本中「跳步、乱推」的失败模式清晰可见。此文把过程奖励从直觉推成可评测路线,后续隐式/生成式 PRM 都以它为参照系。

  • 经典(ICLR 2016)。L11 p13-14 两种 critic 结构的出处:线性 value head + stop-gradient 挂在 policy body 上只训 head;MSE 最优预测是均值(0.6 vs 0.3 例)也来自其 §3.2.1。正文把 seq2seq 从词级交叉熵抬到序列级指标,也是「为什么需要 critic」的早期论证。

  • 2025 前沿。免显式步级标注训练隐式 PRM,把 PRM 变成只靠结果标签即可在线更新的奖励模型(与策略同步更新),省去显式过程标注;开源 PRIME-RL,把过程奖励真正接进在线 RL 训练循环。隐式 PRM 只靠结果标签即可冷启动,token 级细粒度打分随训练在线更新。与 Let's Verify 对照读:一个花钱标数据,一个让奖励自己长出来。

  • 2025 前沿(v5 2025-12)。把 PRM 从标量打分器改成「先思考再打分」的生成式模型,步级监督成本大降、判别力反升;与 PRIME 一显一隐构成 PRM 两条路线对照。打分前先生成一段评估推理,相当于把 test-time scaling 用在奖励侧。同预算下判别准确率反超判别式打分器,是「奖励模型也该会思考」的代表作。

AI 生成 · 仅供参考,与课程方无关。选中正文里的任何一段也能直接问我(解释一下 / 举个例子)。

本详解以 CMU 11-768 AI Agents (Fall 2026) 课程大纲为参考框架独立撰写,AI 辅助起草、人工抽审。 涉及的官方课件、论文与课程材料版权归原所有方,讲义为站内镜像、其余外链原文出处; 观点与文字(除标注引用外)为作者原创。