深度学习:代码预训练模型

时间:2024-11-29 14:57:43

自动代码生成

如Coplilot、CodeGeeX等代码补全插件现在以及支持对代码自动生成,提升开发者效率。代码生成主要包括:代码生成、注释生产/代码解释和代码翻译等工作。

 代码与训练模型介绍

代码预训练具有如下特点:多语言能力掌握、代码特殊格式处理。评测代码预训练结果主要考虑:追求正确性、功能、逻辑正确实现、实现用户意图。

基于Transformer的代码与训练模型

CodeBERT

模型架构:Encoder架构模型

训练数据:自然语言-代码对 CodeSearchNet数据集

预训练任务:掩码预测、替换Token检测

下游任务:代码搜索、检测,(附加解码器)进行文档生成 

GraphCodeBERT

在CodeBERT基础上引入代码结构信息:数据流图,表示变量的相互引用关系。

 输入:文本+代码+变量符号

变量符号的注意力:GraphCodeBERT通过数据流图的边关系来影响注意力机制的计算。文本与代码间可以相互计算注意力,但是变量符号间,有边的变量才可以相互计算注意力。同时,代码段中的变量可以与变量符号序列中的变量计算注意力,因为他们本质是一样的。

预训练任务:掩码预测、数据流图连边预测、代码与变量符号关联预测 

大规模预训练模型

CodeX

首个大规模代码生成模型,基于GPT-3 12B进行微调。159GB Python代码数据训练,编程题目微调。

CodeGeeX

基于MindSpore实现的13B多语言代码生成预训练模型。

训练数据分为两个部分:开源数据集(代码子集,多语言)、CodeParrot(Python),额外爬取的数据集:GitHub上优质的开源仓库。总共包含23种编程语言。

数据清洗

按照完全匹配去重文件,根据长度、字符取出无效文件。

在文件开头以注释形式标记语言。如 # language:Python,添加一些其他的元信息(InCoder工作)。

基于自然语言分词器:GPT-2 BPE Tokenizer进行分词。对于代码中特有的连续空格编码成为特殊空格字符,减少空格编码数。

每个文件切分为2048长度的序列作为训练样本,不足最大长度使用终止符补齐。

模型架构

基于GPT架构的自回归模型,由40层Transformer Decoder组成,模型规模为13B。

TopQueryEmb是由一个独立的位置编码生成的一个可学习的Embedding,作为Top Query Layer的Q。

更多内容可参考MindSpore官方视频:第六课:代码预训练_哔哩哔哩_bilibili