PanGu-Coder:函数级的代码生成模型

本文分享自华为云社区《PanGu-Coder: 函数级的代码生成模型-云社区-华为云》 , 作者:DevAI。
1. 概述基于预训练模型的生成技术在自然语言处理领域获得了极大的成功 。近年来 , 包括OpenAI GPT-3、华为PanGu-Alpha等在内的文本生成模型展示出了惊人的创造力 , 生成能力远超以往的技术 , 逐渐成为序列生成的一种基本范式 , 并显示出了巨大的商业潜力 。在这种范式的引导下 , 研究人员开始尝试将语言生成模型引入到软件工程领域 , 并在代码生成与补全等任务中取得了突破性进展 。其中 , 最广为人知的当属微软发布的AI辅助编程工具Copilot 。
近日 , 华为诺亚方舟实验室语音语义实验室联合华为云PaaS技术创新实验室基于PanGu-Alpha研制出了当前业界最新的模型PanGu-Coder [1] 。与业界标杆Copilot 背后的Codex[2]以及谷歌的AlphaCode等[3][4]相比 , PanGu-Coder在代码生成的一次通过率(PASS@1)指标上不仅大幅超越同等规模的模型 , 甚至超越了参数量规模更大的模型 。在支持的语言上 , 除英文外 , PanGu-Coder在中文上同样有出色的表现 , 在未来也可以更好地服务使用中文的开发者 。在内测中还发现:PanGu-Coder不但熟悉常见算法 , 还能熟练地使用各种API , 甚至可以求解高等数学问题 。相信经过不断打磨 , PanGu-Coder将逐步成为编程人员的聪明助手 。
2. 训练数据PanGu-Coder使用了380GB的原始Python/ target=_blank class=infotextkey>Python文件 , 通过MD5校验 , 限制文件大小、代码长度以及AST解析等方式对原始文件进行了清洗、去重等工作 , 最终得到了147GB的数据用作模型训练阶段的输入 。
为了提升函数级代码生成的效果 , 每个Python文件中的代码语料均按照函数级的方式进行了重新组织 。例如:如果某个函数的定义之后紧接着对于函数的自然语言注释 , 该注释将被放置到函数定义之前 , 形成自然语言到代码的配对数据 , 并用以构建训练数据集 。
3. 训练方法PanGu-Coder将训练分为了两个阶段:第一阶段使用了全量的代码数据进行训练;第二阶段选择了更符合目标任务的自然语言和代码对作为训练数据对模型进行调优 。
3.1 模型架构

PanGu-Coder:函数级的代码生成模型

文章插图
图1 PanGu-Coder的模型结构
由于PanGu-Alpha所采用的的自回归Transformer架构所具备强大的文本生成能力 , 在PanGu-Coder的训练中也沿用了此模型架构用于代码生成任务 , 其架构如图1所示 。同时 , PanGu-Coder也沿用了PanGu-Alpha的中英文多语词表 , 从而同时具备支持中英文输入的能力 。
3.2 训练方法受课程学习(Currilum Learning)启发 , PanGu-Coder采用了两阶段训练的方式进行训练:1)在原始语料上 , 采用传统的自回归语言建模(Causal language modeling , CLM)进行训练;2)在经过筛选的语料上 , 仅对<自然语言 , 代码>平行句对样本 , 采用创新的代码自回归语言建模(Code-CLM)进行训练 。
PanGu-Coder:函数级的代码生成模型

文章插图
图2 PanGu-Coder的两阶段样本构成方式
PanGu-Coder的两阶段样本示例如图2所示 。图2(左)为第一阶段训练样本 , 图2(右)为第二阶段样本 。在第一阶段的训练中 , PanGu-Coder具备了自然语言和代码交错的语言模型的能力 , 而第二阶段样本则帮助PanGu-Coder在通过自然语言进行代码生成的任务上得到了更好的适配 。
PanGu-Coder:函数级的代码生成模型

文章插图
图3 PanGu- Coder: Code-CLM 损失函数
在第二阶段的训练中 , PanGu-Coder采用了专门为代码生成而设计的Code-CLM作为其损失函数 。如图3所示 。在训练过程中 , Code-CLM仅保留代码部分的Loss计算结果 , 同时忽略了自然语言部分的Loss 。Code-CLM损失函数的采用 , 让PanGu-Coder更专注于学习生成代码序列的同时减少了自然语言序列带来的干扰 , 使得PanGu-Coder的第二阶段训练数据与训练目标都更接近代码生成任务的真实场景 。


推荐阅读