CodeXGLUE:用于代码理解和生成的机器学习基准数据集

互联不一般哥 2024-07-06 18:22:58

CodeXGLUE: A Machine Learning Benchmark Dataset for Code Understanding and Generation

Shuai Lu1,Daya Guo2,Shuo Ren3,Junjie Huang3,Alexey Svyatkovskiy4,Ambrosio Blanco5,Colin Clement4,Dawn Drain4,Daxin Jiang4,Duyu Tang5, Ge Li1,Lidong Zhou5,Linjun Shou4,Long Zhou5,Michele Tufano4,Ming Gong4,Ming Zhou5,Nan Duan5,Neel Sundaresan4,Shao Kun Deng4,Shengyu Fu4,Shujie Liu5

1Peking University,2Sun Yat-sen University,3Beihang University,4Microsoft,

5Microsoft Research Asia

引用

Lu S, Guo D, Ren S, et al. Codexglue: A machine learning benchmark dataset for code understanding and generation[J]. arXiv preprint arXiv:2102.04664, 2021.

论文:https://arxiv.org/abs/2102.04664

仓库:https://github.com/microsoft/CodeXGLUE

摘要

基准数据集对加速编程语言任务的研究具有重大影响。在本文中,我们介绍了CodeXGLUE,这是一个基准数据集,用于促进机器学习研究,以实现程序理解和生成。CodeXGLUE 包括 14 个数据集中的 10 个任务集合,以及一个用于模型评估和比较的平台。CodeXGLUE 还具有三个基线系统,包括 BERT 样式、GPT 样式和编码器-解码器模型,使研究人员能够轻松使用该平台。这些数据和基线的可用性可以帮助开发和验证可应用于各种程序理解和生成问题的新方法。

1 引言

随着开发人员人数的快速增长,利用人工智能 (AI) 帮助软件开发人员提高开发过程生产力的代码智能变得越来越重要。人们普遍认为,基准测试对应用人工智能研究的发展有重大影响。在本文中,我们专注于为代码智能建立一个基准数据集。

自动化程序理解和生成可以提高软件开发人员的生产力。事实上,想要查找具有相同意图的其他人编写的代码的开发人员可以利用代码搜索系统来自动检索语义相关的代码。同样,对下一步要写什么感到困惑的开发人员可以使用代码补全系统根据对代码所做的编辑自动完成接下来的token。最后,当开发人员想要在Python中实现Java代码时,代码到代码的翻译系统可以帮助将他们的代码从一种编程语言(Python)翻译成另一种编程语言(Java)。

近年来,研究人员越来越多地将包括神经网络在内的统计模型应用于编码智能任务。最近,从大型编程语言数据中学习的预训练模型的应用受到了 BERT和 GPT 等预训练模型在自然语言处理 (NLP) 中的巨大成功的启发。这些模型,包括 CodeBERT和 IntelliCode Compose,进一步改进了代码理解和生成问题,但它们缺乏涵盖广泛任务的基准测试套件。ImageNet用于计算机视觉,GLUE用于 NLP 表明,多样化的基准数据集对应用人工智能研究的发展具有重大影响。

为了解决这个问题,我们引入了CodeXGLUE,这是一个用于程序理解和生成研究的机器学习基准数据集,包括14个数据集,10个多样化的编程语言理解和生成任务的集合,以及一个用于模型评估和比较的平台。CodeXGLUE 支持以下任务:

代码到代码(克隆检测、缺陷检测、完形填空测试、代码完成、代码修复和代码到代码转换)文本到代码(自然语言代码搜索,文本到代码生成)代码到文本(代码摘要)文本到文本(文档翻译)

CodeXGLUE 包括 BigCloneBench、POJ-104、Devign、PY150、Github Java Corpus、Bugs2Fix、CONCODE和 CodeSearchNet,以及表 1 中突出显示的新引入的数据集。数据集的选择或创建是基于任务具有明确定义的考虑,并且数据集的数量可以支持数据驱动的机器学习方法的开发和评估。我们创建的数据集包括 (1) 两个涵盖 6 种编程语言的完形填空测试集,(2) 两个分别使用 Java 和 Python 的行级代码完成测试集,(3) Java 和 C# 之间的代码到代码转换数据集,(4) 两个具有 Web 查询和规范化函数和变量名称的自然语言代码搜索测试集,(5)涵盖五种自然语言的文档翻译数据集。

为了方便参与者,我们提供了三个基线模型来帮助执行任务,包括一个 BERT 风格的预训练模型(在本例中为 CodeBERT)来支持代码理解问题,一个 GPT 风格的预训练模型,我们称之为 CodeGPT,以帮助解决完成和生成问题,以及一个解决序列到序列生成问题的 EncoderDecoder 框架。

