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:ThinkTwice的动机和方法概览

图1:左(A)——Prompt-only refinement的脆弱性:GPT-5.2在AIME上做refinement后分数反降。中(B)——现有方法的对比:one-pass RLVR没有纠错能力,training-free reflection没学过如何纠错,prior learned refinement需要额外信号。右(C)——ThinkTwice的框架:两阶段联合训练,共享同一个正确性奖励。

几个关键观察:

  1. Prompt-only refinement是脆弱的。没有经过训练的纠错,模型在检查答案时既可能修复错误,也可能破坏正确答案。k=4时从90.0降到86.7,k=1时从78.3降到76.7——越认真检查越差。

  2. 现有方案各有软肋。图中Panel B做了一个很清晰的分类:

  3. One-pass RLVR(如标准GRPO):只管做题,不管纠错
  4. Training-free reflection(如Self-Refine):不需要信号但没学过纠错策略
  5. Prior learned refinement:效果好但需要额外的批评标注或验证器

  6. ThinkTwice想要的是:Signal-Free + Joint Learning——不需要额外信号,同时让推理和纠错互相增强。

我之前在做类似实验的时候发现过一个现象:模型做refinement的时候,如果它不知道自己原来的答案对不对,它的行为模式跟"随机改答案"其实差不多。这篇论文的insight就在于,与其告诉模型"你的答案对不对",不如让它通过RL训练自己学会判断——哪些答案值得改,哪些该保留。


🏗 方法核心:两阶段联合GRPO训练

ThinkTwice的核心思路可以一句话概括:每个训练iteration里做两轮GRPO更新——先做题,再纠错,用同一个奖励函数

图2:ThinkTwice的完整训练流程

图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的优化目标:

\[J_{GRPO}(\theta) = \mathbb{E}\left[\frac{1}{G}\sum_i \mathcal{L}_i - \beta \cdot D_{KL}(\pi_\theta \| \pi_{ref})\right]\]

其中 \(\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:

[User: 原始问题 x]
[Assistant: base solution y_base]
[User: 通用review指令 I_refine]

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:跨模型纠错的热力图

图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的训练动态

图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:答案格式化率和生成长度变化

图5:上图——boxed答案和final answer marker的使用率。ThinkTwice(橙色)比GRPO(蓝色)更早、更稳定地采用规范格式。下图——生成长度变化。两种方法的响应长度都在缩短,ThinkTwice缩短更快,从约700词降到约400词。

一个有趣的副产品:虽然训练中完全没有格式奖励,ThinkTwice的模型更快学会了用\boxed{}和"final answer"标记来规范答案格式。合理的解释是——refinement阶段需要提取前一轮答案,格式规范的答案更容易被正确提取和评估,这形成了一个隐性的选择压力。

训练效率

图6:训练效率对比

图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:推理阶段的pass@k曲线

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

图8:纠错阶段的pass@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前沿,关注我