代码的表示学习:CodeBERT及其他相关模型介绍
什么是CodeBert
CodeBERT是微软在2020年开发的BERT模型的扩展。它是一个用于编程语言(PL)和自然语言(NL)的双峰预训练模型,可以执行下游的(NL-PL)任务,这个模型使用6种编程语言(Python, Java, JavaScript, PHP, Ruby, Go)进行NL-PL的匹配训练。
本文将对论文进行简要概述,并使用一个例子展示如何使用,有关模型背后的数学和详细架构的更多详细信息,请参阅原始论文。在最后除了CodeBert以外,还整理了最近一些关于他的研究之上的衍生模型。
在深入研究这篇论文之前,让我们先介绍一下CodeBERT可以支持的下游任务用例和。这些用例中的一些已经在MS工具中实现,例如visual studio- IntelliCode。
CodeBert 的用例
代码转换或代码翻译:例如,当开发人员想要编写与现有python 代码相同的的 java 代码时,代码到代码翻译可以帮助翻译此代码块。
代码自动注释:可以帮助开发人员进行代码摘要。当开发人员看到不熟悉的代码时,模型可以将代码翻译成自然语言并为开发人员进行总结。
文本到代码:类似代码搜索的功能,这种搜索可以帮助用户检索基于自然语言查询的相关代码。除此以外还可以根据注释生成相应的代码。
文本到文本:可以帮助将代码域文本翻译成不同的语言。
BERT架构
BERT ((Bidirectional Encoder Representations from Transformers) 是谷歌在 2018 年提出的自监督模型。
BERT 本质上是由多个自注意力“头”组成的 Transformer 编码器层堆栈(Vaswani 等人,2017 年)。对于序列中的每个输入标记,每个头计算键、值和查询向量,用于创建加权表示/嵌入。同一层中所有头的输出被组合并通过一个全连接层。每层都用跳过连接相连,然后进行层规范化(LN)。BERT 的传统工作流程包括两个阶段:预训练和微调。预训练使用两个自监督任务:掩蔽语言建模(MLM,预测随机掩蔽的输入标记)和下一句预测(NSP,预测两个输入句子是否彼此相邻)。微调适用于下游应用程序,通常在最终编码器层之上添加一个或多个全连接层。
CodeBert 架构
BERT 很容易扩展到多模态,即使用不同类型的数据集进行训练。CodeBert 是 Bert 的双模扩展。即 CodeBERT 同时使用自然语言和源代码作为其输入。(与主要关注自然语言的传统 BERT 和 RoBERTa 不同)
双峰 NL - PL 对:训练 CodeBERT 的典型输入是代码和明确定义的文本注释的组合。
CodeBERT 描述了两个预训练目标:掩码语言建模 (MLM) 和替换标记检测 (RTD)。
使用掩码语言建模训练 CodeBERT:为 NL 和 PL 选择一组随机位置来屏蔽掉,然后用特殊的 [MASK] 标记替换所选位置。MLM 的目标是预测被掩盖的原始标记
带有替换标记检测的训练 CodeBERT:在原始 NL 序列和 PL 序列中,有很少的标记会被随机屏蔽掉。训练一个生成器模型,它是一个类似于 n-gram 的概率模型进行屏蔽词的生成。然后训练一个鉴别器模型来确定一个词是否是原始词(二元分类问题)。
完整文章:
https://avoid.overfit.cn/post/29087fd920d847fb88671bc5e1cdad27