mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
663 字
2 分钟
Verify Step by Step 论文解读:过程监督让数学推理更强
2025-02-03

大型语言模型在做复杂数学题时经常”一本正经地胡说八道”。OpenAI 的 Verify Step by Step 论文系统比较了结果监督和过程监督,证明了**过程监督(Process Supervision)**能够显著提升模型的推理可靠性。

本文将详细解读这篇论文的核心发现和技术方案。

本文要点#

  • 结果监督(ORM)vs 过程监督(PRM)
  • 过程监督的标注方案
  • 主动学习在过程监督中的应用
  • MATH 数据集的表现

一、背景:数学推理的可靠性问题#

1.1 LLM 推理的错误模式#

flowchart TB A["LLM 数学推理的典型错误"] --> B["1. 推理跳跃"] A --> C["2. 计算错误"] A --> D["3. 错误假设"] A --> E["4. 幻觉式推理"] A --> F["示例"] B --> B1["看似对但中间步骤省略关键推导"] C --> C1["4 × 7 = 26(正确是 28)"] D --> D1["假设某个条件成立但实际不成立"] E --> E1["看似合理但逻辑不连贯"] F --> F1["鸡兔同笼问题: 鸡 12 只,兔 23 只"] F --> F2["验证: 12+23=35 , 12×2+23×4=92 ≠ 94 "] style A fill:#f44336,color:#fff

1.2 两种监督信号#

# 结果监督(Outcome Supervision / ORM)
class OutcomeSupervision:
"""
只看最终答案是否正确
不关心推理过程
"""
def reward(self, solution, final_answer, ground_truth):
return 1.0 if final_answer == ground_truth else 0.0
# 过程监督(Process Supervision / PRM)
class ProcessSupervision:
"""
评估每个推理步骤是否正确
提供细粒度反馈
"""
def reward_per_step(self, steps, ground_truth):
rewards = []
for i, step in enumerate(steps):
# 判断当前步骤是否正确
is_correct = verify_step(step, steps[:i], ground_truth)
rewards.append(1.0 if is_correct else 0.0)
return rewards

二、核心对比:ORM vs PRM#

2.1 监督信号对比#

flowchart LR subgraph 结果监督 ORM A1[推理步骤 1] --> A2[推理步骤 2] --> A3[推理步骤 N] --> A4[最终答案] A4 --> B1[/] end subgraph 过程监督 PRM C1[推理步骤 1] --> D1[/] C2[推理步骤 2] --> D2[/] C3[推理步骤 N] --> D3[/] D1 --> C2 D2 --> C3 end style B1 fill:#f44336,color:#fff style D1 fill:#4caf50,color:#fff style D2 fill:#4caf50,color:#fff style D3 fill:#4caf50,color:#fff

2.2 标注成本对比#

flowchart TB A["ORM vs PRM 标注对比"] --> B["结果监督 ORM"] A --> C["过程监督 PRM"] A --> D["OpenAI 的方案"] B --> B1["只需要标注最终答案"] B --> B2["标注成本低"] B --> B3["但无法指出错误发生在哪一步"] C --> C1["每个中间步骤都需要标注"] C --> C2["标注成本高"] C --> C3["但能精确定位错误"] D --> D1["使用主动学习减少标注量"] D --> D2["只标注最有价值的步骤"] style B fill:#ff9800,color:#fff style C fill:#4caf50,color:#fff

2.3 效果对比#

# OpenAI 的对比实验
results = {
"ORM": {
"solve_rate": "70%", # 能解决多少问题
"step_accuracy": "85%" # 步骤准确率
},
"PRM": {
"solve_rate": "78%", # 显著提升
"step_accuracy": "95%" # 步骤更可靠
}
}

三、技术方案:PRM800K 数据集#

3.1 数据集构建#

class PRM800KDataset:
"""
PRM800K:80 万步骤级人类反馈标注
用于训练过程监督奖励模型
"""
def __init__(self):
self.annotations = []
def add_annotation(self, problem, solution, step_feedback):
"""
添加一个标注样本
problem: 数学问题
solution: 逐步解答
step_feedback: 每一步是否正确的标注
"""
self.annotations.append({
"problem": problem,
"solution": solution,
"step_feedback": step_feedback
})

3.2 主动学习策略#

class ActiveLearning:
"""主动学习减少标注成本"""
def select_samples(self, model, unlabeled_problems):
"""
选择模型最不确定的样本进行标注
"""
uncertainties = []
for problem in unlabeled_problems:
# 让模型生成解答
solutions = model.generate_solutions(problem, n=10)
# 计算答案的一致性
answers = [sol.final_answer for sol in solutions]
agreement = max(set(answers), key=answers.count) / len(answers)
# 一致性低 = 不确定 = 值得标注
uncertainties.append((problem, 1 - agreement))
# 选择最不确定的样本
uncertainties.sort(key=lambda x: x[1], reverse=True)
return [p for p, _ in uncertainties[:self.batch_size]]

3.3 奖励模型训练#

