预训练模型的源代码的实证比较

互联不一般哥 2024-07-04 19:17:10

An Empirical Comparison of Pre-Trained Models of Source Code

Changan Niu1, Chuanyi Li1, Vincent Ng1, Dongxiao Chen1, Jidong Ge1, Bin Luo1

1State Key Laboratory for Novel Software Technology, Nanjing University, Nanjing, China

引用

Niu C, Li C, Ng V, et al. An empirical comparison of pre-trained models of source code[C]//2023 IEEE/ACM 45th International Conference on Software Engineering (ICSE). IEEE, 2023: 2136-2148.

论文:[2302.04026v1] An Empirical Comparison of Pre-Trained Models of Source Code (arxiv.org)

摘要

虽然大量的预训练模型的源代码已开发成功并应用于近年来的各种软件工程(SE)任务,但我们对这些预训练模型的理解可以说是相当有限的。为了加深我们对这些的理解模型,我们进行了第一次系统的实证比较19个最近开发的预训练模型的源代码在13个软件工程任务上。为了获得对这些模型的更多见解,我们采用最近开发的 4 维分类训练模型,然后调查是否存在不同类别的预训练模型之间的相关性以及他们在不同 SE 任务上的表现。

1 引言

尽管深度学习成功应用于NLP等人工智能 (AI) 子领域近年来,但自然语言处理(NLP)和计算机视觉通常需要大量带注释的训练数据训练数百万甚至数十亿的网络参数深层神经模型。对于许多学习任务,包括软件工程(SE),获取带注释的数据是昂贵的。为了解决这个数据注释瓶颈,NLP研究人员提出了一个可以考虑的想法最近深度学习中最令人兴奋的发展之一研究,即预训练。而不是训练一个从头开始模型(即使用随机初始化的网络权重),这通常需要大量特定于任务的annotated数据,我们可以首先在一个或多个所谓的数据上对其进行预训练自监督任务(即带有注释数据的任务)可以自动生成,因此数量很大的训练数据很容易获得),因此其权重编码一般语言和常识知识语言,然后得到的预训练模型可以是F进行微调以使用。

尽管事实上近年来大量CodePTM已成功开发并应用于多种软件开发的任务,我们对CodePTMs的理解是可以说相当有限。目前,只有一项预调查Niu等人提供了经过训练的源代码模型。但它只是由原始模型对结果进行总结和分析的报告。虽然预训练模型是与任务无关,因此可以应用于不同的SE任务。根据设计,几乎所有CodePTM只有少数SE任务经过了评估。例如,TreeBERT有仅根据代码摘要和方法名称进行评估一代。这绝不是理想的:不知道如何TreeBERT执行剩余的SE任务,我们不执行知道它是否可以在任何方面取得最先进的结果那些任务。这反过来又意味着我们对这些的理解模型可能是部分的,并且当前最先进的。如果我们评估现有的对大多数(如果不是全部)可用的 SE 任务进行建模。甚至当两个预训练模型在同一台机器上进行评估时SE 任务,这些模型的头对头比较仍然可以,如果在不同的数据集上评估它们就会变得复杂可用于此任务。

为了增进我们对存在的理解为目标通过源代码的预训练模型,我们进行了第一个对19 个最新开发的系统进行了实证比较针对13个流行SE任务的CodePTM。为了在这些 CodePTM中获得更多见解,我们采用了最近开发的四种CodePTMs的维度分类来分类。现有我们研究中使用的19个CodePTM,随后研究类别之间是否存在相关性CodePTM的数量及其在 SE 任务上的表现。

2 实验设置

2.1 SE任务

表I列举了我们将在我们的项目中使用的13个SE任务对比实验。这些也是SE任务通常用于评估源的预训练模型代码。继之前的工作之后,在前两列中,我们从两个维度对每个任务进行分类:(1)是否任务涉及理解(Und.)或生成(Gen.);和(2) 任务假设的输入类型和类型产生的输出(I-O),其中C、NL和V表示代码,分别是自然语言和提取/预测值。表 I 还显示了缩写 (Ab.)、数据集和每个任务的主要评估指标。

