过程奖励模型 PRM:让推理逐步可验证

大模型的解码是一个自回归、逐步生成的过程,但传统的奖励模型只在「生成结束、拿到最终答案」之后才给一次总分。问题在于:一道多步数学题或一段多步代码,往往在中间某一步就走错了,却仍然能生成一个看起来完整的答案。这类「过程正确、结果碰巧对」或者「过程已错、结果也错」的样本,只靠最终对错很难区分,训练与筛选都容易失效。过程奖励模型(Process Reward Model,PRM)把评判粒度从「整段输出」下放到「每一步推理」,对中间步骤逐一打分,于是错误能被更早、更准地定位。本文先讲清 PRM 与结果奖励模型(ORM)的本质区别,再拆解 PRM 如何对步骤打分、训练数据从哪来、推理时怎么结合,最后用一个最小 Python 示例演示「逐步打分并选最优路径」。

一、ORM 与 PRM 的区别

结果奖励模型(Outcome Reward Model,ORM)只看最终答案:给定题目和完整解答,ORM 输出一个标量,表示「这个答案整体好不好」。它的标签天然便宜,因为很多任务(如数学题、单元测试)用程序就能自动判分,不需要人读过程。但 ORM 有两个硬伤:其一是信用分配模糊,它无法告诉你到底是哪一步出了错;其二是容易被「结果正确但过程错误」的样本误导,例如数值巧合、错误步骤相互抵消,或者代码能跑通却逻辑谬误。

过程奖励模型(PRM)则在每一步之后都插一个判别点。给定题目、已经写下的前 k 步,PRM 输出「第 k+1 步是否正确 / 可信」的概率。这样奖励信号自带位置,错误被定位到具体步骤,训练和监督都能做到「哪错改哪」。代价是标注成本高:如果靠人工,需要人逐段阅读并判断每一步;如果靠自动,需要设计可靠的启发式或搜索来推断步骤好坏。

一个常用的直觉对比是:ORM 像「只看考试成绩」,PRM 像「既看成绩也看每道题的解题步骤」。在需要强推理可靠性的场景里,逐步信号往往比单次总分更有用。OpenAI 的「Let’s Verify Step by Step」(arXiv:2305.20050,已核验)在 MATH 数据集上做了系统对比,结论是过程监督显著优于结果监督,其过程监督模型在 MATH 测试集一个有代表性的子集上解出了约 78% 的题目,并配套发布了含 80 万条逐步人工标注的 PRM800K 数据集。

二、PRM 如何对推理中间步骤打分

PRM 在工程上通常实现为一个「带步骤判别头」的语言模型:把题目和前 k 步拼成上下文,让模型在每一步的结尾处输出一个正确概率。训练目标多用二分类交叉熵,标签为「该步正确 / 错误」,有时也会引入「中性(无法判断)」这一类。

在数学场景里,一个步骤通常是推理链上的一行推导,例如「由勾股定理得 c = sqrt(a^2 + b^2)」。PRM 的输入是题目加上截至该步的全部前文,输出是该步为正的概率 p_k。整条路径的质量可以用多种聚合方式表达:取所有步骤概率的最小值(最保守,强调「任一步都不能错」)、取乘积或几何平均(强调整体连贯),或取末尾几步的平均。实践中常用「所有步骤概率的最小值」或「乘积」作为路径总分,因为只要有一处关键错误,整条推理就不可信。

在代码场景里,「步骤」可以是函数逐个生成、或解题的逐个子目标。比如写一道算法题,PRM 可以分别评估「是否选对了数据结构」「循环边界是否处理正确」「递归终止条件是否完备」。与数学不同的是,代码还能用执行反馈做辅助:把中间函数跑一组测试用例,通过的步骤给高奖励,报错的步骤给低奖励。也就是说,代码 PRM 往往把「语言模型打分」和「可执行验证」结合起来,比纯文本判分更稳。

