0代码训练GPT-5?MIT微软证实GPT-4涌现自我纠错能力迭代

4694e6165571f6cd07a4990b51a409e6.jpeg



我们都知道,大模型具有自省能力,可以对写出的代码进行自我纠错。

这种自我修复背后的机制,究竟是怎样运作的?

对代码为什么是错误的,模型在多大程度上能提供准确反馈?

近日,MIT和微软的学者发现,在GPT-4和GPT-3.5之中,只有GPT-4表现出了有效的自修复。并且,GPT-4甚至还能对GPT-3.5生成的程序提供反馈。

a938341cc9c8d49918d11e7dcea7cd20.jpeg

论文地址:https://arxiv.org/pdf/2306.09896.pdf

英伟达科学家Jim Fan强烈推荐了这项研究。

在他看来,即使是最专业的人类程序员也无法一次性正确编写程序。他们需要查看执行结果,推理出问题所在,给出修复措施,反复尝试。这是一个智能体循环:根据环境反馈迭代改进代码。

很有可能,OpenAI正在通过雇佣大量软件工程师来训练下一代GPT。而他们不需要输出代码——Critique is all you need。

f5f76c808950e8c7ef3da5baf0ce2fa1.jpeg

- GPT-4能够进行自我修复的核心原因是其强大的反馈能力。它能够有效地自我反思代码的问题所在,其他模型无法与之竞争。


- 反馈模型和代码生成模型不必相同。事实上,反馈模型是瓶颈。


- 基于GPT-4的反馈,GPT-3.5能够编写更好的代码。


- 基于专业人员的反馈,GPT-4本身能够编写更好的代码。

揭秘用于代码生成GPT修复


我们都知道,大语言模型在生成代码方面,表现出了非凡的能力。

然而,在具有挑战性的编程任务(比如竞赛和软件工程师的面试)中,它们却完成得并不好。

好在,很多模型会通过一种自修复工作流来「自省」,来自我纠正代码中的错误。

研究者很希望知道,这些模型在多大程度上能提供正确的反馈,并且说明自己生成的代码为什么是错误的。

如图显示的是,基于自我修复方法的经典工作流程。

首先,给定一个规范,从代码生成模型中采样一个程序,然后在规范中提供的一组单元测试上执行该程序。

9bdd2200f9f36bd7337cb7333eef0cdd.jpeg

如果程序在任何单元测试中失败,那么错误的消息和程序会被提供给一个反馈生成模型,该模型再输出代码失败原因的简短解释。

最后,反馈被传递给一个修复模型,该模型生成程序的一个固定版本。

表面上看,这个工作流似乎非常完美。它让系统在解码过程中克服由于不良样本引起的错误,在修复阶段容易地合并来自符号系统(编译器、静态分析工具和执行引擎等)的反馈。

并且模仿人类软件工程师编写代码的试错方式。

ea89a8732ebe802e382a4371a8c4bf99.jpeg

然而,工作流有一个问题:自修复需要对模型进行更多的调用,从而增加了计算成本。

而且,研究者们发现了一个很有意思的现象:大模型自修复的有效性不仅取决于模型生成代码的能力,还取决于它对于代码如何在任务中犯错的识别能力。

目前还没有任何工作对此进行详细调查,因此,作者们研究了GPT-3.5和GPT-4在解决竞赛级代码生成任务时的自修复有效性。

研究人员提出了一个新的评估策略,称为7992efa6a843c2c5a15b0ab39900af52.jpeg,在这个策略中,根据从模型中采样的token总数来衡量任务的通过率。

因为使用的是pass@t,而不是传统的pass@k(根据实验数量衡量通过率),这样就能与纯粹基于采样的方法进行公平的比较。

从实验中,研究者发现:

1. GPT-4才能实现自我修复带来的性能提升;对于GPT-3.5,在所有预算下,修复后的通过率要低于或等于基准的无修复方法。


2. 即使对于GPT-4模型,性能提升也最多只能算是适度的(在预算为7000个token的情况下,通过率从66%提高到71%,约等于45个独立同分布的GPT-4样本的成本),并且取决于初始程序的多样性足够丰富。


3. 使用GPT-4生成的反馈替换GPT-3.5对错误的解释,可以获得更好的自修复性能,甚至超过基准的无修复GPT-3.5方法(在7000个token下,从50%提高到54%)。


4. 使用人类程序员提供的解释替换GPT-4自己的解释,可以显著改善修复效果,修复并通过测试的程序数量增加了57%。

自我修复四阶段


自修复方法涉及4个阶段:代码生成、代码执行、反馈生成和代码修复。对此,研究人员正式定义了这四个阶段。


阶段一:代码生成

给定规范ea86bcde83e748da24d9912b112f301d.jpeg,一个程序模型80c2d995b21471bfa8c43cfc51021371.jpeg,首先生成69ace349c8f0a5188c029b05de01e53c.jpeg样本1ee8f75747e3536268f1e688ab7d8bbf.jpeg

用一个公式来表示:

