CODEI/O:通过代码输入-输出预测压缩推理的模式

25年2月来自DeepSeek-AI、上海AI实验室和香港科大的论文“CODEI/O: Condensing Reasoning Patterns via Code Input-Output Prediction”。

推理是大语言模型的一项基本能力。虽然先前的研究主要集中于增强数学或代码生成等狭隘技能,但由于训练数据稀疏和碎片化,提高许多其他推理任务的性能仍然具有挑战性。为了解决这个问题, CODEI/O 将原始代码转换为代码输入-输出预测格式,系统地压缩各种推理模式,其固有地嵌入在上下文-落地的代码中。通过训练模型来预测给定代码和测试用例的输入/输出,这些代码和测试用例完全以自然语言作为思维链 (CoT) 原理,暴露给通用推理原语(如逻辑流规划、状态空间搜索、决策树遍历和模块分解),同时将结构化推理与特定代码的语法分离并保持程序严谨性。实验结果表明,CODEI/O 在符号、科学、逻辑、数学和数字以及常识推理任务中取得持续的改进。通过匹配现有的真实输出或使用预测的输入重新执行代码,可以验证每个预测并通过多轮修订进一步增强 CoT,从而产生 CODEI/O++ 并实现更高的性能。

推理是人类认知和解决问题的基本方面,是快速迁移和适应新任务的基础(Dehaene,2004;Knauff & Wolf,2010;Wang & Chiew,2010)。它也被认为是高级大语言模型(LLM)的基石和实现通用人工智能(AGI)的关键一步(Huang & Chang,2022;Qiao,2022;Jaech,2024;Xiang,2025)。然而,当前的方法面临一个根本的悖论:虽然数学问题求解(Shao,2024;Yang,2024;Zeng,2024;Ying,2024;Toshni-wal,2024)和代码生成(Roziere,2023;Mistral-AI,2024;Zhu,2024;Hui,2024)等任务受益于丰富的结构化训练数据,但大多数其他推理领域(包括逻辑推理、科学推理和符号推理)都受到稀疏和碎片化监督信号的困扰。因此,识别富含各种推理模式且可扩展的训练数据变得至关重要。

现实世界的代码程序,反映不同上下文中各种推理模式的整合,使其成为理想的训练来源,同时最大限度地降低过拟合的风险。然而,传统对原始代码进行持续的预训练并不是最理想的,因为相关的推理信号往往是隐式的,并与噪声信息交织在一起。即使是更清晰的直接对文本-到-代码生成进行训练的目标也面临挑战,因为它受到生成特定代码语法要求的限制,因此很难泛化到特定代码任务之外。

学习代码执行。学习代码执行的主题,早在 LLM 时代之前就已存在 (Zaremba & Sutskever, 2014; Graves et al., 2014)。然而,大多数相关工作在从代码执行中学习时仅关注输出预测任务本身 (Nye et al., 2021; Liu et al., 2023; Ding et al., 2024c)。其他工作试图利用代码执行,无论是通过最终反馈 (Ding et al., 2024a; Wang et al., 2024) 还是中间跟踪 (Ding et al., 2024b; Ni et al., 2024),来提高代码生成能力。还有一些专门的基准测试旨在评估模型预测执行结果的能力,例如 CRUXEval(Gu,2024 年)和 LiveCodeBench-Exec(Jain,2024)。

推理时间规模化。一种增强推理的方法是推理-时间规模化,例如 OpenAI o1(Jaech,2024)或 DeepSeek R1(DeepSeek-AI,2025),它通常鼓励模型通过大规模强化学习,生成超长的推理过程来解决问题。这些方法正在将模型在大规模挑战任务上推向新的极限,同时也显著改变模型的输出模式。

本文将原始代码文件转换为可执行函数并设计一个更直接的任务:给定一个函数及其相应的文本查询,模型需要完全以自然语言作为 CoT 原理,根据输入预测执行输出或根据输出预测可行的输入。这种方法旨在将核心推理流程与特定于代码的语法分离,同时保持逻辑严谨性。通过收集和转换来自不同来源的函数,生成的数据融合各种基础推理技能,例如逻辑流程编排、状态空间探索、递归分解和决策。通过从原始代码文件提供的不同上下文中学习这些样本,模型可以反复接触这些推理过程,从而更好地内化这些技能。

如图所示本文训练数据构建的概述:从各种来源收集原始代码文件并转换为统一格式。然后通过执行代码生成输入-输出对,而用于预测的自然语言 CoT 则从 DeepSeek-V2.5 收集。经过验证的 CoT 可以进行可选的修订,以进一步增强推理链。

请添加图片描述

收集原始代码文件

CODEI/O 的有效性,在于选择涵盖广泛推理模式的多样化原始代码源。为此,选择具有不同重点的来源:CodeMix,从内部代码预训练语料库中检索的大量原始 Python 代码文件集,从中过滤掉过于简单或过于复杂的文件;PyEdu-R(推理),Python-Edu 的一个子集(Ben Allal,2024),专注于复杂的推理任务,如 STEM、系统建模或逻辑谜题。为了避免与 CodeMix 重叠,故意排除以纯算法为中心的文件。除了这两个来源之外,还从各种较小、信誉良好的来源整合高质量的代码文件,包括全面的算法存储库、具有挑战性的数学问题和知名的在线编码平台。总的来说,合并这些来源会产生大约 810.5K 个代码文件。

转换为统一格式

收集到的原始代码文件通常缺乏结构、包含不相关的元素,并且难以以独立的方式执行。因此,使用 DeepSeek-V2.5(DeepSeek-AI,2024)对它们进行预处理,将其细化为统一格式,强调主要逻辑功能,并使其可执行,以便收集输入-输出对供以后的预测任务使用。此转换将数据组织成以下组件:1)清理的参考代码:通过清理和重构代码对原始代码文件进行预处理,将核心逻辑功能提取到函数中;可视化(例如,打印、绘图)和文件处理(例如,读取、写入)等非必要元素被排除在外。2)主入口点函数:添加一个主入口点函数来总结代码的整体逻辑;它可以调用其他函数或导入外部库,并且必须具有非空参数(输入)并返回有意义的输出;所有输入和输出都需要是 JSON 可序列化以方便进一步处理。3)输入/输出描述:主入口点函数的输入和输出有明确的定义,包括数据类型、约束(例如输出范围)或更复杂的要求(例如字典中的K)的信息。4)输入生成器:不是直接生成测试用例,而是创建一个独立的基于规则 python 输入生成器函数;此生成器返回符合主入口点函数要求的非平凡输入;在约束条件下应用随机性,从而实现可扩展的数据生成。5)查询:基于主入口点函数生成简洁的问题陈述,作为查询来描述代码的预期功能。

收集输入-输出对

将收集的原始代码文件转换为统一格式后,用输入生成器为每个函数采样多个输入,并通过执行代码获得相应的输出。为了确保输出是确定性的,跳过所有包含随机性的函数,例如使用 import random 的函数。在执行这些代码期间,还对运行期(runtime)和输入/输出目标的复杂性施加一系列限制。对于每个转换后的函数,采样多个输入-输出对,具体数量取决于其来源。在过滤掉不可执行的代码、超过运行期限制的样本和超过所需复杂性的输入-输出对后,从 454.9K 个原始代码文件中获得 350 万个实例。输入和输出预测实例的分布,大致平衡在 50%/50%。

构建输入-输出预测的样本

收集输入-输出对以及转换后的函数后,需要将它们组装成可训练的格式。对于采用的监督微调过程,每个训练样本都需要一个提示和一个响应。由于目标是输入-输出预测任务,用设计的模板构建提示,以组合函数、查询、参考代码以及特定的输入或输出。理想情况下,响应应该是自然语言 CoT,以推理如何得出正确的输出或可行的输入。一般来说,选择以下两种方式来构建所需的 CoT 响应:
直接提示 - CODEI/O。虽然理论上拥有完整的可执行代码可以生成可靠的执行轨迹作为响应,但也存在两个挑战:1)获得确定性的输入预测逆函数是不切实际的; 2) 自动构建的轨迹受到预设计的模板约束,缺乏自由形式自然语言推理的表达性和通用性。因此,采用完全基于 LLM 的方法来合成所有所需的响应,使用 DeepSeek-V2.5,因为它具有顶级性能但成本极低。此处生成的数据集称为 CODEI/O。如图提供两个收集的响应示例。
充分利用代码 - CODEI/O++。一种常见的提高数据质量的方法是拒绝采样(Yuan,2023),其中错误的预测会被丢弃。虽然这种方法非常适合 CODEI/O,因为可以通过重新执行代码来验证所有响应,但它会导致性能不佳。因此,采取另一种方法来充分利用来自参考代码的执行反馈。对于预测错误的响应,将反馈附加为第二轮输入消息,并要求 DeepSeek-V2.5 重新生成另一个响应。实际上,捕获多种类型的反馈:对于输出预测,只是通知模型它生成一个错误的答案;对于输入预测,还会根据错误输入提供执行的输出;对于代码执行失败的情况(例如,由于格式错误、参数不匹配错误或其他运行时错误),还会明确包含这些反馈。第二轮之后,重新检查新生成响应的正确性。然后,通过连接所有四个组件来构建最终响应:第一轮响应 + 第一轮反馈 + 第二轮响应 + 第二轮反馈。对于第一轮的正确响应,第一轮反馈只是“成功”,没有第二轮内容。一般来说,在第一轮中,50% 的响应是正确的,而 10% 的错误响应可以在第二轮中成功修改。与CODEI/O类似,在修改后保留所有答案,无论正确与否。通过这种方式收集的数据集称为CODEI/O++。

请添加图片描述

选择以下基础模型作为主干:Qwen 2.5 7B Coder(Hui,2024)、Deepseek v2 Lite Coder (MoE)(Zhu,2024)、LLaMA 3.1 8B(Dubey,2024)和 Gemma 2 27B(GemmaTeam,2024)。这些模型被选为目前最先进的基础模型,在架构、大小和预训练重点方面有所不同。值得注意的是,包括两个编码器模型,因为先前的研究表明,与通用模型相比,编码器模型表现出更强的推理能力(Suzgun,2023;Shao,2024)。

利用内部指令调整数据集,其中包含来自不同语言的约 118 万个样本,涵盖数学、编码、写作等广泛领域。在此数据集上调整模型使其能够有效地遵循不同的指令,使其适用于广泛的下游任务并可对其进行测试。

与持续预训练类似,在大多数实验中采用两阶段训练策略。第一阶段涉及对 CODEI/O 或 CODEI/O++ 数据集进行训练,然后是第二阶段的一般指令调整。

采用这种两阶段训练方法的原因,在于我们数据集的特点。与指令调整数据相比,CODEI/O(++) 数据集包含的样本数量要多得多。简单地混合这两个数据集会导致分布偏差,从而造成对指令调整数据的学习不足。这可能会阻止模型在下游任务中充分展示其遵循各种指令的能力。为了解决这个问题,两阶段训练首先加强模型作为更强大的通用推理基础模型,然后通过指令调整将其调整为通用指令遵循模型。

在以下基准上评估所有模型:DROP(Dua,2019)、WinoGrande(Sakaguchi,2020)、GSM8K(Cobbe,2021)、MATH(Hendrycks,2021b)、MMLU-STEM(Hendrycks,2021a)、BBH(Suzgun,2023)、GPQA(Rein,2024)、CruxEval(Gu,2024)、ZebraGrid(Lin,2025)。这些基准涵盖多个关键推理领域,包括科学、数学和数字、符号、常识、逻辑和代码理解。还包括两个综合基准:LiveBench (White,2024) 和 KorBench (Ma,2024)。除了这些已建立的基准之外,还在两个额外的基准上进行测试:BBH-ZH,9 个 BBH 子任务的中文版,因为指令调整数据包含英文和中文示例,以及 LeetCode-O (LC-O),专为带有测试用例 LeetCode 问题的双语输出预测而设计。所有评估使用贪婪解码完成,均在零样本学习设置,但 BBH-EN/-ZH 在 3-样本学习设置。

主要基线是在单个阶段(仅限第 2 阶段)直接在指令调整数据集上对基础模型进行微调。这有助于评估额外的训练阶段是否提供任何切实的好处。还选择几个强大的数据集作为第一阶段的基线:WebInstruct(Yue,2024):一个大型指令调整数据集,包含从互联网挖掘并由 LLM 细化的 1160 万个样本。OpenMathInstruct-2(Toshniwal,2024):一个 1400 万个样本的数据集,专注于数学问题解决,使用 LLaMA 3.1 405B-Inst(Dubey,2024)从 GSM8K 和 MATH 增强。

OpenCoder-SFT-Stage-1(Huang,2024):一个由通用代码数据合成的 420 万个 QA 对数据集,涵盖不同的计算机科学领域。 Python-Edu(Ben Allal,2024):根据持续对代码进行预训练往往会增强推理能力的发现,采用其完整的 7.7M 代码语料库,并使用标准语言建模损失对其进行训练。对于 WebInstruct 和 OpenMathInstruct-2,在大多数实验中使用 3.5M 子集,与 CODEI/O 数据集的大小保持一致,但也报告在 Qwen 2.5 7B Coder 完整数据集上进行训练时的分数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值