目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0b6db4b31616dee1c15c5cf100aa821e.png)
发表于EMNLP 2021
paper地址:https://aclanthology.org/2021.emnlp-main.685.pdf
代码地址:https://github.com/salesforce/CodeT5
一、简介
当前的方法要么依赖于仅编码器(或仅解码器)的预训练,这对于生成(或理解)任务来说是次优的,要么以与 NL 相同的方式处理代码片段,而忽略了 PL 的特性,例如 token 类型。论文提出的 CodeT5,是一个统一的预训练 encoder-decoder Transformer 模型,它可以更好地利用从开发人员分配的标识符传达的代码语义。模型采用统一的框架来无缝支持代码理解和生成任务,并允许多任务学习。此外,论文还提出了一种新的标识符感知预训练任务,使模型能够区分哪些代码 token 是标识符,并在它们被 mask 时恢复它们。
此外,论文还利用用户编写的代码注释和双峰双生成任务进行更好的 NL-PL 对齐。实验表明,CodeT5 在理解代码缺陷检测和克隆检测等任务以及包括 PL-NL、NL-PL 和 PL-PL 在内的各个方向的生成任务方面明显优于先前的方法。
二、预训练
a. Identifier-aware Denoising Pre-training
用了类似于T5的Masked Span目标,该目标随机掩蔽具有任意长度的Span,然后在解码器中结合一些sentinel tokens预测这些Masked Span。(图中的a. Masked Span Prediction (MSP))
b. Identifier Tagging (IT)
告知模型该代码token是否为标识符,与一些开发辅助工具中语法高亮显示的精神类似。
c. Masked Identifier Prediction (MIP)
与MSP中的随机span mask 不同,MIP屏蔽PL段中的所有标识符,并对所有出现的特定标识符使用唯一的标记 (obfuscation,混淆的思想,,即改变标识符名称不会影响代码语义)。然后将唯一标识符和sentinel tokens排列到目标序列I中再预测。
d. Bimodal Dual Generation
预训练阶段解码器只看到离散的masked spans和标识符,但在下游任务中解码器需要生成流畅的NL文本或语法正确的代码片段。为了缩小预训练和微调的差距,利用NL-PL双向数据训练模型的双向转换和优化模型,将NL→PL生成和PL→NL生成视为两项任务,对每对NL-PL双峰数据,构造两个方向相反的训练实例,并添加语言id、Bimodal Dual Generation可以视为一种特殊的span mask(屏蔽来自双峰输入的全部NL或PL段)。目的是提高NL和PL之间的一致性。