7d3eaedffecab53233cb8f67eb820327.jpeg

阶段二:代码执行

然后在测试平台上执行f5105483c98e87cddc0c37f38a513add.jpeg代码示例,并假设可以以可执行形式的访问完整测试集。

如果任何样本通过了所有的测试,就会停止,因为此时已经找到了令人满意的程序。

否则,收集执行环境返回的错误信息37215d7a4aa561b3fe7d6c122ceb8975.jpeg

这些错误消息要么包含编译/运行时错误信息,要么包含程序输出与预期不同的示例输入。

阶段三:反馈生成

在此,研究人员使用反馈模型来生成更详细的错误解释。

在这个阶段,为每个错误的程序生成8fb8b6e4b04ef4a0abdf3bc49bf0a067.jpeg反馈字符串,d9cf6418afea20230aa60aedceaa113f.jpeg,如下所示:

c04b3625ee54701e4ec8a1d15c5ed808.jpeg

阶段四:代码修复

在最后一步中,对于每个初始程序8fb2fc98e611e987a9c85f08a5d216f2.jpeg和反馈61feaca4fdf8b7e7bd2e0444d354f1f6.jpegf81f6db5e220b088b219bfa8b4bd8b84.jpeg候选修复程序从10bdc19a2e6dc45b62d8f5932197610b.jpeg中采样:

eba5b566bec33e1c763ef76c8b1790dd.jpeg

研究人员称这个过程产生的交错文本和程序树修复树T

——植根于规范6c6c052eeacbd5fa4044540d9bd37477.jpeg,然后分支到初始程序ef163d2f7d509f810a82da22449f828b.jpeg,每个程序分支到反馈7bb3d6977e6e8ae92379ea8d9eda413f.jpeg,然后修复7af966e73c55b106c1e2c6af9aaa8c0f.jpeg

具体如图所示:

7c7678946905d4e6d33a1d17eb1fd4fc.jpeg

由于自我修复需要几个非一致成本的相关模型调用,在这种设置中,cbe1c384b10ded8de2dbc14e86d93018.jpeg(在eb9d181b2b006aba0c176766763b4b4b.jpeg样本中获得正确程序的可能性)不是比较和评估自我修复的各种超参数选择的合适度量。

相反,研究人员将通过率作为从模型中采样总token数量的函数来衡量,将其称之为cc728e8e31434aa996421913666ce85a.jpeg的度量。

实验过程


研究人员又进一步针对3个问题进行了测试:

1. 对于更加有挑战的编程任务中,这些模型的自我修复是否比不进行修复的i.i.d.有更好的采样?

2. 更强的反馈模型会提高模型的修复性能吗?

3. 如果让人类参与功能最强模型的自我修复循环,提供人工反馈,是否可以解锁更好的修复性能?

首先研究团队引入了一个很有挑战的编程任务:Automated Programming Progress Standard (APPS)数据集中的编程任务。

这个数据集中的任务包括从入门级到大学竞赛级的编程任务,可以用来评估人类程序员解决问题和代码能力。

研究人员选取了300个任务,包括60个入门级别的任务和60个竞赛级别的任务。

17a886e888d3102055042d310d2334ff.jpeg

研究人员选取了GPT-3.5和GPT-4作为模型,使用模板字符串连接和单次提示词来进行自我修复。

下图为提示词的实例之一。

85d67fb9563d69d4e246bfd53ede7133.jpeg

自修复需要强大的模型和多样化的初始样本

研究人员让单个模型分别进行代码的修复生成和反馈生成。

在右边的图中,我们沿轴显示了具有两个超参数的热图,其中每个单元格中的值表示平均通过率,当给定相同的token预算(即t的相同值pass@t)时,自我修复由基线的平均通过率归一化。

fe0f02a1558d0b40922b13c2117b2741.jpeg

从图中可以看到,对于GPT-3.5模型,pass@t在所有设置下都低于或等于相应的基线(黑),清楚地表明自我修复对GPT-3.5并不是一种有效的策略。

而在GPT-4(下图)中,有几个值的自修复通过率明显优于基线。

b45d2019721705a9f5389cd39cc3a817.jpeg

下图是6a9b1beaf1b2d7f9e41bbe185f240e12.jpeg和基线的无修复方法。

GPT-4反馈改进了GPT3.5的修复结果

研究人员又进一步进行了新的实验,评估使用单独的、更强的模型来生成反馈的效果,目的是为了测试一个假设:由于模型无法内省和调试自己的代码,阻碍了自我修复(比如说对于GPT-3.5)。

3bfe7bcc15b74ad9280a6294dedadf5f.jpeg

这个实验的结果如上图(亮蓝色)所示。

在绝对性能方面,GPT-3.5,GPT-4确实突破了性能障碍,并且比GPT-3.5的i.i.d.采样略微更高效。

这表明文本反馈阶段本身是至关重要的,改进它可以缓解GPT-3.5自修复的瓶颈。

人工反馈显著提高了GPT-4修复的成功率

