3 个月前

GraphCodeBERT:基于数据流的代码表示预训练

GraphCodeBERT:基于数据流的代码表示预训练

摘要

针对编程语言的预训练模型在代码搜索、代码补全、代码摘要等多种代码相关任务上已取得显著的实证性能提升。然而,现有预训练模型通常将代码片段视为词元(token)序列,忽略了代码本身固有的结构信息。这种结构蕴含了关键的语义内容,能够有效增强代码理解能力。为此,本文提出 GraphCodeBERT,一种考虑代码内在结构的编程语言预训练模型。与以往基于抽象语法树(AST)等语法级结构的方法不同,我们采用数据流(data flow)作为预训练阶段的结构表示,这是一种语义级结构,用于编码变量之间“值的来源”关系。该语义结构简洁明了,避免了AST所固有的深层嵌套层级,从而提升了模型的计算效率。GraphCodeBERT基于Transformer架构构建,并在传统的掩码语言建模任务之外,引入了两个结构感知的预训练任务:一是预测代码结构边(即数据流边),二是对齐源代码与代码结构表示之间的语义特征。为高效融合代码结构信息,我们设计了一种图引导的掩码注意力机制(graph-guided masked attention function)。我们在四个下游任务上对模型进行了评估,包括代码搜索、代码克隆检测、代码翻译和代码优化。实验结果表明,引入代码结构信息及新提出的预训练任务显著提升了模型性能,在四项任务上均达到了当前最优(state-of-the-art)水平。此外,我们进一步发现,在代码搜索任务中,模型更倾向于关注结构级别的注意力,而非传统的词元级别注意力,验证了结构信息在代码理解中的重要性。

代码仓库

microsoft/CodeBERT
官方
pytorch

基准测试

基准方法指标
code-search-on-codesearchnetGraphCodeBERT
Go: 84.1
JS: 71.1
Java: 75.7
Overall: 77.4
PHP: 72.5
Python: 87.9
Ruby: 73.2
type-prediction-on-manytypes4typescriptGraphCodeBERT
Average Accuracy: 62.51
Average F1: 60.57
Average Precision: 60.06
Average Recall: 61.08

用 AI 构建 AI

从想法到上线——通过免费 AI 协同编程、开箱即用的环境和市场最优价格的 GPU 加速您的 AI 开发

AI 协同编程
即用型 GPU
最优价格
立即开始

Hyper Newsletters

订阅我们的最新资讯
我们会在北京时间 每周一的上午九点 向您的邮箱投递本周内的最新更新
邮件发送服务由 MailChimp 提供
GraphCodeBERT:基于数据流的代码表示预训练 | 论文 | HyperAI超神经