摘要:推理是大型语言模型的一项基本能力。尽管先前的研究主要集中在提升如数学或代码生成等狭窄领域的技能,但由于训练数据稀疏且分散,在许多其他推理任务上提高性能仍然具有挑战性。为了解决这个问题,我们提出了CodeI/O,这是一种新颖的方法,通过将原始代码转换为代码输入输出预测格式,系统地提炼出上下文相关代码中内在蕴含的多样化推理模式。我们训练模型根据代码和完全以自然语言形式给出的测试用例来预测输入输出,作为思维链(Chain-of-Thought, CoT)的推理过程,从而使模型接触到通用的推理原语——如逻辑流规划、状态空间搜索、决策树遍历和模块化分解——同时,将结构化推理与代码特定语法解耦,并保持过程严谨性。实验结果表明,CodeI/O在符号推理、科学推理、逻辑推理、数学与数值推理以及常识推理任务上均取得了显著提升。通过匹配现有的真实输出或使用预测输入重新执行代码,我们可以验证每个预测,并通过多轮修订进一步增强思维链,从而得到CodeI/O++,并实现更高的性能。我们的数据和模型可在https://github.com/hkust-nlp/CodeIO上获取。Huggingface链接:Paper page,论文链接:2502.07316
一、引言
- 推理能力的重要性:推理是人类认知和问题解决的基础,也是大型语言模型(LLMs)实现人工智能通用化(AGI)的关键步骤。然而,当前LLMs在除数学或代码生成等特定领域外的其他推理任务上表现欠佳。
- 研究背景与动机:现有方法主要关注提升LLMs在特定领域的技能,但许多其他推理任务由于缺乏丰富且结构化的训练数据,性能提升面临挑战。因此,本研究旨在开发一种能够系统提炼多样化推理模式的方法,以增强LLMs的广泛推理能力。
- CodeI/O方法提出:本文提出了一种新颖的方法——CodeI/O,通过将原始代码转换为代码输入输出预测格式,提炼出代码中蕴含的推理模式,从而训练LLMs提高其在多种推理任务上的表现。
二、CodeI/O方法概述
- 方法核心:CodeI/O的核心在于将代码转换为可执行函数,并设计一个简单的任务:给定一个函数及其对应的文本查询,模型需要预测给定输入的执行输出或给定输出的可行输入,且预测完全以自然语言形式的思维链(CoT)进行。
- 优势分析:这种方法能够将核心推理流程与代码特定语法解耦,同时保持逻辑严谨性。通过从多样化源代码中收集并转换函数,所得数据包含了多种基础推理技能,如逻辑流编排、状态空间探索、递归分解和决策制定。学习这些样本能够使模型更好地内化这些技能。
三、数据构建过程
- 原始代码收集:从多个来源收集原始代码文件,包括CodeMix(一个大型Python代码文件集合)和PyEdu-R(Python-Edu的一个子集,专注于复杂推理任务)。此外,还纳入了来自算法仓库、数学难题和在线编程平台的高质量代码文件。
- 代码预处理:使用DeepSeek-V2.5对收集的代码进行预处理,将其转换为统一格式,强调主要逻辑功能,并确保其可执行性以收集输入输出对。预处理步骤包括清理代码、添加主入口函数、定义输入输出描述、创建输入生成器和生成查询。
- 输入输出对收集:对于每个转换后的函数,使用输入生成器采样多个输入,并通过执行代码获得相应的输出。为确保输出的确定性,跳过包含随机性的函数。经过过滤后,获得约350万个实例。
- 训练样本构建:将输入输出对与转换后的函数组合成训练样本。每个样本包含一个提示和一个响应,提示结合了函数、查询、参考代码和特定输入或输出,响应则是以自然语言形式给出的CoT。
四、模型训练与验证
- 训练策略:采用两阶段训练策略。第一阶段在CodeI/O数据集上进行训练,以增强模型的基础推理能力;第二阶段进行通用指令微调,使模型能够遵循多样化的指令。
- 验证方法:通过匹配现有真实输出或使用预测输入重新执行代码来验证每个预测。对于错误的预测,采用多轮修订策略,通过提供执行反馈并重新生成响应来增强CoT,从而得到CodeI/O++数据集,进一步提高性能。
五、实验设置与结果
- 实验模型:选择了四个先进的基础模型进行实验,包括Qwen2.57B Coder、Deepseek v2 Lite Coder、LLaMA3.18B和Gemma227B,这些模型在架构、大小和预训练重点上各不相同。
- 评估基准:在DROP、WinoGrande、GSM8K、MATH、MMLU-STEM、BBH、GPQA、CruxEval、ZebraGrid和LiveBench等多个基准上评估模型性能,这些基准涵盖了科学、数学与数值、符号、常识、逻辑和代码理解等多个关键推理领域。
- 实验结果:实验结果表明,CodeI/O在所有基准上均取得了显著提升,且性能提升均衡,没有在某些基准上取得进步而在其他基准上退步的情况。此外,CodeI/O++通过多轮修订进一步提高了性能。
六、消融研究与分析
- 输入/输出预测消融:分别训练仅输入预测和仅输出预测的模型,结果表明两者性能相近,但输入预测在KorBench基准上表现更好,而输出预测在符号推理任务上表现更佳。
- 拒绝采样消融:通过移除错误的预测来探索拒绝采样的效果,结果发现这会导致性能下降,表明数据多样性的损失。
- 不同合成模型效果:将WebInstruct子集使用DeepSeek-V2.5重新生成响应,发现尽管WebInstruct-DS25在Qwen2.5Coder7B和LLaMA3.18B上表现优于原始数据集,但仍不及CodeI/O,这表明代码中蕴含的多样化推理模式的重要性。
- 数据规模影响:通过随机采样不同数量的训练实例来评估CodeI/O的扩展性,结果表明增加训练样本数量通常能提高性能,特别是在训练数据较少时性能提升更为显著。
- 不同数据格式影响:探索了训练样本中查询、参考代码和CoT的最佳排列方式,发现将查询和参考代码放在提示中,CoT放在响应中取得了最高的平均分数和最均衡的性能。
- 多轮修订效果:评估了多轮修订的进一步改进效果,发现虽然从第一轮修订到第二轮修订的改进较小,但多轮修订仍然有助于提升性能。
七、相关工作
- 代码执行学习:在LLMs时代之前,代码执行学习就已存在,但大多数相关工作主要集中在输出预测任务本身。本文首次在大规模、多样化的代码输入输出预测上训练LLMs,并证明其在提高广泛推理能力上的有效性。
- 推理增强方法:近期的一些方法通过大规模强化学习鼓励模型生成超长推理过程来解决问题,但这些方法主要关注挑战性任务,并显著改变了模型的输出模式。相比之下,CodeI/O与这些方法正交,并为其提供了更好的基础。
八、结论
- 主要贡献:本文提出了CodeI/O方法,通过训练LLMs预测代码输入输出,提炼出多样化的推理模式,从而显著提高了模型在多种推理任务上的性能。实验结果表明,CodeI/O和CodeI/O++在所有评估基准上均取得了显著提升,且性能提升均衡。
- 未来工作:未来的工作可以探索如何进一步优化数据收集和处理过程,以及如何将CodeI/O方法应用于其他类型的推理任务。此外,还可以研究如何将CodeI/O与其他推理增强方法相结合,以进一步提升LLMs的推理能力。
九、附录
- 附录内容概述:附录部分提供了详细的实验设置、基准描述、数据检查细节、数据源分布、不同数据源的输入输出对数量、多轮修订中的响应类型分布、训练超参数、使用其他指令微调数据的效果以及文中提及的示例。这些内容有助于读者更深入地理解实验过程和结果。
本文通过对CodeI/O方法的详细介绍和实验验证,展示了其在提高大型语言模型广泛推理能力上的有效性。CodeI/O通过提炼代码中蕴含的多样化推理模式,为模型提供了丰富的训练数据,从而显著提升了其在多种推理任务上的表现。这一研究不仅为增强LLMs的推理能力提供了新的思路和方法,也为未来的相关工作奠定了坚实的基础。