站点图标 AI技术聚合

【论文笔记】CURE: Code-Aware Neural Machine Translation for Automatic Program Repair

【论文笔记】CURE: Code-Aware Neural Machine Translation for Automatic Program Repair

1.基本信息

2021年A会ICSE论文
作者

关键词

automatic program repair(APR), software reliability,NMT模型,JAVA

2.论文概述

motivation

现有的neural machine translation(NMT) techniques有两个主要限制。

solution

提出CURE,一个基于NMT的APR技术,有3个创新点:

result

CURE正确地修复了57个Defects4J的bug和26个QuixBugs里的bug,在这两个基准数据库上超过了所有现有的APR技术。

3.Introduction

PS:刚开始接触自动代码修复,很多东西不是很懂,还在学习。

NMT模型是什么?

NMT模型利用深度学习技术将有bug的源代码自动编码为潜在空间的中间表示,然后将编码后的表示解码为目标正确的代码。

对于search-based APR approach (including NMT-based techniques),产生一个正确的fix,需要满足两个条件:

NMT模型面临的挑战

our approach

Programming language models

为了帮助NMT模型学习类似开发人员的源代码(即,不仅是可编译的,而且类似于程序员编写的代码)。本文将预训练和微调工作流程应用于APR任务。作者参考预训练语言模型在NLP中的有效应用,提出了在NMT体系结构中加入一个预先训练过的软件代码语言模型,称为编程语言(PL)模型,以创建一个新的APR体系结构。

Code-aware search strategy

现有的Beam search搜索策略,在APR的NMT模型中使用需要更大的beam sizes(100-1000)去生成足够的候选patches。然而,对于较大的beam大小,普通的bean search会选择许多坏的补丁,这些补丁要么是不可编译的,要么是长度不正确。
解决:

Subword tokenization

以前的工作没有恰当处理合成词(eg.binsearch”作为一个单词,也就是OOV【out of vocabulary words】,而不是把它分解成“bin”和“search”,它们都在词汇表中。),作者提出使用byte-pair encoding(BPE)(一种subword tokenization技术)对复合词和生僻字进行标记,以进一步解决OOV问题。

contribution

4.Approach

为了应对上述挑战,我们设计并应用了三种新技术。
|

techniqueschallenge
subword tokenizationimprove the search space
programming language modellearn developer-like source code and improve patch ranking
code-aware beam-search strategyimprove patch ranking and generate more correct patches

4.1overview


PL training data:open-source Java projects。
Patch training data:从开源项目commit历史中提取的the buggy lines、上下文和正确的fix。
Buggy projects:用户提供一个APR的标准输入,一个有bug的项目和bug的位置。

4.2 Subword tokenization

为了解决OOV问题,减小词汇量,作者采用了字节对编码(BPE),它是一种无监督学习算法,通过迭代合并最频繁的字节对来找到语料库中最频繁的子词。(拆分合成词)

这是一个例子,图b使用了复制机制,但仍不能产生正确的fix,是因为它只能复制出现在buggy行的token。因为charno是在if行出现的,在if行就被认定为是OOV ,定为unknown,因此在buggy行的token也是unknown,所以复制失败。

4.3 Programming Language Model

为了解决学习developer-like源码的挑战,作者在开源程序上预训练出一个语言模型,称为programming language model (PL model)。
作者使用Generative Pre-trained Transformer (GPT)用于PL建模,因为GPT已被证明可以改进许多不同性的能NLP任务。
对PL模型进行预训练可以将编程语言学习与补丁学习分离开来。好处有两个:

4.4 Fine-Tuning for APR with a PL Model

作者将CoNuT作为CURE的NMT模型。即overview中“1b”得到的模型。


P函数指得是,PL模型和CoNuT模型分别以不同的权重,参与到预测fix中下一个token的过程中,并使得Lnmt最大化平均对数可能性。
微调出的模型是结合之前训练好的PL模型和CoNuT得到的NMT模型。

微调阶段的目的是找到对于所有Patch training data中数据最好的参数集sitar和φ去最大化Lapr。
下图是如何生成fix的过程。(需要认真去看论文了解过程)
疑问:编码和阶码的目的是什么?(感觉跟NMT的定义有关,需要仔细去了解下)

4.5 Code-Aware Beam-Search Strategy and Patch Generation

为了生成有效的identifiers,CURE首先静态分析并提取有有效标识符。
下图是一个提取buggy line valid identifiers的过程:

5.实验

数据源

PL Training Data:
根据GHTorrent[42],从GitHub下载所有(1700个)开源Java项目,在Defects4J第一个错误之前至少有一个提交,并将它们回滚到2006年之前的版本,以避免使用未来的数据。
然后使用JavaParser来提取除抽象method和长于1024个token的method之外的所有method。
最终:PL训练数据包含404万个方法,以及30000个验证实例。
Patch Training Data:
使用在GitHub上分享的CoCoNuT的训练数据作为我们的补丁训练数据,这是从45180个Java项目中提取的。将这些数据集用于PL训练成本太高,因此在子词标记化之后,丢弃上下文或正确补丁长度超过1,024个令牌的实例。
最终:我们的patch训练数据包含272万个训练实例和
16920个验证实例。

实验装置

结果

6.limitation

总结

对patch的处理:

文章出处登录后可见!

已经登录?立即刷新
退出移动版