ICLR 2020 reject,后改为Learning and Evaluating Contextual Embedding of Source Code,发表在ICML 2020
Google Brain
CuBERT:开源代码和数据链接
和Bert无区别,只是替换了语料和微调的任务。
本文做的是代码预训练,提出了CuBERT(Code Understanding BERT)。在6.6M python files的语料上做训练。数据是public Github repository hosted on Google’s BigQuery platform。
预训练任务
Masked language modeling (MLM)
预测mask的token是什么
Next Sentence Prediction(NSP)
预测两个代码逻辑行是否为上下句的关系
微调任务
5个分类任务和一个其他任务
EMNLP findings, 2020
Zhangyin Feng, Daya Guo, Duyu Tang …
哈工大,中山大学,微软亚洲研究院
开源代码和数据
可用:预训练模型;在每种语言上进行微调比在6种语言上一起微调效果更优;
本文做的是代码预训练,提出了CodeBERT(a first large bimodal pre-trained model for natural language and programming language)。
模型架构
Follow Bert,RoBERTa,使用多层双向Transformer作为CodeBERT的模型架构,和RoBERTa-Base中的架构一样,其中的模型参数有125 Million(1.25亿参数)
input: [ C L S ] , w 1 , w 2 , ⋯ , w n , [ S E P ] , c 1 , c 2 , ⋯ , c m , [ E O S ] [CLS], w_1, w_2, \cdots, w_n, [SEP], c_1, c_2, \cdots, c_m, [EOS] [CLS],w1,w2,⋯,wn,[SEP],c1,c2,⋯,cm,[EOS]
其中的 w i w_i wi表示句子的token, c i c_i ci表示代码的token
output: 每一个token基于上下文的表示;[CLS]的表示,代表聚合的序列表示
数据集来自CodeSearchNet,其中的2.4M bimodal data的形式为
预训练的任务
Masked Language Modeling (MLM)
输入是NL-PL pair,在其中随机选择一些位置mask掉。MLM的目标是预测被mask掉的原始token。
Replaced Token Detection (RTD)
使用bimodal和unimodal数据做训练,包括两个generator和一个discriminator,generator是随机选择位置替换成其他token,discriminator是判断某一位置是否被替换。
实验部分(模型微调)
对于不同的下游任务,会有不同的设置。如:在code search任务中,输入是和预训练阶段一致的,然后使用输出的[CLS]向量来表示代码和自然语言查询之间的相关性。再比如:在code-to-text generation任务中,使用encoder-decoder架构,并用CodeBERT初始化encoder的参数。在实验部分,作者给出了四个下游任务:
Natural language code search
数据形式为 ( c , w ) (c, w) (c,w) pair,与预训练的输入一样,该正样本对应的负样本可以通过 ( c , w ^ ) , ( c ^ , w ) (c, \hat{w}), (\hat{c}, w) (c,w^),(c^,w)来构造。该任务建模为一个二分类任务,模型输出的[CLS]表示后,再接上一层softmax,得到该pair是否匹配。
NL-PL probing
该任务是想要探究模型预测mask掉的token是什么的能力。输入是(c, w) pair,但这里的pair是经过筛选的。包含两个方面的筛选,一方面是NL side,输入是
Code documentation generation
encoder-decoder架构,其中的decoder是6层,768个隐层神经元,12个attention heads的设置。
Generalization to programming languages not in pre-training
预训练的语言包括6种,不包括C#。作者利用CODE-NN中的数据集,包含66015 pairs of questions and answers,结果比CODE-NN效果稍好,但不如code2seq(文中的解释是因为code2seq包含了AST path的信息,而这里只用到了codesequence的信息。)
优点
和ICLR 2020被拒稿的工作相比,这个工作有三个不同点:1. cross modal,既用到了bimodal的语料,又用到了unimodal的语料;2. 6种编程语言;3. 预训练的任务有所不同,没有NSP,而是换成了replaced token dection。
CoRR 2020
Daya Guo, Shuo Ren, Shuai Lu, Zhangyin Feng, …
中山大学,北航,北大,哈工大,微软亚洲研究院
可用:关于data flow结构的预训练任务,微调任务(代码克隆检测,不同语言之间代码翻译)
Motivation
本文做的是代码预训练,在此之前的两个代码预训练的工作分别是:
基于以上两个工作,作者认为之前的代码预训练模型都只是将代码作为序列来考虑,忽略了代码中的结构信息。本文将代码的data flow信息引入预训练过程,并且设计了有关结构预测的预训练任务。
具体方法
模型架构
和RoBERTa架构一样,12层Transformer,768个隐层神经元,12个attention head。
输入包含三个部分:{[CLS], W, [SEP], C, [SEP], V}
预训练框架如下:
预训练任务
模型微调
作者给出了四个下游任务:
natural language code search
给定自然语言查询,模型找出最匹配的代码段。
code clone detection
数据集:BigCodeBench 901724/416328/416328 examples for training/validation/testing
输入:source code and data flow
输出:[CLS]的表示,然后计算点乘,得出两段代码是clone的概率。
在微调阶段,学习率5e-5,batch size=128,Adam optimizer
code refinement
分析
arxiv 2020
Paras Jain, Ajay Jain, Tianjun Zhang, Pieter Abbeel, Joseph E. Gonzalez & Ion Stoica
加州大学伯克利分校
关键词:code pre-training, syntactically diverse but functionally equivalent programs, contrastive training
Motivation
在此之前的代码预训练工作包括:CuBERT和CodeBERT,它们使用和BERT一样的架构和类似的预训练任务,比如MLM(Masking Language Modeling,预测mask的token)任务。这使得预训练阶段模型关注的是浅层的语言推理,表现在代码中就是在基于代码token级别进行表示。
然而很多下游任务需要理解一段代码的功能,MLM预训练任务存在欠缺。所以,作者设计了基于代码功能表示的预训练任务。
具体方法
作者假定:在下游任务中,具有相同的功能的代码应该有类似的向量表示。
【programs with the same functionality have the same underlying representation for downstream code understanding tasks.】
基于此,在预训练模型前,需要准备大量的正负样本,正样本是一对功能相同的代码,负样本是一对功能不同的代码。
构造正样本可以有两种方式:
在类似github的代码资源库中搜索与给定代码相似功能的代码,组成pair,作为正样本。
但这种方式需要在大量资源中搜索出功能相似的代码,复杂度较高,并且搜索到的代码不一定功能相同。
通过source-to-source compiler transformation工具生成和给定代码功能相同,但形式不同的代码。
预训练的使用的是JavaScript 1.8M 无标注的方法。(self-supervised training)
其中的f_q表示对代码进行表示的encoder,可以是BiLSTM,Transformer,RoBERTa等。
下游任务:
创新点
可改进的点
后续关注工作
ICSE 2021
Nghi D. Q. Bui, Yiyun Yu, Lingxiao Jiang
Singapore Management University, The Open University
Key words: Doc2vec(skip-gram), self-supervised code representation, similar ASTs will have similar subtrees
python代码
研究动机
目前代码表示的工作可以分为两类:
所以,作者提出InferCode,在大规模无标签的代码数据上自监督地训练模型,只要代码可以转换为AST,InferCode就可以作为encoder得出代码表示。预训练得到的InferCode encoder在5个下游任务中表现较好。
具体方法
key intuition: similar ASTs will have similar subtrees.
Doc2Vec (Le, Mikolov, 2014)的思想:
本文引用Doc2Vec的思想,将代码的AST视为文档,AST中的子树视为词。目标是最大化给定AST表示下的子树表示的最大对数似然。
步骤为:
其他注意点:
下游任务(3个无监督,2两个有监督)
arxiv 2021
Baptiste Roziere, Marie-Anne Lachaux, Marc Szafraniec, Guillaume Lample
Facebook AI Research, Paris Dauphine University
研究动机
目前基于BERT的代码预训练,预训练任务中基本都会包含Masked language modeling(MLM)。该任务在nlp领域应用广泛,即给定一个自然语言序列,随机替换掉其中的一些token,由模型预测替换掉的位置原来的token是什么。由于源代码相对于自然语言来说,更加规范,变量之间存在关联,所以预测mask掉的token更容易。这就意味着,如果使用MLM作为代码预训练的任务,模型可以学到的信息就相对较少,对于代码理解来说是不利的。至于其他的代码预训练模型中使用到的Next sentence prediction(NSP)和Replaced token detection(RTD),都是从nlp领域引入的,没有考虑代码的特性来设计特定的预训练任务。
其次,代码相对自然语言来说更规范,更具结构性,mask掉的token更容易被预测出来,如:mask掉一个右括号,可能根据括号的匹配,就可以被预测出来,但这对于模型学习代码特征来说是不利的。
所以,本文提出了一个特定于代码的预训练任务:code deobfuscation。也就是输入模糊化后的代码,模型试图还原原先的代码。
code obfuscation:是指在保证其主要功能的前提下,修改源代码,或者缩短代码,以增加人们理解代码的难度。
具体方法
下图为MLM任务和DOBF任务的对比。
the model is trained to generate the sequence: FUNC_0 bfs | VAR_0 graph | VAR_1 root | VAR_2 visited | VAR_3 queue | VAR_4 neighbor | VAR_5 node.
预训练任务中,mask的比例在(0, 1)之间:
模型架构:seq2seq model with attention
BERT(12 layers, 12 attention heads, and a hidden dimensionality of 768,还有一个6 layers, 8 attention heads, and a hidden dimensionality of 1024.)
数据集:Google BigQuery中的19G python和26G java数据
Baselines: CodeBERT 和 TransCoder
下游任务:
分析
其他参考文献
[1] Roziere, B., Lachaux, M.-A., Chanussot, L., and Lample, G. Unsupervised translation of programming languages. Advances in Neural Information Processing Systems, 33, 2020.
[2] Lacomis, J., Yin, P., Schwartz, E., Allamanis, M., Le Goues, C., Neubig, G., and Vasilescu, B. Dire: A neural approach to decompiled identifier naming. In 2019 34th IEEE/ACM International Conference on Automated Software Engineering (ASE), pp. 628–639. IEEE, 2019.
[3] David, Y., Alon, U., and Yahav, E. Neural reverse engineering of stripped binaries using augmented control flow graphs. Proceedings of the ACM on Programming Languages, 4(OOPSLA):1–28, 2020.
[4] Codexglue: An open challenge for code intelligence. arXiv, 2020.
ESEC/FSE 2020
Alexey Svyatkovskiy, Shao Kun Deng, Shengyu Fu, Shengyu Fu (微软)
keywords: GPT-C (GPT model pretrianed on code corpus), multi-type code completion, multilingual model
研究动机
本文的任务是代码补全,目前代码补全的工作存在两点不足:
针对以上不足,本文有三个贡献点:
具体方法
GPT-C
模型:GPT-2
数据集:12亿行Python, C#, Javascript, TypeScript语言的代码
分词方式: Byte-Pair Encoding (BPE),应对OOV问题
IntelliCode Compose
将sequence decoding的过程视为树的搜索过程,直至 token出现
Multilingual model
比较了四种建模多语言的方式:
1)忽略语言之间的不同,用统一的模型训练多种语言【实验表明:这种方式比单独对单语言训练效果更差】
2)加入language type embedding信息,每种语言用一个向量表示,和原本的token embedding等结合。
3)在每个训练样本的最开始加上一句"lang * remaining token sequence"
4)在预训练时,加入一个language type classification任务