表1:CodeXGLUE 的简要摘要,包括任务、数据集、语言、各种状态下的大小和基线系统(突出显示的数据集是新引入的)

2 任务概述

在本节中,我们将为每个任务提供定义。

克隆检测:任务是测量代码之间的语义相似性。这包括两个子任务:一对代码之间的二进制分类和代码检索,其中目标是找到语义相似的代码。缺陷检测:其目的是确定源代码正文是否包含可用于攻击软件系统的缺陷,例如资源泄漏、释放后使用漏洞和 DoS 攻击。完形填空试验:这旨在预测代码的屏蔽令牌,并包括两个子任务。第一个是从整个词汇表中测量预测掩码标记的准确性。另一种是通过区分“max”和“min”来测试语义推理能力。代码补全:它旨在根据代码上下文预测接下来的token。它的子任务是token级完成和行级完成。前者检查下一个token是否被正确预测,而后者则测试生成的行的优劣。代码翻译:它涉及将代码从一种编程语言翻译成另一种编程语言。代码搜索:它测量文本和代码之间的语义相关性,由两个子任务组成。第一种是根据自然语言查询在代码集合中查找最相关的代码。第二个子任务需要分析查询代码对,以预测代码是否应答查询。代码修复:它的目标是通过自动修复错误来完善代码。文本到代码生成:这旨在通过自然语言描述生成代码。代码摘要:目的是为代码生成自然语言注释。文档翻译:它旨在将代码文档从一种自然语言翻译成另一种语言。

3 实验评估

3.1 数据集

在本节中,我们将介绍CodeXGLUE中包含的数据集。数据集的选择或创建基于数据集的数量可以支持数据驱动的机器学习方法的开发和评估的标准。

克隆检测

克隆检测包括两个子任务。第一个子任务是预测两个给定代码是否具有相同的语义。我们使用 BigCloneBench数据集进行子任务。第二个子任务旨在检索语义相似的代码,给定一个代码作为查询,我们使用数据集 POJ-104来执行它。

缺陷检测

对于缺陷检测任务,周等人提供了Devign数据集,其中包括从两个大型C编程语言开源项目(即QEMU和FFmpeg)中收集的27,318个手动标记函数。该数据集是通过收集与安全相关的提交并从标记的提交中提取易受攻击或不易受攻击的函数而创建的。

完形填空试验

图 1 显示了代码域中完形填空测试 (CT) 任务的两个示例,该任务旨在通过要求这些模型预测来自多个候选者的掩码来评估模型理解代码的能力。我们专注于两个子任务:CT-all(来自过滤词汇表的候选者)和 CT-maxmin(候选者为“max”和“min”)。

图1:完形填空测试数据集中的两个示例

我们使用CodeSearchNet的验证和测试集,为六种编程语言(即Go、Java、JavaScript(JS)、PHP、Python和Ruby)创建CT-all和CT-maxmin数据集。

代码补全

我们使用两个有影响力的数据集进行代码完成,python 中的 PY150 和 Java 中的 Github Java Corpus。这两个数据集都有助于实现token级代码补全。我们更进一步,从两个语料库中为行级代码补全任务创建两个测试集。任务是完成一条未完成的线路。模型应能够预测任意token类型和代码结构的代码序列。

代码翻译

代码翻译的训练数据是在两种编程语言中具有等效功能的代码对。在本文中,我们提供了一个由 Java 和 C# 之间的并行代码组成的数据集。我们没有使用Lachaux等人的数据集,因为他们没有监督模型训练的数据。继Nguyen等人和Chen等人之后,我们使用了从几个开源项目收集的数据,即Lucene、POI、JGit和Antlr。由于许可证问题,我们不使用 Itext和JTS。这些项目最初是用 Java 开发的,然后移植到 C#。它们是成熟的系统,具有悠久的发展历史,并且同时使用 Java 和 C# 版本。

代码搜索

代码搜索包括两个子任务。第一个是从给定自然语言查询的候选代码集合中查找最相关的代码。我们从 CodeSearchNet 语料库创建了一个具有挑战性的测试集,称为 CodeSearchNet AdvTest,用于执行此任务。第二个子任务是预测代码是否应答给定的查询。我们提供了真实用户查询的测试集 WebQueryTest。

代码修复

代码修复旨在自动修复代码中的错误。我们使用Tufano等人发布的数据集。源是有缺陷的 Java 函数,而目标是相应的固定函数。

