论文笔记 CodeT5

文章的全名叫做CodeT5:Identifier-aware Unified Pre-trained Encoder-Decoder Models for Code Understanding and Generstion。

原文链接

论文StrucCoder给出了一个概念叫做Struct-aware,译过来就是结构感知能力,意思就是在训练的时候给模型的各个模块如embedding、attention、tasks等等中加入能够和代码结构相关的信息,这样模型就能够很好地区别于普通的Seq to seq模型从而学到比较好的代码表征。目前在处理代码翻译代码生成的任务上具有结构感知能力的表现优秀的模型有GraphCodeBert,CodeT5和StructCoder,在之前我已经向大家介绍过GraphCodeBertStructCoder,借这篇文章表达我对CodeT5的理解。

通过文章标题,CodeT5是一个集成的、经过预训练的、对标识符有感知能力的编解码器模型,这个集成的意思就是CodeT5既可以处理代码理解的任务如克隆检测、也能处理代码生成的任务如代码摘要,代码修复,代码翻译等等。CodeT5这篇文章没有特别复杂的数学计算,当然是基于大家之前对Transformer和bert的理解的基础上,里面更多的体现了作者在设计和测试模型时的一个实验思想。

目录

设计思想

预训练

(a)MSP(Masked Span Predicion)

(b)IT(Identifier Taggng)

 (c)MIP(Masked Identifier Prediction)

(d)Bimodal Dual Generation

Fine-tuning

单任务迁移学习

多任务学习

实验

下游任务

代码摘要

代码生成(NL-PL)

代码翻译和代码修复(PL-PL)

理解任务

预训练任务分析

总结


设计思想

CodeT5是基于T5改进的,T5在自然语言的理解和生成任务上有很好的表现;

在CodeT5能够很好承载代码结构信息的是标识符。首先标识符因为名字的不同可以区别于其他标识。然后从开发者的角度来看,标识符的名字在一定程度上代表了它的功能。比如一个函数的名字叫做binarySearch,那么我们很容易想到这个函数应该是用来实现一个二分查找的功能的。再比如,i、j、k通常作为循环的迭代变量;

CodeT5的输入中加入了注释序列,一方面,函数的功能或者变量的含义可以从注释中获取,另一方面,加入注释序列,模型可以很好处理多模态训练任务。

预训练

 上图概括了预训练的所有过程。

首先输入是双模态的,即注释和代码拼接起来再编码的。模型能够对标识符有感知能力也是在预训练阶段通过预训练任务训练出来的:

(a)MSP(Masked Span Predicion)

主要的思想对于输入序列,采样15%的token给mask掉,在mask的过程中确保是掩盖整个单词。这也是大部分的模型在预训练阶段选用的任务来提高模型的理解能力。MSP的损失函数如下:

不做深入解释了,大致解释基于已被mask的输入序列和已经预测出来的被mask词去最小化下一个词的预测损失。

(b)IT(Identifier Taggng)

因为标识符在本本模型中有着很高的地位,为了让模型能够识别哪个是标识符,因此开发者设计标识符打标任务。需要注意的是这个任务仅仅由编码器完成。

IT的损失如下,同传统的序列打标的损失函数一样,使用的是交叉熵:

 (c)MIP(Masked Identifier Prediction)

基于“对一个变量,改变它的名字并不会改变它在代码中作用”这一个思想,开发者设计了这个任务。首先把输入的代码中所有标识符都mask掉,但是要注意同一个名字的标识符要用同一个mask,如上图名字为mid的标识都用mask5来掩盖。

开发者认为这个任务是具有挑战性的,因为模型需要根据代码的上下文和注释来预测这个标识符的名字。损失函数如下:

(d)Bimodal Dual Generation

在之前几项任务中,解码器只能够看到离散的mask,而实际的生成任务是需要生成一个流畅的代码或者自然语言描述,为了拉近预训练与实际任务的距离,开发者设计了这项任务。在输入序列中mask掉整个代码或者自然语言,并且让解码器复原。

Fine-tuning

在大规模无标注的数据集上预训练后,就需要通过下游任务来微调模型。这里通过迁移学习和多任务学习来微调模型。

单任务迁移学习

