虽然像GPT-4这样的大型语言模型(LLM)在编写软件代码方面非常精通,但是这些模型的成本和不透明性激发了人们对更加经济、规模更小的编码LLM的兴趣。
这些替代方案可以针对特定任务进行微调,并且成本很低。开发这些LLM的一大挑战是在训练数据集的大小和模型的性能之间找到最佳平衡点。
针对这一挑战,微软公司在最近发表的一篇论文中介绍了一种使用更少示例训练高效编码语言模型的新技术。这篇文章介绍了WaveCoder模型,并声称优于其他在类似数量的示例上训练的编码LLM。
作为WaveCoder的补充,微软公司还开发了CodeOcean,这是一个包含2万个不同代码示例的精选数据集。该数据集可以增强编码应用的基础模型的微调。
选择正确的编码示例
虽然WaveCoder是一个令人印象深刻的LLM模型,但这篇论文中更有趣的部分是CodeOcean,它是一个附带的数据集。CodeOcean解决了一个重大挑战:创建一个平衡成本效益和质量的数据集。研究人员认为一个具有最大多样性的数据集可以产生令人印象深刻的结果,即使它包含的示例有限。
该研究团队从CodeSearchNet开始,这是一个包含200万对注释和代码的广泛编码数据集。他们使用基于BERT的Transformer模型为每个示例生成嵌入,将复杂信息转换为数字列表。
他们对嵌入应用了一种聚类算法,根据它们的相似性对示例进行排序。这种方法使研究人员能够从原始数据集中提取一个子集,最大限度地提高多样性。
添加说明
在建立核心数据集之后,研究人员必须创建包含代码和指令的训练示例。为了实现这一点,他们创建了一个生成器-鉴别器框架,用于根据原始代码示例生成指导性数据。最初,他们使用GPT-4在特定的场景中制作任务定义。这些初始任务定义与指导提示相结合,被提供给GPT-3.5,以生成额外示例的相应指令。
对于鉴别器组件,研究人员制定了一个单独的评估提示。这个提示以及代码和指令示例提供给GPT-4进行评估。然后,CodeOcean管道使用良好的示例来生成未来的训练示例。
研究人员通过这个迭代过程生成了2万个高质量的教学样本。这些示例跨越了四个不同的编码任务类别:代码生成、代码摘要、语言翻译(从一种编程语言到另一种编程语言)和代码修复。这四个类别包含了LLM编码任务的很大一部分。
训练WaveCoder
生成用于编码LLM的训练示例有很多方法。但微软的CodeOcean以强调泛化和示例效率而与众不同。与依赖大量数据的研究不同,CodeOcean可以使用较小的数据集实现高性能。
为了证明CodeOcean的有效性,研究人员对三种编码语言模型进行了微调:StarCoder-15B、CodeLLaMA(7B和13B)和DeepseekCoder-6.7B。考虑到数据集的大小,其微调既快速又经济高效。研究人员根据HumanEval、MBPP和HumanEvalPack这三个关键的编码基准对微调后的模型进行了评估。
通过在CodeOcean上进行多次训练,所有模型在这些基准测试上都有了显著的改进。在代码生成方面,研究人员描述了WaveCoder的影响和局限性:“在微调过程之后,与基础模型和一些开源模型相比,WaveCoder模型的性能有了显著的提高,但它仍然落后于专有模型(例如GPT-4和Gemini),以及使用7万多个训练数据训练的指示模型。”
WaveCoder和WizardCoder之间的性能差异很小,有78000个训练示例。这表明“精细化和多样化的指令数据可以显著提高指令调优的效率。”
WaveCoder在代码摘要和修复任务方面尤为出色。它在几乎所有编程语言上的表现都优于其他开源模型。这一成功强调了“定义和分类代码相关任务对增强代码LLM泛化能力的有效性”。
虽然微软公司尚未发布WaveCoder和CodeOcean的模型、代码和数据,但有关Hugging Face的讨论表明,该公司正在审查是否将它们对外发布。展望未来,研究人员的目标是探索更大数据集的效果,以及将CodeOcean与其他编码数据集相结合的潜在好处。