文本到代码生成

为了完成这项任务,我们使用了 CONCODE,这是一个广泛使用的代码生成数据集,它是从 GitHub 上大约 33,000 个 Java 项目中收集的。它包含 100,000 个用于训练的示例和 4,000 个用于验证和测试的示例。每个示例都是一个由 NL 描述、代码环境和代码片段组成的元组。该数据集的任务是从自然语言描述(Javadoc 样式的方法注释)和类环境生成类成员函数。类环境是由类的其余部分提供的编程上下文,包括类中的其他成员变量和成员函数。

代码摘要

对于代码摘要,我们使用 CodeSearchNet 数据集,其中包括六种编程语言;即 Python、Java、JavaScript、PHP、Ruby和 Go。数据来自公开可用的开源非 fork GitHub 存储库,每个文档都是第一段。表2中列出了 CodeXGLUE 中使用的过滤 CodeSearchNet 数据集的统计信息。

表2:有关代码汇总任务的筛选 CodeSearchNet 数据集的数据统计信息

文档翻译

文档翻译旨在将代码文档自动从一种自然语言(例如英语)翻译成另一种自然语言(例如中文)。我们使用的数据集是从 Microsoft 文档中抓取的,包括不同语言的软件和代码描述文档。我们专注于并行数据稀缺的低资源语言对,并引入多语言机器翻译任务。

3.2 基线系统

我们提供了三种类型的基线模型来执行前面提到的任务,包括支持程序理解问题的 BERT 风格的预训练模型(在本例中为 CodeBERT)、帮助我们解决完成和生成问题的 GPT 风格的预训练模型 CodeGPT,以及解决序列到序列生成问题的编码器-解码器框架。

CodeBERT

为了执行代码理解任务,如克隆检测、缺陷检测、完形填空测试和代码搜索,我们使用 CodeBERT作为编码器。这是一个基于Transformer的双峰预训练模型,具有12层,768维隐藏状态,以及12个编程语言(PL)和自然语言(NL)的注意力头。Feng等人通过掩码语言建模预训练CodeBERT,并在CodeSearchNet数据集上替换了token检测目标,该数据集包括6种编程语言的2.4M函数和文档对。

CodeGPT

我们提供 CodeGPT,这是一种基于 Transformer 的语言模型,在编程语言 (PL) 上进行了预训练,以支持代码完成和文本到代码生成任务。CodeGPT 具有与 GPT-2 相同的模型架构和训练目标,由 12 层 Transformer 解码器组成。我们从CodeSearchNet数据集中预训练了Python和Java语料库上的单语模型,其中包括1.1M的Python函数和1.6M的Java方法。训练数据集中的每个函数都有一个函数签名和一个函数体。某些函数还包含自然语言文档。

我们为每种编程语言训练两个 CodeGPT 模型。一个模型从头开始预训练,以便在代码语料库上新获得BPE(字节对编码器)词汇,并随机初始化模型参数。另一种模型是领域自适应模型,它以 GPT-2 模型为起点,并在代码语料库上不断训练。因此,第二个模型具有相同的 GPT-2 词汇量和自然语言理解能力。我们将此模型称为 CodeGPT 适配模型,并将其视为代码完成和文本到代码生成任务的默认模型。

Encoder-Decoder

对于代码修复、代码转换、代码摘要和文档转换等序列到序列生成问题,我们提供了一个编码器-解码器框架。我们使用 CodeBERT 初始化编码器,并在所有设置中使用具有 6 层、768 维隐藏状态和 12 个注意力头的随机初始化 Transformer 作为解码器。

3.3 实验结果

在本节中,我们报告了 10 个任务的基线系统的精度数字。我们还将展示训练模型和对模型进行推理所需的时间。

克隆检测

实验设计。我们使用 BigCloneBench 和 POJ-104 数据集进行克隆检测。BigCloneBench 数据集的任务被表述为二元分类,以预测给定的代码对是否具有相同的语义,并使用 F1 分数作为评估指标。POJ-104 数据集的任务旨在从开发/测试集中检索给定代码的 499 个代码以进行验证/测试,以平均平均精度 (MAP) 作为评估指标。克隆检测任务的总分是 F1 和 MAP 分数的平均值。

