昇思MindSpore技术公开课-代码预训练

本文介绍了代码预训练模型的发展,如基于Transformer的CodeBERT、在大规模预训练上表现优秀的CodeGPT,以及针对代码结构学习的GraphCodeBERT。重点讲解了CodeGeeX作为大规模多语言代码生成模型的特性和应用,展示了AI在提高编程效率中的作用。

概述

本课主要讲了代码预训练的相关知识包括代码生成的应用场和任务,以及代码模型的特点和训练方法。近年来基于transformer和大规模预训练的代码生成模型逐渐成为研究热点如CodBERT和CodeGPT等。其中CodBERT是一个基于BERT的模型将代码和自然语言一起用于训练而CodeGPT则是一个基于GPT的模型在超大规模预训练上取得了较好的效果。这些模型在代码生成和理解方面具有重要应用价值。

课程链接第六课:代码预训练_哔哩哔哩_bilibili

代码预训练模型的作用/应用场景

1.代码生成

2.代码解释

3.代码翻译

代码预训练模型介绍

1.CodeBERT

使用了bimodal data(即PL-NL Pairs)进行了预训练,预训练数据的来源为CodeSearchNet数据集,其中有Python, Java, JavaScript, PHP, Ruby和Go这六种编程语言的2.1M bimodal data和6.4M unimodal codes(也就是没有对应comments的纯代码),这些数据的来源都是GitHub中的开源仓库,并且后续的很多工作也在预训练阶段用了CodeSearchNet数据集。

CodeBERT的输入形式为,第一段为自然语言文本,第二段为代码,训练的数据可分为两种,即bimodal data,即NL-PL Pairs和unimodal data,也就是纯代码。

CodeBERT在预训练阶段的任务有以下两个:

Masked Language Modeling (MLM),算是Transformer类模型的预训练中最老生常谈的任务了,作者将其应用于基于bimodal data的训练。

Replaced Token Detection (RTD),迁移自ELECTRA,既可以利用bimodal data进行训练,还可以进一步利用unimodal data(比如是没有对应自然语言文本的code),具体细节可以参考ELECTRA原文。

2.GraphCodeBERT

GraphCodeBERT基于数据流学习代码的表征,

数据流的获得分为以下几个步骤

  1. 通过语法分析工具获得AST,原文中使用的工具是tree-sitter
  2. 从AST中提出变量,构成一个由变量组成的序列
  3. 从AST中抽取变量之间的依赖关系,文中称之为“value comes from”,构造数据流图

GraphCodeBERT在模型预训练阶段额外提出了两个在当时较为新颖的训练任务

  1. Edge Prediction,即数据流图边预测,通过预测数据流图的边学习代码的结构信息
  2. Node Alignment,即变量对齐,具体而言是学习数据流图中的某个node来自输入代码中的哪个code token

将它们和从CodeBERT(或是BERT or RoBERTa)继承下来的MLM任务一起优化。考虑到AST是一种图结构,为了让Transformer能适应其与一般序列结构的差异,作者修改了其注意力机制,主要是通过调整Attention Mask缩小感受野。

其中E代表的是数据流图的边,E'代表的是数据流图的节点和代码的对应关系边。

就下游任务而言,GraphCodeBERT文中主要完成了Natural Language Code Search、Clone Detection、Code Translation和Code Refinement这几个任务,它同样适用CodeXGLUE Benchmark中的其他任务,比如Code Summarization等。

GraphCodeBERT相较于前作CodeBERT解决了CodePTM只学习自然语义,而不学代码结构/语法的问题。学习数据流相较于学习AST本身有相当的信息损失,这也为之后的UniXcoder挖了一个小坑。

3.GPT-C

FSE/ESEC 2020 IntelliCode Compose: Code Generation using Transformer

GPT-C是为了代码补全(Code Completion)这个任务而设计的

GPT-C认为之前的的代码补全工作有两点不同

  1. 根据上文的token来预测下个token,没有将代码的全文环境纳入考虑
  2. 多语言效果不佳

GPT-C是GPT-2模型的变体,在一个大规模、无监督、多语言的数据集上从零开始训练。基于GPT-C,作者构建了一个代码补全Framework,称之为IntelliCode Compose,并对多种编程语言进行建模。作者将Sequence decoding的过程视为对树的搜索,搜到出现目标token为止。

其他模型

CodeGeeX


CodeGeeX是由清华大学知识工程实验室和智谱AI研发,鹏城实验室提供算力支持,异思MindSpore提供技术支持的开源的大规模多语言代码生成模型
CodeGeeX是一个具有130亿参数的多编程语言代码生成预训练模型,采用异思MindSpore框架实现,使用鹏城实
验室“鹏城云脑lI”平台中1536个异腾910 AI处理器,在20多种编程语言的代码语料库历时两个月训练而成。开源开放,支持异腾和英伟达平台,具有高精度代码生成、代码翻译等能力。

上线以来,CodeGeeX插件服务了80000+用户,每天为程序员生成超过数百万行代码

CodeGeeX训练数据

数据处理:

CodeGeeX详细介绍

CodeGeeX生成代码视频

codeGeeX

总结

本节课主要讲了代码预训练模型现有的代码预训练模型。人工智能代码生成工具是一种利用人工智能技术自动生成代码的工具,可以帮助程序员提高编程效率。这些工具使用预训练模型在大规模数据集上进行预训练,学习通用的语言表示,然后在特定任务上进行微调,以提高模型的性能。这种方法可以减少对标注数据的依赖,提高模型的泛化能力,同时也可以加速模型的训练过程。这些工具的简单性使编程变得更加容易,这就是它们的魅力所在。这大大减少了开发人员(无论是经验丰富的开发人员还是新手)编写代码所需的时间和精力。这些工具的应用非常广泛,包括自然语言处理、计算机视觉、语音识别等领域。CodeGeeX和GitHub Copilot是两个人工智能代码生成工具,它们都可以帮助程序员提高编程效率,但是它们的使用方式和功能略有不同。CodeGeeX是一个国产开源项目,免费使用,使用门槛低,但是功能相对较少;GitHub Copilot是由OpenAI和GitHub合作开发的,功能更加强大,但是需要用户在GitHub上注册账号并安装插件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值