社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  chatgpt

编码碾压ChatGPT!UIUC清华联手发布7B参数Magicoder,代码数据权重全开源

新智元 • 4 月前 • 113 次点击  



  新智元报道  

编辑:Mindy
【新智元导读】全新代码大模型Magicoder,不到7B参数,就能在代码生成领域与顶级代码模型不相上下。

开源「代码大模型」来了!

UIUC清华团队的研究人员发布了Magicoder,不到7B参数,就能在代码生成领域与顶级代码模型不相上下。

值得一提的是,Magicoder的代码、权重和数据,毫无保留完全开源。

论文地址:https://arxiv.org/abs/2312.02120

Magicoder依靠的OSS-INSTRUCT的方法,是通过对现有顶级代码模型(例如ChatGPT)的提示,加上网络上的种子代码片段,来生成的代码。

这可真是取之于大模型,用之于大模型;就有网友转发说道:通过这些结果,看到了提高用于LLMs的合成数据的潜力也是一个非常有趣的领域。

话不多说,那就让我们来具体了解一下Magicoder的来历吧!

代码生成的发展史


代码生成(Code Generation),也叫程序合成(Program Synthesis),近几十年来,一直都是学术界的一块「硬骨头」,在此领域进行过的许多尝试,例如基于抽象的合成和基于示例的编程,都没有取得很好的效果。

直到最近,使用在代码上训练的大型语言模型取得了显著的突破,被广泛应用于辅助实际软件开发。

最初,诸如GPT-3.5 Turbo和GPT-4之类的闭源模型主导了各种代码生成基准和排行榜。

为了推动开源LLM在代码生成领域的应用,SELF-INSTRUCT方法被开发出来,通过使用强大的LLM生成合成的编码指令,并利用这些指令对较弱的学生模型进行微调,以从强大的教师模型中提取知识。

然而,SELF-INSTRUCT在提高LLM的指令遵循能力时,仍然依赖于狭窄范围的预定义任务或启发式方法。

为了解决这一问题,UIUC和清华的研究人员提出了Magicoder,其中采用的OSS-INSTRUCT方法,旨在减轻LLM固有的偏见,通过直接学习开源代码释放其创造高质量和创意编码指令的潜力。

OSS-INSTRUCT通过从开源中搜集的随机代码片段获得灵感,自动生成新的编码问题。借助于不同的种子代码片段,OSS-INSTRUCT能够直接产生多样、真实和可控的编码指令数据。

如下图所示,在这个例子中,LLM从两个不同函数的不完整代码片段中获取灵感,成功地将它们关联起来,并构建出一个现实的机器学习问题。

由于OSS-INSTRUCT与现有的数据生成方法是正交的,OSS-INSTRUCT可以被同时结合使用,进一步推动模型在编码任务中的能力。

为什么OSS-INSTRUCT如此神奇?


OSS-INSTRUCT的工作方式是通过对LLM(例如ChatGPT)进行提示,然后根据从互联网搜集的一些种子代码片段(例如来自GitHub)生成编程问题及其解决方案。

一方面,种子片段提供了生成的可控性;

另一方面,OSS-INSTRUCT加强了LLM创建编程问题的多样化,更符合真实的编程场景。

我们可以从以下几个指标中一探究竟:

1. 类别平衡

如下图所示,通过计算OSS-INSTRUCT中每个样本的嵌入与这10个类别之间的余弦相似性,可以看出其在不同类别之间表现出了多样性和平衡。

2. 长度分布

下图展示生成问题和解决方案的长度分布,良好的平衡性让OSS-INSTRUCT更贴合实际应用场景。

3. 与HumanEval的相似性计算

下图展示了与HumanEval样本的余弦相似性。

可以看出,OSS--INSTRUCT在所有研究的数据生成技术中表现出最低的平均相似度,这说明OSS--INSTRUCT生成的数据是最富有多样性的。

但是,既然OSS-INSTRUCT获取到的种子片段来自于开源代码,为什么不直接在这些开源代码上进行微调呢?
为了回答这个问题,研究人员遵循CodeSearchNet,使用基础的CODELLAMA-PYTHON-7B对配对数据进行了2个时期的微调,遵循相同训练设置。
对比结果如下表,在75,000个配对注释-函数数据上,微调甚至使基础模型恶化,而OSS-INSTRUCT有助于引入实质性的提升。
研究人员推测,这种恶化可能是由这些配对数据固有的大量噪声和不一致性导致的。
这进一步表明,数据的真实性对于代码指令调整至关重要,而非格式。
该结果还凸显了OSS-INSTRUCT的优越性,可以将这些松散相关的代码片段转化为语义一致的指令调整数据。

Magicoder表现评估


研究团队首先构建了使用OSS-INSTRUCT进行训练的Magicoder系列,同时进一步组合使用OSS-INSTRUCT和Evol--INSTRUCT构建了MagicoderS系列,并在两个系列上都进行了测试。
代码生成基准使用的是HumanEval和MBPP,这是目前两个最广泛使用的基准。这些基准中的每个任务都包括一个任务描述(例如docstring)作为提示,然后让LLMs生成相应的代码。其正确性由少量测试用例进行检查。
为了更严格的评估,研究人员还使用了由EvalPlus框架支持的HumanEval+和MBPP+以获取更多的测试。
值得注意的是,MagicoderS-CL和MagicoderS-DS在HumanEval+上的表现都优于只有7B参数的ChatGPT。
让我们具体看下Magicoder的表现:

1. Python语言

我们首先可以观察到Magicoder-CL相在HumanEval和HumanEval+上相对于CODELLAMA-PYTHON-34B有了实质性的改进。

MagicoderS-CL在HumanEval+上优于ChatGPT和所有其他开源模型。
此外,尽管在HumanEval上得分略低于WizardCoder-CL-34B和ChatGPT,但在更严格的HumanEval+数据集上超过了它们,这表明MagicoderS-CL可能生成更稳健的代码。

2. 其他编程语言

在除了Python之外的语言对比中,Magicoder-CL在所有研究过的编程语言中都大幅超过了基础的CODELLAMA-PYTHON-7B。
此外,MagicoderS-CL在所有编程语言上都进一步改进了Magicoder-CL,仅使用7B参数就实现了与WizardCoder-CL-34B相当的性能。
值得注意的是,Magicoder-CL仅使用非常有限的多语言数据进行训练,但仍然优于其他具有相似甚至更大规模的LLMs。这意味着LLMs可以从数据中学习超出其格式的知识。

3. 数据科学库

最后,针对7个热门Python数据科学库的1,000个独特的数据科学编码问题(DS-1000 dataset),研究人员也进行了单元测试,旨在评估LLMs在实际用例中的表现。
从表中可以看出,Magicoder-CL-7B已经在所有评估的基线中表现出色,包括最先进的WizardCoder-SC-15B,改善了8.3个百分点。
虽然Magicoder还不够完美,但作者认为,通过公开分享所有的数据 和代码细节,会有越来越多的先进代码模型出现。
让我们也拭目以待。
参考资料:
https://arxiv.org/abs/2312.02120



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/165849
 
113 次点击