结果。不同模型取得的结果如表3所示。RtvNN训练递归自编码器来学习 AST 的表示。Deckard 计算 AST 中结构信息的向量,并使用局部敏感哈希 (LSH)对相似的向量进行聚类。CDLH通过基于 AST 的 LSTM 学习代码片段的表示。ASTNN使用 RNN 对语句的 AST 子树进行编码。它将所有语句树的编码馈送到 RNN 中,以学习程序的表示形式。 FA-AST-GMN在流增强 AST 上使用 GNN 来利用显式控制和数据流信息。TBCCD提出了一种位置感知字符嵌入,并使用基于树的卷积从其 AST 中捕获代码片段的结构信息,并从代码标记中捕获词法信息。Code2vec通过将多个语法路径聚合到单个向量中来学习代码片段的表示。NCC 通过利用程序的底层数据流和控制流对程序进行编码。Aroma 是一个代码推荐引擎,它采用部分代码片段,并推荐包含查询片段的一小组简洁代码片段。MISIM-GNN 从上下文感知语义结构中学习代码的结构表示,该语义结构专门用于从代码语法中提升语义含义。在这个实验中,我们使用 RoBERTa和 CodeBERT等预训练模型对源代码进行编码,并通过前馈网络或内积计算两个代码的语义相关性。尽管 CodeBERT 没有利用在代码相似度度量方面被证明有效的代码结构,但该模型在克隆检测任务上的表现仍然优于 RoBERTa,总分为 90.4。这些实验结果表明,预训练对克隆检测是有用的。如果进一步利用代码结构,还有进一步改进的余地。

表3:克隆检测任务的结果

缺陷检测

实验设计。我们使用上述提到的数据集进行缺陷检测,旨在预测源代码是否包含可用于攻击软件系统的缺陷。评估指标是准确性分数。我们使用 CodeBERT 基线对源代码进行编码,并采用源代码的表示来计算暴露于漏洞的概率。

结果。表4显示了我们实现的模型的结果。我们分别使用双向 LTSM (BiLTSM)、TextCNN、RoBERTa和 CodeBERT来编码源代码的表示。然后,使用两层前馈网络后跟softmax层来计算遇到漏洞的概率。如结果所示,CodeBERT 的准确率为 62.1,具有最先进的性能。然而,与TextCNN相比,预训练模型实现的改进是有限的。改进这些预训练模型的一个潜在方向是合并来自代码结构的信息,例如抽象语法树、数据流、控制流等。

表4:缺陷检测任务的结果

完形填空试验

实验设计。我们使用 CT-all 和 CT-maxmin 数据集进行完形填空测试任务。模型应通过利用文档和代码上下文来预测屏蔽的代码token。准确性针对每种语言报告,以所有语言的宏观平均准确率分数作为总体评估指标。

结果。表5显示了 CT-all 和 CT-maxmin 数据集的结果。我们报告了 RoBERTa 和 CodeBERT(Masked Language Modeling, MLM)的性能,它们使用 RoBERTa 初始化,并使用掩码语言建模目标进行进一步训练。结果表明,CodeBERT比仅从自然语言中学习的RoBERTa性能更好。

表5:完形填空测试任务的结果

代码补全

实验设计。我们使用 PY150 和 Github Java Corpus 数据集执行token级和行级代码补全任务。token级任务是预测下一个token,给定前一个token的上下文,并根据token级精度对预测进行评估;而行级任务需要补全一整行代码,代码的质量是通过精确匹配准确性和Levenshtein编辑相似度等指标来评估的。Levenshtein 编辑相似度衡量将一个字符串转换为另一个字符串所需的单个字符编辑次数。这是代码补全方案的关键评估指标,因为它衡量开发人员纠正代码中的错误所需的工作量。每个数据集上的分数是token级补全时的准确率和行级补全时的编辑相似度的平均值。代码补全任务的总分是通过对两个数据集的分数进行平均来计算的。

结果。表6 显示了两个数据集上所有模型的结果。我们对LSTM、Transformer、GPT-2、CodeGPT 和 CodeGPT 进行了微调,以生成接下来的token。CodeGPTadapted 以 71.28 的总分实现了最先进的性能。

表6:代码补全任务的结果

代码搜索

实验设计。我们使用前文提到的 CodeSearchNet、AdvTest 和 WebQueryTest 数据集进行代码搜索。为了提高效率,我们将文本和代码分开编码以执行代码搜索。对于 CodeSearchNet AdvTest 数据集,任务是从给定查询的候选代码集合中查找最相关的代码,并通过平均倒数排名 (MRR) 指标对其进行评估。对于 WebQueryTest 数据集,该任务被表述为二元分类,以预测代码是否可以回答给定的查询,我们使用 F1 和准确性分数作为评估指标。代码搜索的总分是为两个子任务记录的值的平均值。

