微软发布代码智能新基准数据集CodeXGLUE,多角度衡量模型优劣
来源 | 微软研究院AI头条
编者按:代码智能(code intelligence)目的是让计算机具备理解和生成代码的能力,并利用编程语言知识和上下文进行推理,支持代码检索、补全、翻译、纠错、问答等场景。以深度学习为代表的人工智能算法,近年来在理解自然语言上取得了飞跃式的突破,代码智能也因此获得了越来越多的关注。该领域一旦有突破,将大幅度推动 AI 在软件开发场景的落地。
一直以来,微软秉承为开发者赋能的使命。在2020年 Build 大会上,微软首席执行官 Satya Nadella 表示,“GitHub 拥有超过5000万用户,Visual Studio Code 是最受开发者欢迎的代码编辑器。微软将为开发者打造最完整的开发工具链,结合 GitHub、Visual Studio 和 Azure,帮助开发者实现从想法到代码、从代码到云的转化。”同时,微软在自然语言理解和深度学习领域有着深厚的积累,不只有大数据、大模型、强算力支撑着模型的训练,还有丰富的模型部署及优化经验,帮助人工智能算法真正落地到产品中。
基准数据(Benchmark Dataset)对一个领域的发展至关重要。例如,ImageNet(斯坦福大学)极大地推动了计算机视觉领域的发展,类似包含多种任务的 GLUE(纽约大学)和 XGLUE(https://microsoft.github.io/XGLUE/,微软亚洲研究院自然语言计算组)数据集在自然语言处理领域也产生了非常深远的影响。近年来,统计机器学习算法,尤其是深度学习算法在很多代码智能任务(如代码检索、代码补全、代码纠错)上都取得了不错的进展,但是,代码智能领域仍缺少一个能覆盖多种任务的基准数据,以便从不同角度衡量模型的优劣。
近期,微软亚洲研究院(自然语言计算组)联合 Visual Studio 和必应搜索发布了代码智能领域首个大规模多任务的新基准——CodeXGLUE(https://github.com/microsoft/CodeXGLUE)。该基准可覆盖 code-code、code-text、text-code、text-text 四个类别,包含10个任务及14个数据集,具体有:代码克隆检测、代码缺陷检测、代码完形填空、代码补全、代码纠错、代码翻译、代码检索、代码生成、代码注释生成、代码文档翻译十项任务。其中,有自建数据集,也有在业界已有影响力的数据集。
十项全能评测集上线
具体来说,CodeXGLUE 中包含如下十项任务:
1. 代码克隆检测(Clone Detection)。该任务是为了检测代码与代码之间的语义相似度,包含两个外部公开数据集,但任务定义稍有不同。在第一个数据集中,给定两个代码作为输入,要求做0/1二元分类,1表示两段代码语义相同,0表示两段代码语义不同。在第二个数据集中,则给定一段代码作为输入,任务是从给定的代码库中检索与输入代码语义相同的代码。
2. 代码缺陷检测(Defect Detection)。该任务是检测一段代码是否包含可以导致软件系统受到攻击的不可靠代码,例如资源泄露、UAF 漏洞和 DoS 攻击等。该任务中使用了外部公开数据集。
3. 代码完形填空(Cloze Test)。先给定一段代码,但代码中的部分内容被掩盖住,该任务要求预测出被掩盖的代码。研究员们将该任务定义为多项选择题的形式,并构建了两个数据集。在第一个数据集中,被掩盖住的代码可以来自于代码中的任意字符;在第二个数据集中,则试图更有针对性地测试系统对代码 max、min 函数的理解能力。
4. 代码补全(Code Completion),也就是给定已经写好的部分代码。该任务能够自动预测出后续的代码,具体包含两个设置,分别是词汇级别(Token-level)和行级别(Line-level)的补全。顾名思义,前者的任务是补全下一个词汇,而后者的任务是补全一整行代码。词汇级任务使用了两个被外部广泛使用的数据。行级别的任务则是在词汇级别任务的数据上自动构建的数据。
5. 代码翻译(Code Translation)。该任务是把代码从一种编程语言翻译到另一种编程语言。研究员们构建了一个 Java 到 C# 的代码翻译数据集。
6. 代码检索(Code Search)。该任务是为了检测自然语言与代码之间的语义相似度,包含两个数据集,具体定义稍有不同:在第一个数据集中,给定一个自然语言作为输入,任务是从给定代码库中检索与输入自然语言语义最相近的代码,研究人员为该数据新构建了一个测试集,用来更好地测试系统的深层语义理解能力。在第二个数据集中,给定自然语言-代码对作为输入,要求系统做0/1二元分类,1表示语义相似,0表示语义不相似,研究员们同样为该任务构造了新的测试数据集,测试数据的自然语言来自必应搜索引擎,可以更好地反应真实用户的查询习惯。
7. 代码纠错(Code Refinement)。 给定一段有 bug 或者复杂的代码作为输入,该任务要求生成被优化后的代码。该任务中使用了一个外部公开的数据集。
8. 代码生成(Text-to-code Generation)。给定自然语言注释作为输入,该任务要求自动生成函数的源代码。该任务中使用了外部的公开数据集。
9. 代码注释生成(Code Summarization)。给定一段函数代码作为输入,该任务要求自动生成对应的自然语言注释。该任务中使用了外部公开数据集。
10. 文档翻译(Documentation Translation)。该任务的目的是自动将代码文档从一种自然语言翻译到另一种自然语言,如从英文翻译到中文。该任务中构建了新的数据集。
CodeXGLUE 发布在 GitHub 上,参赛者可首先通过 Git Clone 命令下载全部资源。最外层目录对应了四个任务分类,即 Code-code、 Code-text、Text-code 和 Text-text。研究员们为每个任务和数据集都创建了子文件夹,其中包括数据、代码、评测脚本以及说明文档。对于来自外部的公开数据集,则提供了数据下载的脚本;同时,对于需要做预处理的部分数据,也提供了预处理的脚本。
三大基线系统模型
CodeBERT、Encoder-Decoder和CodeGPT
为了让参赛者更容易参与到 CodeXGLUE 中,研究人员为每个任务搭建了目前较为流行的、基于神经网络的基线系统(Baseline)。这些基线系统可以被归为三类:第一类是基于 CodeBERT 预训练模型的系统,能够支持如分类、检索等代码理解任务;第二类是基于 CodeGPT 预训练模型的系统,能够支持代码补全和代码生成任务;第三类是编码器-解码器模型(Encoder-Decoder),能够更好地支撑如代码翻译、代码纠错等生成任务。下图给出了三类基线系统的总况,接下来将分别对每个基线系统进行介绍。
基于 CodeBERT 预训练模型的系统:在自然语言处理领域,BERT 在诸多自然语言理解任务中都展现了非常出色的性能。BERT 的基本思想是把模型的学习过程分为预训练(Pre-training)和微调(Fine-tuning)两个步骤。在预训练阶段,BERT 会从海量无标注的文本中通过自监督优化目标,如语言模型和掩码语言模型,学习通用的词汇上下文语义表示;在微调阶段,已经训练好的模型参数会在下游任务的标注数据上进行微调。受 BERT 的启发,研究员们为参赛者提供了 CodeBERT 模型,即面向编程语言的预训练模型。
CodeXGLUE 中的很多任务同时涉及到文本和代码,因此该系统提供了在 code-text pair 上预训练的 CodeBERT 模型。该模型在训练过程中同时会把代码和文本作为输入,这样的设置可促进模型学习文本和代码之间的语义交互(相关论文:CodeBERT: A Pre-Trained Model for Programming and Natural Languages,https://arxiv.org/abs/2002.08155)。由于代码严格遵循编程语言的语法规范,所以代码的内容具有很强的结构性,基于这点考虑,研究人员进一步提出了一种融合代码结构的预训练模型,如下图所示。具体来说就是利用代码的数据流信息,并围绕数据流提出了两种新的预训练任务。模型的具体细节可参见论文:GraphCodeBERT: Pre-training Code Representations with Data Flow (https://arxiv.org/abs/2009.08366 )。
基于 CodeGPT 预训练模型的系统:GPT 模型在自然语言生成任务上取得了非常出色的效果,也有学者发现在编程语言上预训练 GPT 模型在代码生成任务上表现得很不错。为了帮助参赛者更快地搭建模型,研究员们分别在 Python 和 Java 两种编程语言上预训练了 GPT 模型,称之为 CodeGPT(如下图所示)。模型的训练数据来自CodeSearchNet,训练目标是传统的语言模型。参赛者只需在下游任务中对 CodeGPT 进行微调,即可在代码生成和补全任务上取得当前最好的性能。
编码器-解码器模型系统:为了支持如代码翻译、代码纠错等 Sequence-to-sequence 生成问题,该系统提供了基于 Transformer 的 Encoder-Decoder 框架。下图展示了一个 C++ 到 Python 的代码翻译样例,Encoder 端接收了 C++ 的代码作为输入,Decoder 端序列化地输出了 Python 代码。模型的框架也支持在 Encoder 端使用 CodeBERT 初始化模型参数,以更好地表示代码的语义。
研究人员在两个 P100 GPU 上计算了每个数据集上进行模型训练和推理的时间,如下表所示。可以看出,模型训练时长在一小时到三十小时内,推理的过程则更快,最快的数据仅需要几分钟,最耗时的需要两个小时。这样的资源消耗通常是可以被大部分参赛者所接受的。
全新评测指标CodeBLEU
定义模型优劣标准
评测指标的选取至关重要,它定义了区分模型优劣的标准。目前,业界大多使用 BLEU 评价生成代码的质量,其基本思想是计算生成代码和标准答案代码 ngram 的匹配程度。然而,代码蕴含着丰富的语法和语义结构,BLEU 无法捕捉代码的结构特性。因此,微软亚洲研究院的研究员们提出了 CodeBLEU 来更好地评价自动生成代码的质量。CodeBLEU 的基本思想是不仅使用字符的 ngram 匹配程度,还要同时考虑代码的关键字信息、AST 结构化子树信息以及代码变量之间的数据流信息。CodeBLEU 的最终结果由各个子部分加权求和获得。
为了验证 CodeBLEU 指标的有效性,研究人员分别在代码生成、代码翻译和代码纠错上进行了实验。不仅为每个任务提供了多个系统的模型输出,并分别使用 BLEU、CodeBLEU 评测各个系统,此外还请了熟悉编程语言的人工标注人员为每个模型的输出打分。通过下图可以看出,CodeBLEU 与标注人员打分的皮尔逊相关系数更高,从而验证了该指标的有效性。更多细节,请参见论文:CodeBLEU: a Method for Automatic Evaluation of Code Synthesis (https://arxiv.org/abs/2009.10297 )。
为了方便研究人员使用,微软亚洲研究院的研究员们还为每个任务和数据集提供了基线系统。欢迎学术界和工业界的同行来了解和使用 CodeXGLUE,也欢迎大家提供宝贵的意见和建议。
CodeXGLUE:
https://github.com/microsoft/CodeXGLUE
更多精彩推荐
打通语言理论和统计NLP,Transformers/GNNs架构能做到吗?
自拍卡通化,拯救动画师,StyleGAN再次玩出新花样
干货!高频手撕算法合集来了
放弃 Windows 后 ,开源操作系统能成为主流桌面系统吗?
起底 ARM:留给中国队的时间不多了
相关文章:

Spring从菜鸟到高手(四)(上)使用JdbcTemplate类实现用户登陆验证、批量更新
标签:Spring java JdbcTemplate Spring从菜鸟到高手 绝缘材料原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://tonyaction.blog.51cto.com/227462/42042看了我前面几篇文章的朋…

CSS盒模型及边距问题
盒模型是CSS的基石之一,页面的每一个元素都被看作一个矩形框,分别由外边距,边框,内边距,内容组成, 在CSS中,width和height的值指的是内容的宽高,增加外边距,边框…

区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets
首先,这两个函数不是C标准库中的函数, int getch(void) //从标准输入读入一个字符,当你用键盘输入的时候,屏幕不显示你所输入的字符。也就是,不带回显。 int getche(void) //从标准输入读入一个字符&…
无限想象空间,用Python玩转3D人体姿态估计
前言姿态估计,一直是近几年的研究热点。它就是根据画面,捕捉人体的运动姿态,比如 2D 姿态估计:再比如 3D 姿态估计:看着好玩,那这玩应有啥用呢?自动驾驶,大家应该都不陌生࿰…

Mac中将delete键定义为删除键
在Mac中,delete键实际是退格键(Backspace),fndelete才是删除键。这也是从Windows转到Mac时不习惯的地方之一。 通过安装DoubleCommand软件可以解决这个问题。安装后,在System Preferences中找到DoubleCommand找打开在E…

CHIL-SQL-MIN() 函数
MIN() 函数 MIN 函数返回一列中的最小值。NULL 值不包括在计算中。 SQL MIN() 语法 SELECT MIN(column_name) FROM table_name 注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。 SQL MIN() 实例 我们拥有下面这个 "Orders&quo…
Google排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
毋庸置疑,Python越来越被认可为程序员新时代的风口语言。无论是刚入门的程序员,还是年薪百万的 BATJ 的大牛都无可否认:Python的应用能力是成为一名码农大神的必要项。 所以,很多程序员把Python当做第一语言来学习。 但对于Python…

CSS滤镜详解
CSS滤镜详解 简介〓 设置文字透明层次,模糊效果,给文字加光晕等这些本来要靠图片才能处理的效果,现在CSS可以既简单又快速的把它实现了……接着往下看就知道了。 〓正文〓 语法:STYLE"filter:filtername(fparameter1, fpa…

php实现单链表
<?php //单链表的存储结构 class Node{ public $data;//数据域 public $next;//指针域 指向下一个结点 function __construct(){ $this->data null; $this->next null; } } //单链表数据类型 class LinkList{ public $data; public $next; function _…

2017-2-23 C#基础 中间变量
用中间变量做这个题 1、“请输入年份:”(1-9999) “请输入月份:”(1-12) “请输入日期:”(要判断大小月,判断闰年) 判断输入的时间日期是否正确 2、计算输入的…

HTA的简单应用
HTA简介:HTA是HTML Application的缩写(HTML应用程序),是软件开发的新概念,直接将HTML保存成HTA的格式,就是一个独立的应用软件,与VB、C等程序语言所设计的软件没什么差别。下面是一个HTA的例子&…
300亿美元,AMD为什么要买Xilinx?
作者 | Just来源 | CSDN(ID:CSDNnews)自2015年5月,Intel(英特尔)以167亿美元收购FPGA生产商Altera后,半导体行业接连传出大整合。上个月,NVIDIA(英伟达)宣布以400亿美元收购芯片设计公司Arm&…

PIM-SSM简介
源特定组播(SSM:Source Specific Multicast)是一种区别于传统组播的新的业务模型,它使用组播组地址和组播源地址同时来标识一个组播会话,而不是向传统的组播服务那样只使用组播组地址来标识一个组播会话。SSM保留了传统PIM-SM模式中的主机显示…

MyBatis开发入门二:一对多连表查询
1. 步骤: (1). 加包(2). 编写db.properties;编写conf.xml,将db.properties加入到conf.xml;引入别名(3). 建立实体类(4). 编写sql操作对应的***Mapper.xml文件(5). 将sql操作对应的***Mapper.xml文件注册到conf.xml文件中(6). 编写…

ASP.NET里的事务处理
出自: http://blog.csdn.net/ycl111/ 事务是一组组合成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将控制和维护每个数据库的一致性和完整性。如果在事务过程中没有遇到错误,事务中的所有修改都将永久成为数据库的一部…

JAVA的正则表达式语法
Java 正则表达式表达式意义:1.字符x 字符 x。例如a表示字符a\\ 反斜线字符。在书写时要写为\\\\。(注意:因为java在第一次解析时,把\\\\解析成正则表达式\\,在第二次解析时再解析为\,所以凡是不是1.1列举到的转义…
应届生失业率或继续上升?别怕,这份秋招指南请收好!
受疫情影响,今年的就业形势基本上没跑了:“各行各业,大小企业,全面缩招!”据国家统计局7月份的最新数据显示:20-24岁大专及以上人员(主要为新毕业大学生)失业率比去年同期高 3.3 个百…
微信小程序把玩(三十五)Video API
原文:微信小程序把玩(三十五)Video API电脑端不能测试拍摄功能只能测试选择视频功能,好像只支持mp4格式,值得注意的是成功之后返回的临时文件路径是个列表tempFilePaths而不是tempFilePath文档写的有点问题。 主要属性:…

使用.NET发送邮件
出自: http://blog.csdn.net/ycl111/如果你曾经使用过ASP来发送邮件,你大概会使用CDONTS,但是在.NET里,发送邮件的功能已经封装进 .NET Framework的System.Web.Mail的命名空间里了,使用这个命名空间下类,就可以很容易…
采摘工人月薪十万却无人应聘,英澳农场求助 AI
作者 | 神经小兮来源 | HyperAI超神经金秋时节,本是收获的季节,但是英国、澳大利亚等地的果农却愁容满面。眼看着日渐成熟的瓜果就要烂在地里,却还招不到采摘工人。缺人,成为果农们眼下急需解决的问题。虽然大型联合收割机早已普及…

好记性不如烂笔杆-android学习笔记二 Acitvity lifecycle 生命周期
7,//Acitvity lifecycle 生命周期/***1,一个Activity就是一个类,并且这个类要继承Activity*2,复写onCreate方法*3,每个Activity需要在Androidmanifest.xml文件中配置*4,为Activity添加控件*/ 1 public class Activity …

hdu5740
考验代码能力的题目,感觉网络流一要求输出方案我就写的丑 http://www.cnblogs.com/duoxiao/p/5777632.html 官方题解写的很详细 因为如果一个点染色确定后,整个图的染色也就确定了; 对于两个点u和v, 令它们之间的最短路是dis(u,v), 那么交换它…

xml操作类(转载)
作者:未知 请与本人联系 <%Class XMLDOMDocument Private fNode,fANode Private fErrInfo,fFileName,fOpen Dim XmlDom 返回节点的缩进字串 Private Property Get TabStr(byVal Node) TabStr"" If Node Is Nothing Then Exit Property …

对HDS AMS 2000+巡检案例
1. 使用工具:笔记本,网线一根, 2. 使用软件:vmware虚拟机(安装XP P2系统,最好为P3),HSNM2-1152-W-CLI-P01.exe(AMS 200管理软件),jre…
用Python实现坦克大战游戏 | 干货贴
作者 | 李秋键出品 | AI科技大本营(rgznai100)《坦克大战》是1985年日本南梦宫Namco游戏公司在任天堂FC平台上,推出的一款多方位平面射击游戏。游戏以坦克战斗及保卫基地为主题,属于策略型联机类。同时也是FC平台上少有的内建关卡…

SPU、SKU、ARPU是什么,我来记录一下我的理解
在电商系统里经常会提到“商品”、“单品”、“SPU”、“SKU”这几个词,那么这几个词到底是什么意思呢?既然不知道是什么,那么我们就查一下:SPU Standard Product Unit (标准化产品单元),SKUst…

用C#操纵IIS(代码)
using System;using System.DirectoryServices;using System.Collections;using System.Text.RegularExpressions;using System.Text;/*** author 吴海燕* email wuhy80-usualyahoo.com* 2004-6-25 第一版*/ namespace Wuhy.ToolBox{/// <summary>/// 这个类是静态类。…

linux 内核参数调整说明
linux 内核参数调整说明 所有的TCP/IP调优参数都位于/proc/sys/net/目录。例如, 下面是最重要的一些调优参数, 后面是它们的含义: 1. /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲。2. /proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲。3. /proc/sys/net/ipv4…
Java 最高均薪 19015 元! 9 月程序员工资出炉,你拖后腿了吗?
在全员争当码农的时代,如果你也想学一门编程语言,那么,我要告诉你,Java 是编程语言中不可撼动的王者。有点难理解?先看个排行榜???? 来自权威开发语言排行榜 TIOBE 的数据(截止到 2020 年 4 月&#x…

java 基础知识八 正则表达式
正则表达式 是一种可以用于模式匹配和替换的规范, 一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式, 用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为…