Qwen2.5-Math 论文解读:给它一个 Python 解释器,7B 就能追上 72B
论文:Qwen2.5-Math Technical Report: Toward Scaling Law in Mathematical Reasoning(arXiv<2409>2409>.12122,v1 标题;正式版改名为 Toward Mathematical Expert Model via Self-Improvement) 作者:An Yang、Beichen Zhang、Binyuan Hui 等 16 人,阿里通义千问团队,2024 年 9 月 这是少见的”全流程”技术报告:1.5B / 7B / 72B 三个尺寸的数学专家模型,从预训练、SFT、奖励模型到强化学习,全部用同一套方法论串起来。它最核心的两个抓手,一个是 TIR(Tool-Integrated Reasoning,工具集成推理)——让模型边推理边写 Python 代码做计算;另一个是 自我改进(Self-Improvement)——每一轮的老师都是上一轮的自己。72B-Instruct 在 2024 年中文高考数学上拿到 88.5 分(官方博客,TIR 模式),当时妥妥的开源数学天花板。
一、先说清楚:这篇报告到底在解什么问题
1. LLM 做数学,有两个先天性短板
做过大模型数学评测的人都有体会,模型做错题基本就两种死法:
- 算错。推理链条是对的,但中间某一步”三七二十一”算岔了,后面全崩。纯靠自然语言做多位数乘除、开根号、解方程,本质上是让一个背语料的模型去干计算器的活,出错是必然的。
- 绕不出来。涉及符号运算、算法型题目(比如求矩阵特征值、解二次方程组的两个根),模型用自然语言”手搓”推导,又慢又容易错。
Qwen2.5-Math 这份报告的出发点就是这两件事:计算不准,就让模型学会用工具;数据不够,就让模型自己造。
2. 模型家族一览
报告一口气发布了三类模型:
| 模型 | 说明 |
|---|---|
| Qwen2.5-Math-1.5B / 7B / 72B | Base 模型,在 Qwen Math Corpus v2 上继续预训练 |
| Qwen2.5-Math-1.5B / 7B / 72B-Instruct | 指令模型,支持中英双语、CoT + TIR 两种推理 |
| Qwen2.5-Math-RM | 奖励模型(Reward Model),既管训练也管推理选择 |
有个细节值得玩味:论文 v1 版本标题是”Toward Scaling Law in Mathematical Reasoning”(迈向数学推理的 scaling law),正式版改成了”Toward Mathematical Expert Model via Self-Improvement”(通过自我改进迈向数学专家模型)。标题的变化其实暴露了团队结论的演化——一开始想找的是”参数换分数”的幂律,最后真正跑通的却是”数据 + 工具 + 自我迭代”这条更便宜的路。
二、三种推理范式:CoT、PoT,和真正的主角 TIR
1. CoT:老老实实写步骤
链式思维(Chain-of-Thought, CoT) 大家都熟:模型用自然语言一步步推理,“因为……所以……”地写下来。这是基本盘,Qwen2.5-Math 给它专门构建了训练数据集,中英双语、标注题加合成题混着用。
2. PoT:一口气写完整个程序
程序思维(Program-of-Thought, PoT) 更进一步:模型把整个解题过程写成一个完整程序,最后一次性执行拿答案。问题是模型写的时候看不到任何中间结果,等于盲写——一个小错就全盘报废。报告里 PoT 主要出现在评测设置中(zero-shot),不是训练的重心。
3. TIR:边想边算,这才是杀手锏
工具集成推理(Tool-Integrated Reasoning, TIR) 是这篇报告的真正主角。它的玩法是:模型推理到需要计算的地方,现场写一段 Python 代码,交给解释器执行,看到结果后再继续往下推理。就像人做题时按了一下计算器,而不是强迫自己全程心算。
这直接补上了 CoT 的三个短板,报告里概括为:
- 精确数值计算(precise computation)——大数运算、复杂数值;
- 符号运算(symbolic manipulation)——求二次方程的根、矩阵特征值;
- 算法型操作(algorithmic manipulation)——需要写循环、枚举、验证的题。
效果有多直接?看同一模型 CoT 和 TIR 在 MATH 上的对比:
| 模型 | CoT MATH | TIR MATH | 提升 |
|---|---|---|---|
| 1.5B-Instruct | 75.8 | 79.9 | +4.1 |
| 7B-Instruct | 83.6 | 85.2 | +1.6 |
| 72B-Instruct | 85.9 | 88.1 | +2.2 |
模型越小,TIR 的收益越大——1.5B 的小模型靠一个 Python 解释器,MATH 直接干到接近 80。到了竞赛题上差距更夸张:AIME24 上 72B 用 CoT 贪心解码只能解出 9/30,换 TIR 立刻变 12/30;1.5B 用 CoT 只有 3/30,用 TIR 直接跳到 7/30。
工程上还有一个精巧的细节:做 TIR 的强化学习时,Python 解释器输出的所有 token 都被 mask 掉——不让模型为”工具的输出”负责,只为自己写的代码和后续的推理负责。这个处理很干净。
三、数据工程:数学语料从哪来,难题怎么造
1. 预训练语料:从 700B 到 1T+ tokens
Qwen2-Math 时代用的 Qwen Math Corpus v1 大约 700B tokens,来源是数学网页、代码、百科、考试题加合成数据。处理流程是标准四件套,但每一步都为数学定制:
- 召回:训 FastText 分类器,从 Common Crawl 里捞数学文本,还利用 URL 元信息扩召回;
- 去重:MinHash 过滤相似文档;
- 质量过滤:拿 Qwen2-0.5B-Instruct 配合 prompt 给候选数据打分,优中选优;
- 合成:用 Qwen2-72B-Instruct 从已有材料里抽取整理数学问答,或者直接生成新的问答对。
到了 v2,规模拉到 1T+ tokens,三个升级点:
- 用 Qwen2-Math-72B-Instruct 大规模合成预训练级数学数据(注意:是用上一代指令模型给下一代造预训练粮,自我改进从这儿就开始了);
- 补了大量中文数学数据,来自网页、书籍、代码仓库;
- Base 不再从 Qwen2 初始化,而是从语言、代码、推理更强的 Qwen2.5 base 继续预训练,上下文 4K。
最后的配比不是拍脑袋的:拿 1.5B 小模型做消融实验,试出来最优混合比例。这个”用小模型当探针调数据配比”的做法,便宜又实用。
2. SFT 数据:题从哪来,答案怎么筛
指令微调的数据分两条线。
CoT 数据:query 侧有 58 万英文题 + 50 万中文题,标注题来自 GSM8K、MATH、NuminaMath 的训练集,中文还额外加了 K-12 题集;合成题用 MuggleMath 方法从标注题”演化”而来。response 侧经过迭代式拒绝采样(Rejection Sampling):当前最强模型对每道题生成多条推理路径,有标准答案的只留答案正确的,没有标准答案的合成题用 加权多数投票(weighted majority voting) 推断哪条路径更可能对,然后再用奖励模型分数选 top-k。最后沉淀出 200 万英文 + 50 万中文 的 CoT 训练样本。
TIR 数据:19 万标注题 + 20.5 万合成题(合成用了 MuggleMath 和 DotaMath 两种方法),另选 7.5 万标注题翻译成中文强化中文推理。标注题用 在线拒绝微调(online RFT):多个温度做核采样,难题加大采样量,只保留答案与参考答案一致的代码路径,每轮去重,用清洗后的数据继续微调,滚雪球式迭代。
3. 难度控制:给每道题打分
这里有个容易被忽略但很关键的工程点:团队训了一个难度打分模型(difficulty-scoring model) 给每道题的复杂度打分,用来维持不同难度层级的分布平衡。
为什么重要?因为拒绝采样天然偏爱简单题——简单题容易采样出正确答案,数据里就会越积越多简单题。不控制难度分布,模型会”刷低级题刷到高分、一上难题就露馅”。主动管住难度分布,是后面 AIME/AMC 竞赛成绩能起来的前提之一。
4. 防污染:13-gram + 最长公共子序列
评测集污染是数学 benchmark 的重灾区(MATH 训练集里不少题和测试题结构高度相似)。报告的做法:13-gram 匹配加文本规范化,再加一条规则——最长公共子序列占比超过 0.60 就判为污染。预训练数据对照 GSM8K、MATH 等过滤;SFT、RM、RL 的数据则对照全部 12 个评测集(含 AIME24、AMC23、高考、中考)剔除可能重叠的题目和解法。这个严谨度,分数才敢信。
四、自我改进闭环:整篇报告的灵魂
1. 闭环长什么样
把报告的方法论抽象一下,就是一个循环:
- 旧模型大规模生成数学语料 / 解题回答;
- 用**规则校验器(答案对不对)+ 奖励模型(过程好不好)**双重筛选;
- 用筛出来的数据做 SFT,得到更强的模型;
- 更强的模型重新采样,训出更强的奖励模型;
- 新 RM 再回到第 1 步,指导下一轮数据迭代、RL 训练和推理选择。
关键在于这个循环每一段都用上了:预训练语料是 Qwen2-Math-Instruct 造的;SFT 数据由 RM 筛;RL 的奖励一半来自 RM;连推理时的 best-of-N 选择都由 RM 打分。一个 RM 贯穿全流程,这是它和”训个 RM 只做最后一步 RL”的常规做法最大的区别。
2. 奖励模型怎么训
Qwen2.5-Math-RM 的训练数据:36.1 万英文题 + 25.7 万中文题,每题配 6 条候选回答(从不同版本、不同尺寸的模型采样,用来平衡难度)。偏好标签的构造简单粗暴但有效:对照标准答案,答对的标正、答错的标负,全对或全错的题直接扔掉——因为这些题没有区分度。
结构上,RM 从 SFT 模型初始化,把语言建模头换成一个两层线性层的标量打分头,训练用 listwise 排序损失——不是把 6 条回答拆成 pair,而是直接在有效 pair 上算 ranking loss。
3. RM 推理时有多值钱
推理阶段用 RM 做 best-of-N 重排(rm@N),效果全面压过朴素的多数投票(maj@N)。挑几个英文 MATH 的数字:
| 模型(72B-Instruct) | pass@1 | maj@8 | rm@8 |
|---|---|---|---|
| CoT | 85.9 | 88.6 | 89.8 |
| TIR | 88.1 | 91.8 | 92.9 |
TIR + rm@8 在 MATH 上拿到 92.9——同样的模型,多采样 8 条再让 RM 挑一条,就比贪心解码高了近 5 分。RM 在这里不是训练时的配角,而是推理时的性能放大器。
五、训练细节:SFT、RM、GRPO 一条龙
1. SFT
CoT 和 TIR 数据联合训练,3 个 epoch,序列长 4096。72B 用 batch size 256、学习率 5e-6;1.5B/7B 用 batch size 128、学习率 2e-5,最后都衰减到 7e-7。中规中矩,没有玄学。
2. RL:GRPO + 精心挑题
强化学习用的是 GRPO(Group Relative Policy Optimization)——DeepSeekMath 带火的方案:不训 value function,对同一个 query 采一组回答,用组内 reward 的均值和标准差归一化出 advantage,再摊到每个 token 上。实现基于 ChatLearn,每 query 采 32 条回答,KL 系数 1e-3。
但真正见功夫的是 query 筛选:拿不同尺寸的 SFT 模型对 RM 训练集每题重采 8 条回答,对照答案判对错,只保留 8 条里恰好对 2~5 条的题——对太少(<2)说明模型现在学不会,对太多(>5)说明已经会了没有训练价值。筛完剩 6.6 万道题。这就是”最近发展区”思路:只练跳一跳够得着的题。
3. 奖励塑形:规则校验兜底,RM 排序
reward 由两部分拼成:
r = σ(α · rm) + (rv − 1),其中 α = 0.5rv 是规则校验器(答案对 = 1,错 = 0),rm 是奖励模型的连续分数。这个设计保证任何正确回答的总分一定高于任何错误回答(正确答案下限 > 错误答案上限),然后在正确组、错误组内部再按 RM 分数排序。既避免了 RM 打分漂移导致”过程漂亮但答案错”被奖励,又保留了过程级的细粒度信号。
TIR 的 RL 里,Python 解释器输出的 token 全部 mask——前面说过,这个细节值得抄。
六、成绩单:高考 88.5 分,碾压 GPT-4o
1. 中文:高考数学 88.5 分
据官方团队博客,Qwen2.5-Math-72B-Instruct 用 TIR 模式在 2024 年中文高考数学卷上拿到 88.5 分。论文内的中文基准(GaoKao 综合 + CMATH + CN Middle School 24)上,72B-Instruct 的 CoT 平均 82.7,TIR rm@8 平均 83.1,而 GPT-4o 的中文平均只有 65.2——差了 17.5 分,这不是误差,是断层。
2. 英文:7 项基准平均 68.2 vs GPT-4o 的 62.0
英文 CoT pass@1,72B-Instruct 平均 68.2,GPT-4o(2024-08-06)62.0。单项看:MATH 85.9 vs 81.1、Minerva Math 44.1 vs 36.8、OlympiadBench 49.0 vs 43.3,全面领先。
3. 对比 DeepSeekMath:同尺寸下的降维打击
和同为 7B 的 DeepSeekMath-7B-RL 比:
| 指标 | Qwen2.5-Math-7B-Instruct | DeepSeekMath-7B-RL |
|---|---|---|
| MATH(英文 CoT) | 83.6 | 52.4 |
| 英文 7 项平均 | 62.9 | 46.6 |
| OlympiadBench | 41.6 | 19.0 |
MATH 上 31 分的差距。DeepSeekMath 证明了 GRPO 路线可行,Qwen2.5-Math 则证明了”数据迭代 + TIR + RM 全流程”能把同尺寸天花板再抬高一大截。
4. 竞赛题:TIR + RM 采样是核武器
AIME24(30 题)和 AMC23(40 题)上,对比最刺眼:GPT-4 Turbo 只能解 1/30,Gemini 1.5 Pro 2/30,而 Qwen2.5-Math-72B-Instruct:
- CoT 贪心:9/30;TIR 贪心:12/30;
- TIR + rm@256:19/30;
- AMC23 上 TIR + rm@256:39/40,接近满分。
更吓人的是 1.5B:TIR + rm@256 在 AIME24 上解出 19/30——和 72B 打平。小模型 + 工具 + 大规模重排采样,硬是把竞赛题拉到了旗舰水平。
5. Base 模型也在偷偷进化
7B base 在 GSM8K / MATH / 高考填空上做到 91.6 / 55.4 / 57.6,已经超过自家 Qwen2-72B base(89.5 / 51.1 / 55.9);72B base 的 MATH 从上一代 60.5 涨到 66.8。专项继续预训练的价值,base 层就看得见。
七、所谓”数学 scaling law”:数据和工具在替代参数
报告没有给出幂律公式,但数据本身讲了一个更实在的故事:
- 7B 追平上一代 72B:Qwen2.5-Math-7B-Instruct 的 CoT MATH 83.6,几乎等于 Qwen2-Math-72B-Instruct 的 84.0;英文平均 62.9 对旧旗舰 65.7,只差 2.8。
- 1.5B 逼近旧 72B:1.5B-Instruct 中文平均 76.1,贴着 Qwen2-Math-72B-Instruct 的 76.6。
- 工具对小模型收益最大:TIR 让 1.5B 的 MATH 提升 4.1 分,远超 72B 的 2.2 分。
换句话说,在数学这个垂类上,“更多参数”的边际收益正在被”更好的数据 + 更强的工具 + 更精的采样”吃掉。这大概就是标题从”Scaling Law”改成”Self-Improvement”的原因——团队最后发现,真正能稳定复现的规律不是参数幂律,而是自我改进闭环的迭代收益。
收尾:我的一点看法
第一,TIR 是被低估的路线。 现在大家一提推理模型就是 o1 式的长 CoT,但 Qwen2.5-Math 在 2024 年 9 月就证明了:给模型一个 Python 解释器,比让它多堆几千 token 的思维链划算得多。计算错误是”确定性损失”,工具能把它清零;而推理能力的提升是”概率性收益”,贵且慢。后来 Qwen3、DeepSeek 都在往”推理 + 工具调用”融合走,回头看这篇报告是押对了方向的。
第二,自我改进闭环的本质是把 RM 变成了基础设施。 大多数团队训 RM 只是为了 RLHF 的最后一步,这篇报告里 RM 干了四件事:筛 SFT 数据、定 RL 奖励、训 RL 策略、推理时挑答案。一个组件贯穿全流程,每一轮迭代都在复利。这个架构思路比任何单点数字都更值得借鉴。
第三,它的局限也要看到。 上下文只有 4K,放到今天的长思维链时代明显偏短;中文场景下 TIR 相对 CoT 完全没有英文那样的增益(pass@1 平均 79.9,反而低于 CoT 的 82.7),说明 TIR 数据和中文数学语料的结合还没吃透;竞赛题的好成绩高度依赖 rm@256 这种 256 次采样,推理成本是贪心解码的两百多倍,落地时得掂量。
第四,它给”垂直专家模型”留了一个开放问题。 用领域数据 + 领域工具 + 自我迭代,能不能把这套配方复制到物理、化学、金融?Qwen2.5-Math 证明了数学上行。但数学的特殊性在于:答案可验证(规则校验器免费)、计算可外包(Python 现成)。换到答案模糊的领域,这个闭环还能不能转起来,就是后话了。
附:核心数据速查
关键成绩表
| 指标 | 成绩 | 设置 |
|---|---|---|
| 中文高考 2024 数学 | 88.5 分 | 72B-Instruct,TIR(官方博客) |
| MATH(英文) | 92.9 | 72B-Instruct,TIR + rm@8 |
| MATH(英文 CoT pass@1) | 85.9 / 81.1 | Qwen2.5-Math-72B-Instruct / GPT-4o |
| 英文 7 项平均(CoT) | 68.2 / 62.0 | Qwen2.5-Math-72B-Instruct / GPT-4o |
| 中文 3 项平均(CoT) | 82.7 / 65.2 | Qwen2.5-Math-72B-Instruct / GPT-4o |
| MATH(7B CoT) | 83.6 / 52.4 | Qwen2.5-Math-7B / DeepSeekMath-7B-RL |
| AIME24 | 19/30 | 72B-Instruct,TIR + rm@256 |
| AMC23 | 39/40 | 72B-Instruct,TIR + rm@256 |
| AIME24(1.5B) | 19/30 | 1.5B-Instruct,TIR + rm@256(与 72B 持平) |
| MATH(1.5B TIR) | 79.9 | 小模型靠工具逼近 80 |
| Base MATH(72B) | 66.8(上代 60.5) | few-shot CoT |
数据工程速查
| 项目 | 规模 |
|---|---|
| 预训练语料 v1 / v2 | 700B / 1T+ tokens |
| CoT SFT query | 58 万英文 + 50 万中文 |
| CoT SFT response | 200 万英文 + 50 万中文 |
| TIR SFT query | 19 万标注 + 20.5 万合成(另 7.5 万中译) |
| RM 训练数据 | 36.1 万英文 + 25.7 万中文题,每题 6 条候选 |
| RL query | 6.6 万(8 次采样对 2~5 条才保留) |
| 去污染规则 | 13-gram 匹配 + 最长公共子序列 > 0.60 |
概念清单
- TIR(Tool-Integrated Reasoning):边推理边调用 Python 解释器执行代码,看到结果再继续,弥补计算和符号运算短板
- CoT(Chain-of-Thought):自然语言逐步推理
- PoT(Program-of-Thought):一次性生成完整程序再执行
- Self-Improvement Loop:旧模型造数据 → 校验器 + RM 筛选 → SFT 出更强模型 → 训更强 RM → 循环
- GRPO(Group Relative Policy Optimization):免 value function 的 RL,用组内均值标准差归一化 advantage
- 拒绝采样 / online RFT:反复采样只保留答案正确的路径,滚动微调
- 加权多数投票(weighted majority voting):无标准答案的合成题,用投票推断正确路径
- 难度打分模型(difficulty-scoring model):给题打难度分,控制训练集难度分布
- rm@N / maj@N:采样 N 条后由 RM 重排选最优 / 多数投票选答案
- Reward Shaping:r = σ(0.5·rm) + (rv−1),规则校验兜底、RM 组内排序
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时





