CoTexT: Multi-task Learning with Code-Text Transformer
基于 Transformer 的 代码-文本 多任务学习
链接:
0:摘要
我们提出了CoTexT,一种预先训练过的、基于转换的编码器-解码器模型,它可以学习自然语言(NL)和编程语言(PL)之间的代表性上下文。利用自我监督,CoTexT对大型编程语言语料库进行预训练,以学习对语言和代码的一般理解。CoTexT支持下游的NL-PL任务,如代码汇总/文档编制、代码生成、缺陷检测和代码调试。我们训练CoTexT对可用PL语料库的不同组合,包括“双峰”和“单峰”数据。在这里,双峰数据是文本和相应的代码片段的组合,而单峰数据仅仅是代码片段。我们首先使用多任务学习来评估CoTexT:我们对6种不同的编程语言进行代码总结,并对CodeXGLUE数据集中出现的中小尺寸编程语言进行代码细化。我们进一步进行了广泛的实验来调查CodeXGlue数据集中的其他任务,包括代码生成和缺陷检测。在这些任务中,我们始终实现了SOTA的结果,这证明了我们的模型的多功能性。
1:Introduction
我们介绍了CoTexT(Code and Text Transfer Transformer,代码和文本传输转换器),这是一种预训练过的自然语言(NL)和编程语言(PL)的模型,如Java、Python、Javascript、PHP等。CoTexT遵循由(Vaswanietal.,2017)提出的编码器-解码器架构和注意机制。然后,我们将该模型调整为匹配(Raffel等人,2019)提出的T5框架。我们通过对多种编程语言的多任务学习和其他相关任务进行详尽的实验来测试CoTexT。
我们使用包含多种编程语言(包括Java、Python、javascript、Ruby等)的大型编程语言语料库来训练CoTexT。在这里,我们测试了单峰和双峰数据的不同组合,以产生每个下游任务的最佳结果。然后,我们对四个CodeXGLUE任务(Luetal.,2021)进行微调CoTexT,包括代码总结、代码生成、缺陷检测和代码细化(中小数据集)。结果表明,我们对这四个任务中的每一个都达到了最先进的价值。我们发现CoTexT优于当前的SOTA模型,如CodeBERT(Feng等人,2020)和PLBART(Ahmad等人,2021a)。
在本文中,我们提供了以下贡献:
CoTexT的三个不同版本,在CodeXGLUE的代码总结、代码生成、缺陷检测和代码细化(中小型数据集)任务上实现了最先进的技术。我们宣传我们的CoTexT预训练的检查点和相关的源代码,可供未来的研究和改进。
2:Related Work
与我们的工作特别相关,CodeBERT(Fengetal.,2020)对NL-PL 对的双峰数据进行了训练。这种策略允许CodeBERT同时学习自然语言和编程语言的通用表示。GraphCodeBERT(Guoetal.,2021)是CodeBERT的一个扩展,它超越了语法级结构,并使用预训练阶段的数据流来捕获代码的语义级结构。最近,PLBART(Ahmadetal.,2021b)是NL和PL的一个预训练的序列到序列模型。通过去噪自编码,该模型可以很好地完成NL-PL的理解和生成任务。
3: CoTexT
根据T5的例子(Raffel等人al.,2019),我们使用由(Kudo和理查森,2018)提出的句子块无监督文本标记器。句子片段模型提取包含序列语义上下文的子单词。我们使用句子块作为我们所有贡献的CoTexT模型的词汇模型。然而,代码中使用的特殊标签(如“[”、“{”、“$”等)都不在 sentence piece模型的词汇表中。这些标签在编程语言中具有一个重要的代表性上下文。因此,为了增强模型的鲁棒性,我们在自我监督和监督训练过程中,将所有这些缺失的标记编码为自然语言表示。
3.2 Pre-training CoTexT
我们对双峰和单峰数据都训练CoTexT 。双峰数据在每个序列中同时包含代码片段和相应的自然文本,而单峰数据只包含代码序列。在自监督训练中,我们使用了两个主要的数据集: CodeSearchNet Corpus Collection and GitHub Repositorie的数据。表1列出了用于训练CoTexT 的语料库组合。为了节省时间和计算资源,我们初始化了在C4语料库上训练的原始T5中的检查点。
3.2.1 CodeSearchNet Corpus Collection
CodeSearchNet Corpus (Husain等人,2020)包含来自开源非分叉Github存储库的编码函数。该数据集跨越了6种编码语言(Python、Java、Javascript、PHP、Ruby、Go),这有助于多任务学习。代码搜索网还包含了每个函数的自然语言描述。对于双峰数据,我们可以简单地将自然语言片段与相应的代码片段连接起来,以创建一个输入序列。然后按照3.1中的描述来处理这些数据。
3.2.2 GitHub repositories
我们从谷歌BigQuery上的GitHub存储库数据集中下载了大量的Java和Python函数。然后提取这些Java和Python函数,并使用来自(Lachauxetal.,2020)的预处理管道获得自然语言描述。这些数据点还通过管道来替换特殊令牌(如3.1中所述)。
3.3 Input/Output Representations
CoTexT将所有NLP问题转换为文本到文本的格式。这意味着在自我监督的预训练和监督训练中,我们都使用输入序列和目标序列。对于双峰模型,我们将一系列自然语言文本和相应的编程语言文本序列连接起来作为输入。对于单峰模型,我们只需简单地使用每个编码的函数作为输入序列。在自监督训练过程中,输入序列的跨度被随机掩蔽,目标序列(Raffeletal.,2019)作为相同的哨点标签和真实的掩蔽跨度/标签的连接而形成。
3.4 Model Architecture
CoTexT遵循由(Vaswani等人,2017)提出的序列到序列的编码解码器架构。我们初始化了由(Raffeletal.,2019)发布的基础T5模型,该模型有2.2亿个参数。我们以0.001的学习率和输入/目标长度为1024来训练模型。利用谷歌Colab上提供的TPUv2-8,我们使用推荐的模型并行度为2和批处理大小为128进行训练。
3.5 Multi-task Learning 多任务学习
该模型的训练采用最大似然目标(即使用“教师强制”(Wilmis和Zipser,1989)),而不管文本代码或代码文本任务。因此,对于CoTexT,我们利用多任务学习(Raffeletal.,2019)的潜力来完成代码总结和代码细化任务上的文本代码和编文生成。要指定我们的模型应该执行的任务,我们只需在输入序列中添加一个特定于任务的前缀。例如,在对每种编程语言的Code Summarization 任务进行微调时,我们只需在输入序列前为每个PL名称(即Java)添加一个前缀
4 Experiments
在本节中,我们将首先描述代码智能CodeXGLUE的基准数据集,然后解释我们所执行的任务的实验设置,并讨论每个任务的结果。评价数据集汇总见表3。
4.1 CodeXGLUE
CODE的通用语言理解评估基准(CodeXGLUE)(Luetal.,2021)是一个基准数据集,用于促进关于代码理解和代码生成问题的机器学习研究。该数据集包括代码智能任务(分类和生成)、用于模型评估的平台和用于比较的排行榜。CodeXGLUE有10个代码智能任务,包括代码-文本、文本-代码、代码-代码和文本-文本场景。对于CoTexT,我们专注于代码汇总、代码生成、代码细化和缺陷检测任务。
4.2 Evaluation Tasks
我们使用原始T5模型的设置来评估TPUv2-8上的编程语言和自然语言生成任务(Raffel等人,2019年)。每个任务的输入长度和目标长度见表2。
4.2.1 Code Summarization 代码摘要
对于代码摘要,其目标是为给定的代码片段生成一个自然语言描述。该任务包括一个CodeSearchNet 数据集(Husain等人,2019年),其中包含6种不同的编程语言:Python、Java、Javascript、PHP、Ruby、Go。这些数据来自公共开源的非分叉GitHub存储库,注释从函数文档中删除,如(Husainetal.,2019)所述。
4.2.2 Code Generation 代码生成
文本到代码生成的目的是生成一个给定自然语言描述的编码函数。该任务使用协编码数据集(Iyeretal.,2018)完成,这是一个众所周知的Java语言生成数据集。在数据集中,有一些包含自然语言描述、代码环境和代码片段的元组。目标是从Javadoc样式方法注释形式的自然语言描述中生成正确的Java函数。
4.2.3 Code Refinement 代码细化
代码细化,或代码修复,旨在自动纠正Java代码中的bug。我们使用了CodeXGLUE(Lu等al.,2021)发布的Bug2修复语料库,它将任务分为两个子集:中型和小型。小数据集只包含少于50个标记的Java代码函数。中型数据集包括具有50-100个标签的函数。
4.2.4 Defect Detection 缺陷检测
对于缺陷检测任务,我们试图对PL代码片段是否包含可能导致破坏性结果的漏洞进行分类,如资源泄漏或DoS攻击。该任务使用Devign数据集(Zhouetal.,2019),其中包含来自开源项目的C语编程语言。此数据集基于与安全相关的提交进行标记。有关注释过程的细节,请参见(Zhouetal.,2019)。
4.3 Experimental Setup
4.3.1 Baselines
我们将我们的模型与一些著名的预先训练过的模型进行了比较:
CodeGPT,CodeGPT改编基于GPT-2的架构和培训目标(布齐诺夫斯基和Vulic,2019)。CodeGPT在 CodeSearchNet 数据集(Luetal.,2021)上从头开始预先训练,而 CodeGPT-Adapted 从GPT-2检查点开始学习该数据集。
CodeBERT(Feng等人,2020)采用了与RoBERTa(Liuetal.,2020)相同的架构,但目标是尽量减少掩码语言建模的组合损失,并替换标签检测。
PLBART(Ahmad等人,2021b)是一个基于 Transformer 的模型。BART(Lewisetal.,2019)使用三种学习策略对PL语料库进行训练:标签掩蔽、标签删除和标签填充。
4.3.2 Performance Metrics
BLEU (Papinenietal.,2002)是一种执行机器翻译文本自动评估的算法。该方法计算了一个候选翻译与一组参考文本相比的 n 元相似性。类似于(Fengetal.,2020)和(Ahmadetal.,2021b),我们使用平滑的BLEU-4分数(?)对于代码摘要和语料库级BLEU分数。
CodeBLEU (Renetal.,2020)基于抽象语法树和数据流结构,旨在考虑代码的语法和语义特征。
精度 是指协调参考值的生成序列数与观测值总数的比值。
5 Results
5.1 Multi-Task Learning 多任务学习
我们首先报告了CoTexT在多任务学习任务中的结果,包括代码总结和代码细化。
5.1.1 Code Summarization
对于代码摘要任务,我们使用T5框架(Raffel等人,2019)执行多任务学习,对六种不同的编程语言(Ruby、Javascript、Go、Python、Java和PHP)的CoTexT。代码汇总任务的结果如表5所示。
首先,我们观察到只在一般域语料库(C4)上进行预训练的基t5在这个任务上是有效的。事实上,与CodeXGLUE排行榜上的所有其他相关模型相比,基础T5在BLEU-4度量上取得了更高的总体结果。这表明了领域特异性T5模型的重要性,我们希望与基础T5模型相比能获得更好的结果
我们进一步观察到,CoTexT在总体分数、特定于python的分数、java得分和go特定得分上达到了最先进的(SOTA)。虽然CoTexT的性能并没有明显优于其他预训练的模型,但我们观察到CoTexT在两种非常常见的编程语言(Python和Java)上实现了SOTA,同时在其他编程语言上仍然获得了竞争的结果。我们将此结果归因于与其他语言相比,Python和Java的大量训练数据(训练规模如表3所示)。基于这一结果,随着更多的训练数据可用,CoTeXT有可能进一步超越竞争对手的模型。
5.1.2 Code Refinement 代码细化
我们还通过执行多任务学习来进行代码细化来测试CoTexT。在这种情况下,中小型测试集都有一个任务注册表,其中对输入序列都带有相应的前缀。
各模型的代码细化结果如表6所示。对于这项任务,仅在自然语言文本上进行预训练的基础T5与其他基于转换器的模型相比表现得不佳。然而,在对大型编程语言语料库进行训练后,CoTexT的结果在中小型测试集的所有指标上都有了显著的改进。CoTexT在小测试集和中等测试集的精度度量上实现了SOTA。
5.2 Single-Task Learning 单任务学习
除了多任务学习之外,我们还使用代码生成任务和与缺陷检测相关的分类任务来评估CoTexT性能单任务学习。
5.2.1 Code Generation
在表4中,我们报告了代码生成任务的结果,其中自然语言被翻译成Java代码。结果表明,我们提出的模型基于 精确匹配(EM)、BLEU和CodeBLEU 的3个指标获得了SOTA结果。对于每个单独的度量,CoTexT仅略优于其他模型(例如,CoTexT和CodeGPT-Adapted 的EM均达到20.10)。然而,我们的模型在这3个指标上始终保持着优越性。在CoTexT之前,CodeGPT-Adapted 的 EM度量为SOTA,PLBART 的 BLUE/CodeBLUE度量为SOTA。从这个结果中,我们推断CoTexT在这个任务上具有最好的整体性能,并且在代码生成领域具有很大的潜力。
5.2.2 Defect Detection
缺陷检测结果见表7。具体来说,CoText的性能比之前的SOTA模型(PLBART)高出3.44%。对于这项任务,在大型编程语料库上的额外训练允许CoTexT优于所有其他模型,并实现SOTA结果。缺陷检测数据集由用C编程语言编写的代码组成,这些代码不包含在我们的训练数据中。我们的模型对类似的语言有很强的理解,因此能够在C中执行缺陷检测,与竞争对手的模型相比,它具有改进的结果。
6 Conclusion
在本文中,我们介绍了CoTexT,一种针对编程语言和自然语言的预训练过的语言表示。CoTexT专注于文本代码和代码文本的理解和生成。利用T5框架(Raffeletal.,2019),我们发现对大型编程语言语料库的预训练对于自然语言和编程语言领域内的一系列任务是有效的。CoTexT在4个CodeXGLUE代码智能任务上实现了最先进的结果:代码总结、代码生成、代码细化和代码检测。对于未来的工作,我们计划在更广泛的编程语言和自然语言生成任务上测试CoTexT,如自动完成或代码翻译。