【论文阅读003】:CURE: Code-Aware Neural Machine Translation for Automatic Program Repair

论文基本情况:

论文名: CURE: Code-Aware Neural Machine Translation for Automatic Program Repair

作者:Nan Jiang(Purdue University), ThiBaud Lutellier(University of Waterlor), Lin Tan(Purdue University)

作者:Nan Jiang(Purdue University), ThiBaud Lutellier(University of Waterlor), Lin Tan(Purdue University)

来源:2021 ICSE

论文主题:程序修复,程序语言处理

一句话论文:

本文将程序语言预训练的GPT模型与翻译模型结合起来,共同作为自动程序修复(ARP, Auromatic Program Repair)模型工作,并设计了一种Code-aware定向搜索策略,通过关注可编译且与原长度类似的补丁,缩小搜索空间,提高生成补丁工的可编译率,使质量高的补丁排序更靠前,提高了修复成功率。

重点与思考:

这篇文章作为2021年的SOTA,将其他领域内的一些技术迁移到自动修复这一问题上,在两个常用数据集上取得了比较好的效果,并为自动化漏洞修复这一方向中存在的一些问题,提供了部分解决思路。

1. 程序语言的数据以及词表问题

由于标识符命名过于自由,导致可能存在的命名空间无限大,使词汇表的大小过大。对于模型训练来说,过大的词表将导致训练效率的下降,时间成本过大;另一方面,如果单纯地将一个标识符标注为一个向量,100个变量标注100个,忽视了变量命名间的关系和可能存在的规律,可能还会影响模型的性能。目前,存在一种方法是提取出所有的变量名,维护一张变量表,记录对应的位置,在训练时将其全部标注为一个向量,在生成补丁时,根据位置,查找之前维护的表,将原变量名导入到补丁中,但该方法相当于直接舍弃掉变量名的含义,这一点是跟人的直观印象是不符的,且生成后再赋予变量名,这一行为的正确率应该也不会特别高。
本文使用的策略是采用子词划分策略,类似于Bert等模型中的分词方法。将一个组合词分割成不同的部分,比如max_here被分成’max’,‘_’,'here’三部分,这样的话,词表大小被大大缩减,保留了变量名的部分语义信息,并且,是后续对生成补丁进行筛选的基础
此外,在之前的其他研究中,修复的过程中都只关注出现问题的代码行,而忽视了整体代码段的内容,本文中规避了这个问题,充分利用了出错行之前的代码,提高修复成功的概率。

2. 模型训练与推理流程

文中提出的APR模型包含两部分,预训练的GPT模型和神经网络翻译模型(Context-aware neural machine translation (CoNuT)),一起作为APR模型进行补丁生成。因此,模型训练阶段也分为两部分,GPT预训练和ARP微调。
在GPT训练阶段,使用的数据是从github上提取的所有Java项目,需要注意的是,由于微调阶段的数据来源也是开源项目,因此,需要避免使用出现Bug的代码,即该阶段使用的训练数据需要使用2006年前的提交信息,也不需要关注其中是否包含漏洞等信息,因为,预训练部分主要目的是使模型能够学到人类编写的代码的特点。任务是下一单词预测。
在微调阶段,使用的数据是CoCoNuT(这是另一个自动代码修复方案)所使用的数据,涵盖了训练阶段使用的项目。微调过程中,将GPT和CoNuT结合起来,一起微调。损失包含了两部分, L N M T L_{NMT} LNMT λ L G P T \lambda L_{GPT} λLGPT,前者是在已知Bug行和Bug行前的内容情况下,调整两部分模型参数,最大化预测下一个单词的平均概率(应该类似于自然语言生成任务),后者是生成的补丁时正确补丁的概率。
在推理阶段,首先会把整体代码段输入到GPT模型中,提取代码特征,生成上下文代码表示和Bug行代码表示,其次,会把Bug前的代码,以及目标生成的字符的前一个字符输入模型中,提取相应特征,一种四部分代码表示,共同作为代码生成的输入数据,推断下一个字符,随后,递归生成整个补丁。

3. 筛选和搜索策略

生成补丁后,如何在生成的众多代码中选择正确的补丁也是一个非常重要的问题,本文使用的是定向搜索算法,并对其做了一些改进。主要采取了两种策略,有效性验证和长度控制。后者是基于一个统计学概念,经统计发现,正确补丁与原错误代码间长度差距,大多数均不超过5,因此,在使用模型生成补丁时,更倾向于选择与原长度类似的代码,且惩罚过短或过长的补丁。该策略还有一个好处是,搜索的空间更深,更容易生成补丁。
前者则是对定向搜索算法的改进,Vanilla beam search算法没有对搜索树进行处理,仅考虑概率问题,可能会选择无法编译的代码。而改进后的Code-aware beam search 会首先根据生成的子词,判断某一条路径走下去,是否能形成正确的标识符,剪枝掉会导致错误的路径,减少了搜索空间,且可编译性大大增加。

你可能感兴趣的:(论文,论文阅读,机器翻译,安全)