迁移学习指的是用来处理某一个任务的模型去学习另一个任务,以提高模型的泛化能力和表征能力。和代码相关的任务通常被划分代码生成和代码理解任务。在把理解任务的输出看作是一个单一元素的序列后,CodeT5基于本身的seq2seq模型就能够很好驾驭生成任务和理解任务。

多任务学习

如果把单任务迁移学习看作是模型对不同任务串行训练的话,那么多任务学习就可以看作多任务并行训练。多任务学习指的是多个任务公用一个模型,只在输出的时候有自己的一些网络层,在一定程度可以提高训练效率,减少训练多个模型权重的开销。

通常,对要训练的任务的不同数据集按照一定的分布(通常是多样分布)采样,然后以特定的标识让模型知道自己正在学习什么任务,最后输入模型进行训练。

实验

下游任务

代码摘要

只与训练编码器的模型(RoBERTa,CodeBERT,DOBF)在项任务中效果差于编码器解码器都训练的模型(PLBART,CodeT5) 。

代码生成(NL-PL)

 GPT是只训练解码器的模型。

代码翻译和代码修复(PL-PL)

从代码修复任务上,直接拷贝源代码也能够获得很高的BLEU评分,说明BLEU并不是用来评价代码生成任务的完美的准则。 

理解任务

理解任务包括了瑕疵检测和克隆检测。

从以上几项下游任务的对比看出,编解码器都预训练的模型效果优于其他模型,CodeT5可以适用于各项下游任务。 

预训练中,加入双模态生成任务对于代码摘要和代码生成任务有帮助,但是在有时候也会降低PL-PL生成任务的评分,这或许是因为双模态生成学习到的是自然语言与代码语言的一个对齐关系。因此加入双模态生成任务后,模型更加侧重于同时含有代码语言和自然语言的任务。

预训练任务分析

对MIP,MSP和IT作消融实验:

从中可以发现移除任意一个组件都会或多或少降低各项任务的评分,除了移除MSP反而升高了瑕疵检测任务的评分。 这说明了MSP对于生成任务是比较重要的。

移除MIP对瑕疵检测的任务损伤是最大的,也说明了MIP更侧重于代码语义的理解。

此外,由于MIP和MSP都是对输入序列中的一些token掩盖掉,为了探究这两项任务是否会有重合,开发者还做了一项对比实验。

 在这项实验中,开发者使用在预训练阶段移除了MIP或者MSP的CodeT5去处理MSP和MIP任务。从Acc一栏发现只预训练该任务的模型只能很好的处理本项任务,并不能很好的处理另一项任务。“#Pred M”代表了预测出来的数量同掩盖时用的不同mask数量的相同的准确率,从这一栏发现在预训练阶段只训练MIP的模型在处理MSP任务时“#Pred M”也有很高的准确率,这可能是因为:在MIP中,相同的标识符使用的是同一个Mask,是一个多对一的关系,而MSP是一对一的关系,多对一的关系预测包含了一对一关系的预测。

总结

CodeT5是一个对标识符有感知力的模型,其原型是T5。在经过编解码器预训练、具有迁移学习和多任务学习的微调后,CodeT5能够很好的处理多项任务并且相比于之前的Baseline模型都达到了SOTA效果。

代码智能属于自然语言处理的一个分支,目前仍然是一个新兴的研究领域并且受到学术界和公业界的广泛关注。代码智能旨在提高程序质量和软件开发流程的效率,让程序员告别繁复的工作。虽然CodeT5目前有一个很高的性能,但是仍然具有以下几个需要谨慎考量的点:

偏见:因为数据集绝大部分来源于github上的仓库,里面的变量名,注释、函数名、类名形形色色,难免会有名族和性别上的歧视;

计算消耗:训练CodeT5的成本巨大,训练过程中产生了49.25kgCO2,对环境产生一定威胁;

过度依赖:CodeT5提供了一个自动化编写代码工具,这可能会让程序员对此产生依赖。如果程序员过分依赖此工具,对其生成的代码缺乏思辨,一旦CodeT5生成了某个隐藏的bug,那么对于后期的debug的开销和对于安全的威胁都是巨大的;

安全隐患:由于数据集来源于github,那么其中可能包含一些敏感信息,比如政治和个人隐私。虽然训练数据已经经过多轮清洗,但是仍然会有一些信息残留。此外,由于CodeT5这样的生成模型的不确定性,它可能会产生一些易受攻击的代码会对软件产生有害影响。

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nbyvy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值