CS329A Lecture3:AI 答了十次,我该信哪一次?
Table of Contents
让一个 Agent 做完任务,再补一句“检查一下”,几乎是顺手的事。可如果它检查完,自信地把错误答案交了上来呢?
多问几次也未必解决问题。十份回答摆在面前,有的答案相同,有的解释漂亮。最后该交哪一份? Stanford CS329A 第 3 讲 Robust Verification,就从这个问题往下拆。
本文依据 CS329A 2025 年秋季课程表 的四篇指定阅读整理,不是课堂实录。文中的订单、批改和互动结果为教学示例;论文实验会单独注明出处。
先做一回阅卷人
买三杯奶茶,每杯 12 元,再用一张减 5 元的优惠券。这道题不难,答案是 31 元。不过,模型可以用不同的方式“算出”31。
先点下面的“核对最后数字”,再点“逐步批改”。
先核对金额,再翻开计算过程。留意 A 和 C 的变化。
- 3 杯,每杯 12 元:3 × 12 = 36 元。
- 减去 5 元优惠:36 − 5 = 31 元。
数字正确
两步都对,这份可以放心选。
- 3 杯,每杯 12 元:3 × 12 = 36 元。
- 使用优惠券:36 + 5 = 41 元。
数字错误
第二步把减价算成了加价。
- 3 杯,每杯 12 元:3 × 12 = 35 元。
- 减去 5 元优惠:35 − 5 = 31 元。
数字正确
两步都算错了,却碰巧写对了最后的数字。
现在只能看到答案:A 和 C 都写了 31 元。
为本文构造的例子。按钮切换的是标签信息,不是在运行真实 ORM 或 PRM。
看到 C 的过程,大概就能理解为什么检查答案并不总是省心:它两次算错,最后居然写对了数字。
在数学题里,这可能是答案匹配,也可能要求推理成立。写代码时,可能是通过测试,还可能包括没有破坏已有功能。检查的标准不同,同一份结果可能得到不同的评价。
第一层:让模型学会挑答案
一个模型负责生成几份解答,再让一个评分模型比较它们,挑出最好的一份。这个评分模型就叫验证器(verifier)。
为什么把写答案和检查答案拆开?想象解一道数学题:从空白纸开始找解法,和检查别人写好的两步计算,做的事情不一样。现成的步骤给了检查者落脚点。模型能否利用这些线索,比重新作答更可靠,要靠实验来判断。
它又没有标准答案,凭什么给分?
遇到新题时确实没有。但训练的时候可以有。
Cobbe 等人在 2021 年的 Training Verifiers to Solve Math Word Problems 中,让生成模型先回答训练集里的题。训练集已经给出了标准答案,因此可以自动给模型的解答标注“对”或“错”,再把这些批好的作业交给另一个模型学习。
这里的训练,是用例子调整模型参数。反复练习以后,希望它学到一些能迁移到新题的判断方法,而不只是记住那几道题的答案。
回到奶茶订单。自动标注程序只要发现最终数字是 31,就给正标签;如果是 41,就给负标签。评分模型则可以同时读到题目和完整解答,学习预测这份解答最后是否正确。
这种训练方式叫结果监督(outcome supervision)。由它训练出的奖励模型,常简称为 ORM。这里的“奖励”可以先理解成一个用于比较的分数,比如 0.8 比 0.3 更值得选。
论文每道题生成 100 份解答,再由验证器挑最高分。这样的选择方式叫 Best-of-N:有 N 份候选,取评分最好的一份。它在训练数据足够时带来了提升;数据很少时,验证器也会过拟合,效果未必好。
论文依据:Cobbe et al.,§4.2 。实验使用 GSM8K,也就是论文提出的小学数学应用题数据集。训练验证器还包含辅助目标,这里只保留理解流程所需的部分。
先别把“出现过”当成“选对了”
假设有 100 道题,每题生成十份答案。检查完候选和最终提交结果,得到下面这本账:
最终只交对了 55 道。
80/100 是候选覆盖率,这里对应 pass@10;55/100 才是最终正确率。中间这 25 道,值得单独追查挑选过程。上面的数字是教学例子。
这个差别会伴随整节课。候选中一份正确答案都没有,评分器再聪明也无从挑选;正确答案已经在里面,继续增加候选又未必是最需要做的事。
只想记一个式子的话
在同一个候选池、同一种正确性标准下:
如果正确答案出现时总能选中,两者就相等。这种“永远选得对”的理想检查者通常叫 oracle,用来给实验画上界。它不代表我们部署时真的有这样一个工具。
Weaver 将两者之差称为 generation-verification gap,生成与验证之间的差距。定义见原文 §3。这个关系针对从已有候选中选一份的流程;选完再修改答案,要另外评估。
现在回头看 C。只按最后数字标注,它拿到的也是“对”。模型从这条训练数据里,没有直接得到“第一步乘法错了”的提醒。怎样把这样的错误也教给它?
第二层:把批注写到每一步
批改数学作业时,老师经常会圈出某一行:“这里符号写反了。”这种反馈比整页一个叉更具体,也更容易知道该改哪里。
Let’s Verify Step by Step 就把这个想法用于模型训练:让人工标注者逐步读解答,给每一步标上正、负或中性标签,供模型学习。中性标签用于不好直接判成对或错的步骤。为了控制标注范围,论文在第一个错误处停止继续批改。
这样训练出来的模型叫过程奖励模型(process reward model,PRM)。过程监督的“过程”,指的就是模型写出来的这些中间推理步骤。
正标签来自最后的数字匹配。
没有告诉模型:第一步算错了。
负标签指出了第一处错误。
最终碰巧答对,也不会盖过这一步。
| 拿同一份解答来比较 | 结果监督 · ORM | 过程监督 · PRM |
|---|---|---|
| 批改到哪里? | 整份解答 | 中间的每一步 |
| 收到什么标签? | 最终结果对或错 | 步骤的正、负或中性评价 |
| C 最后写了 31,但第一步算错 | 按最终答案匹配,给正标签 | 第一处算错的步骤收到负标签 |
| 评分时读什么? | 可以读题目和完整解答 | 题目及当前步骤、前文 |
多写了过程,就算过程监督吗?
停一下,自己判断 模型写了十行推导,训练时只按最后数字打分。这算过程监督吗? 核对你的判断 收起参考思路
仍然是结果监督。推导写得再长,也没有收到逐步标签。过程监督需要把“这一行错了”的信息送到具体步骤,例如 C 的第一步 3 × 12 = 35。
而且,检查每一步时仍然要看题目和前文。“所以减去 5 元”在使用优惠券时是对的,在计算额外配送费时就未必成立。把一句话单独抽出来打分,容易丢掉它赖以成立的条件。
一份解答有很多分,最后选哪份?
PRM 会给各个步骤打分,但用户只需要一个答案。因此系统还要把步骤分数合成整份解答的分数。
三步得分是 0.95、0.10、0.95。
整份分数 ≈ 0.09
一步低分会拉低乘积;步骤数量也会影响结果。
还是这三个步骤,直接找到最低分。
整份分数 = 0.10
让最不可信的那一步决定整份解答的评分。
用三个数字看看“相乘”和“取最小值”
假设三步得分依次是 0.95、0.10、0.95。
- 相乘:。
- 取最小值:。
分数都被中间那一步拉低了。相乘还有一个需要留意的地方:步骤越多,乘积往往越小。每步都是 0.95,5 步的乘积约为 0.77,20 步只有约 0.36。因此,步骤怎样划分、解答写多长,也可能影响排序。
这些是用于比较的模型分数。一个分数写成 0.9,并不自动意味着它在现实中有严格校准的 90% 正确概率。
逐步批改真的更管用吗?
Lightman 等人在一组较难的数学题上比较了三种选择方式。生成模型保持相同,每道题准备 1,860 份候选,然后分别用多数投票、ORM 和 PRM 挑答案。
这组实验中,PRM 选对了 78.2% 的题,优于 ORM 的 72.4%。更细的监督帮助检查者从同一批候选中找到了更多正确解答。
标注预算有限,研究者优先挑哪些作业?
优先找评分很高,最终答案却错了的解答。明显的错误,模型可能已经会认;那些看似合理的错误,更值得请人复核。这种有选择地收集标注的方式叫主动学习。
论文依据:Lightman et al.,§2 介绍标注与评分,§3给出上图成绩, §4讨论受控比较和主动学习。大规模 ORM 与 PRM 的训练集不同,作者另做了小规模实验以帮助区分这些影响。实验固定生成器,没有用 PRM 做强化学习。
人工标注的难处也很直接:费时间。论文发布的 PRM800K 里约有 80 万个步骤标签。换一个任务、换一类题,还能一直请人这样逐步批下去吗?
第三层:批作业太贵,能让模型帮忙吗?
Math-Shepherd 给出了一个巧办法:暂时不请人判断“这一步逻辑上对不对”,先看看从这里接着做,能不能做出正确答案。
比如已经写到“原价共 36 元”。保留这段题目和已有计算,让一个负责续写的模型,从这里接着算几次。如果有一次成功得到 31 元,至少说明这条路曾经被走通过。
这个负责接着写的模型叫 completer。论文把“当前步骤之前的题目和解答”作为它的起点,反复续写到结束,再用训练题的标准答案核对最终结果。这些续写结果,就能转成步骤的训练标签。
保留这一步,让模型接着算优惠后的价格。每次续写结束,用训练题的标准答案 31 元核对结果。
已续写
答对次数
硬标签 HE · 是否成功过
软标签 SE · 成功比例
先点“续写一次”。一次失败,会不会让你过早否定这一步?
两组结果都是预设的教学样本,不调用模型、不随机生成。演示的是标注如何形成,不是比较真实模型的能力。换模型会重新计数。
成功过一次,和经常成功,是两回事
看完八次预设续写,模型甲答对三次,乙答对一次。同样的记录,可以批出两种标签:
| 标签 | 它问的问题 | 模型甲 · 3/8 | 模型乙 · 1/8 |
|---|---|---|---|
| 硬标签 HE | 有没有成功过?有就标 1,否则标 0 | 1 | 1 |
| 软标签 SE | 成功次数占多少? | 37.5% | 12.5% |
HE 看不出甲乙的这点差别,SE 保留了成功比例。两种标签回答的问题不同。
论文主要使用硬标签,续写次数设为 8。训练过程奖励模型后,就可以让它直接预测这些步骤标签,不必每次在线打分都重新做八次续写。
一个正确步骤,也可能得到差评
3 × 12 = 36 算得没错。可续写模型总把优惠券算成加价,接着写出 41 元。
前缀正确,续写却反复失败。
前面写出 35,后面可能主动纠正,也可能碰巧回到 31。
最后答对,仍然不能证明前面每步都对。
所以,续写标签测到的是“从这里走到正确答案的机会”。它会受到续写模型能力的影响,和人工逐行判断逻辑并不相同。理解这个区别,才不会把自动标注当成一个无误的数学老师。
为什么多续写几次,硬标签就可能变了?
假设一个前缀每次续写成功的概率只有 10%,而且各次独立。只续写一次,90% 的时候会看到失败;续写 8 次,至少观察到一次成功的概率约为 57%。
这就是有限采样带来的影响:没有看见成功,不等于不存在成功的可能。增加续写次数,既花更多计算,也会让更多偶尔能走通的前缀拿到正标签。
“用分数选答案”和“用分数继续训练”
生成几份候选 → PRM 打分 → 交最高分。
改变本次选择,不更新生成模型的参数。
生成解答 → PRM 给反馈 → 更新生成模型。
改变后续生成策略,这才涉及继续训练。
Math-Shepherd 两种都做了。逐步强化学习时,它在每个推理步骤结束后提供奖励,让生成模型根据这些反馈调整参数。
论文依据:Math-Shepherd,§3.3 定义两类标签,§3.4–3.5 介绍重排与逐步 PPO,§4给出 8 次续写等实验设置。标题中的“without Human Annotations”指无需人工逐步标注,仍然需要标准答案和生成计算。
第四层:多请几个检查者,会更可靠吗?
走到这里,我们已经有几种办法训练检查者。现实里也常常直接使用现成的奖励模型,或者请另一个 LLM 按提示词评价答案。后一种通常叫 LLM judge,可以把它理解为“扮演评审的语言模型”。
但单个检查者总有盲点。那就多请几个?
Weaver 研究的正是这个方向:把多个不完美的验证器组合起来。困难在于,有的可靠,有的不太可靠;有的给 0 到 1 分,有的给另一个范围的分数,还有的只回答对或错。
先看即使每个人都只投一票,会发生什么。
候选 A 算出 31 元,计算正确。候选 B 把优惠券加进总价,算出 41 元,但解释写得很流畅。
A · 31 元
B · 41 元
多数票选了 B。甲和乙恰好被同一种表面特征误导。
这里手动设定权重为 1、1、3,只演示加权为何有用。Weaver 需要从数据中估计可靠性,不能预先知道谁在这道新题上答对了。真实奖励模型也不一定只检查上面列出的线索。
给分前,先看看是谁在给分
演示里的三份意见没有变,改变的是各自的分量。如果我们有理由相信丙更可靠,让它的意见占更大权重,便可能改善结果。
不过,这里偷了个懒:演示直接把丙的权重设成了 3。真正遇到一道新题,当然不能先知道谁答对,再给谁加权。Weaver 需要解决的是更难的部分:在没有大量标准标签的情况下,怎样估计谁的判断值得多信一点。
它使用了一类叫弱监督(weak supervision)的方法。可以先把它理解为:手里有很多不完全可靠的批改意见,通过这些意见在大量样本上的关系,估计检查者的可靠性,再组合出一个判断。
- 统一刻度
不同模型的分数范围不同,先做归一化,方便后续处理。
- 整理成可用的判断
把分数转成二元判断,过滤几乎总说对或总说错等低信息信号。
- 估计谁更可靠
用大量样本上的批改意见拟合弱监督模型,估计检查者的可靠性。
- 组合后再选答案
把这些判断汇总成候选评分,再从候选池里挑选。
两个人一起犯错,未必是两份证据
如果甲和乙都偏爱流畅的表达,它们可能反复被同一类错误说服。两人意见一致,看似增强了可信度,实际却可能只是重复了同一个偏差。
因此,验证器越多并不保证越准。输出统计可以提供线索,但不能靠一群模型互相赞同,就无条件推出它们都对。
往深一点:组合模型对检查者的关系作了什么假设?
Weaver 的基本模型采用“给定真实对错后,验证器判断条件独立”的假设。说得具体些:已经知道一份答案是错的以后,甲会不会被它骗过,不应再透露太多乙会不会被骗的信息。现实中的模型往往没这么独立。
论文依据:Weaver,§4.2 讨论弱监督与条件独立假设, 附录 B.3 介绍预处理及少量标签的用途。上面的手工加权演示只解释动机,并不是 Weaver 的算法复现。
组合后的检查,值不值得花这笔钱?
论文 v1 用 Llama 3.3 70B Instruct 为每题生成 100 份候选,在四个基准上得到下面的平均答对比例:
| 怎样选答案 | 平均答对比例 | 这个数字表示什么 |
|---|---|---|
| 多数投票 | 72.2% | 选出现次数最多的答案 |
| Weaver | 87.7% | 用组合后的验证器选答案 |
| 理想检查者 · Oracle | 91.9% | 这批候选能达到的上限 |
Weaver 缩小了“有正确答案却没选中”的损失,但没有把它完全消除。
代价也容易看见:100 份答案,每份交给多个检查者,都要消耗计算。论文还尝试把集成产生的信号用于训练一个更小的 400M 模型,让它学习这套评分方式,降低实际使用时的检查开销。这叫蒸馏,可以理解为让一个较小模型学习较大系统给出的判断。
数据来自 Weaver v1,Table 1 ,蒸馏见 §6 。这些数字属于整个多候选系统,比较时仍要另算验证成本。
候选越多,检查也会遇到新麻烦
现在再看开头的“多答几次”。假如检查者偶尔会把某类错误打成特别高的分,十份候选里可能遇不到它,一百份里却遇到了。一旦系统总是选最高分,这个错误就会挤掉真正正确的答案。
下面的小实验把这个机制简化到可以算清楚。模型每次只有 10% 的概率答对,正确答案得 0.8 分。错误通常得 0.2 分,但偶尔会被误打成 0.9 分。试着增加候选数,看看两条曲线是否一起上升。
每次独立生成,答对概率为 10%。正确答案得 0.8 分;错误答案通常得 0.2 分, 偶尔被误打为 0.9 分。你可以调整尝试次数,以及这种误判发生的概率。
横轴为答案数量(对数刻度)。试着从 32 份调到 128 份,再把误判概率调到 0。 曲线只展示上述假设的计算结果,不是论文实测,也不表示所有验证器都会退化。
在默认设置下,从 32 份增加到 128 份,正确答案几乎一定出现了,但最终选对的概率却下降了。把误打高分的概率调到 0,两条曲线又会重合。
这是一个构造的反例,用来解释为什么增加候选不保证最终成绩上升。真实验证器是否会退化、何时退化,需要在具体任务上测量。它也解释了为什么我们不能只看随机抽查时的平均准确率:系统最后专门选择最高分,恰好可能集中遇到评分器最有自信的那类错误。
想知道图里的曲线怎么算
设每次生成答对的概率为 ,错误候选被误打成 0.9 分的概率为 ,共生成 次,各次独立。图中固定 。
候选中至少出现一个正确答案的概率是:
最终要选对,必须没有高分错误,并且至少出现一个正确答案。因此:
第一项是“没有高分错误”的概率,第二项是“全是低分错误”的概率。两者相减,留下了能够选对的情况。这里的 特指错误答案超过正确答案分数的概率,不是任意分类阈值下的假阳性率。曲线只对应这个教学设定。
回到你自己的 Agent
下次 Agent 失败,可以先留住它生成过的候选,看看究竟发生了哪种情况。
先查生成和工具使用:是否读到了相关代码?是否能运行测试?
先查第七份为什么得了高分:测试漏了什么?检查者是否被解释说服了?
这时可以把本节四种思路放回自己的任务中理解。整份打分适合已有明确结果标签的情况;逐步反馈能指出错误发生的位置;续写和执行可以帮助自动构造一些训练信号;多个检查者则提供了组合不同判断的机会。要用哪一种,取决于你能获得什么反馈,以及检查要花多少成本。
- 同一批候选:让两种方法面对相同的选择范围。
- 有正确候选的题数:生成器给了检查者多少机会?
- 最后选对的题数:有多少机会被用上了?
- 生成与检查的总成本:多花的计算换来了什么?
最后留一道题 验证器从 100 份解答里挑出了高分答案。只能再检查一次,你想查什么? 查看参考思路 收起参考思路
检查它最容易给高分、却可能出错的地方。数学题可以重新核对关键推导;代码补丁可以补上与原测试不同的边界用例;如果用了多个模型,看看它们是否只是重复同一种判断。
这不是一个放之四海皆准的操作。它提醒我们把有限检查预算花在尚未获得可靠证据的地方,而不是机械地再问一次“你确定吗”。
四篇论文,接下来怎么读
如果想读原文,可以带着下面几个具体问题去找答案。本文按 2025 年 9 月开课时已经公开的版本整理,避免混入后续修订的实验。
- Training Verifiers to Solve Math Word Problems
先看 §4.2 的训练流程图:哪些地方能访问标准答案,哪些地方需要模型自己判断?
- Let's Verify Step by Step
先看 §2 的标注方式与 §3 的结果图:步骤标签增加了什么信息,78.2% 又是怎样测出来的?
- Math-Shepherd: Verify and Reinforce LLMs Step-by-step without Human Annotations
先看 §3.3 的续写图:这里的“好步骤”到底怎样定义?
- Shrinking the Generation-Verification Gap with Weak Verifiers
先看 §3 的差距定义与 §4.2:没有大量标签时,组合模型依赖了哪些统计信息和假设?