12 天前
GraphCodeBERT:基于数据流的代码表示预训练
Daya Guo, Shuo Ren, Shuai Lu, Zhangyin Feng, Duyu Tang, Shujie Liu, Long Zhou, Nan Duan, Alexey Svyatkovskiy, Shengyu Fu, Michele Tufano, Shao Kun Deng, Colin Clement, Dawn Drain, Neel Sundaresan, Jian Yin, Daxin Jiang, Ming Zhou

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