需要提醒的是,PRM 估的是「这一步看起来是否正确」,并不绝对等于「客观正确」。尤其当训练数据有噪声时,PRM 可能奖励看似合理实则错误的步骤,因此推理时通常要把 PRM 与一个最终结果校验(如答案匹配、单元测试)搭配使用。

三、训练数据怎么获取

PRM 最大的现实门槛是「逐步标签从哪来」。主流做法有三种。

第一种是人工标注。最典型的就是「Let’s Verify Step by Step」(已核验)发布的 PRM800K:标注者阅读模型生成的逐步解答,对每一步标记为正确、错误或中性。人工标注质量高、噪声小,但昂贵且难以规模化,且不同标注者对「中性」的界定常有分歧。

第二种是 MCTS 自动标注,代表工作是 Math-Shepherd(arXiv:2312.08935,已核验)。它的核心想法是:对已经写下的第 k 步,从该步出发用模型多次采样后续完整解答(一次采样称为一次 rollout);如果这若干次 rollout 中至少有一次最终答对,就说明第 k 步「走得通」,给正标签,否则给负标签。这样无需任何人读过程,就能用「能否导向正确答案」反推出每一步的好坏。Math-Shepherd 把这种自动过程监督用于重排序与逐步 PPO,在 Mistral-7B 上把 GSM8K 准确率从 77.9% 提升到 84.1%,MATH 从 28.6% 提升到 33.0%,再配合其验证还能进一步到 89.1% 与 43.5%。

第三种是自我训练与自举。思路是让模型自己生成大量解答,用「自洽性」或「自我验证」来打步骤标签:例如同一步在多条成功路径里反复出现,就倾向于给它高置信正标签;或先训一个初版 PRM,再用它筛选高质量逐步数据去迭代训练更强的 PRM 与策略模型。这类方法把对人工和昂贵搜索的依赖逐步内化,是开源社区补齐 PRM 数据缺口的常见路线。

四、推理时如何结合 PRM

拿到一个训练好的 PRM 后,它在推理阶段最常见的用途是「搜索更好的推理路径」,也就是推理时计算(inference-time compute)的核心。

Best-of-N(也叫拒绝采样)是最直接的用法:用策略模型对同题生成 N 条完整解答,用 PRM 给每条路径打分(常见取法为各步骤正确概率的最小值或乘积),选分数最高的一条输出。实现简单、收益明显,代价是 N 倍生成成本。

Beam Search 把逐步打分用进生成过程本身:每生成一步,就保留当前 PRM 累计分数最高的 k 条部分路径,再各自续写,逐步剪枝。相比 Best-of-N,它在生成中途就干预,能避免把算力浪费在早已走偏的路径上,但对步骤边界的切分和 PRM 的逐步一致性要求较高。

树搜索是更激进的路线,用 PRM 作为节点价值的估计去做结构化搜索。rStar(arXiv:2408.06195,已核验)把推理拆成「自我博弈式的生成-判别」:目标小模型用带丰富类人推理动作的蒙特卡洛树搜索(MCTS)构造高质量轨迹,再由另一个能力相近的小模型充当判别器逐条验证,双方一致同意的轨迹被认为更可能正确。rStar 不微调、不依赖更强模型,就把 LLaMA2-7B 的 GSM8K 从 12.51% 提升到 63.91%,Mistral-7B 从 36.46% 提升到 81.88%。LLaMA-Berry(arXiv:2410.02884,已核验)则把 MCTS 与迭代式 Self-Refine 结合成 SR-MCTS,并用成对偏好奖励模型(PPRM)以「增强 Borda 计数」把两两偏好合成全局排名,在 GPQA、AIME24、AMC23 等奥赛级基准上优于 ToT、rStar 等传统搜索。树搜索思路此处仅作概述,重点是理解「PRM 提供逐步价值,搜索负责在该价值指引下探索路径」这一分工。

五、最小代码示例:用 PRM 打分并选最优路径

