WizardCoder: 实现Code LLMs的指令微调

释放双眼,带上耳机,听听看~!
本文介绍了WizardCoder,通过将Evol-Instruct方法应用到代码领域,实现了Code LLMs的指令微调,提高了其在代码生成任务中的性能表现。

我正在参加「掘金·启航计划」

导语

这个工作的整体思路比较简洁,可以认为就是将之前一篇论文(WizardLM)中提出的Evol-instruct的思想应用到了Code LLM领域(之前是通用领域),整体论文方法和内容感觉都没有那么充实。尽管方法简单,但效果惊人。通过Evol-instruct的加成,普通的StarCoder获得了远超其他开源和闭源Code LLM(例如Anthropic的Claude和Google的Bard)的表现。

  • 论文:WizardCoder: Empowering Code Large Language Models with Evol-Instruct
  • 会议:Arxiv 2023
  • 链接:arxiv.org/pdf/2306.08…

摘要

代码大型语言模型(Code LLMs),例如StarCoder,在代码相关任务中表现出色。然而,大多数现有模型仅在广泛的原始代码数据上进行预训练,而没有进行指令微调。本文介绍了WizardCoder,通过将Evol-Instruct方法适应到代码领域,使Code LLMs具备复杂的指令微调能力。通过对四个著名的代码生成基准测试(HumanEval、HumanEval+、MBPP和DS1000)进行全面实验,揭示了WizardCoder的出色能力。它在开源Code LLMs中超过了所有其他模型,差距显著。此外,该模型甚至在HumanEval和HumanEval+上优于最大的闭源LLMs,Anthropic的Claude和Google的Bard。

1 简介

Code LLMs使用大量的代码数据进行预训练,在各种与代码相关的任务中表现出色。大多数先前的Code LLMs主要强调预训练过程,而在细粒度指令调整方面探索有限。指令调整的引入最初旨在增强LMs在不同任务之间的泛化能力。例如,InstructGPT 涉及征求人类标注者提供明确的指令,以确保与用户意图对齐。类似地,最近的研究,如Alpaca采用了self-instruct方法,其中ChatGPT生成指令数据。Vicuna利用了从ShareGPT.com收集的用户共享的对话。WizardLM引入了Evol-Instruct方法,涉及演化现有指令数据以生成更复杂,多样化的数据集。

然而,所有这些方法主要关注的是通用领域,并缺乏针对代码领域的特定设计考虑。受Evol-Instruct方法的启发,本研究旨在通过通过特定于代码的Evol-Instruct生成复杂的代码指令数据来增强SOTA开源Code LLM,StarCoder的能力。为此,本文对演化提示过程进行了几个针对代码相关任务的特定适应,包括改进演化指令,简化演化提示的形式,并结合代码调试和时空复杂性约束。使用新创建的代码指令遵循训练集对StarCoder进行微调,并获得最终的WizardCoder模型。实验结果表明,该模型在四个基准测试中的表现都优于现有开源和闭源的LLMs。

2 相关工作

这里主要提一下Evol-Instruct,这个方法是之前(同一个研究小组的10天的论文,参考arxiv.org/pdf/2304.12… )工作提出的一种方法,Evol-Instruct使用LLMs代替人类自动批量生产各种难度级别的开放域指令,以提高LLMs的性能。

WizardCoder: 实现Code LLMs的指令微调

上图展示了Evol-Instruct的运行示例。从一个简单的初始指令“1+1=?”开始,该方法随机选择In-depth Evolving(蓝色方向线)或In-breadth Evolving(红色方向线)将简单指令升级为更复杂的指令或创建新的指令(增加多样性)。In-depth Evolving包括五种类型的操作:添加约束,深化,具体化,增加推理步骤和复杂化输入。In-breadth Evolving是突变,即基于给定的指令生成全新的指令。这六个操作是通过向LLMs提示特定的提示来实现的。由于演化出的指令是由LLMs生成的,有时演化会失败。该方法采用指令消除器来过滤失败的指令,通过对这个演化过程进行若干轮的重复,可以获取足够的包含各种复杂度的指令数据。

3 方法

3.1 Evol-Instruct Prompts for Code

受WizardLM提出的Evol-Instruct方法的启发,本文也试图使代码指令更加复杂,以增强代码预训练大型模型的微调效果。为了将Evol-Instruct适应到代码领域,作者对演化提示进行了以下修改:

  1. 简化演化指令,删除了加深,复杂输入和In-Breadth Evolving。
  2. 简化演化提示的形式,通过统一演化提示模板。
  3. 针对代码域的具体特点,添加了两个演化指令:代码调试和代码时间空间复杂度约束。

统一的代码演化提示模板如下:

WizardCoder: 实现Code LLMs的指令微调

这里,{question}表示待演化的当前代码指令,{method}是演化类型。本文使用的五种类型如下:

WizardCoder: 实现Code LLMs的指令微调

3.2 训练WizardCoder

采用以下过程来训练WizardCoder。最初使用StarCoder 15B 作为基础,然后使用通过Evol-Instruct演化的代码指令跟随训练集进行微调。微调的提示格式如下所述:

WizardCoder: 实现Code LLMs的指令微调

为构建训练数据集,本文使用名为Code Alpaca(这是一个使用Code相关的指令训练LLaMA的项目)的20K指令跟随数据集进行初始化。迭代地在这个包含20,000个样本的数据集上使用Evol-Instruct技术来产生演化数据。每轮数据演化之后,作者将所有先前轮次的演化数据与原始数据集合并,对StarCoder进行微调,并在HumanEval上评估pass@1指标。一旦观察到pass@1指标下降,将停止使用Evol-Instruct,并选择具有最高pass@1的模型作为最终模型。

4 实验

作者在4个知名的代码生成基准上进行了实验,分别为HumanEval、MBPP、HumanEval+和DS-1000。实验结果分别如下图所示:

WizardCoder: 实现Code LLMs的指令微调

WizardCoder: 实现Code LLMs的指令微调

从图1和表格1的实验结果中,可以看出:

  1. 尽管体积明显更小,WizardCoder的表现优于最大的闭源LLMs,包括Claude、Bard、PaLM、PaLM-2和LaMDA。
  2. WizardCoder在HumanEval上的表现优于所有开源Code LLMs (+22.3),包括StarCoder、CodeGen、CodeGee和CodeT5+。
  3. WizardCoder的表现显著优于所有带有指令微调的开源Code LLMs,包括InstructCodeT5+、StarCoder-GPTeacher和Instruct-Codegen-16B。

同时,作者也展示了对于Evol轮次的消融实验结果,结果发现大概3次的时候得到了最好的性能表现。

WizardCoder: 实现Code LLMs的指令微调

5 总结与未来工作

本文介绍了WizardCoder,一种Evol-Instruct微调的Code LLM。实验结果表明,WizardCoder在四个广泛认可的代码生成基准测试(HumanEval,HumanEval+,MBPP,DS-1000)上实现了SOTA性能,超过了所有现有的开源Code LLMs。此外,与最大的闭源LLMs,包括Anthropic的Claude和Google的Bard相比,WizardCoder表现出更优秀的性能。 未来工作将优先增强Code Evol-Instruct方法,以进一步增强模型的性能。

WizardCoder: 实现Code LLMs的指令微调

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

如何结合ChatGPT和Midjourney发挥更强大的威力

2023-12-12 13:43:14

AI教程

生成艺术二维码的方法和优化

2023-12-12 13:58:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索