结果。表 7显示了 CodeSearchNet、AdvTest 和 WebQueryTest 数据集的结果。我们报告了 RoBERTa和 CodeBERT的性能。下表显示 CodeBERT 的性能优于 RoBERTa。

表7:代码搜索任务的结果

文本到代码生成

实验设计。我们使用 CONCODE 数据集进行文本到代码的生成。模型应根据自然语言描述和类环境生成 Java 类成员函数的源代码。我们报告了精确匹配精度、BLEU 分数和 CodeBLEU 分数。我们使用 CodeBLEU 分数作为总体评估指标。

结果。表8显示了 CONCODE 测试集的结果。Seq2Seq 是一个基于RNN的序列到序列模型。Seq2Action + MAML将上下文感知检索模型与模型无关元学习 (MAML) 相结合。Iyer-Simp + 200 个 idoms提取了代码习语并应用基于习语的解码。我们还报告了预训练模型的性能,包括 GPT-2、CodeGPT 和 CodeGPT 适配模型。CodeGPTadapted 达到了 35.98 的 CodeBLEU 分数,从而实现了最先进的性能。

表8:文本到代码生成任务的结果

代码翻译

实验设计。我们使用前文中描述的构建数据集。数据集包含 Java 和 C# 函数的匹配示例。我们报告了此任务的精确匹配准确性、BLEU 分数和 CodeBLEU 分数。CodeBLEU 用作整体评估指标。

结果。表9显示了两个平移方向上的模型结果。Naive 方法直接复制源代码作为翻译结果。PBSMT是基于短语的统计机器翻译的缩写。Transformer 使用与预训练模型相同的层数和隐藏大小。该表显示,使用 CodeBERT 初始化并使用匹配的样本对进行微调的 Transformer 会产生最佳结果。

表9:代码翻译任务的结果

代码修复

实验设计。我们使用Tufano等人最初发布的数据集,该数据集包含两个根据 Java 函数的长度建立的子集。我们报告了此任务的精确匹配准确性、BLEU 分数和 CodeBLEU 分数。精确匹配精度用作整体评估指标。

结果。Naive 方法直接复制错误代码作为修复结果。至于 Transformer,我们使用与预训练模型相同的层数和隐藏大小。关于CodeBERT方法,我们使用预训练的CodeBERT模型初始化Transformer编码器,并随机初始化解码器的参数和从源到目标的注意力。然后,我们使用训练数据对整个模型进行微调。如表10所示,在所有型号中,具有 CodeBERT 初始化的 Transformer 实现了最佳性能。

表10:代码修复任务的结果

代码摘要

实验设计。我们使用前文中提到的数据集进行代码摘要。为了评估这些模型,我们遵循Feng等人,他们使用平滑BLEU评分作为评估指标,因为这适用于评估短文档。我们使用 encoder-decoder 管道来解决这个问题。我们使用 Adam 优化器来更新模型的参数。我们调整超参数,并在开发集上执行早期停止。

结果。表11显示了不同模型在代码汇总中取得的结果。Seq2Seq是一个基于RNN的序列到序列模型。Transformer 和 RoBERTa 使用与 CodeBERT 相同的设置,但编码器分别由 RoBERTa随机初始化。所有模型都使用字节对编码 (BPE)词汇表。在这个实验中,CodeBERT的BLEU分数比RoBERTa提高了1.3%,并在六种编程语言上实现了最先进的性能。

表11:代码总结任务的结果

文档翻译

实验设计。我们将 Microsoft Docs 数据集用于文本到文本翻译任务,这些任务侧重于英语(EN)和其他语言(包括拉脱维亚语(LA)、丹麦语(DA)、挪威语(NO) 和中文 (ZH))之间的低资源多语言翻译。根据Johnson等人,我们训练了一个单一的多语言模型作为我们的基线。为了区分不同的翻译对,我们在源句子的开头添加了一个语言token来指示模型应该翻译的目标语言。我们用XLM-R初始化多语言翻译模型的编码器。通过 BLEU分数对模型进行评估,文档翻译的总分是八个翻译方向的平均 BLEU 分数。

结果。表12显示了模型在八个平移方向上取得的结果。Transformer Baseline是多语言翻译模型。预训练的 Transformer 使用 XLM-R 初始化 Transformer Baseline 的编码器。就八个平移方向的整体性能而言,Transformer Baseline 和预训练 Transformer 的 BLEU 得分分别为 52.67 和 66.16。实验结果表明,与强基线模型相比,预训练的 BLEU 评分提高了 13.49。

表12:文档翻译任务的结果

转述:张雅欣

0 阅读:0

互联不一般哥

简介:感谢大家的关注