CodeT5: 一种新型的代码理解与生成模型

释放双眼,带上耳机,听听看~!
本文介绍了最新的编程语言模型CodeT5,该模型结合了对代码的理解与生成任务,并通过预训练任务和开发者指定的标识符对来提升代码语义的学习。实验结果表明CodeT5在CodeXGLUE的多个任务上取得了最先进的成果。

导语

1 简介

最近,很多研究尝试将NLP领域的PLM模型引入到编程语言领域,如CodeBERT等,但这类模型仅利用了Encoder或者Decoder,而且在预训练时使用的方法大多与训练自然语言的方法类似,无法很好的利用代码丰富的结构信息,导致模型无法很好的学到代码的语义。

CodeT5: 一种新型的代码理解与生成模型

本文提出了CodeT5模型,这是一个考虑代码token类型的encoder-decoder模型。除了最基本的denoising seq2seq预训练目标,作者还提出利用开发者在代码中指定的标识符(identifiers)和代码对应的注释作为NL-PL对齐语料。预训练语料与CodeBERT相同,既有双模态语料,也有代码的单模态语料。Fine-tune则是在CodeXGLUE的相应下游任务上进行。

本文的贡献如下:

  • 本文提出了CodeT5,以支持与编码相关的理解和生成任务,并且还允许多任务学习。
  • 文本提出了一种新颖的标识符感知预训练目标,该目标考虑了来自代码的关键标记类型信息(标识符)。此外,本文提出利用源代码中自然提供的NL-PL对来学习更好的跨模态对齐。
  • 大量的实验表明,CodeT5在CodeXGLUE的14个子任务上产生了最先进的结果。进一步的分析表明,CodeT5可以通过提出的识别标识符的预训练更好地捕获代码语义,双模态双向生成主要有利于NL↔PL任务。

2 相关工作

3 CodeT5

3.1 Encoding NL and PL

对于双模态数据,也是使用[SEP]来分隔开,其格式如下:

x=([CLS],w1,…,wn,[SEP],c1,…,cm,[SEP])x = ([CLS], w_1, …, w_n, [SEP], c_1, …, c_m, [SEP])

对于PL单模态数据,NL部分则是空。

3.2 预训练任务

总共使用4种预训练任务。

  • MSP(Masked Span Predicion)
  • IT(Identifier Taggng)
  • MIP(Masked Identifier Prediction)
  • Bimodal Dual Generation

CodeT5: 一种新型的代码理解与生成模型

Masked Span Prediction

如图2(a),该任务以15%的概率随机MASK掉一个原输入中的span,该span的长度为1到5中的均匀抽样得到,并且采用whole word mask技术,以避免将一个完整词的部分token给mask掉。

CodeT5: 一种新型的代码理解与生成模型

Identifier Taggng

如图2(b),该任务目的是通知模型该代码标记是否是标识符(即用户定义的变量名),这与一些开发辅助工具中的语法突出显示精神相似。该任务即为一个二分类的Sequence labeling。

CodeT5: 一种新型的代码理解与生成模型

Masked Identifier Prediction

如图2(c),该任务屏蔽PL段中的所有标识符,并对所有出现的特定标识符使用唯一的标记 (obfuscation,混淆的思想,,即改变标识符名称不会影响代码语义)。然后将唯一标识符和sentinel tokens排列到目标序列I中再预测。

CodeT5: 一种新型的代码理解与生成模型

Bimodal Dual Generation

如图2(d),该任务即NL-PL的双向seq2seq生成,即由注释文本和代码字段进行相互转换。

3.3 Fine-tuning CodeT5

作者介绍了两种Fine-tune的方式:

  • Task-specific Transfer Learning
  • Multi-task Learning

Task-specific Transfer Learning

与代码相关的任务可以分为生成任务和理解任务。对于前者,CodeT5可以自然地使用Seq2Seq框架进行调整。为了理解任务,作者研究了两种方法,一种是将标签生成为unigram目标序列(就是seq2seq输出label,像原始T5那样),另一种是根据最后一个解码器隐藏状态,从类标签词汇表中预测它。

Multi-task Learning

本文还通过一次在多个任务上训练共享模型来探索多任务学习设置,为所有任务采用相同的统一模型,而不添加任何特定于任务的网络.为了通知模型它正在处理哪个任务,作者设计了任务控制代码的统一格式,并将其预先放入源输入中,如图1所示。例如,使用“Translate Java to CSharp:”作为从Java到CSharp的代码到代码转换任务的源提示符。

由于不同的任务有不同的数据集大小,作者采用平衡抽样策略。对于N个数据集(或任务),在概率{qi}i=1N{q_i}_{i=1}^N的情况下,定义以下抽样的多项分布:

CodeT5: 一种新型的代码理解与生成模型

其中nin_i为第i个任务的样例数,α设为0.7。

4 实验设置

4.1 预训练数据集

与之前的工作如CodeBERT类似,采用CodeSearchNet作为预训练数据集。其统计指标如下图:

CodeT5: 一种新型的代码理解与生成模型

4.2 Code-specific Tokenizer

