1.1 总览
基于预训练的生成技术在自然语言处理中获得了极大的发展,包括OpenAI GPT-3、华为【盘古α】等在内的文本生成模型展示出惊人的创造力,其能力远超以往模型,并逐渐成为序列生成的一种基本范式,显示出巨大的商业潜力。基于这种范式,研究人员开始尝试将语言生成模型引入软件工程领域,并在代码生成与补全上取得突破进展,例如以OpenAI大规模代码预训练生成模型Codex为底座的AI辅助编程工具Github Copilot。
继华为诺亚方舟实验室发布【盘古α】以及基于其的对话生成模型【盘古Bot】之后,诺亚联合华为云PaaS再次基于【盘古α】架构发布高性能代码生成模型【盘古Coder】。针对函数级的代码生成与补全任务,我们训练了参数量为3亿和26亿两个规模的模型。在给定函数名及其自然语言功能描述后,模型能够生成完整的函数实现。对比业界标杆OpenAI Codex以及Google、Meta等发布的模型,【盘古Coder】在代码生成一次通过率(pass@1)指标上不仅大幅超越同等规模的模型,甚至超越了参数量规模更大的模型。值得一提的是,相比业界模型,我们使用了相对更少的训练数据和计算资源,并且【盘古Coder】不仅支持英文,对中文同样有出色的表现,未来可以更好地服务中国开发者。在产品化的实际体验中,我们惊喜地发现,【盘古Coder】不但熟悉常见算法,并且能熟练地使用各种API以及工具,会操作数据库,甚至可以解高等数学问题。经过不断打磨,它能够成为程序员们编程的好助手。
更多信息可以参考技术报告https://arxiv.org/pdf/2207.11280.pdf
1.2 训练数据
【盘古Coder】使用了380GB的原始Python文件,然后通过MD5校验,限制文件大小、代码长度以及AST解析等方式我们对文件进行清洗,最终得到147GB的训练数据。
针对自然语言描述生成函数级代码的任务,我们从每个Python文件中提取出所有的函数级代码。如果某个函数的定义之后紧接着对于函数的自然语言注释,我们就把注释挪到函数定义之前,形成所谓的自然语言和代码对作为训练数据的一部分。
下文中会提到,我们的训练分为两阶段:第一阶段,我们使用全量的代码数据进行训练;第二阶段,我们选择更符合目标任务的自然语言和代码对作为训练数据。
1.3【盘古Coder】模型训练
1.3.1 模型架构
图1 【盘古 Coder】模型结构
由于【盘古α】的自回归Transformer架构具备强大的文本生成能力,【盘古Coder】沿用了此模型架构,用于代码生成任务,如图1。同时,【盘古Coder】也采用了【盘古α】的中英文多语词表,从而具备同时支持中英文输入的能力。
1.3.2 训练方法
受课程学习启发,【盘古Coder】采用了两阶段的训练:1)在原始语料上,采用传统的自回归语言建模(Causal language modeling,CLM)进行训练;2)在经过筛选的语料上,仅对(自然语言,代码)平行句对样本,采用创新的代码自回归语言建模(Code-CLM)进行训练。
图2 【盘古 Coder】两阶段样本构成方式
【盘古Coder】的两阶段样本示例如图2所示,图2(左)为第一阶段训练样本,图2(右)为第二阶段样本。第一阶段样本帮助【盘古Coder】学习自然语言和代码交错的语言模型,第二阶段样本帮助【盘古Coder】更加适配通过自然语言进行代码生成的任务。
图3 【盘古 Coder】Code-CLM 损失函数
其中Code-CLM是更适宜于代码生成的训练目标。如图3所示,训练中Code-CLM仅保留代码部分的Loss计算,忽略自然语言部分的Loss计算。从而让【盘古Coder】专注于学习生成代码序列,而不受自然语言序列干扰。【盘古Coder】的第二阶段训练数据、训练目标,都更接近代码生成任务的模式。
1.4【盘古Coder】实验分析
1.4.1模型生成通过率测评
模型的一次生成通过率(pass@1)是代码语言生成模型最重要的能力衡量指标,我们采用了OpenAI发布的数据集HumanEval以及谷歌发布的数据集MBPP两个函数级生成数据集作为我们的评测目标,表1是HumanEval一个非常简单的例子,我们的模型可以在Problem Description的条件下生成函数签名和函数体,生成的代码需要通过单元测试才被认为生成正确。
表1 HumanEval 示例
在HumanEval数据集上,相比业界标杆Codex(OpenAI)以及包括AlphaCode(Google Deep Mind)、CodeGen(Saleforce)、 INCoder(Meta)等模型,【盘古Coder】在3亿和26亿的模型上的一次通过率pass@1均达到最优,特别的我们3亿的模型(pass@1=17.07%)超越了Codex (pass@1=16.22%)接近7亿的模型,基本持平谷歌10亿的模型(表2)。在MBPP数据集上,我们的26亿模型超越了META INCoder 接近70亿模型效果(表3)。同时,我们的模型是所有对比模型里所用数据量以及计算量最小(train tokens)的模型,充分说明我们的数据集构建策略和分阶段训练设计的合理性,能够在函数级代码生成这一最重要场景上达到业界最优。
表2 【盘古 Coder】在HumanEval上的一次通过率以及十次通过率
表3 【盘古 Coder】在MBPP上的一次通过率以及十次通过率
为了进一步提升模型函数级生成的能力,我们收集了业界已公开的大规模函数级数据集如CodeContest, CodeSearchNet, APPS对模型进行微调(Fine-tune)得到【盘古Coder-FT】,实验显示微调模型在MBPP以及HumanEval上提升明显(表4)。
表4 【盘古 Coder】3亿模型Fine-tune结果
在实际生产中,实现一个函数之前,通常会预先设计几个测试用例来测试函数实现结果,HumanEval 164个函数描述中,有130个描述带了预设的测试用例,我们最后使用这些测试用例进行多次生成(200次)过滤,并统计了这个子集内的通过率,最终结果可以看到,测试用例可以极大地提升通过率,3亿的模型可以达到41.52%的通过率。
表5 【盘古 Coder】3亿模型测试用例过滤结果
1.4.2产品实践
我们已将盘古Coder模型集成进华为云代码开发辅助套件中,可以在IDE中方便地根据自然语言描述生成Python代码或者根据上下文进行补全。在使用过程中我们发现,【盘古Coder】不仅熟悉常见的编程模式和算法,并且能熟练地使用各种API以及工具,例如数据库操作,甚至可以解高等数学问题。可以预见,经过产品的不断打磨和用户的合理使用,盘古Coder能成为程序员们提升编程效率的好助手。
Case1:常见的数据结构算法
Input: 使用冒泡排序的方法对数组进行排序。
OutPut:
Case2: SQL查询功能。
Input:使用mysql, 从表 “AI research” 的所有记录, 选择address为
"Hong Kong Science Park" 的记录,并显示结果.
OutPut:
Case3: 使用机器学习工具创建文本分类器
Input: create a text binary sentiment classifier .
Output:
Case4 : 高等数学题1,求微分。
Input:Using sympy find the derivative of the function using the
definition of the derivative.f(x)=(x**2-1)/(2*x-3).
Output:
Case5:高等数学题2,求概率分布。
Input: One generates a number x from a uniform distribution on the
interval [0, θ].One decides to test H0 : θ = 2 against HA :
θ = 2 by rejecting H0 if x ≤ 0.1 or x ≥ 1.9.Using simulations,
compute the probability of a type I error.
Output:
1.5 展望与总结
【盘古Coder】是基于预训练语言模型【盘古α】演进而来的首个支持中文的代码生成语言模型,它的训练高效,在函数级生成与补全性能上达到业界领先的水平。后续我们会继续【盘古Coder】的迭代与演进,不仅在Python代码生成上达到更高的可用性,也会继续开发更多的辅助编程功能、支持更多的程序语言、支持更高效地训练与推理,使能更简单的领域适配。
【免责声明】
华为在本公众号所载的材料和信息,包括但不限于文本、图片、数据、观点、建议、网页或链接,虽然华为力图在网站平台上提供准确的材料和信息,但华为并不保证这些材料和内容的准确、完整、充分和可靠性,并且明确声明不对这些材料和内容的错误或遗漏承担责任,也不对这些材料和内容作出任何明示或默示的、包括但不限于有关所有权担保、没有侵犯第三方权利、质量和没有计算机病毒的保证。
华为可以在没有任何通知或提示的情况下随时对网站上的内容进行修改,为了得到最新版本的信息,请您定时访问本网站。华为(含其关联公司)在本网站上所提及的非华为产品或服务仅仅是为了提供相关信息,并不构成对这些产品、服务的认可或推荐。华为并不就网址上提供的任何产品、服务或信息做出任何声明、保证或认可,所有销售的产品和服务应受华为的销售合同和条款的约束。
作者:诺亚方舟实验室
文章来源:诺亚实验室
推荐阅读
三角迁移:助推以中文为中心的机器翻译
TPAMI 2022综述 | 视觉Transformer系统性测评及未来方向探讨
【悟空】 华为诺亚开源首个大规模中文多模态数据,一亿图文对,包含基础大模型
更多嵌入式AI相关技术干货请关注嵌入式AI专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。