为了使我们的实验数量可控比较,每当一个任务有多个数据集时,我们选择最受欢迎的一个(如表一中的灰色所示)除了代码搜索,我们选择A1而不是C3,因为A1是C3的过滤版本,A1上的结果更多反映模型的泛化能力。

表I:评估任务、数据集和指标的详细信息

2.2 评估指标

对于每个SE任务,我们将使用以下方法进行评估表I最后一列列出的标准指标。规模化和检索任务,Acc(准确度)等指标,F1、准确率 (P)、召回率 (R)、平均倒数排名 (MRR)使用平均精度 (MAP)。对于一代NLP 社区开发的任务、指标,例如困惑度 (PPL)、Levenshtein 编辑相似度(ES)、BLEU(B.),以及SE社区开发的变体,例如 CodeBLEU (C.B.),被使用。此外,一些生成任务还使用了 Accuracy 的变体进行评估其中之一表示序列是否生成模型与正确答案完全匹配(EM),并且其他,计算精度(CA),计算乘以假设函数产生与给定相同输入时的参考。

2.3 预训练模型

在本小节中,我们首先概述26个已经应用于SE任务的PTM,在我们的实证比较中我们将包含的19个预训练模型的源代码进行枚举。

(1) 结构(Arch.)。现有的网络架构可以分为长短期记忆(LSTM)、Transformer(TF),Transformer-Encoder(TE,仅编码器TF部分)和Transformer-Decoder(TD,解码器仅TF的一部分)。

(2) 模态是指PTM假定的输入类型。可能的形式包括代码、自然语言 (NL)和代码结构。这些不同的方式应该如何组合由底层组合决定策略,可以是一起 (+) 或独立(& )。

(3) 预训练任务(Tasks)。如果有多个任务使用时,任务可以联合学习 (+),顺序学习 (&),或者 (/)3。每个预训练任务的定义为在表III中给出。遵循 Niu 等人,在第一栏中我们根据任务的不同将这些任务分为四类输入方式:(1)代码感知或自然语言感知(C/NLA)任务,起源于 NLP,可以是应用于 NL 或代码序列来挖掘潜在信息来自 NL 或 Code 的信息; (2) 仅代码感知 (CA) 任务,只能应用于挖掘潜在信息代码文本; (3) 仅结构感知(SA)任务,其目标是学习代码结构的表示; (4) 十字模态感知 (CMA) 任务,旨在获取知识来自多种输入方式,并进一步细分为根据涉及的输入方式分为三个类别,即 Code-NL (CN)、Code-Structure (CS) 和 Code-NL结构(中枢神经系统)。在第二列中,我们对这些任务进行分类基于它们是否是生成性的(G,即生成令牌)或本质上是分类的(C,即预测标签)。

(4) 编程语言(PL)。我们对代码 PTM 进行分类取决于它们是否在一个PL上进行了预训练(Mono语言(单语))或多语言(多语种(多))。

在我们的实证比较中,我们排除了所有基于 LSTM 的源代码的模型,因为它们不代表状态,并保留所有基于Transformer的模型源表II中所示的代码(OSCAR 除外),因为OSCAR没有不针对高级 PL。这给我们留下了19个PTM我们的比较中的源代码。此外,我们还将呈现结果是五个未在源代码上进行预训练的模型。它们包括四个PTM-NL(RoBERTa、GPT-2、BART 和T5)和vanillaTransformer模型。比较这些模型的结果以及 19个PTM获得的结果源代码可以揭示一些收益通过源代码预训练获得每个SE任务。

表II:现有预训练模型的分类及其原始论文中报告的设定任务的性能

表III:预训练任务的分类和描述

2.4 实施细节

(1) 对于那些已公开预训练的 PTM模型和分词器,我们使用提供的.CuBERT,CodeBERT、GraphCodeBERT、DOBF、JavaBERT、CodeGPT改编,T5学习,PLBART,ProphetNet-Code,CoTexT,CodeT5、SPT-Code 和 UniXcoder 都属于此类。如果提供了多个模型,我们选择“基础”版本与原始论文中的方法一致。

