找回密码
 立即注册
搜索

​新预训练模型CodeBERT出世,编程言语和自然言语都不在话下

选自arXiv

作者:Zhangyin Feng等

机器之心编译

参与:魔王、蛋酱

对于自然言语处理从业者来说,BERT 这个概念一定不生疏,自从诞生以来,它在诸多义务检测中都有着非常优秀的表现。近日,来自哈尔滨工业大学、中山大学和微软亚洲研讨院的研讨者合作提出了一个可处理双模态数据的新预训练模型 CodeBERT,除了自然言语(NL),编程言语(PL)如今也可以停止预训练了。

在这篇名为《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》的论文中,来自哈工大、中山大学和微软的研讨人员详细引见了这一新预训练模型,该模型可处理双模态数据:编程言语(PL)和自然言语(NL)。

CodeBERT 学习可以支持下游 NL-PL 运用的通用表示,比如自然言语代码搜索、代码文档生成,经实验 CodeBERT 模型在两项义务均获得 SOTA 效果,同时研讨者构建了 NL-PL 探测数据集,CodeBERT 在 zero-shot 设置中的功能表现也持续优于 RoBERTa。

论文链接:https://arxiv.org/abs/2002.08155

CodeBERT 模型运用基于 Transformer 的神经架构构建而成,训练所用的混合目的函数包括了交换 token 检测(replaced token detection,RTD)预训练义务。RTD 运用从生成器采样的合理替代 token 来交换部分输入 token 从而毁坏输入,然后训练一个判别器来预测受损输入中的每个 token 能否被生成器样本交换。

这就使得 CodeBERT 模型可应用双模态数据 NL-PL 对和单模态数据,前者为模型训练提供输入 token,后者有助于学得更好的生成器,研讨者经过模型调参的方式评价了 CodeBERT 在两个 NL-PL 运用中的功能。

CodeBERT

CodeBERT 既能处理自然言语又能处理编程言语,比如 Python、Java、JavaScript 等。它可以捕捉自然言语和编程言语之间的语义衔接,并输入可广泛支持 NL-PL 了解义务(如自然言语代码搜索)和生成义务(如代码文档生成)的通用表示。CodeBERT 模型基于多层 Transformer 构建而成,Transformer 如今已被广泛运用于大型预训练模型中。

为了应用双模态数据实例 NL-PL 对和大量可用单模态代码,研讨者运用混合目的函数来训练 CodeBERT,函数包括标准遮盖言语建模(MLM)和交换 token 检测(RTD),交换 token 检测应用单模态代码学得更好的生成器,从而输入更好的交换 token。

研讨运用了 6 种编程言语训练 CodeBERT,其中双模态数据点是具有函数级自然言语文档的代码。CodeBERT 模型的训练设置与多言语 BERT (Pires et al., 2019) 相似,即针对 6 种编程言语学习一个预训练模型,且不运用显式标记来标注输入编程言语。

研讨者在两项 NL-PL 义务(自然言语代码搜索和代码文档生成)上评价了 CodeBERT 的功能。实验结果表明调参后的 CodeBERT 模型可在这两项义务上达到当前最优功能。为了进一步了解 CodeBERT 学得的知识类型,研讨者构建了 NL-PL 探测数据集,并在 zero-shot 设置中测试 CodeBERT,即不对 CodeBERT 调参。测试结果表明,CodeBERT 的功能持续优于仅基于自然言语的预训练模型 RoBERTa。

以下内容将详细引见 CodeBERT,包括模型架构、输入和输入表示、目的函数、训练数据,以及将 CodeBERT 运用于下游义务时应如何调参。

模型架构

研讨者遵照 BERT (Devlin et al., 2018) 和 RoBERTa (Liu et al., 2019),并运用了多层双向 Transformer 作为 CodeBERT 的模型架构。

详细而言,CodeBERT 的模型架构与 RoBERTa-base 基本分歧,包括 12 个层,每一层有 12 个自留意力头,每个自留意力头的大小为 64。隐藏维度为 768,前馈层的外部隐藏层大小为 3072。模型参数总量为 1.25 亿。

输入/输入表示

在预训练阶段,研讨者将输入设置为两个片段和一个特殊分隔符的组合,即 [CLS], w1, w2, ..wn, [SEP], c1, c2, ..., cm, [EOS]。其中一个片段是自然言语文本,另一个则是以某种编程言语写成的代码。

CodeBERT 的输入包括:1)每个 token 的语境向量表示(适用于自然言语和代码);2)[CLS] 的表示,作为聚合序列表示(aggregated sequence representation)。

