【中文翻译】CODEI/O: Condensing Reasoning Patterns via Code Input-Output Prediction

大模型翻译,如有不对,敬请理解。文中图片和表格省略

摘要

推理是大型语言模型(LLMs)的一项基本能力。尽管先前的研究主要集中在提升如数学或代码生成等狭窄技能上,但由于训练数据的稀疏性和碎片化,提升其他推理任务的性能仍然具有挑战性。为了解决这个问题,我们提出了CoDEI/O,这是一种新颖的方法,通过将原始代码转换为代码输入输出预测格式,系统地压缩嵌入在上下文代码中的多样化推理模式。通过训练模型在给定代码和测试用例的情况下预测输入/输出,并以自然语言作为链式思维(CoT)推理,我们让模型接触到通用的推理原语——如逻辑流规划、状态空间搜索、决策树遍历和模块化分解——同时将结构化推理与代码特定语法解耦,并保持程序的严谨性。实验结果表明,CoDEI/O在符号、科学、逻辑、数学与数值以及常识推理任务上均带来了持续的改进。通过匹配现有的真实输出或使用预测的输入重新执行代码,我们可以验证每个预测,并通过多轮修订进一步增强CoT,从而形成CoDEI/O++,并实现更高的性能。我们的数据和模型可在https://github.com/hkust-nlp/CodeIO获取。

1 引言

推理是人类认知和问题解决的基本方面,构成了快速转移和适应新任务的基础[4, 15, 26]。它也被认为是高级大型语言模型(LLMs)的基石,是实现人工通用智能(AGI)的关键步骤[8, 17, 13, 25]。然而,当前的方法面临一个根本性的悖论:尽管像数学问题解决[22, 28, 29, 30]和代码生成[24, 23, 14, 16]这样的任务受益于丰富的结构化训练数据,但大多数其他推理领域——包括逻辑推理、科学推理和符号推理——却因监督信号的稀疏和碎片化而受到影响。因此,识别富含多样化推理模式且易于扩展的训练数据变得至关重要。

我们相信,现实世界中的代码程序反映了跨多样化上下文的广泛推理模式的集成,使其成为理想的训练来源,同时最小化过拟合的风险。然而,传统的对原始代码进行持续预训练并不理想,因为相关的推理信号通常是隐含的,并与噪声信息交织在一起。即使是直接训练文本到代码生成的更干净目标也面临挑战,因为它受限于生成代码特定语法的要求,难以推广到代码特定任务之外的任务。为了解决这些限制,我们提出将原始代码文件转换为可执行函数,并设计一个更简单的任务:给定一个函数及其对应的文本查询,模型需要完全以自然语言作为CoT推理,预测给定输入的执行输出或给定输出的可行输入。这种方法旨在将核心推理流与代码特定语法解耦,同时保持逻辑的严谨性。通过从不同来源收集和转换函数,生成的数据包含了各种基础推理技能,如逻辑流编排、状态空间探索、递归分解和决策制定。从原始代码文件提供的多样化上下文中学习这些样本,使模型能够更好地内化这些技能。

与对原始代码进行持续预训练类似,我们的代码输入/输出预测学习作为一个独立的训练阶段,在通用指令调优之前以两阶段方式进行,作为增强基础模型推理能力的中间步骤。提示包括函数、文本查询以及给定的输入或输出,而响应则通过提示一个强大的开源模型DeepSeek-V2.5(DeepSeek-AI等,2024)直接收集。值得注意的是,输入输出预测的实例具有高度可扩展性,因为我们可以从单独的Python输入生成器中为每个函数采样数百个输入,并通过执行代码获得真实输出。最后,我们从多个来源收集了超过450K个函数,并为每个函数生成多个输入输出对。通过为它们合成CoT,我们总共获得了3.5M个训练样本,形成了CoDel/O数据。为了进一步利用代码的可验证特性,我们基于代码执行验证所有预测,并提示DeepSeek-V2.5对最初错误的响应进行第二轮修订。这些多轮修订被连接成更长的响应。生成的CoDel/O++数据集进一步提升了性能,证明了这一改进过程的有效性。

我们在四个参数规模从7B到30B的基础模型上验证了CoDel/O和CoDel/O++的有效性。在14个不同基准上的评估表明,训练它们可以提升各种推理任务的性能,不仅限于代码相关任务,还包括更广泛的任务,如逻辑、符号、数学与数值、科学、常识等。与几个强大的数据基线(如OpenMathInstruct2(Toshniwal等,2024)、OpenCoder-SFT-Stage1(Huang等,2024)、WebInstruct(Yue等,2024)和高质量原始代码(Ben Allal等,2024)相比,CoDel/O不仅在所有四个测试的基础模型上实现了更高的平均分数,而且表现更加平衡——它不仅在少数评估基准上提升了分数,还在其他基准上保持了稳定的表现,展示了其平衡且可推广的推理能力。

2 CoDel/O

本节介绍了我们的数据构建流程。我们首先从各种来源收集原始代码文件(§2.1),然后将它们转换为统一格式(§2.2)。接下来,从转换后的函数中采样输入输出对(§2.3)。最后,组装完整的训练数据集(§2.4)。图1展示了概述。

收集原始代码文件

CoDel/O的有效性在于选择涵盖广泛推理模式的多样化原始代码来源。为了实现这一点,我们选择了具有不同侧重点的来源:CodeMix,一个从内部代码预训练语料库中检索到的大量原始Python代码文件集合,我们过滤掉了过于简单或过于复杂的文件;以及PyEdu-R(推理),Python-Edu(Ben Allal等,2024)的一个子集,专注于复杂的推理任务,如STEM、系统建模或逻辑谜题。为了避免与CodeMix重叠,我们特意排除了以纯算法为中心的文件。除了这两个来源外,我们还从各种较小的、声誉良好的来源中纳入了高质量的代码文件,包括全面的算法库、具有挑战性的数学问题和知名的在线编码平台。总共合并这些来源产生了大约810.5K个代码文件。有关数据来源的更多详细信息,请参见附录C.1。

转换为统一格式

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

收集输入输出对

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

构建输入输出预测样本

收集输入输出对以及转换后的函数后,我们需要将它们组装成可训练的格式。对于我们采用的监督微调过程,每个训练样本都需要一个提示和一个响应。由于我们的目标是输入输出预测任务,我们使用设计的模板构建提示,将函数、查询、参考代码以及特定输入或输出结合起来。我们在附录G中的图8中提供了一个示例提示。响应理想情况下应该是自然语言的CoT,用于推理如何得出正确的输出或可行的输入。通常,我们选择以下两种方式来构建所需的CoT响应:

直接提示 - CODEI/O 虽然拥有完整的可执行代码理论上允许我们生成可靠的执行轨迹作为响应,但出现了两个挑战:1) 获得输入预测的确定性反向函数是不切实际的;2) 自动构建的轨迹受限于预先设计的模板,缺乏自由形式自然语言推理的表达力和通用性。因此,我们采用完全基于LLM的方法,使用DeepSeek-V2.5合成所有所需的响应,因为它具有顶级的性能但成本极低。这里生成的数据集称为CodeI/O。我们在图2中提供了两个收集到的响应示例。

充分利用代码 - CodeI/O++ 提高数据质量的常见方法是拒绝采样(Yuan等,2023),即丢弃不正确的预测。尽管这种方法非常适合CodeI/O,因为我们可以通过重新执行代码来验证所有响应,但我们发现它会导致次优性能(§4.1)。因此,我们采用另一种方法,充分利用参考代码的执行反馈。对于预测不正确的响应,我们将反馈作为第二轮输入消息附加,并要求DeepSeek-V2.5重新生成另一个响应。在实践中,我们捕获多种类型的反馈:对于输出预测,我们简单地通知模型它生成了错误的答案。对于输入预测,我们还提供了基于错误输入的执行输出。对于代码无法执行的情况(例如,由于格式错误、参数不匹配错误或其他运行时错误),我们也明确包含这些反馈。

在第二轮之后,我们重新检查新生成的响应的正确性。然后,我们通过连接所有四个组件来构建最终响应:第一轮响应 + 第一轮反馈 + 第二轮响应 + 第二轮反馈。对于第一轮中正确的响应,第一轮反馈仅为“成功”,没有第二轮内容。通常,在第一轮中,50%的响应是正确的,10%的不正确响应可以在第二轮中成功修订。与CodeI/O类似,我们在修订后保留所有响应,无论是正确还是错误的。我们通过这种方式收集的数据集称为CodeI/O++,我们在附录G中的表9中提供了一个完整示例。

3 实验

设置

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

指令调优数据 我们使用了一个包含约1.18M个样本的内部指令调优数据集,涵盖了数学、编码、写作等多个领域。在该数据集上对模型进行调优,使其能够有效地遵循各种指令,从而适用于广泛的下游任务。

训练设置 类似于持续预训练,我们在大多数实验中采用两阶段训练策略。第一阶段涉及在CodeI/O或CodeI/O++数据集上进行训练,随后是第二阶段的通用指令调优。

采用这种两阶段训练方法的原因在于我们数据集的特点。CodeI/O(++)数据集包含的样本数量显著多于指令调优数据。简单地将两个数据集混合会导致分布偏差,这可能导致指令调优数据上的学习不足,从而阻止模型在下游任务中充分展示其遵循各种指令的能力。为了解决这个问题,两阶段训练首先将模型强化为更强大的通用推理基础模型,然后通过指令调优将其适应为多功能指令遵循模型。详细的训练超参数见附录E。

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

脚注1:我们采用2406-2407分割,排除了代码生成和指令遵循子任务,因为它们不是我们的重点。

脚注2:为清晰起见,BBH在后文中称为BBH-EN。

4 分析

为了检验我们方法中不同关键方面的影响,我们进行了多项分析实验。除非另有说明,所有实验均使用Qwen 2.5 Coder 7B进行简化,报告的结果是在第二阶段通用指令调优后获得的。

消融研究

我们首先对数据构建过程进行了两项关键消融研究,结果如表2所示:

输入/输出预测 我们通过分别训练输入和输出预测来检验它们的效果。分数大致相似,但输入预测在KorBench上表现优异,而在GPQA上略有下降,输出预测在符号推理任务(如BBH)上表现出更大的优势。CRUXEval-1和-O也分别偏好输入和输出预测。

拒绝采样 我们探索了使用拒绝采样过滤不正确响应的方法,这移除了50%的训练数据。然而,这导致了整体性能下降,表明数据多样性有所损失。我们还尝试通过代码执行将所有不正确响应替换为真实答案(无CoT)。我们在设计用于测量输出预测准确性的基准(如LeetCode-O和CRUXEval-O)上看到了改进,但在其他地方降低了分数,从而降低了平均性能。当将这些方法与训练在约50%的CoDel/O子集上进行比较时,它们仍然没有优势。因此,为了保持性能平衡,我们在主要实验中保留所有不正确响应,不做任何修改。

不同合成模型的效果

我们的一些基线(如WebInstruct)使用Qwen-72B(Bai等,2023)和Mixtral 22Bx8(Jiang等,2024)合成响应,而CoDel/O使用DeepSeek-V2.5。为了消融不同合成模型的效果,我们使用DeepSeek-V2.5重新生成了3.5M WebInstruct(因为它涵盖了大量领域)子集的响应,创建了一个名为WebInstruct-DS25的更新数据集。如图3所示,虽然WebInstruct-DS25在Qwen 2.5 Coder 7B和LLaMA 3.1 8B上优于原始数据集,但仍不及CoDel/O。这突显了代码中多样化推理模式的价值以及任务选择在训练中的重要性。总体而言,这种比较表明,预测代码输入和输出可以超越仅从高级模型中进行知识蒸馏,从而提升推理能力。

CoDel/O的扩展效果

我们评估了CoDel/O在不同训练数据量下的扩展效果。通过随机采样训练实例,图4a揭示了一个明显的趋势:增加训练样本数量通常会提升基准测试的性能。具体来说,使用最少的数据量在大多数基准上表现相对较弱,因为模型缺乏足够的训练来有效泛化。相比之下,当使用完整数据集进行训练时,CoDel/O实现了最全面和稳健的性能。中等数量的数据产生的结果介于这两个极端之间,表明随着更多训练样本的引入,性能逐渐提高。这突显了CoDel/O在增强推理能力方面的可扩展性和有效性。

