过程奖励模型与步骤级监督:从原理到实现
1.1 为什么步骤级监督是必要的
1.1.1.1 结果监督的瓶颈:一个解方程的例子
想象我们正在教一个学生解方程:2x + 6 = 10。学生写下了三步:
第一步:2x = 10 - 6,得到 2x = 4
第二步:x = 4 / 2,得到 x = 2
第三步:x = 3
如果只看最终答案,老师只能给出一个信号:“错了”。老师无法知道错误发生在哪一步。是第一步移项符号搞错了?还是第二步除法算错了?又或者是第三步莫名其妙写了个3?这种只给最终分数的监督方式,就是结果奖励模型(Outcome Reward Model,ORM)的核心困境。
在继续之前,我们先看看ORM的形式化定义。给定一个问题 qqq 和一个完整的解答文本 y=(y1,y2,…,yT)y = (y_1, y_2, \dots, y_T)y=(y1,y2,…,yT),ORM输出一个标量:
R(q,y)∈{0,1} R(q, y) \in \{0, 1\} R(q,y)∈{0,1}
其中1表示最终答案正确,0表示错误。这个信号极其稀疏:一条包含数十个推理步骤的解答,只对应一个二元标签。当模型生成成千上万条解答时,绝大多数的梯度更新只能收到"对"或"错"这一个比特的信息。
现在我们已经了解了ORM的稀疏性,接下来看看这种稀疏性在数学上带来了什么问题。
1.1.1.2 信用分配与方差爆炸
ORM的奖励信号需要回溯到生成解答的每一个token。如果我们用策略梯度来优化生成模型,梯度形式为:
∇θJORM=Ey∼πθ(⋅∣q)[∑t=1T∇θlogπθ(yt∣q,y<t)⋅R(q,y)] \nabla_\theta J_{\text{ORM}} = \mathbb{E}_{y \sim \pi_\theta(\cdot|q)} \left[ \sum_{t=1}^T \nabla_\theta \log \pi_\theta(y_t|q, y_{<t}) \cdot R(q, y) \right] ∇θJORM=Ey∼πθ(⋅∣q)[t=1∑T∇θlogπθ(yt∣q,y<t)⋅R(q,y)]
这里 R(q,y)R(q,y)R(q,y) 是一个伯努利随机变量。假设当前模型对某类问题的正确率约为30%,那么 Var(R)=0.3×0.7=0.21\text{Var}(R) = 0.3 \times 0.7 = 0.21Var(R)=0.3×0.7=0.21。这个方差并不小,更关键的是,同一个 RRR 要乘到所有 TTT 个步骤的梯度上。如果 T=100T=100T=100,相当于用一枚硬币的抛掷结果,去指导一百个不同动作的信用分配。
听起来抽象对吧?如果画成图会是什么样子?我们可以把ORM的梯度更新想象成一条河流:上游有一百条支流(每个token的梯度),但它们的水量(权重)都由下游同一个闸门(最终奖励 RRR)控制。闸门只开或关,所有支流同时被淹没或同时干涸。这种单点瓶颈导致梯度估计的方差随序列长度线性甚至二次增长。
这在训练中意味着:模型需要采集成千上万的完整解答,才能获得对单个步骤的可靠梯度信号。数据效率极低。
1.2 过程奖励模型的形式化框架
1.2.1.1 把推理看作马尔可夫决策过程
现在我们已经了解了ORM的信用分配困境,接下来看看PRM如何拆解这个问题。
过程奖励模型的核心思想很简单:与其在终点等答案,不如在每一步都设一个检查站。我们可以把数学推理重新建模为一个马尔可夫决策过程(MDP)。状态 sts_tst 是"已经写下的解题历史",动作 ata_tat 是"生成的下一个步骤"。与ORM不同,PRM在每个中间状态都提供一个反馈信号。
形式化地,PRM是一个函数:
Vϕ(q,s1:t)→[0,1] V_\phi(q, s_{1:t}) \to [0, 1] Vϕ(q,s1:t)→[0,1]
它输入问题 qqq 和步骤前缀 s1:t=(s1,s2,…,st)s_{1:t} = (s_1, s_2, \dots, s_t)s1:t=(s1,s2,…,st),输出一个概率值,表示"从当前步骤继续推理,最终能够得出正确答案"的可能性。在原始设定中,这个输出被简化为一个二分类标签:该步骤是"正确路径上的步骤"还是"错误路径上的步骤"。
1.2.1.2 PRM与ORM的数学边界
为了严格对比,我们把ORM也写成价值函数形式。ORM可以看作只在终止状态 sTs_TsT 进行判断:
VORM(q,y)=I[Answer(y)=Correct] V_{\text{ORM}}(q, y) = \mathbb{I}[\text{Answer}(y) = \text{Correct}] VORM(q,y)=I[Answer(y)=Correct]
而PRM在每个中间步骤都进行判断:
VPRM(q,s1:t)=Eπ[I[Answer(y)=Correct] ∣ s1:t] V_{\text{PRM}}(q, s_{1:t}) = \mathbb{E}_{\pi} \left[ \mathbb{I}[\text{Answer}(y) = \text{Correct}] \,\big|\, s_{1:t} \right] VPRM(q,s1:t)=Eπ[I[Answer(y)=Correct]s1:t]
也就是说,PRM估计的是条件期望:给定当前已经写下的步骤前缀,最终正确的概率。ORM则是这个期望在 t=0t=0t=0 时的特例(没有任何步骤时,期望就是模型自身的平均正确率)。
如果画成图会是什么样子?ORM像是一个只在终点拍照的裁判,PRM则像是一个拿着摄像机全程跟拍的导演,每一帧都能判断演员是否走在正确的剧情线上。
1.3 方差差异:从数学上理解PRM为何更稳定
1.3.1.1 信用分配长度的差异
现在我们已经了解了PRM和ORM的定义差异,接下来看看这种差异在方差层面产生的具体影响。
ORM的训练信号 RRR 需要跨越整个序列长度 TTT 来分配信用。在策略梯度框架下,单个样本对第 ttt 步的梯度贡献为:
gtORM=∇θlogπθ(at∣st)⋅R g_t^{\text{ORM}} = \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot R gtORM=∇θlogπθ(at∣st)⋅R
由于 RRR 与所有步骤共享,且 R∈{0,1}R \in \{0,1\}R∈{0,1},其方差为:
Var(R)=p(1−p) \text{Var}(R) = p(1-p) Var(R)=p(1−p)
其中 ppp 是模型当前的平均正确率。当 ppp 远离0.5时(例如专家模型 p=0.9p=0.9p=0.9),方差 Var(R)=0.09\text{Var}(R)=0.09Var(R)=0.09 看似不大,但由于所有步骤的梯度都与同一个 RRR 耦合,总梯度向量的方差上界为:
Var(∑t=1TgtORM)≤T2⋅Gmax2⋅Var(R) \text{Var}\left(\sum_{t=1}^T g_t^{\text{ORM}}\right) \leq T^2 \cdot G_{\max}^2 \cdot \text{Var}(R) Var(t=1∑TgtORM)≤T2⋅Gmax2⋅Var(R)
这里 GmaxG_{\max}Gmax 是单步策略梯度的最大范数。序列长度 TTT 以平方形式进入方差上界,这是ORM训练不稳定的根源。
1.3.1.2 PRM的方差分解
PRM采用监督学习而非强化学习来训练验证器。对于每个步骤前缀 s1:ts_{1:t}s1:t,我们有一个局部标签 yt∈{0,1}y_t \in \{0,1\}yt∈{0,1}(该步骤是否正确)。PRM的交叉熵损失为:
LPRM=−∑t=1T[ytlogv^t+(1−yt)log(1−v^t)] \mathcal{L}_{\text{PRM}} = -\sum_{t=1}^T \left[ y_t \log \hat{v}_t + (1-y_t) \log(1-\hat{v}_t) \right] LPRM=−t=1∑T[ytlogv^t+(1−yt)log(1−v^t)]
其中 v^t=σ(Vϕ(q,s1:t))\hat{v}_t = \sigma(V_\phi(q, s_{1:t}))v^t=σ(Vϕ(q,s1:t))。每一步的损失梯度仅依赖于该步骤的局部标签 yty_tyt:
gtPRM=∇ϕLt=(v^t−yt)⋅∇ϕVϕ(q,s1:t) g_t^{\text{PRM}} = \nabla_\phi \mathcal{L}_t = ( \hat{v}_t - y_t ) \cdot \nabla_\phi V_\phi(q, s_{1:t}) gtPRM=∇ϕLt=(v^t−yt)⋅∇ϕVϕ(q,s1:t)
核心观察来了:在PRM框架下,一条包含 TTT 个步骤的解答,产生了 TTT 个独立的训练样本。每个样本的噪声仅来自该步骤标签的伯努利方差 Var(yt)=pt(1−pt)\text{Var}(y_t) = p_t(1-p_t)Var(yt)=pt(1−pt)。虽然单步方差可能仍然存在,但总方差被分散到 TTT 个独立梯度中:
Var(∑t=1TgtPRM)=∑t=1TVar(gtPRM)+协方差项 \text{Var}\left(\sum_{t=1}^T g_t^{\text{PRM}}\right) = \sum_{t=1}^T \text{Var}(g_t^{\text{PRM}}) + \text{协方差项} Var(t=1∑TgtPRM)=t=1∑TVar(gtPRM)+协方差项
由于不同步骤的PRM梯度主要依赖不同的前缀表示,协方差项远小于ORM情形。更重要的是,ORM用一个样本去推断T个步骤的信用,而PRM用T个样本分别推断每个步骤的信用。根据大数定律,后者的估计效率在样本复杂度上具有线性优势。
这在训练中意味着:PRM的验证器训练不需要ORM那样的大规模完整轨迹采样。即使只有少量完整解答,只要步骤被充分标注,就能稳定训练。
1.4 验证器架构拆解
1.4.1.1 输入表示:问题与历史的拼接
现在我们已经了解了PRM的训练稳定性来源,接下来看看一个可运行的PRM在工程上长什么样子。
验证器的输入不是裸文本,而是一个结构化序列。假设问题是"求16的平方根",当前已经生成的步骤是"第一步:设x为所求数,x平方等于16"。我们需要把问题和历史拼接成一个上下文序列:
x=[CLS,q1,q2,…,qm,SEP,s1,s2,…,st] x = [\text{CLS}, q_1, q_2, \dots, q_m, \text{SEP}, s_1, s_2, \dots, s_t] x=[CLS,q1,q2,…,qm,SEP,s1,s2,…,st]
其中 qiq_iqi 是问题token,sjs_jsj 是步骤token,SEP是分隔符。这个拼接后的序列被送入Transformer编码器。
如果画成图会是什么样子?想象两个蓝色方框,左边方框装着"问题",右边方框装着"已走步骤",中间有一个绿色闸门"拼接接口"把它们连成一串token流。
1.4.1.2 步骤编码器与隐藏状态提取
Transformer对拼接序列进行前向传播,输出每一层的隐藏状态矩阵 H∈RL×dH \in \mathbb{R}^{L \times d}H∈RL×d,其中 LLL 是总token数,ddd 是隐藏维度。
PRM不需要每个token都有一个价值分数,它只需要判断"当前步骤整体"的质量。因此,我们需要从隐藏状态中提取步骤级别的表示。最常用的做法是取步骤结束位置的隐藏状态(例如换行符或特殊步骤标记处的向量),记为 ht∈Rdh_t \in \mathbb{R}^dht∈Rd。
另一种做法是对步骤内的所有token做平均池化:
htmean=1∣st∣∑j∈stepthj h_t^{\text{mean}} = \frac{1}{|s_t|} \sum_{j \in \text{step}_t} h_j htmean=∣st∣1j∈stept∑hj
两种方法各有优劣:取结束位置更关注步骤的"结论性",平均池化则更均衡。在原始实现中,通常使用步骤结束标记处的隐藏状态。
1.4.1.3 价值头设计:从向量到概率
提取到步骤表示 hth_tht 后,价值头(Value Head)将其映射为一个标量 logits,再通过 sigmoid 得到概率:
zt=Wv⋅ht+bv z_t = W_v \cdot h_t + b_v zt=Wv⋅ht+bv
v^t=σ(zt)=11+exp(−zt) \hat{v}_t = \sigma(z_t) = \frac{1}{1 + \exp(-z_t)} v^t=σ(zt)=1+exp(−zt)1
这里 Wv∈R1×dW_v \in \mathbb{R}^{1 \times d}Wv∈R1×d 和 bv∈Rb_v \in \mathbb{R}bv∈R 是价值头的可训练参数。如果PRM被训练为二分类器(正确步骤 vs 错误步骤),这个概率就是步骤属于"正确路径"的后验概率。
这在实际使用中意味着:推理时,我们可以把 v^t\hat{v}_tv^t 当作一个实时质量计。如果某一步的分数突然从0.9跌到0.2,系统就知道模型在此处大概率走上了歧途。
1.5 自动步骤标注:Math-Shepherd方法
1.5.1.1 人工标注的困境与蒙特卡洛出路
现在我们已经了解了PRM的架构,接下来看看训练数据从哪里来。
PRM需要步骤级标签,但人工标注每一步的正确性成本极高。一个数学问题可能有十几种解法,每种解法又有十几个步骤,让标注者逐行判断"这一步是否通向正确答案"几乎不可扩展。
Math-Shepherd的核心洞察是:我们可以用蒙特卡洛模拟来自动生成步骤标签。基本思路是:对于某个步骤前缀,如果我们从这个前缀出发,让当前策略模型自动生成大量后续完成,然后检查这些完成中有多少比例是正确的,这个比例就可以作为该步骤的价值估计。
1.5.1.2 软标签的构造公式
形式化地,给定问题 qqq 和步骤前缀 s1:ts_{1:t}s1:t,我们从策略模型 πθ\pi_\thetaπθ 中采样 KKK 个完成:
y(k)∼πθ(⋅∣q,s1:t),k=1,2,…,K y^{(k)} \sim \pi_\theta(\cdot | q, s_{1:t}), \quad k = 1, 2, \dots, K y(k)∼πθ(⋅∣q,s1:t),k=1,2,…,K
然后使用自动验证器(例如代码执行或符号检查)判断每个完成的最终答案是否正确。步骤前缀的软标签定义为:
vtsoft=1K∑k=1KI[Answer(y(k))=Correct] v_t^{\text{soft}} = \frac{1}{K} \sum_{k=1}^K \mathbb{I}\left[\text{Answer}(y^{(k)}) = \text{Correct}\right] vtsoft=K1k=1∑KI[Answer(y(k))=Correct]
这个 vtsoft∈[0,1]v_t^{\text{soft}} \in [0, 1]vtsoft∈[0,1] 就是PRM训练时的回归目标。如果 KKK 足够大,根据大数定律,vtsoftv_t^{\text{soft}}vtsoft 会收敛到真实的条件期望 VPRM(q,s1:t)V_{\text{PRM}}(q, s_{1:t})VPRM(q,s1:t)。
1.5.1.3 硬标签的剪枝策略
除了软标签,Math-Shepherd还使用一种更经济的硬标签策略。对于一条已经知道最终答案是否正确的完整轨迹,我们可以反向标记步骤:
- 如果轨迹最终正确,则轨迹中的每一个步骤都被标记为正样本(标签1)。
- 如果轨迹最终错误,则找到第一个导致错误的步骤(通常通过对比正确轨迹或使用启发式规则定位),将该步骤标记为负样本(标签0),后续步骤可以忽略或全部标记为负。
这种硬标签虽然粗糙,但生成成本极低,适合作为预训练阶段的冷启动数据。
如果画成图会是什么样子?想象一棵决策树,根节点是"问题",每个分支是一个"步骤"。正确路径上的所有节点被涂成绿色,错误路径从分叉点开始涂成红色。Math-Shepherd就是用大量随机游走来统计每个节点最终通向绿色终点的频率。
1.5.1.4 伪代码:自动标注引擎
procedure MonteCarloLabel(problem, prefix, policy, verifier, K)
success_count ← 0
for i ← 1 to K do
completion ← policy.generate(problem, prefix)
if verifier.check(completion) = true then
success_count ← success_count + 1
end
end
value ← success_count / K
return value
end
procedure HardLabelBatch(problem, generator, verifier, N)
// 第一步:生成候选轨迹
traces ← empty list
for i ← 1 to N do
trace ← generator.rollout(problem)
trace.is_correct ← verifier.check(trace.answer)
append trace to traces
end
// 第二步:反向传播标签
labels ← empty map
for each trace in traces do
if trace.is_correct = true then
for each step in trace.steps do
labels[step] ← 1
end
else
error_step ← LocateFirstError(trace, verifier)
labels[error_step] ← 0
for each later_step after error_step do
labels[later_step] ← 0
end
end
end
return labels
end
这在实际使用中意味着:即使没有任何人工标注,我们也能通过"自我对弈加自动评判"的方式,源源不断地生成PRM训练数据。这是推理模型能够大规模扩展步骤监督的关键工程突破。
1.6 训练与推理中的PRM
1.6.1.1 损失函数与训练流程
现在我们已经了解了数据如何自动标注,接下来看看PRM的训练细节。
PRM的训练本质上是一个监督学习问题。给定一个标注数据集 D={(q(i),s1:t(i),yt(i))}\mathcal{D} = \{(q^{(i)}, s_{1:t}^{(i)}, y_t^{(i)})\}D={(q(i),s1:t(i),yt(i))},其中 yt(i)∈{0,1}y_t^{(i)} \in \{0,1\}yt(i)∈{0,1} 或 [0,1][0,1][0,1],我们最小化交叉熵损失:
L(ϕ)=−1∣D∣∑(q,s,y)∈D[ylogσ(Vϕ(q,s))+(1−y)log(1−σ(Vϕ(q,s)))] \mathcal{L}(\phi) = -\frac{1}{|\mathcal{D}|} \sum_{(q,s,y) \in \mathcal{D}} \left[ y \log \sigma(V_\phi(q,s)) + (1-y) \log(1-\sigma(V_\phi(q,s))) \right] L(ϕ)=−∣D∣1(q,s,y)∈D∑[ylogσ(Vϕ(q,s))+(1−y)log(1−σ(Vϕ(q,s)))]
如果 yyy 是软标签(蒙特卡洛估计值),这个损失相当于让PRM学习条件期望的估计;如果 yyy 是硬标签,则是一个标准的二分类问题。
在继续之前,我们先看看训练时的一个关键技巧:步骤重采样。由于错误步骤往往比正确步骤更难识别(模型很少生成明显荒谬的中间步骤),训练集中正负样本可能极度不平衡。常用的做法是对负样本过采样,或者在损失中加入类别权重。
1.6.1.2 推理时的搜索策略:Best-of-N与Beam Search
训练好的PRM不是单独使用的,它通常与生成模型配合,在推理阶段进行搜索。
Best-of-N筛选:生成模型先独立采样 NNN 条完整解答。ORM只能根据最终答案筛选,而PRM可以计算每条解答的步骤级累积分数。例如,取解答所有步骤PRM分数的几何平均或算术平均作为总体质量分,然后选择分数最高的解答。这种方法在相同计算预算下显著优于ORM的Best-of-N。
Beam Search指导:更精细的做法是在生成过程中实时指导。维护一个宽度为 BBB 的候选前缀集合。每生成一个新步骤,PRM评估所有 BBB 个候选前缀的分数,保留分数最高的 BBB 个进入下一轮。这相当于在推理空间中进行启发式搜索,PRM扮演了A星算法中启发函数的角色。
形式化地,Beam Search的第 ttt 步更新规则为:
Bt=Top-B{∑i=1tlogπθ(si∣q,s<i)+α⋅Vϕ(q,s1:t)} \mathcal{B}_t = \text{Top-}_B \left\{ \sum_{i=1}^t \log \pi_\theta(s_i|q, s_{<i}) + \alpha \cdot V_\phi(q, s_{1:t}) \right\} Bt=Top-B{i=1∑tlogπθ(si∣q,s<i)+α⋅Vϕ(q,s1:t)}
其中 α\alphaα 是生成模型似然与PRM价值之间的权衡系数。当 α=0\alpha=0α=0 时退化为标准Beam Search;当 α\alphaα 很大时,模型几乎完全按照PRM的指引前进。
如果画成图会是什么样子?想象一条河流分叉成许多支流,ORM站在入海口只挑最干净的水,PRM则在每个分叉口都立了一块指示牌,实时告诉船夫哪条支流污染更少。
1.6.1.3 方差差异在推理中的体现
ORM在推理阶段的方差体现在:Best-of-N时,即使 NNN 很大,如果模型生成的解答整体质量不高,ORM也无法从中挑出好的。因为ORM只看终点,所有错误解答无论"错得多离谱"都被同等对待(标签0)。
PRM在推理阶段的方差则低得多:即使一个解答最终错了,PRM也能识别出"前几步其实是对的",从而在Beam Search中保留这些有价值的前缀。这种部分信用机制使得搜索树能够更有效地剪枝,避免在明显错误的方向上浪费计算。
这在实际使用中意味着:PRM不仅是一个训练工具,更是一个推理加速器。它让模型在测试时就能通过更少的采样次数找到高质量解答,相当于把训练时节省下来的方差优势,转化为了推理时的计算效率优势。
1.7 接口与架构总览
1.7.1.1 模块接口对接图
现在我们已经走完了原理与算法,接下来看看各个模块之间如何拼接成一个可运行系统。
PRM系统对外暴露的核心接口只有两个:输入侧接收"问题文本"和"历史步骤",输出侧返回"概率值"和"类别判断"。内部则通过拼接操作将异构输入统一为token序列,再经过前向传播得到结果。
1.7.1.2 完整三层架构总览
如果把PRM系统看作一个完整服务,它可以清晰划分为数据层、模型层和应用层。数据层负责原始问题、步骤语料和标注数据的存储与清洗;模型层负责词元嵌入、编码主干和价值估计;应用层负责步骤筛选、束搜索和最优输出。
1.7.1.3 全章闭环
现在我们已经走完了从ORM的困境到PRM的架构、从方差推导到自动标注、从训练损失到推理搜索的完整路径。让我们在最后把闭环收紧。
ORM像是一个在终点打分的裁判,它只能告诉你"对"或"错"。这种稀疏性导致训练信号方差大、信用分配困难、数据效率低下。PRM则把裁判换成了全程跟拍的导演,每一步都有一个镜头。通过把单一的二元结果信号拆解为 TTT 个局部步骤信号,PRM在数学上实现了方差的分散与降低。
验证器架构上,PRM本质上是一个基于Transformer的步骤级二分类器或回归器。它的输入是问题与步骤前缀的拼接,输出是该步骤通向正确答案的概率。通过价值头把隐藏状态映射为标量概率,PRM能够在推理的每一步提供实时质量反馈。
数据层面,Math-Shepherd通过蒙特卡洛模拟和硬标签剪枝,解决了步骤级标注的可扩展性问题。大量随机完成与自动验证的结合,使得PRM可以在无人工干预的情况下自我迭代数据。
训练与推理层面,PRM通过标准交叉熵损失进行监督学习,并在Beam Search中作为启发式函数指导生成。步骤级价值不仅降低了训练方差,更在测试时通过部分信用机制提升了搜索效率。
这在训练与实际使用中意味着:当我们面对需要长链推理的复杂任务时,不应该只在终点等待答案。把监督信号插入到推理的每一个中间节点,不仅能让模型学得更快、更稳,还能让模型在测试时拥有"自知之明"——知道自己在哪一步开始偏离正确轨道。这种从稀疏到密集、从终点到全程的监督范式转换,正是新一代推理模型能够实现深度思考的核心基础设施。
1万+



被折叠的 条评论
为什么被折叠?



