#数学数据能提升代码能力吗?代码数据能反哺数学推理吗?
#0. 一句话结论
可以互相帮助,但迁移并不对称:代码数据通常更稳定地反哺数学推理,数学数据对代码能力的帮助更依赖“代码任务是否需要算法/规格推理”。
更具体地说:
- 数学 → 代码:主要提升的是抽象推理、分步规划、边界条件分析、形式化约束理解、verifier-driven search 等能力;因此更可能帮助竞赛编程、算法题、复杂 bug reasoning、程序验证式任务,而不一定显著提升普通 API glue code 或工程框架熟练度。
- 代码 → 数学:通常更直接。代码预训练会强化变量绑定、符号操作、层级结构、可执行中间表示、精确语法约束和“把问题转成程序”的习惯;这解释了为什么 DeepSeekMath 选择从 DeepSeek-Coder 继续训练,以及 PoT/ToRA/MAmmoTH 这条线会把数学推理显式转成代码或工具调用。
- 预训练阶段更像在学“表示与先验”:代码和数学都属于高密度、低歧义、强结构数据,能改变模型内部对变量、控制流、证明/推导结构的建模方式。
- 后训练阶段更像在学“行为策略”:数学/代码都是可验证任务,天然适合 RLVR、拒绝采样、过程/结果奖励;但后训练更容易发生风格迁移和过拟合,未必能补足底层表示缺口。
所以,如果问题是“训练数学数据能不能提高代码 benchmark”,答案是可能,但要看代码 benchmark 的推理密度;如果问题是“训练代码数据能不能提高数学 reasoning”,答案是已有大量经验证据显示可行,而且机制更清楚。
#1. 为什么数学和代码会互相迁移?
数学和代码表面上是两个领域:一个是自然语言 + 公式推导,一个是程序语言 + 执行语义。但对 LLM 来说,它们共享几类底层能力:
- 符号绑定:变量、函数、条件、约束必须在长上下文中保持一致。
- 组合泛化:小规则组合成大解法;局部步骤错误会导致全局失败。
- 形式化结构:数学证明、方程推导、代码 AST 都有强层级结构。
- 可验证反馈:数学答案可判对错,代码可运行测试;这使它们比开放式写作更适合自动化筛选、拒绝采样、RLVR。
- 中间过程有价值:CoT、PoT、代码草稿、工具调用 trace 都是把隐式思考外化为可训练轨迹。
这也是为什么近两年的强推理模型几乎都会把 math/code 放在同一个“可验证推理”篮子里,而不是把它们当成完全分离的能力。
#2. 发展脉络:从“数学是语言任务”到“数学/代码是可验证推理任务”
#2.1 第一阶段:通用预训练 + 少量 prompting,数学和代码还是附属能力
早期 GPT-style LLM 主要在通用网页文本上训练。数学和代码能力更多来自语料中自然出现的片段,而不是被系统性设计。
代表节点:Chain-of-Thought Prompting (2022)
CoT 的关键贡献不是发明数学数据,而是证明:当模型足够大时,显式中间步骤可以激活复杂推理能力。这让数学任务从“直接预测答案”转向“生成可检查的推理轨迹”。
- 之前的问题:模型直接给答案,复杂多步题容易跳步。
- 解决方法:用少量带中间步骤的例子诱导模型生成推理链。
- 新问题:自然语言推理链不一定可执行,算术错误、幻觉步骤仍然常见。
- 推动下一阶段:既然自然语言 CoT 不可靠,就需要更形式化、更可验证的中间表示——代码自然进入视野。
#2.2 第二阶段:代码作为数学推理的“可执行中间语言”
代表节点:Program of Thoughts (PoT, 2022)
PoT 的核心思想是把数学/数值推理中的计算部分交给程序执行,模型负责把问题转成程序。这条线非常关键,因为它说明代码不只是另一个任务,而可以成为数学推理的中间表示。
- 之前的问题:CoT 把推理和计算都放在自然语言里,计算脆弱。
- 解决方法:模型生成 Python 程序,由解释器执行得到答案。
- 新问题:程序生成本身可能错;复杂数学还需要选择工具、调用库、组织多步交互。
- 推动下一阶段:从一次性程序生成走向工具集成推理 agent。
代表节点:ToRA (2023)
ToRA 将自然语言推理与外部工具、符号求解器、计算库结合,训练 tool-use trajectories。它说明数学推理可以被建模成“语言 + 代码 + 工具”的交互过程。
这对“代码能否反哺数学”的回答很直接:可以,而且不是泛泛迁移,而是把代码作为数学推理的执行 substrate。
#2.3 第三阶段:专门数学模型开始大量利用代码底座
代表节点:Minerva (2022)
Minerva 在通用自然语言基础上继续训练技术内容,包括数学、科学、工程文本,显著提升定量推理能力。它证明了“继续预训练 technical corpus”对数学有用。
代表节点:Llemma (2023)
Llemma 从 Code Llama 继续在 Proof-Pile-2 等数学相关语料上训练,成为一个开放数学模型。值得注意的是,它不是从纯通用模型开始,而是利用已有代码模型作为底座。这暗示代码预训练提供了数学模型需要的形式化结构先验。
代表节点:DeepSeekMath (2024)
DeepSeekMath 是最强的证据之一:它从 DeepSeek-Coder-Base-v1.5 7B 出发,继续用 120B math-related tokens,并混入自然语言与代码数据训练,最后在 MATH 上达到很强表现。这个设计本身给出一个判断:
对数学推理来说,代码底座不是副作用,而是可复用的结构化推理基础。
DeepSeekMath 还引入 GRPO 做数学 RL,进一步把数学推理推向可验证奖励训练。
#2.4 第四阶段:数学和代码在后训练中合流为 RLVR
2024-2025 年之后,一个明显趋势是:数学和代码不再只是两类数据,而是两类最适合 RL 的任务。
- 数学:答案可验证、部分过程可验证。
- 代码:单元测试、编译、执行结果可验证。
- Agentic coding:issue 是否解决、测试是否通过、repo 状态是否正确,也可近似验证。
代表节点:DeepSeek-R1 (2025)
DeepSeek-R1 的重要性不只在数学分数,而在于它展示了大规模 RL 可以在可验证任务上激发 reasoning behavior。虽然 R1 覆盖多种任务,但数学和代码是最自然的奖励来源。这使“math/code transfer”从数据迁移问题,变成了可验证环境中的策略优化问题。
#3. 数学数据如何帮助代码能力?
数学数据对代码能力的帮助,主要不是让模型“记住更多 API”,而是改善高阶 reasoning。可以分成四类机制。
#3.1 提升规格理解与约束保持
很多代码任务的难点不是语法,而是理解需求:输入输出约束、边界条件、不变量、复杂条件组合。数学训练会强化模型处理显式约束的能力。
可能受益的代码任务:
- 算法题与竞赛编程;
- 需要推导复杂边界条件的函数实现;
- 需要证明不变量或复杂状态转移的代码;
- 需要把自然语言需求翻译为精确逻辑的任务。
不一定受益的任务:
- 纯框架调用;
- 依赖具体库知识的工程代码;
- 大型 repo 中跨文件上下文定位;
- UI/业务 glue code。
因此,如果 benchmark 是 HumanEval/MBPP 这类小函数题,数学可能有帮助;如果是 SWE-bench 这类真实仓库修改,数学数据单独的帮助会弱得多,代码库结构、调试、工具使用和长上下文更关键。
#3.2 强化分步规划和错误检查
数学后训练常要求模型显式分解问题、检查中间结果、回溯错误。这些行为可以迁移到代码:先设计思路、再实现、再测试、再修复。
但这里有个细节:行为迁移不等于能力迁移。如果模型没有足够代码语料,数学 CoT 可能只让它“解释得更像在推理”,却不能写出正确代码。
#3.3 提供高质量可验证 RL 信号
数学数据的另一个价值是它便宜、密集、可自动判分。对于后训练,数学题可以作为 general reasoning RL 的训练场,促使模型形成搜索、反思、延迟下结论等策略。这些策略可能迁移到代码 RL。
但迁移边界也很明确:数学答案通常是短 outcome;代码任务的 reward 牵涉编译、测试、性能、风格、依赖、repo 状态。代码的 credit assignment 更长、更稀疏,不能指望数学 RL 完全替代代码 RL。
#3.4 数学数据可能带来的负迁移
数学训练也可能伤害代码:
- 过度冗长的 CoT 风格会让代码回答变慢、啰嗦;
- 只学符号推导,忽略工程约束;
- 强化“最后答案正确”而不是“可维护实现”;
- 数学数据比例过高可能稀释 API、库、真实 repo 分布。
所以数学数据要提升代码,关键不是“多加数学”,而是控制配比、阶段和任务形态。
#4. 代码数据如何帮助数学能力?
相比数学 → 代码,代码 → 数学的机制更直接,证据也更强。
#4.1 代码预训练提供形式化结构先验
代码有严格语法、嵌套结构、变量作用域、控制流、函数调用、错误反馈。模型在代码上训练,会被迫学习:
- 变量一致性;
- 层级结构;
- if/for/递归等控制流;
- 抽象函数与模块化;
- 精确 token 级约束。
这些能力与数学中的变量替换、分情况讨论、递推、构造证明高度相似。
DeepSeekMath 从 DeepSeek-Coder 出发,就是一个很强的经验信号:好的代码模型可以作为数学模型的底座。
#4.2 代码让“计算”从语言模型中解耦出来
PoT、MAmmoTH、ToRA 这几条线都在说明:数学推理里有一部分不是“想明白”,而是“算正确”。让模型生成代码,再由解释器执行,可以显著降低算术和符号操作错误。
这给数学训练带来一个很重要的范式变化:
模型不必把所有推理都压进自然语言;它可以学会选择一种可执行表示。
这和 agent 方向也高度相关:代码是当前最成熟的、可执行的 latent/action interface。
#4.3 代码数据改善可验证后训练的探索空间
在 RLVR 中,模型需要探索不同解法。代码提供了一个更短的反馈回路:程序能跑就能马上知道很多东西。对于数学题,尤其是组合、数论、概率、动态规划类问题,写程序验证 conjecture 是很自然的解题策略。
这也是为什么强 reasoning model 常常在数学和代码上一起提升:它们共享“生成候选 → 执行/验证 → 修正”的训练闭环。
#4.4 代码也会带来负迁移
代码不是万能数学数据。过度依赖代码可能导致:
- 能算但不能证明;
- 对不可计算/抽象证明题帮助有限;
- 对形式定理证明需要 Lean/Coq 等更专门语料,而不是普通 Python;
- 可能把数学推理简化成 brute-force 搜索。
所以代码对数学最强的帮助在“可计算、可模拟、可枚举、可验证”的数学问题上;对高抽象证明,还需要证明语料和形式化验证环境。
#5. 预训练与后训练中的差异
#5.1 预训练:学的是表示、语法、世界模型和领域先验
在预训练/继续预训练阶段,math/code 数据主要改变模型的内部表示。
| 数据类型 | 对底层表示的贡献 | 对另一领域的潜在帮助 |
|---|---|---|
| 代码 | 变量绑定、作用域、控制流、模块化、精确语法、可执行性 | 帮助数学中的符号操作、程序化解题、形式结构建模 |
| 数学文本 | 公式、定义、定理、推导链、抽象概念 | 帮助代码中的规格理解、算法推导、不变量分析 |
| 数学题解 | 分步推理、策略选择、错误检查 | 帮助代码规划和调试思维 |
| 程序执行数据 | action-feedback loop、测试驱动修正 | 帮助数学工具使用和验证式推理 |
预训练迁移通常更“深”,但也更难归因,因为它和数据质量、模型规模、tokenizer、上下文长度、混合比例都耦合。
#5.2 后训练:学的是回答风格、解题策略和奖励对齐
后训练中,math/code 数据的作用更像 shaping behavior:
- SFT 教模型如何展开步骤;
- rejection sampling 选择正确轨迹;
- RLVR 用结果奖励鼓励探索;
- PRM/ORM 改善过程或最终答案选择。
后训练迁移更容易看到短期 benchmark 提升,但也更容易出现“表层策略迁移”:模型学会写很长 reasoning,却没有更强的底层执行能力。
#5.3 一个实用判断:预训练看“结构相似”,后训练看“奖励相似”
- 如果两个领域在表示结构上相似,预训练更可能迁移。
- 如果两个领域的 reward/verifier 形态相似,后训练更可能迁移。
数学和代码恰好两者都相似,所以它们是 LLM 能力迁移中最值得研究的一对。
#6. 经验案例怎么读?
#6.1 DeepSeekMath:代码底座 + 数学继续预训练 + GRPO
DeepSeekMath 的配方可以被理解为三层:
- DeepSeek-Coder 底座:提供代码结构和形式化能力;
- 120B math-related tokens 继续预训练:注入数学概念和题解分布;
- GRPO 后训练:利用可验证奖励进一步优化解题策略。
这说明“代码 → 数学”不是单一步骤,而是底座、数据、RL 共同作用。
#6.2 MAmmoTH:混合 CoT 和 PoT 的数学 instruction tuning
MAmmoTH 的 MathInstruct 数据包含 CoT 和 PoT rationales。它的意义在于明确承认:数学问题有些适合语言推理,有些适合程序推理。混合数据让模型学会在两种表示之间切换。
#6.3 ToRA:数学推理变成工具使用轨迹
ToRA 把数学训练成 tool-integrated reasoning agent。这对代码能力也有启发:未来代码 agent 的训练可能不是单轮“写函数”,而是多轮“读 repo → 写 patch → 跑测试 → 修复”的工具轨迹。
#6.4 Phi-1 / Textbooks Are All You Need:高质量合成数据对代码很关键
Phi-1 说明小模型也能通过高质量“textbook-like”代码数据获得强代码能力。这对数学 → 代码迁移的启发是:如果数学数据要帮助代码,最好不是普通题解堆砌,而是能和代码结构对齐的高质量算法/程序化推理数据。
#7. 一个更精确的答案:何时可行,何时不可行?
#7.1 数学训练帮助代码:可行条件
更可能有效:
- 代码任务需要算法推理;
- 任务有明确 verifier,比如单元测试;
- 数学数据包含可执行/程序化推理;
- 后训练鼓励先规划、再实现、再验证;
- 代码数据没有被数学数据稀释掉。
不太可能有效:
- 代码任务主要考 API 记忆;
- 真实 repo 修改需要大量项目上下文;
- 数学数据全是自然语言长 CoT;
- 没有代码执行反馈;
- 训练只优化最终答案,不优化可维护实现。
#7.2 代码训练帮助数学:可行条件
更可能有效:
- 数学题可计算、可枚举、可模拟;
- 模型学会生成和执行程序;
- 数据含 PoT/tool-use trajectories;
- 训练中有 verifier 或执行反馈;
- 底座已有足够自然语言数学概念。
不太可能有效:
- 纯抽象证明;
- 需要严密形式逻辑而不是数值计算;
- 普通代码语料质量低、重复多、缺少解释;
- 模型只学语法,没有学到问题转程序的过程。
#8. 对训练配方的启发
如果目标是同时提升数学和代码,比较合理的 recipe 不是简单混合,而是分阶段:
- 基础预训练阶段:保留足够高质量代码,学习形式化结构与执行先验。
- 数学/科学继续预训练阶段:加入高质量数学文本、题解、公式推导、证明和技术内容,但不要完全移除代码。
- 混合 reasoning SFT 阶段:同时包含 CoT、PoT、tool-use、debug trace、算法推导。
- 可验证 RL 阶段:把 math、code、tool-use 都作为 verifier-rich tasks,但最好分 curriculum,避免奖励冲突。
- agentic code 阶段:引入 repo-level trajectory,包括读文件、定位 bug、编辑、运行测试、修复。
这里的关键判断是:数学和代码可以共享 reasoning policy,但不能共享全部环境分布。 数学 RL 可以培养“想清楚再答”的策略,代码 RL 还必须训练“和真实系统交互”的能力。
#9. 对 wenjun 方向的研究机会
这对问题和你关心的基础模型训练、agentic RL、潜空间推理其实高度相关。几个值得深挖的问题:
#9.1 能否把代码看成数学推理的 latent/action interface?
PoT/ToRA 是显式代码轨迹,但未来可能有更紧凑的 latent program representation。一个方向是:模型先在 latent space 中形成程序化计划,再只在必要时外化为代码执行。
#9.2 math RL 学到的到底是 reasoning,还是 benchmark-specific search?
如果数学 RL 后模型代码也提升,说明学到了可迁移策略;如果只数学提升,说明可能只是题型搜索。可以设计 cross-domain transfer eval:math-only RL 后测 HumanEval/SWE-bench-lite;code-only RL 后测 GSM8K/MATH/证明题。
#9.3 数据配比是否存在“结构能力临界点”?
代码 token 比例太低可能学不到执行结构;数学 token 太低可能学不到抽象概念。值得研究是否存在某种 phase transition:达到一定结构化 token 密度后,模型变量绑定和长程一致性突然改善。
#9.4 verifier-rich tasks 是否能作为通用智能的训练飞轮?
数学和代码最特殊的地方是可验证。若它们能训练出通用搜索、反思、分解、工具使用策略,那么下一步就是把这种策略迁移到开放 agent 环境。但这里会遇到 long-horizon credit assignment 和环境非平稳问题。
#9.5 从“数据迁移”走向“环境迁移”
真正重要的问题可能不是数学数据和代码数据谁帮助谁,而是:
哪些训练环境能诱导模型形成可迁移的内部算法?
数学题、代码测试、工具执行、网页任务、科研探索,都是不同 verifier 密度和 horizon 长度的环境。理解这些环境如何塑造能力,比单纯比较数据类型更基础。
#10. 最终判断
- 数学数据可以帮助代码能力,但主要帮助 reasoning-heavy code,不保证提升工程型 coding。
- 代码数据反哺数学更确定,尤其通过代码底座、PoT、tool-use 和可执行验证。
- 预训练阶段的迁移来自结构化表示;后训练阶段的迁移来自可验证奖励和解题策略。
- 二者最好被看作同一个“形式化、可验证推理”谱系,而不是两个孤立能力。
- 对未来 agent 训练来说,math/code 的最大价值可能不是 benchmark 本身,而是提供了最便宜、最密集、最可控的 reasoning environment。
如果要用一句更研究导向的话概括:
代码是数学推理的可执行化,数学是代码推理的抽象化;二者共同构成了当前 LLM 最可规模化训练的形式化推理生态。
#参考与延伸阅读
- Wei et al., Chain-of-Thought Prompting Elicits Reasoning in Large Language Models, 2022.
- Chen et al., Program of Thoughts Prompting: Disentangling Computation from Reasoning for Numerical Reasoning Tasks, 2022.
- Lewkowycz et al., Solving Quantitative Reasoning Problems with Language Models / Minerva, 2022.
- Gunasekar et al., Textbooks Are All You Need, 2023.
- Azerbayev et al., Llemma: An Open Language Model For Mathematics, 2023.
- Yue et al., MAmmoTH: Building Math Generalist Models through Hybrid Instruction Tuning, 2023.
- Gou et al., ToRA: A Tool-Integrated Reasoning Agent for Mathematical Problem Solving, 2023.
- Luo et al., WizardMath: Empowering Mathematical Reasoning for Large Language Models via Reinforced Evol-Instruct, 2023.
- Guo et al., DeepSeek-Coder: When the Large Language Model Meets Programming -- The Rise of Code Intelligence, 2024.
- Shao et al., DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models, 2024.
- DeepSeek-AI, DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning, 2025.