【AI论文】CodeI/O: 通过代码输入输出预测来提炼推理模式

摘要:推理是大型语言模型的一项基本能力。尽管先前的研究主要集中在提升如数学或代码生成等狭窄领域的技能,但由于训练数据稀疏且分散,在许多其他推理任务上提高性能仍然具有挑战性。为了解决这个问题,我们提出了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的推理能力提供了新的思路和方法,也为未来的相关工作奠定了坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/69756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI

前言: 做过全栈的工程师知道,如果一个APP的项目分别是前端/后端两个团队开发的话,那么原型设计之后,通过接口文档进行开发对接是非常必要的。 传统的方法是,大家一起定义一个接口文档,然后,前端和后端的工程师进行为何,现在AI的时代,是不是通过AI能协助呢,显然可以…

热更图片方案

项目平常需要对线上一些图片资源修正,所以需要热更图片功能。 远端入口新增字段配json文件 {"1.1.22030303":{"sprite":{"assets/ui/common/images/acient_gold.png" : "https://aaaa.png","assets/ui/common/image…

24电子信息类研究生复试面试问题汇总 电子信息类专业知识问题最全!电子信息复试全流程攻略 电子信息考研复试真题汇总

你是不是在为电子信息考研复试焦虑?害怕被老师问到刁钻问题、担心专业面答不上来?别慌!作为复试面试92分逆袭上岸的学姐,今天手把手教你拆解电子信息类复试通关密码!看完这篇,让你面试现场直接开大&#xf…

PortSwigger——WebSockets vulnerabilities

文章目录 一、WebSockets二、Lab: Manipulating WebSocket messages to exploit vulnerabilities三、Lab: Manipulating the WebSocket handshake to exploit vulnerabilities四、Using cross-site WebSockets to exploit vulnerabilities4.1 跨站WebSocket劫持(cro…

Dockerfile 详解:构建自定义镜像

Dockerfile 是一种文本文件,包含了一系列指令,用于描述如何构建一个 Docker 镜像。通过 Dockerfile,我们可以将应用程序及其所有依赖打包成镜像,确保应用在不同环境中运行时保持一致性。掌握 Dockerfile 的写法和最佳实践,能够帮助我们高效地构建和管理容器镜像。 本文将…

机器视觉中的3d和2d的区别

在机器视觉中,3D和2D的主要区别体现在数据的维度、处理方式及应用场景上。以下是具体对比: 数据维度 2D视觉 :处理二维图像,仅包含宽度和高度信息,通常以像素矩阵表示。 3D视觉 :处理三维数据,…

日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(5):動詞ます形 > 動詞ない形

日语学习-日语知识点小记-构建基础-JLPT-N4&N5阶段(5):動詞ます形 > 動詞ない形 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)動詞ます形 > 動詞ない形(2)~ないでください:(3)指带词(指示代词):こ そ あ ど3、单词(1)日语单词(2)日语…

Sonic Layer1

礼记有言:良冶之子,必学为裘;良弓之子,必学为箕; 闲来无趣,看看Sonic 的官方文档吧。道听途殊终归了解的不够全面。 首先,看Sonic 是如何介绍自己的: 哇趣,Sonic 把自己的…

C#数据库操作系列---SqlSugar完结篇

1. 不同寻常的查询 之前介绍了针对单个表的查询,同样也是相对简单的查询模式。虽然开发完全够用,但是难免会遇到一些特殊的情况。而下面这些方法就是为了解决这些意料之外。 1.1 多表查询 SqlSugar提供了一种特殊的多表查询方案,使用IQuer…

Pygame: joystick 模块使用示例

pygame几乎可以识别任意外接游戏操纵设备。 游戏手柄上的每个操作都会形成一个电信号被joystick类对象捕获到, joystick把这个信号归一化到[-1,1]区间,或者离散化为{0,1}。 以下程序创建一个弹出窗口,实时显示joystick捕获到的信号数值&…

html css js网页制作成品——HTML+CSS+js茉酸奶的茶网页设计(5页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…

在vscode中拉取gitee里的项目并运行

拉取项目: 方法一:vscode点击查看--->终端(或者直接通过快捷键ctrol+ `打开) 在终端内通过cd命令定位到你想存放项目的文件夹 例如:cd h: 通过命令:git clone 地址 例如:git clone newbee-mall-vue-app: 前端代码 等待拉取完成即可在对应文件夹下看到项目啦 方…

常见的缓存更新策略

Cache Aside Pattern(旁路缓存模式) Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景。 读写步骤 写: 更新DB删除缓存 读: 缓存读数据,读到直接返回未读取到直接从db读取db读取的数据同…

QT无弹窗运行和只允许运行一个exe

最近做一个小功能&#xff0c;需要后台运行QT程序&#xff0c;无弹窗&#xff0c;并且只允许一个exe运行&#xff0c;不关闭程序&#xff0c;无法2次启动。 main.cpp #include "deleteshotcurveflie.h" #include <QApplication> #include <QSharedMemory&…

cap2:1000分类的ResNet的TensorRT部署指南(python版)

文章目录 1、保存pytorch模型1.1 获取pth模型1.2 建立标杆 2、导出ONNX2.1 导出模型2.2 验证模型2.3 可视化模型结构 3、环境搭建3.1 TensorRT的安装3.2 安装pycuda 4、转换TensorRT引擎4.1 使用trtexec工具完成序列化4.2 使用python的API进行转换 5、推理5.1 推理代码5.2 结果…

Day82:创建图形界面(GUI)

在 Python 中,我们可以使用 Tkinter(标准 GUI 库)来创建图形用户界面(GUI)。Tkinter 提供了一系列工具和控件,使开发者可以轻松地创建窗口、按钮、输入框等界面组件。 1. Tkinter 简介 Tkinter 是 Python 内置的 GUI 库,使用它可以创建窗口应用程序,而无需安装额外的库…

Mybatis快速入门与核心知识总结

Mybatis 1. 实体类&#xff08;Entity Class&#xff09;1.1 实体类的定义1.2 简化编写1.2.1 Data1.2.2 AllArgsConstructor1.2.3 NoArgsConstructor 2. 创建 Mapper 接口2.1 Param2.2 #{} 占位符2.3 SQL 预编译 3. 配置 MyBatis XML 映射文件&#xff08;可选&#xff09;3.1 …

【LeetCode Hot100 双指针】移动零、盛最多水的容器、三数之和、接雨水

双指针 1. 移动零题目描述解题思路关键思路&#xff1a;步骤&#xff1a;时间复杂度&#xff1a;空间复杂度&#xff1a; 代码实现 2. 盛最多水的容器题目解析解题思路代码实现 3. 三数之和问题描述&#xff1a;解题思路&#xff1a;算法步骤&#xff1a;代码实现&#xff1a; …

python-leetcode 28.两数相加

题目&#xff1a; 给定两个非空链表&#xff0c;表示两个非负整数&#xff0c;它们每位数字都是按照逆序地方式存储&#xff0c;并且每个节点只能存储一位数字。请将两数相加&#xff0c;并以相同的形式返回一个表示和的链表。 输入&#xff1a;l1 [2,4,3], l2 [5,6,4] 输出…

3.3 学习UVM中的uvm_driver 类分为几步?

文章目录 前言1. 定义2. 核心功能3. 适用场景4. 使用方法5. 完整代码示例5.1 事务类定义5.2 Driver 类定义5.3 Sequencer 类定义5.4 测试平台 6. 代码说明7. 总结 前言 以下是关于 UVM 中 uvm_driver 的详细解释、核心功能、适用场景、使用方法以及一个完整的代码示例&#xff…