下面用约三十行 Python 演示核心思想。我们构造两条候选推理路径,每条由若干步骤文本组成;用一个 mock 的 PRM 给每一步输出正确概率,再用「各步概率的最小值」作为路径总分,选出最优路径。注意真实 PRM 是一个神经网络,这里用确定性映射代替,只为说明流程。

  # 模拟一个过程奖励模型:输入步骤文本,返回该步「正确」的概率
  # 真实场景里这里是加载好的 PRM 模型,对每一步输出一个标量logit经sigmoid
  def mock_prm(step_text):
      if "错误" in step_text or "矛盾" in step_text:
          return 0.1
      if "假设" in step_text:
          return 0.6
      return 0.9

  # 两条候选推理路径,每条是若干步骤组成的列表
  path_a = ["设未知数为 x", "假设两边同除以零仍成立", "解得 x = 0"]
  path_b = ["设未知数为 x", "两边平方后移项", "解得 x = 3 并代回验证成立"]

  # 用「各步正确概率的最小值」作为整条路径的得分,强调任一步都不能错
  def score_path(steps):
      step_scores = [mock_prm(s) for s in steps]
      return min(step_scores), step_scores

  # 对每条路径打分,并记录逐步分数便于排查哪一步拖了后腿
  results = {}
  for name, steps in [("path_a", path_a), ("path_b", path_b)]:
      total, detail = score_path(steps)
      results[name] = (total, detail)

  # 选择路径总分最高的那一条作为最终输出
  best_name = max(results, key=lambda k: results[k][0])
  best_total, best_detail = results[best_name]

  print("各路径得分:", results)
  print("最优路径:", best_name, "路径得分:", best_total)
  print("其逐步分数:", best_detail)

运行后 path_b 会胜出,因为 path_a 中含「假设两边同除以零仍成立」这一步被 PRM 判为低分,整条路径的最小值被拉低。这个最小示例把 PRM 的三个关键动作串了起来:逐步打分、聚合为路径分、按路径分择优。把它替换成真实 PRM 与多条 MCTS 展开的节点,就接近生产环境里 Best-of-N 与树搜索的做法。

小结

PRM 的本质是把奖励信号的粒度从「结果」推进到「过程」,让推理的每一步都可被验证、被定位、被择优。它与 ORM 并非互斥:ORM 标签便宜、适合做最终校验,PRM 信用分配清晰、适合做逐步监督与推理时搜索。训练数据上,人工标注质量最高但贵,MCTS 自动标注(如 Math-Shepherd)可规模化,自我训练则把依赖逐步内化。推理时,Best-of-N、Beam Search、树搜索(rStar、LLaMA-Berry 等)都是「用 PRM 当指南针去探索推理路径」的不同实现。工程落地的关键提醒是:PRM 估的是「看起来对不对」,要和最终结果校验搭配,并警惕噪声标签带来的误奖励。

参考与延伸阅读

  • OpenAI,Let’s Verify Step by Step,arXiv:2305.20050(已核验)。过程监督显著优于结果监督的系统对比,并发布 PRM800K 逐步人工标注数据集。
  • Peiyi Wang 等,Math-Shepherd: Verify and Reinforce LLMs Step by Step without Human Annotations,arXiv:2312.08935(已核验)。用 MCTS 自动构造逐步标签,无需人工标注的过程奖励模型。
  • Zhenting Qi 等,Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers(rStar),arXiv:2408.06195(已核验)。自我博弈式生成-判别加 MCTS 的小模型推理增强。
  • Di Zhang 等,LLaMA-Berry: Pairwise Optimization for O1-like Olympiad-Level Mathematical Reasoning,arXiv:2410.02884(已核验)。MCTS 结合 Self-Refine 与成对偏好奖励模型(PPRM)的树搜索框架。
  • 延伸方向(待核实):Reward Bench、Iterative DPO 与自我训练式 PRM 的近期开源实现,以及把 PRM 与单元测试执行反馈结合的代码推理工作,建议结合原始仓库的 README 与最新论文进一步核对细节。
本文累计阅读