在最后一项实验中,想要研究在用更强的模型(GPT-4)进行修复时,加入专家人类程序员的反馈的影响。

研究目的是了解模型识别代码中错误的能力与人类的能力相比如何,以及这如何影响自修复的下游性能。

研究人员研究人员招募了16名参与者,包括15名研究生和1名专业机器学习工程师。

每个参与者都有五种不同的基础程序,基于他们的Python经验编写代码。

每个程序都取自不同的任务,参与者永远不会看到属于同一个任务的两个不同的程序。

然后,参与者被要求用他们自己的话解释这个程序做错了什么。

实验结果如下图所示:

ddf785c0e1345f807ee6f68e28e5b860.jpeg

研究人员发现,当我们用人类参与者的调试替换GPT-4自己的调试时,总体成功率提高了1.57×以上。

不出意外的是,随着问题变得更难,相对差异也会增加,这表明当任务(和代码)变得更复杂时,GPT-4产生准确和有用反馈的能力远远落后于人类参与者。



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

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

相关文章

了解Spring

目录 什么是Spring? DI Spring 存与取 spring 的存操作 spring的取操作 更快速的进行 Spring 存 与 读 三大注入方式 Autowired set 注入 构造方法注入 Spring 容器中有多个相同的类时 Bean 作用域 设置作用域 Spring 执行流程 Bean 生命周期 什么是Spring? Sp…

uniapp 发送全文件 支持App端ios、android,微信小程序,H5

由于uniapp提供的API在app端只能上传图片和视频,不能上传其他文件,说以只能借助插件了。 ios端用的这个插件 获取到文件对象 免费的 这个是返回一个 filePath 可用直接用于 uni.uploadFile 上传的路径,后面自己又改的File对象 全文件上传选择…

【leetcode】15.三数之和(python+转为两数之和+去重)

class Solution(object):def threeSum(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""# 思路:转为两数之和# for循环遍历先固定一个数字a,寻找另外两个数字之和-a(双指针)# 难点…

C#基础学习_字段与属性的比较

C#基础学习_字段与属性的比较 字段: 字段主要是为类的内部做数据交互使用,字段一般是private修饰; 字段可以赋值也可以读取; 当需要为外部提供数据的时候,请将字段封装为属性,而不是使用公有字段,这是面对对象编程所提倡的。 //字段:学号private int studentID;属性: …

Redis 持久化

持久化结构图示 官网地址:https://redis.io/docs/management/persistence/ RDB (Redis DataBase) RDB(Redis 数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。 是什么 在指定的时间间隔,执行数据集的时间…

IllegalArgumentException: OnNoRibbonDefaultCondition异常与Maven Helper插件解决jar包冲突

在搭建Spring Cloud项目时,引入了不同版本的jar,导致项目启动时报错: main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.Bea…

html中表格

一、table标签 参数说明 实例 <body><table border"1" align"center" width"300" height"200" cellspacing"10"><tr><td>1.1</td><td>1.2</td><td>1.3</td></t…

【一】PCIe基础知识

一、PCIe概述 1、PCIe速度 PCI采用总线共享式通讯方式&#xff1b;PCIe采用点到点(Endpoint to Endpoint)通讯方式&#xff0c;互为接收端和发送端&#xff0c;全双工&#xff0c;基于数据包传输&#xff1b;两个PCIe设备之间的连接称作一条链路(link)&#xff0c; 一条链路可…

Arcgis之Python的Arcpy的点线面对象的创建处理和通过pandas读取txt中的经纬度坐标创建几何对象

前言 本节将介绍点线面对象的创建和处理。创建点对象有三个类&#xff0c;分别是Point、Multipoint、PointGeometry&#xff0c;创建线对象的类为Polyline&#xff0c;创建面对象的类为Polygon。 一、点对象的创建——Point 点对象经常与光标配合使用。点要素将返回单个点对…

VOC数据集介绍以及读取(目标检测object detection)

VOC&#xff08;Visual Object Classes&#xff09;数据集是一个广泛使用的计算机视觉数据集&#xff0c;主要用于目标检测、图像分割和图像分类等任务。VOC数据集最初由英国牛津大学的计算机视觉小组创建&#xff0c;并在PASCAL VOC挑战赛中使用。 VOC数据集包含各种不同类别…

Java安全——安全提供者

Java安全 安全提供者 在Java中&#xff0c;安全提供者&#xff08;Security Provider&#xff09;是一种实现了特定安全服务的软件模块。它提供了一系列的加密、解密、签名、验证和随机数生成等安全功能。安全提供者基础设施在Java中的作用是为开发人员提供一种扩展和替换标准…

ChatGPT 提示词设置

提示词 Prompt&#xff08;提示词&#xff09;&#xff1a;当我们询问GPT时&#xff0c;发送的消息就是Prompt。 通过给出合适的Prompt&#xff0c;可以让GPT了解我们的想法&#xff0c;在根据我们的想法做出更加合适的判断&#xff0c;帮助我们完成任务&#xff0c;提高效率。…