ThinkTwice: 让模型学会"做完题再检查一遍",推理+自纠错联合训练只加3%开销
你有没有碰到过这种情况——让模型做完一道数学题后,再让它"检查一下自己的答案",结果它不但没改对,反而把原来对的答案给改错了?
这个问题其实挺普遍的。GPT-5.2在AIME 2024上做refinement的时候,pass@4从90.0%降到了86.7%——你没看错,越检查越差。模型的self-refinement(自我纠错)一直是个悖论:我们希望模型能"三思而后行",但现实是它经常"三思而后废"。
问题出在哪?现有的self-refinement方案要么纯靠prompt诱导(没学过怎么纠错),要么需要额外的验证器/批评模型(训练成本高),要么训练推理和纠错是两条独立管线(互不知道对方在干嘛)。
多伦多大学的这篇ThinkTwice论文给了一个干净利落的方案:把推理和自纠错塞进同一个GRPO训练循环里,用同一个稀疏的正确性奖励信号驱动两个阶段。不需要过程奖励、不需要外部验证器、不需要批评标注,训练开销只增加3%。
效果怎样?在AIME上,Qwen3-4B的推理性能比GRPO baseline涨了5个点,纠错后再涨11.5个点。而且整个训练收敛比纯GRPO还快16%。
📖 论文信息
- 标题:ThinkTwice: Jointly Optimizing Large Language Models for Reasoning and Self-Refinement
- 作者:Difan Jiao, Qianfeng Wen, Blair Yang, Zhenwei Tang, Ashton Anderson
- 机构:University of Toronto
- 链接:https://arxiv.org/abs/2604.01591
- 代码:https://github.com/CSSLab/ThinkTwice
🎯 问题动机:Prompt-only Refinement为什么不靠谱?
先看一组数据。下图左侧(Panel A)展示了GPT-5.2在AIME 2024上的表现:

图1:左(A)——Prompt-only refinement的脆弱性:GPT-5.2在AIME上做refinement后分数反降。中(B)——现有方法的对比:one-pass RLVR没有纠错能力,training-free reflection没学过如何纠错,prior learned refinement需要额外信号。右(C)——ThinkTwice的框架:两阶段联合训练,共享同一个正确性奖励。
几个关键观察:
-
Prompt-only refinement是脆弱的。没有经过训练的纠错,模型在检查答案时既可能修复错误,也可能破坏正确答案。k=4时从90.0降到86.7,k=1时从78.3降到76.7——越认真检查越差。
-
现有方案各有软肋。图中Panel B做了一个很清晰的分类:
- One-pass RLVR(如标准GRPO):只管做题,不管纠错
- Training-free reflection(如Self-Refine):不需要信号但没学过纠错策略
-
Prior learned refinement:效果好但需要额外的批评标注或验证器
-
ThinkTwice想要的是:Signal-Free + Joint Learning——不需要额外信号,同时让推理和纠错互相增强。
我之前在做类似实验的时候发现过一个现象:模型做refinement的时候,如果它不知道自己原来的答案对不对,它的行为模式跟"随机改答案"其实差不多。这篇论文的insight就在于,与其告诉模型"你的答案对不对",不如让它通过RL训练自己学会判断——哪些答案值得改,哪些该保留。
🏗 方法核心:两阶段联合GRPO训练
ThinkTwice的核心思路可以一句话概括:每个训练iteration里做两轮GRPO更新——先做题,再纠错,用同一个奖励函数。