我们还通过固定并使用所有唯一的原始代码样本,但改变每个样本的输入输出预测实例数量,在输入输出对的维度上扩展数据。图4b显示了与完整集相比使用的I/O对的比例。虽然扩展效果不如训练样本明显,但我们仍然观察到明显的优势,特别是在从1/6增加到6/6时。这表明一些推理模式需要多个测试用例来完全捕捉和学习其复杂的逻辑流。

不同数据格式

我们研究了如何在训练样本中最好地安排查询、参考代码和CoT。如表3所示,将查询和参考代码放在提示中,将CoT放在响应中,实现了最高的平均分数和最平衡的性能。其他格式显示出略低但可比的性能,最差的结果发生在查询在提示中而参考代码在响应中时,类似于标准代码生成任务,但训练样本少得多。这突显了CoT和测试用例扩展对于学习可转移推理能力的重要性。

多轮修订

基于CODEI/O(无修订)和CODEI/O++(单轮修订),我们将修订扩展到第二轮,以评估通过重新生成在第一轮修订后仍然不正确的实例的预测来进一步改进的效果。我们在附录D中的图7中可视化了每轮中响应类型的分布。它显示大多数正确响应在第一轮中预测,大约10%的不正确响应在第一轮修订中得到了纠正。然而,第二轮产生的纠正显著减少,我们发现通过检查案例,模型经常重复相同的错误CoT,而没有添加新的有用信息。在纳入多轮修订后,我们观察到从第0轮到第1轮的一致改进,但从第1轮到第2轮的改进最小——LLaMA 3.1 8B略有改进,而Qwen 2.5 Coder 7B则有所下降。因此,我们在主要实验中停止在单轮修订,即CODEI/O++。

两阶段训练的必要性

最后,我们通过测试单阶段混合训练和两阶段训练与不同数据混合来强调使用CODEI/O数据进行单独训练阶段的必要性。如表4所示,所有两阶段变体都优于单阶段训练。同时,在两阶段训练中混合数据的效果因模型而异。对于Qwen 2.5 Coder 7B,最佳结果是保持CODEI/O和指令调优数据完全分离,而LLaMA 3.1 8B在混合数据时表现更好,无论是在第一阶段还是第二阶段。为了简化我们的方法,我们在主要实验中使用完全分离的数据,将最佳数据混合策略留给未来的工作。

5 相关工作

学习代码执行 学习代码执行的主题早在LLM时代之前就已存在(Zaremba & Sutskever,2014;Graves等,2014)。然而,大多数相关工作在学习代码执行时仅关注输出预测任务本身(Nye等,2021;Liu等,2023;Ding等)。其他工作寻求利用代码执行,无论是通过最终反馈(Ding等)还是中间跟踪(Ding等;Ni等,2024),以提高代码生成能力。还有一些特定的基准旨在评估模型预测执行结果的能力,如CRUXEval(Gu等,2024)和LiveCodeBenchExec(Jain等,2024)。与上述工作在代码相关任务中设定狭窄范围不同,我们首次在LLM上训练大规模、多样化的代码输入输出预测,并展示了其在提高代码之外的通用推理能力方面的有效性。

推理时间扩展 最近一种增强推理的方法是推理时间扩展,如OpenAI的o1(Jacob等,2024)或DeepSeek的R1(DeepSeek-AI等,2025),通常鼓励模型通过大规模强化学习生成超长推理过程来解决问题。这些方法正在将模型推向大规模挑战任务的新极限,同时也显著改变了模型的输出模式。我们认为CODEI/O与这些方法是正交的,我们希望它能为进一步激励LLM的推理能力提供更好的基础。

6 结论

总之,我们引入了CODEI/O,这是一种通过训练LLM以纯自然语言CoT预测代码输入和输出来提高其推理能力的方法。这种方法利用代码的结构化和可扩展性来学习多样化的推理模式,包括符号、逻辑、数学和常识推理。大量实验表明,CODEI/O以及增强的CODEI/O++始终优于现有基线,在各个基准上提供了平衡的改进,而不会牺牲任何领域的性能,突显了其稳健性和多功能性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行动π技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值