绝大多数PLM采用BPE形式的Tokenization策略,本文作者在自己的预训练数据集上重新训练了一个和原始T5 Tokenizer一样词表大小的BPE Tokenizer,作者发现相比于原始T5的Tokenizer,使用他们重新训练的BPE Tokenizer,可以大幅度减少下游任务的序列长度(30%-45%)。这将加速训练,特别是有助于生成任务,因为预测的序列更短。

4.3 下游任务和评价指标

作者主要在CodeXGLUE上进行实验,主要包括:

  • Code summarization
  • Code generation
  • Code translation
  • Code refinement
  • defect detection
  • clone detection

4.4 比较的模型

主要对比三种类型的模型:

  • Encoder-Only:ROBERTA、CodeBERT、GraphCodeBERT、DOBF等;
  • Decoder-Only:CodeGPT-2、CodeGPTadapted;
  • Encoder-decoder:PLBART;

4.5 模型配置

5 实验结果与分析

5.1 CodeXGLUE Downstream Tasks

实验结果如下图:

CodeT5: 一种新型的代码理解与生成模型

CodeT5: 一种新型的代码理解与生成模型

5.2 Effects of Bimodal Dual Generation and Multi-task Learning

双模态预训练为CodeT5-small和CodeT5-base上的代码摘要和生成任务带来了一致的改进。然而,这种预训练任务对PL-PL生成和理解任务没有帮助,甚至有时会略微影响其表现。作者预计这是因为双峰双生成学习了PL和NL之间更好的对齐,这自然有利于涉及PL和NL的前任务。作为一个副作用,这个目标可能会使模型偏向PL-NL任务,并影响其在PL-PL任务上的性能。

在多任务学习中,除了代码转换和缺陷检测外,它通常可以改进大部分的下游任务。特别是,它在很大程度上提高了代码摘要的性能,这并不奇怪,因为代码摘要占子任务的最大比例(13个子任务中的6个),因此从多任务学习中受益最多。此外,作者观察到多任务学习可以持续地提高代码细化的性能,这可能得益于中小细化数据的联合训练。另一个可能的原因是带有缺陷检测的多任务训练将使模型能够更好地理解用于缺陷检测的代码语义,这也是代码改进的必要中间步骤。

5.3 Identifier-aware预训练的分析

消融实验通过消除三个目标(掩码跨度预测(MSP)、标识符标记(IT)和掩码标识符预测(MIP))中的每一个来比较CodeT5-small在四个选定任务上的性能。如表6所示,删除一个目标会降低所有任务的性能。具体来说,删除MSP将大大降低所有生成任务的性能,但反而会提高缺陷检测的性能。这表明掩码跨度预测对于为生成任务捕获语法信息更为关键。相反,删除MIP将对缺陷检测任务造成最大的伤害,这表明它可能更多地关注代码语义理解。通过结合这些目标,CodeT5可以更好地从代码中捕获语法和语义信息。

CodeT5: 一种新型的代码理解与生成模型

图4进一步提供了来自CodeT5及其变体的输出。可以观察到CodeT5可以正确地生成准确的函数,而没有MIP和IT的模型无法恢复“s2”和“hasField”的标识符。这表明Identifier-aware预训练可以更好地区分和利用标识符信息。

CodeT5: 一种新型的代码理解与生成模型

作者还研究了identifier tagging性能,发现它对所有PLs都达到了超过99%的F1,这表明CodeT5可以自信地区分代码中的标识符。

然后我们检查MSP和MIP任务是否会有冲突,因为它们使用相同的哨点令牌进行屏蔽。在标识符屏蔽中,一个唯一标识符的所有出现都被替换为相同的哨兵标记,与span预测中的一对一映射相比,这导致多对一映射。我们比较了用MSP或MIP预训练的模型,以及表7中这两个任务的模型。我们报告了预测精度,以及它们生成与哨点令牌相同数量预测的频率之比。我们观察到,仅使用MIP或MSP进行预训练会使模型偏向该任务,当应用于其他任务时,预测的准确性较差,预测数量不匹配。有趣的是,我们发现MIP-only目标在MSP任务中比MSP-only目标在MIP任务中可以更好地恢复正确的预测数量,这意味着它更容易从多对一映射适应到一对一映射,而相反则很难。最后,将它们结合起来,可以帮助我们的模型在这两个任务之间做出很好的权衡。

6 总结

本文提出了CodeT5,这是一个预训练的编码器-解码器模型,它集成了来自代码的token类型信息。本文提出了一个新的识别预训练目标,以更好地利用标识符,并提出了一个双模态双向生成任务,以使用代码及其注释学习更好的NL-PL对齐。使用统一模型可以支持代码理解和生成任务,并允许多任务学习。实验表明,在大多数CodeXGLUE任务中,CodeT5明显优于所有先前的工作。进一步的分析还揭示了它在各种编程语言之间更好的代码理解能力。

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

OpenAI注册攻略及API接口使用详解

2023-12-15 17:15:14

AI教程

如何使用TensorFlow构建一个Translator模型

2023-12-15 17:27:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索