(2) 其余 PTM 中,如果源代码和数据集提供了,我们根据设置介绍重新训练他们在原始论文中导出以获得预训练模型并分词器。TreeBERT是该类别中唯一的模型。

(3) 对于有源代码但没有数据集的人,我们自己以同样的方式收集所需的数据集正如原作者所做的那样,并根据原始论文中的设置。只有 CugLM 属于此类别。

(4) 如果没有提供源代码,我们重新实现并根据设置进行预训练(例如,分词器、超级原始论文中描述的参数和数据集)。他们是GPT-C、C-BERT、DeepDebug和SynCoBERT。

当评估下游 SE 任务时,这19个任务中的每一个模型根据该任务可用的训练数据进行微调。

3 实验评估

3.1 PTMS的评估:现状

应用 PTM 的研究现状,包括PTMs-NL、PTMs-C 和 CodePTMs,对于 SE 任务来说有点不满意。为了了解这一现状,我们展示了表II 每个PTM评估的每个数据集的ID上(有关数据集 ID 的说明,请参阅表 I)和原始论文中报告的相应结果。到避免让读者负担过多的信息,我们 (1) 省略当SE任务只有一个数据集时的数据集ID; (二)报告使用第一个评估指标的百分比结果(见表一); (3) 所有数据子集的平均结果数据集由多个子集组成。

下面我们根据显示的结果讨论现状在表二中,我们重点讨论源代码的 PTM鉴于它们是本文的重点。

a) 代码理解任务:下面的代码中常设任务,仅评估源代码的一个PTM异常类型和代码问答,所以我们有不知道其他模型在这些方面的表现任务。尽管在Code-to上评估了三个 CodePTM代码检索,他们都使用不同的数据集,从而使得直接比较是不可能的。因此,唯一的任务我们可以比较源代码的PTM是否有缺陷检测、克隆检测和代码搜索。对于缺陷检测,大多数模型在Devign上进行评估CoTexT 取得了最佳效果。对于克隆检测,大多数使用 SynCoBERT 在 BigCloneBench 上评估模型达到最佳结果。用于代码到代码检索 (POJ104) 和代码搜索 (CodeSearchNet和 AdvTest),Unixcoder是最先进的CodePTM。

b) 代码生成任务:代码生成任务是更普遍地用于评估源代码的 PTM。如何曾经,我们无法对七个中的三个进行有效的比较表二所示的生成任务:源的四个 PTM代码在代码完成时进行评估,但它们各自使用不同的数据集。仅在 Mutant 上评估了 T5 学习生成和断言生成。四个可比较的任务和数据集上,CodeT5 在三个方面取得了最好的结果其中:代码翻译 (CodeTrans)、错误修复和代码总结(CodeSearchNet)。剩下的任务,代码Generation,被UniXcoder击败。

c) 总体而言:由于源代码的不同 PTM在不同的下游任务和数据集上进行评估,它是仅根据结果无法直接比较它们现有论文中报道。因此,我们无法绘制更广泛适用的结论我们画的不可靠,我们无法知道最好的对许多此类 SE 任务执行源代码 PTM。因此,对这些数据进行公平、系统的比较PTM是本文工作的主要动机。

3.2 评估结果

对于每个SE任务,我们重复微调和测试使用三个随机数对每个模型进行三次实验种子并报告平均结果表V、VI、VII和VIII。具体来说,对于每个任务和该任务的每个评估指标,我们显示在“Cur”下和“新”列是现有报告的当前结果工作以及我们通过实验获得的结果,分别。对于每个“新”列,最好和次佳每种类型的预训练模型(即 PTM相应 SE 任务上的 NL、PTM-C 和 CodePTM)是分别用粗体和下划线标记。请注意,第一个每个表的行显示vanilla Transformer的结果。

表IV:当前 SOTA 和新 SOTA

3.3 讨论