预训练数据

研讨者运用双模态数据训练 CodeBERT,即自然言语-代码对平行数据。此外,还运用单模态数据,即不具有平行自然言语文本的代码和不具有对应代码的自然言语。

表 1:CodeBERT 训练数据集的数据统计信息。

下图 1 展现了数据示例:

图 1:NL-PL 对示例,其中 NL 是函数文档(黑色虚线框)中的第一段(红色框)。

预训练 CodeBERT

本节将引见训练 CodeBERT 运用的两个目的函数。

第一个目的函数是遮盖言语建模(masked language modeling,MLM),MLM 在多项研讨中被证明是有效的方法。研讨者在双模态数据 NL-PL 对上运用遮盖言语建模。

第二个目的函数是交换 token 检测(RTD),它运用大量单模态数据,如不具有对应自然言语文本的代码。

MLM 目的旨在预测被遮盖的原始 token,其公式如下所示:

RTD 的损失函数如下所示,θ 表示判别器,δ(i) 表示指示函数,p^D2 表示预测第 i 个单词真实概率的判别器。

值得留意的是,RTD 目的运用于输入的每个地位,它与 GAN 的不同之处在于:假如生成器输入了正确的 token,该 token 的标签是「real」而非「fake」。


图 2:RTD 目的图示。NL 生成器和代码生成器都是言语模型,它们基于上下文语境为遮盖地位生成合理的 token。NL-Code 判别器是目的预训练模型,其训练方式是检测采样自 NL 和 PL 生成器的合理交换 token。NL-Code 判别器用于在调参阶段输入通用表示,而 NL 生成器和代码生成器均不出如今调参阶段。

实验

这一部分内容将引见 CodeBERT 的实验结果。首先运用 CodeBERT 停止自然言语代码搜索(对 CodeBERT 执行调参),然后在 NL-PL 探测义务中以 zero-shot 设置评价 CodeBERT 的功能(不对 CodeBERT 停止调参)。最后,研讨者在生成成绩(即代码文档生成义务)上评价 CodeBERT,并进一步运用训练阶段未见过的编程言语来评价 CodeBERT 的功能。

自然言语代码搜索

给定自然言语作为输入,代码搜索的目的是从一堆代码中找出语义最相关的代码。研讨者在 CodeSearchNet 语料库上停止实验。


表 3:CodeSearchNet 语料库的数据统计信息。

下表 2 展现了不同方法在 CodeSearchNet 语料库上的功能结果。


表 2:不同方法在自然言语代码检索义务中的结果。基线包括四种 NL 和 PL 结合嵌入(第一组),RoBERTa 运用遮盖言语建模在代码上执行训练(第二组),PT 表示预训练。研讨者运用不同设置训练 CodeBERT(第三组),包括不同的初始化和不同的学习目的。

NL-PL 探测

给出一个 NL-PL 对 (c, w),NL-PL 探测的目的是测试模型在多个干扰词中准确预测/恢复感兴味的遮盖 token(代码 token c_i 或单词 token w_j)的才能。

下表 4 展现了不同方法的准确率,即对于每种编程言语,模型准确预测的实例与全部实例数量的比例。表 4 前两行罗列了数据统计信息。

表 4:NL-PL 探测义务的数据统计信息,以及不同预训练模型的功能。此表报告了模型的准确率(%),每一组中的最佳结果以加粗方式显示。

研讨者进一步对 PL-NL 探测义务停止了案例研讨。图 4 展现了 Python 代码示例。该示例分别遮盖了 NL token 和 PL token,然后报告 RoBERTa 和 CodeBERT 的预测概率。

图 4:PL-NL 探测义务案例研讨(以 Python 言语代码为例)。该示例分别遮盖 NL token(蓝色)和 PL token(黄色),并报告了 RoBERTa 和 CodeBERT 的预测概率。

代码文档生成

本节触及 code-to-NL 生成义务,报告了在 CodeSearchNet 语料库上六种编程言语的文档生成义务结果。

下表 5 展现了不同模型的代码-文档生成义务结果:

表 5:代码-文档生成义务结果,该实验在 CodeSearchNet 语料库上展开,得到的结果为平滑 BLEU-4 分数。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评3

fupv0997 2020-2-25 19:22:27 显示全部楼层
楼下的接上
回复

使用道具 举报

qq331244362 2020-2-26 20:54:52 来自手机 显示全部楼层
大人,此事必有蹊跷!
回复

使用道具 举报

will丽 2020-2-27 11:59:28 来自手机 显示全部楼层
对不起,我就来看看,不说话
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies