论文笔记:CodeXGLUE: A Machine Learning Benchmark Dataset for Code Understanding and

1,700 阅读5分钟

导语

关键词

program understanding, machine learning, naturalness of software

1 简介

随着开发人员的数量急速增长,利用人工智能(AI)来帮助软件开发人员提高开发过程的生产力的代码智能变得越来越重要。在本文中,我们着重于为代码智能建立一个基准数据集。

自动程序理解和生成系统可以极大的帮助开发者提高编码效率。例如:

  • 代码搜索系统可以帮助开发者通过自然语言来快速检索相似语义的代码段;
  • 代码补全系统可以帮助开发者自动补全后续代码;
  • 代码到代码翻译系统可以将代码由一种编程语言(如Java)转换为另一种编程语言(如Python)。

为了帮助AI辅助代码编程系统的研究,本文建立了一个标准的测试基准CodeXGLUE,它包含10种不同的编程任务共计14个数据集。

image.png

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

2 任务概览

接下来简要介绍CodeXGLUE定义的十个代码相关的任务:

  • Clone detection:该任务是度量代码之间的语义相似性。这包括两个子任务:一对代码之间的二分类和代码检索,其目标是找到语义上相似的代码。
  • Defect detection:该任务目标是确定源代码体是否包含可能被用于攻击软件系统的缺陷,例如资源泄漏、释放后使用漏洞和DoS攻击。
  • Cloze test:该任务目的是预测代码的掩码token,包括两个子任务。第一个是衡量从整个词汇表中预测掩码标记的准确性。二是通过区分“max”和“min”来测试语义推理能力。
  • Code completion:该任务目标是基于代码上下文预测接下来的token。它的子任务是token级完成和行级完成。前者检查下一个token是否被正确预测,而后者测试生成的行是否正确。
  • Code translation:该任务将代码从一种编程语言翻译成另一种编程语言。
  • Code search:该任务测量文本和代码之间的语义相关性,由两个子任务组成。第一种方法是根据自然语言查询在一组代码中找到最相关的代码。第二个子任务需要分析查询代码对,以预测代码是否回答查询。
  • Code repair:该任务目标是通过自动修复错误来改进代码。
  • Text-to-code generation:该任务目的是通过自然语言描述生成代码。
  • Code summarization:该任务目标是为代码生成自然语言注释。
  • Documentation translation:它旨在将代码文档从一种自然语言翻译成另一种自然语言。

3 数据集

本章将详细介绍所使用的这些数据集,有一些是之前的工作,有一些是作者创建的数据集,其中作者创建的在表1中被高亮。

3.1 Clone detection

主要用到了BigCloneBench和POJ-104两个数据集,都是之前的工作。

3.2 Defect detection

主要用到了Devign数据集。

3.3 Cloze test

完形填空共有两种setting:

  • 开放式完形填空,即被挖掉的空可能是任意一个token;
  • 限制级完形填空,即被挖掉的空只可能是特定的词,如max、min等token。

示意图如下图所示:

image.png

依据此,作者发布了CT-all和CT-maxmin两个数据集。其统计特性如下表:

image.png

3.4 Code completion

代码补全任务作者提出使用PY150和Github Java Corpus数据集,并同时提出了token level和line level两种级别的任务,下图展示了一个line level的示例:

image.png

3.5 Code translation

作者在前人的工作基础上,借助AST树制定了一些启发式规则来构建了一个大型的Java-C#代码翻译数据集,并取名为CodeTrans,其中的一个示例如下图所示:

image.png

3.6 Code search

作者首先在CodeSearchNet数据集的基础上通过规范化得到一个更加具有挑战性的数据集CodeSearchNet AdvTest,其示例如下图所示:

image.png

接着,作者提出了WebQueryTest数据集,过去的大多数代码搜索数据集使用来自软件开发人员的在线社区的代码文档或问题作为查询,但这些与真正的用户搜索查询不同。为了解决这个问题,本文提供了WebQueryTest,这是一个Python真实代码搜索的测试集。该问题被表述为二分类任务,并作为检索场景的补充设置。给定一对查询函数和编码函数,模型需要对编码函数是否能回答查询进行分类。

image.png

3.7 Code repair

该任务使用Bugs2Fix数据集。

3.8 Text-to-code generation

该任务使用CONCODE数据集。

3.9 Code summarization

该任务使用过滤后的CodeSearchNet数据集,相关统计情况如下图所示:

image.png

3.10 Documentation translation

文档翻译任务最终包括了43K, 19K, 44K, 和50K的 sentence pairs,分别为English ⇔ Latvian, English ⇔ Danish, English ⇔ Norwegian, 和 English ⇔ Chinese.

image.png

4 Baseline方法

提出了三种Baseline方法:CodeBERT、CodeGPT和Encoder-decoder模型。

image.png

其参数量如下图所示:

image.png

5 实验

5.1 Clone Detection

image.png

5.2 Defect Detection

image.png

5.3 Cloze test

image.png

5.4 Code completion

image.png

5.5 Code search

image.png

5.6 Text-to-code generation

image.png

5.7 - 5.10

image.png

image.png

6 相关工作

7 总结

通过CodeXGLUE,本文旨在寻求支持可以应用于各种程序理解和生成问题的模型的开发,目标是提高软件开发人员的生产力。本文鼓励研究人员参与公开挑战,在代码智能方面取得进展。展望未来,本文计划将CodeXGLUE扩展到更多的编程语言和下游任务,同时通过探索新的模型结构、引入新的预训练任务、使用不同类型的数据等继续开发高级预训练模型。