通过我们的实验,我们获得了新的SOTA每个任务。在表 IV 中,我们显示了每个任务的当前 SOTA模型(源自现有工作),新的 SOTA 模型(来自我们的实验),以及它们相应的表9此外,我们将新的 SOTA 模型加粗,如果它与当前的SOTA模型不同。最后,我们展示新SOTA之间的绝对性能差异 “Δ”列下的模型和当前 SOTA 模型。

首先,所有13个SE任务的SOTA模型都属于CodePTM 类型,涵盖专门设计的模型捕获源代码的独特功能,除了CodeCompletion任务的SOTA模型,CodeGPT改编,属于PTM-C类型,涵盖了设计的模型对于自然语言,但在源代码上进行了预训练。其次,虽然已经提出了许多 PTM,但其中只有五个他们至少在以下方面取得了 SOTA 性能。第三,vanilla Transformer 相对于不同的 SE 任务的 PTM 是不同的: (1) onCloneDe检测(CD)、错误类型预测(ET)、代码搜索(CS)、代码翻译、断言生成和代码摘要化,vanillaTransformer 的性能被所有人超越PTM 类型(即 PTM-NL、PTM-C 和 CodePTM);(2)代码完成和突变生成,vanillaTransformer被所有 PTM-CandCodePTM 打败,但它的表现更胜一筹两个PTMs-NL、BART和T5;(3)关于Code-to-Code Retrieval(CR) 和代码问答 (QA)、vanillaTransformer不仅超越了PTM-NL(CR上的GPT-2和QA上的T5),但也击败一个 PTM-C(GPT-C 对于两个任务);以及(4)缺陷检测 (DD) 和错误修复、vanillaTransformer除了 PTM 之外,甚至还优于 CodePTM - NLandPTMs-C、beatingCugLM、DOBF、T5-学习、PLBART和ProphetNet-CodeonDD和CugLMonBug修复。

A.缺陷检测

SynCoBERT 击败 CoTexT 并成为新的 SOTAPTM 对于这个任务,准确率提高了 0.26。

1) 架构:而该分类的Top-2模型cationtask,SynCoBERT和GraphCodeBERT,都是TE基于,没有足够的经验证据让我们结论是 TE 是执行此任务的更好架构出于多种原因,它比 TD或TF更重要。首先,这个结论,我们需要比较两个模型的结果thatdifferonlyw.r.t.架构,但不存在两个PTM在我们的列表中仅有所不同。其次,基于TF的CoTexT,使用MLMa作为唯一的预训练任务,优于基于TE的UniXcoder,后者使用了另外三个复杂的预训练任务,ULM,MCL和CMG。最后,基于TF的DeepDebug比基于TE取得更好的结果仅使用代码作为输入且仅使用ML时的C-BERT预训练任务。

2) 模态:代码结构和N都显示对模型的性能有积极的影响这项任务,但它们的使用方式也很重要。举个例子,基于 TF 的 TreeBER 的性能优于某些 TF基于使用代码和 NL 的模型(例如 DOBF、T5 学习、PLBART)很大程度上归功于它对 AST 的使用。例如,基于 TF 的 CoTex 优于基于 TF 的 T5 学习相当大:CoText连接代码和对应的单一输入,而 T5 学习则处理来自这两种模式的特征作为单独的数据实例。这表明信息如何源自这些方式的使用会对绩效产生影响。

3) 预训练任务:一、新列中的结果该任务在表 V 中揭示了最有影响力的预训练任务是跨模态感知的分类任务因为它们正被 Top-5 模型使用。这些任务包括TEP/EP(由SynCoBERT和GraphCodeBERT使用),MCL(由SynCoBERT和UniXcoder使用),和NA(采用通过 GraphCodeBERT)。这个观察结果与从Cur列得出的结论,其中Seq2SeqMLM(旧SOTA模型使用的唯一预训练任务,CoTexT)似乎对缺陷检测有最大的促进作用。

B.克隆检测

此任务的新结果没有显着变化从目前的情况来看,除了 PLBART 之外,目前并列第二位,已经滑落至第四位。下降在 PLBART 的排名中似乎表明使用多个预训练任务比使用单个预训练任务更好此任务:而 Top-2 模型SynCoBERT和CodeT5,采用四个不同的预训练任务,PLBART使用DAE作为唯一的预训练任务。此外,新结果还使得我们来看看基于TD 的模型在此任务上的表现;特别是,最好的基于TD的 PTM、CodeGPT 适应的第七排名。