图2:ThinkTwice的两阶段训练流程。Phase 1(左)——标准的推理优化:采样候选解、计算正确性奖励、GRPO更新。Phase 2(右)——纠错优化:从Phase 1随机抽取一个base solution,拼接通用review指令,生成refinement候选、计算同样的正确性奖励、再做一次GRPO更新。
Phase 1:推理优化
这部分跟标准GRPO没区别。给定问题 \(x_j\),模型 \(\pi_\theta\) 生成 \(G\) 个候选解 \(\{y_{j,1}, ..., y_{j,G}\}\),用 exact-match 验证正确性得到二值奖励 \(r_{j,i} \in \{0, 1\}\),然后算group advantage做GRPO更新。
GRPO的优化目标:
其中 \(\mathcal{L}_i = \min(\rho_i A_i, \text{clip}(\rho_i, 1-\varepsilon, 1+\varepsilon)A_i)\),advantage通过组内归一化计算:\(A_i = (r_i - \mu) / \sigma\)。
Phase 2:纠错优化
这是ThinkTwice的核心新增。从Phase 1的候选解中随机选一个作为base solution(注意:是随机选,不是选最差的),构建multi-turn prompt:
review指令是固定的、与任务无关的,大意是"请逐步检查你之前的解题过程,找出错误并修正"。关键是:这个指令不告诉模型原来的答案对不对。
然后模型生成 \(G\) 个refinement候选,同样用exact-match算正确性奖励,再做一次GRPO更新。
几个精巧的设计选择
为什么随机选base solution? 这个选择看似随意,实际上很关键。如果总选错误答案来纠错,模型会学到"看到refinement请求=之前肯定做错了"这种偏见。随机选则让模型必须自己判断原答案质量,既要学会"纠错"也要学会"保留"。
为什么不给正确性信号? 这是跟SCoRe等前置工作的核心区别。SCoRe(Google DeepMind提出的self-correction方法)需要区分第一轮和第二轮的奖励设计,而ThinkTwice两轮用完全相同的稀疏奖励。简洁性是这个方法的核心卖点。
共享策略 vs 独立策略? 两个phase用同一个模型参数,Phase 1更新完的 \(\pi_\theta'\) 直接给Phase 2用。这意味着推理能力的提升会直接传导到纠错阶段。
🧪 实验结果:数据说话
主实验:推理性能(pass@4)
| 方法 | AIME | AMC | MATH500 | Minerva | OlympiadBench | 平均 |
|---|---|---|---|---|---|---|
| Qwen3-4B | ||||||
| Base Model | 29.18 | 64.87 | 88.47 | 39.61 | 57.90 | 56.01 |
| GRPO | 39.06 | 75.36 | 91.86 | 41.03 | 63.80 | 62.22 |
| DrGRPO | 35.46 | 77.65 | 91.83 | 42.75 | 66.51 | 62.84 |
| DAPO | 42.54 | 80.68 | 93.55 | 38.38 | 67.50 | 64.53 |
| ThinkTwice | 44.11 | 79.59 | 93.60 | 42.94 | 67.60 | 65.57 |
| OLMo3-7B | ||||||
| Base Model | 32.81 | 68.77 | 89.87 | 40.63 | 61.36 | 58.69 |
| GRPO | 39.38 | 77.05 | 92.28 | 41.13 | 62.42 | 62.45 |
| DrGRPO | 36.09 | 74.33 | 91.65 | 42.07 | 65.09 | 61.85 |
| DAPO | 36.72 | 76.16 | 91.56 | 42.39 | 63.80 | 62.12 |
| ThinkTwice | 39.24 | 79.89 | 92.74 | 43.43 | 65.81 | 64.22 |
ThinkTwice在两个模型上都拿到了最佳平均分。Qwen3-4B上65.57% vs DAPO的64.53%,提升1个点。AIME上的提升最明显:44.11% vs GRPO的39.06%,涨了5个点。
坦率讲,纯推理性能的提升幅度不算惊人——跟DAPO比只有1个点的优势。但这个方法的真正杀手锏在下面。
自纠错性能:这才是重头戏(pass@4)
| 方法 | AIME | AMC | MATH500 | Minerva | OlympiadBench | 平均 |
|---|---|---|---|---|---|---|
| Qwen3-4B | ||||||
| Base Model | 45.25 | 78.10 | 92.82 | 40.81 | 63.52 | 64.10 |
| Reflexion | 38.47 | 73.17 | 91.48 | 40.87 | 60.89 | 60.98 |
| Self-Refine | 50.37 | 82.40 | 93.86 | 41.19 | 66.33 | 66.83 |
| GRPO | 48.91 | 81.86 | 93.78 | 42.90 | 69.67 | 67.42 |
| DrGRPO | 46.98 | 82.66 | 94.46 | 44.84 | 71.75 | 68.14 |
| DAPO | 49.86 | 87.31 | 94.96 | 40.09 | 72.81 | 69.01 |
| ThinkTwice | 60.43 | 85.54 | 95.70 | 43.93 | 73.78 | 71.88 |
| OLMo3-7B | ||||||
| Base Model | 39.31 | 78.18 | 91.75 | 41.58 | 66.14 | 63.39 |
| Reflexion | 37.38 | 72.18 | 91.29 | 41.48 | 62.36 | 60.94 |
| Self-Refine | 47.34 | 83.81 | 93.24 | 42.35 | 68.30 | 67.01 |
| GRPO | 46.04 | 84.48 | 92.28 | 41.08 | 66.53 | 66.08 |
| DrGRPO | 45.24 | 82.32 | 93.54 | 42.75 | 69.81 | 66.73 |
| DAPO | 44.26 | 84.55 | 93.33 | 42.81 | 68.51 | 66.69 |
| ThinkTwice | 49.33 | 87.06 | 94.66 | 44.33 | 71.38 | 69.35 |
看到AIME那一列了吗?Qwen3-4B上,ThinkTwice纠错后达到60.43%,比GRPO的48.91%高了11.5个百分点。这个提升幅度是真的能打。
还有一个值得关注的对比:Reflexion(training-free方法)在Qwen3-4B上的平均分是60.98%,比不做refinement的Base Model(64.10%)还低。这再次证实了开头说的问题——没训练过的self-refinement是不靠谱的。
跨模型纠错:泛化能力检验

图3:跨模型refinement矩阵。每个格子表示"用行模型做推理 + 用列模型做纠错"的平均pass@4分数。(a) Qwen3-4B,(b) OLMo3-7B。无论是谁的推理结果,ThinkTwice的纠错能力都是最强的(最右列全深色)。
这个实验设计得很聪明。它把推理模型和纠错模型解耦了——即使base solution是其他方法(GRPO、DrGRPO、DAPO)生成的,ThinkTwice做refinement时依然拿到最高分。Qwen3-4B上,ThinkTwice纠错列的最高分67.44%出现在DrGRPO的推理结果上。
这说明ThinkTwice学到的纠错能力是通用的,不依赖于特定的推理风格。
🔬 训练动态分析:从"纠错"到"巩固"的隐式课程
这部分是我觉得这篇论文最有意思的分析。

图4:训练过程中fix-wrong率(把错的改对)和damage-correct率(把对的改错)的变化曲线。橙线=ThinkTwice,蓝线=GRPO。ThinkTwice的fix-wrong率持续上升到约23%,而damage-correct率从约1.5%降到接近0。GRPO的两个指标则相对平稳。
作者发现了一个"rectify-then-fortify"(先纠错,再巩固)的隐式课程:
- 训练前期:base policy还比较弱,生成的解答错误较多。refinement阶段主要在"修复错误",fix-wrong率从约18%上升到23%。
- 训练后期:base policy变强了,正确答案越来越多。refinement阶段逐渐转向"保留正确答案+精简格式",damage-correct率降到接近0。
这个转变不是人为设计的,是从训练动态中自然涌现的。模型自己学会了:前期该改就改,后期该稳就稳。
格式化和长度变化

图5:上图——boxed答案和final answer marker的使用率。ThinkTwice(橙色)比GRPO(蓝色)更早、更稳定地采用规范格式。下图——生成长度变化。两种方法的响应长度都在缩短,ThinkTwice缩短更快,从约700词降到约400词。
一个有趣的副产品:虽然训练中完全没有格式奖励,ThinkTwice的模型更快学会了用\boxed{}和"final answer"标记来规范答案格式。合理的解释是——refinement阶段需要提取前一轮答案,格式规范的答案更容易被正确提取和评估,这形成了一个隐性的选择压力。
训练效率

图6:五个子图分别展示(a)平均奖励、(b)响应长度、(c)每步时间、(d)累计训练时间、(e)平均benchmark准确率。ThinkTwice在7.2小时达到最佳checkpoint,GRPO需要8.6小时——快了16%。
这组数据很关键:
| 指标 | ThinkTwice | GRPO |
|---|---|---|
| 每步额外开销 | +3% | - |
| 达到最佳checkpoint | 7.2h | 8.6h |
| 收敛步数 | ~220步 | ~280步 |
| 硬件配置 | 2x H100 80GB | 2x H100 80GB |
每步只慢3%,但收敛快了22%,总训练时间反而缩短了16%。这个trade-off太划算了。
原因也不难理解:refinement阶段提供了额外的训练信号,相当于用同样的数据提取了更多的梯度信息,加速了策略学习。
📊 Pass@k全景图

图7:推理阶段在5个benchmark上的pass@k曲线(k=1到32)。上排Qwen3-4B,下排OLMo3-7B。紫色=ThinkTwice。在AIME等高难度任务上,ThinkTwice的优势随k增大更加明显。

图8:纠错阶段在5个benchmark上的pass@k曲线(k=1到32)。ThinkTwice(紫色)在几乎所有benchmark和k值上都领先,特别是在AIME上拉开了巨大差距。
对比图7和图8,一个很明显的pattern:在纠错阶段(图8),ThinkTwice在AIME上的pass@k曲线跟其他方法之间的差距,比推理阶段(图7)要大得多。这说明ThinkTwice的核心优势确实是在纠错能力上,而不仅仅是推理能力的提升。
🤔 批判性分析:几个值得思考的问题
1. 实验范围的局限性
说实话,这篇论文的实验覆盖面有些窄。只测了数学推理(MATH、AIME、AMC等),两个模型(Qwen3-4B和OLMo3-7B),都是中小规模的。几个自然的追问:
- 更大的模型(70B+)上还有这个效果吗? 大模型本身的self-correction能力可能已经不错了,联合训练的边际收益可能递减。
- 非数学任务呢? 代码生成、逻辑推理、常识问答等任务上,这种"通用review指令"还能work吗?数学任务有一个天然优势——答案的正确性可以精确验证(exact match)。到了开放式任务,正确性奖励本身就是个问题。
- 多轮refinement呢? 论文只测了一轮refinement。多轮会不会有衰减?这是self-correction研究中一个经典的未解问题。
2. 跟SCoRe的对比缺失
Google DeepMind的SCoRe(Self-Correction via Reinforcement Learning)是这个方向最重要的前置工作之一,使用多轮在线RL来训练self-correction能力。论文在Related Work里提到了SCoRe但没做直接对比实验,这是一个比较明显的遗漏。
可能的原因是SCoRe用的是更大的模型(Gemini系列),不方便apple-to-apple对比。但至少应该讨论一下方法层面的差异和可能的性能差距。
3. "随机选base solution"是否真的是最优选择?
论文说随机选是为了避免偏见,这个逻辑说得通。但我觉得这里有更多可以挖的: - 如果按难度分层抽样呢?前期多选错误答案加速纠错学习,后期多选正确答案强化巩固。 - 如果选"差一点就对了"的答案呢?这些边界case可能提供最丰富的学习信号。
作者没做这方面的消融实验,有些可惜。
4. 通用review指令的上限
固定的、与任务无关的review指令确实简洁,但它也封死了一些可能性。如果review指令能够动态生成(比如基于base solution的具体错误类型),纠错效果可能更好。当然,这就回到了需要额外信号的老路子,是一个简洁性和性能之间的trade-off。
5. 关于"先纠错后巩固"课程的因果性
"rectify-then-fortify"是论文最漂亮的发现之一,但严格来说这是一个相关性观察而非因果论证。fix-wrong率上升可能是因为模型纠错能力变强了,也可能是因为base policy的错误分布发生了变化。作者可以做更多控制实验来剥离这两个因素。
💡 我的判断
ThinkTwice是一个设计上非常"干净"的工作。两阶段联合训练、共享策略、相同奖励——整个方法没有多余的组件。3%的训练开销换来11.5个百分点的纠错提升和16%的训练加速,这个ROI在工程上是很吸引人的。
但我不会把它定位为"self-correction方向的底层突破"。它更像是一个聪明的工程整合:把已有的GRPO框架稍加改造,让模型在训练时就接触到self-refinement的场景。核心insight——"让模型用同一个奖励信号同时学解题和检查"——直觉上很自然,甚至让你觉得"这个我也能想到"(但想到和做出来之间还是有距离的)。
如果你在做数学推理相关的RL训练,ThinkTwice非常值得试。3%的开销基本等于免费午餐。如果你在做更广义的self-correction研究,这篇论文提供了一个很好的baseline和分析框架(特别是fix-wrong/damage-correct的动态分析),但方法本身在非数学场景的适用性还需要验证。
一个更有意思的方向是:能不能把这种联合训练的思路推广到更多的"元技能"上?比如联合训练"解题 + 纠错 + 解释",或者"编码 + 调试 + 重构"。ThinkTwice证明了在同一个训练循环里塞进多个相关任务是可行且有益的,这个思路的应用空间远不止数学推理。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我