class ProcessRewardModel:
"""过程监督奖励模型"""
def __init__(self, base_model):
self.model = base_model
self.reward_head = nn.Linear(hidden_size, 1)
def forward(self, problem, solution_steps):
"""
输出每一步的奖励分数
"""
rewards = []
hidden = self.model.get_input_embedding(problem)
for step in solution_steps:
step_embedding = self.model.encode_step(step, hidden)
reward = self.reward_head(step_embedding)
rewards.append(reward)
hidden = self.model.update_hidden(hidden, step_embedding)
return rewards
def compute_loss(self, problems, solutions, step_labels):
"""
计算过程监督损失
step_labels: 每一步的人类标注(正确/错误)
"""
rewards = self.forward(problems, solutions)
# 每一步的交叉熵损失
loss = 0
for reward, label in zip(rewards, step_labels):
loss += F.binary_cross_entropy_with_logits(
reward,
torch.tensor(label)
)
return loss

四、实验结果#

4.1 MATH 数据集表现#

bar-chart title "PRM vs ORM 在 MATH 测试集的表现" x-label "监督方法" y-label "问题解决率 %" data: ORM: 78.0, PRM: 85.0

4.2 主动学习的效果#

flowchart TB A["主动学习效率对比"] --> B["随机采样 vs 主动学习"] B --> C["达到 80% 准确率所需的标注量"] C --> D["随机采样: ~500K 标注"] C --> E["主动学习: ~200K 标注(减少 60%)"] F["结论:主动学习显著减少标注成本"] D --> F E --> F style A fill:#4caf50,color:#fff

4.3 不同规模模型的表现#

# 过程监督对不同规模模型的效果
model_sizes = ["1B", "7B", "13B", "175B"]
results = {
"ORM": {
"1B": 45,
"7B": 62,
"13B": 71,
"175B": 78
},
"PRM": {
"1B": 52,
"7B": 73,
"13B": 82,
"175B": 85
}
}
# PRM 在所有规模上都优于 ORM

五、为什么过程监督更有效?#

5.1 原因分析#

flowchart TB A["PRM 优势分析"] --> B["1. 更精确的信用分配"] A --> C["2. 更好的可解释性"] A --> D["3. 符合人类教学直觉"] A --> E["4. 避免错误累积"] B --> B1["ORM 难以确定错误发生在哪一步"] B --> B2["PRM 直接标注每一步的对错"] C --> C1["能指出具体哪一步出错了"] C --> C2["便于人类理解和调试"] D --> D1["人类教学也是一步一步指导"] D --> D2["反馈应该针对具体步骤"] E --> E1["ORM 可能因为中间步骤错但结果对而错过错误"] E --> E2["PRM 确保每步都正确"] style A fill:#4caf50,color:#fff

5.2 训练曲线对比#

line title "ORM vs PRM 训练曲线" x-label "训练步数" y-label "MATH 准确率 %" data: ORM: [50, 60, 68, 73, 76, 78], PRM: [50, 65, 75, 80, 83, 85]

六、影响与局限#

6.1 对后续工作的影响#

flowchart A["Verify Step by Step"] --> B["GPT-4 数学能力"] A --> C["MathVista"] A --> D["更多过程监督研究"]

6.2 当前局限#

局限说明
标注成本高需要步骤级标注
只适用数学难以扩展到开放域推理
标注主观性步骤正确性的判断可能因人而异

常见问题 FAQ#

Q1:过程监督和结果监督哪个更好?

A:在数学推理任务上,论文证明过程监督(PRM)显著优于结果监督(ORM),能提升约 7% 的问题解决率。

Q2:为什么过程监督更有效?

A:过程监督提供更精确的信用分配,能明确指出错误发生在哪一步,避免错误累积和误导性监督信号。

Q3:主动学习是如何减少标注成本的?

A:主动学习选择模型最不确定的样本进行标注,避免标注大量模型已经能正确处理的简单样本,从而用更少标注达到相同效果。

Q4:过程监督适用于所有任务吗?

A:不一定。过程监督需要能够清晰定义”步骤”的任务。数学证明、代码调试等有明确步骤的任务最适合。


小结#

Verify Step by Step 证明了过程监督在数学推理中的重要性:

flowchart TB A["Verify Step by Step 核心总结"] --> B["核心发现"] A --> C["技术贡献"] A --> D["影响"] B --> B1["过程监督(PRM)显著优于结果监督(ORM)"] B --> B2["MATH 数据集提升 7%(78% → 85%)"] B --> B3["主动学习减少 60% 标注成本"] C --> C1["PRM800K 数据集(80 万步骤标注)"] C --> C2["主动学习标注策略"] C --> C3["过程监督奖励模型训练方法"] D --> D1["推动了数学推理研究"] D --> D2["启发了更多过程监督工作"] style A fill:#4caf50,color:#fff

参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

Verify Step by Step 论文解读:过程监督让数学推理更强
https://blog.souloss.com/posts/machine-learning/llm-paper-history/verify-step-by-step-process-supervision/
作者
Souloss
发布于
2025-02-03
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时