C.异常类型

该任务是其中唯一的多标签分类任务我们的13个SE评估任务。目前,只有一种模型(即CuBERT)已应用于此任务,这阻止了我们从得出有关相对表现的任何结论多标签分类任务上不同类型的模型像这样。幸运的是,我们的结果使我们能够绘制出一些新的结论:

1) 架构:最值得注意的是,根据新的结果,该任务的SOTA性能无法通过基于TE的模型。相反,基于TF的CodeT5,它将任务转换为文本到文本的形式,可以达到最佳效果。最好的基于TE的模型 (UniXcoder) 和最好的基于TD的模型(GPT-C)分别排名第二和第十,其准确率比CodeT5低1.53点和6.74点。专门针对异常情况类型,它不预测每个异常的索引,而是预测该异常的文本字符串。这样一来,CodeT5就将这个分类任务转化为生成 NL 任务之一,这正是CodeT5 擅长什么。相反,对于基于 TE 的模型(例如,SynCoBERT、UniXcoder、GraphCodeBERT),大多数他们在预训练中使用的任务是二元分类任务(例如,MCL、TEP/EP、NA),因此他们可能缺乏相关知识多标签分类所需的。

2) 模态:每种模态对该任务的影响也变得清晰起来。所有排名前 3 的模型(即 CodeT5、UniXcoder 和 GraphCodeBERT)使用 NL 作为输入之一模式,而仅使用代码和代码结构由其中两个(CodeT5 和 UniXcoder)开发。这似乎表明 NL 对这项任务有更好的积极影响比其他两种方式。

3) 预训练任务:分类预训练任务NSP和生成预训练任务FNP似乎对这项任务产生积极的影响。

D. 代码到代码检索

目前,相对优势和劣势不同的模型架构不可用,因为只有四种基于 TE 的模型在此任务上进行评估。然而,随着新的结果,基于 TE 的模型的结论在此任务上比其他架构有更多优势可以验证,因为该任务的Top-3模型都是TE基于(即 UniXcoder、SynCoBERT 和 GraphCodeBERT)。此外,基于TF和TD的模型的性能是也是可测量的。具体来说,性能最好的基于 TF 的模型 (CodeT5) 和基于 TD 的排名(CodeGPT-adapted)分别为第4名和第20名。

E.代码问答

新的SOTA模型与现款保持一致,即UniXcoder。但我们新报告的SOTA 性能提高了 0.2%MRRpoints。请注意MCL,SOTAmodelUniX 使用的预训练任务编码器,旨在区分两个输入是否匹配其他,这也是代码问答的目标任务。

表VI:代码翻译和断言生成的实验结果

表VII:错误修复、代码完成和突变生成的实验结果

G. 代码翻译

虽然模型是按照平均水平来排名的“Java toC”和“C to Java”子项目的 EMvalue数据集,我们发现两个子数据集上的Top-2模型均为PLBART和Code T510。此外,Top3-6型号从事此任务的有CoTexT、SPT-Code、DOBF和UniXcoder。

表VIII:涉及自然语言的代码生成任务的实验结果

4 结论

我们进行了第一次系统的实证比较现有的源代码预训练模型11。我们相信我们大规模评估的结果以及相关的问题cussion可以让SE研究人员有更好的理解现有PTM及其相对优势和劣势,以及对最先进技术的更好描述通常评估PTM的每个SE任务。

本文提供了许多有价值的发现:无法单独或完全基于现有结果与目前的发现相反。例如,我们发现基于TF的模型不仅在代码方面具有明显的优势生成任务也是代码理解任务。我们希望这篇论文可以为感兴趣的研究人员提供一个对当前状态的全面且可比较的见解。这个领域并激励他们设计更强大的预经过训练的源代码模型。

转述:冯晟

0 阅读:0

互联不一般哥

简介:感谢大家的关注