CodeT5: 使用多任务学习进行代码Bug检测和修复

释放双眼,带上耳机,听听看~!
本文介绍了Salesforce亚洲研究院在EMNLP上发表的论文,利用多任务学习的方式借助CodeT5进行代码Bug的检测和修复,并发布了两个新的Bug检测和修复数据集。该方法在实验中表现优异,适用于程序调试和修复。

本文正在参加人工智能创作者扶持计划

导语

本篇工作是Salesforce亚洲研究院在EMNLP上发表的一篇论文,主要介绍了如何利用多任务学习的方式借助CodeT5进行代码Bug的检测和修复,并发布了两个新的Bug检测和修复数据集。

1 简介

程序调试是软件开发中最重要的,也是最主要的成本。其目标是定位程序的错误行(错误定位),并修复这个有错误的补丁(程序修复) 。大多数调试工具分为两类:基于程序分析(program analysis-based)和基于神经网络(neural-based)。为了调试程序,基于程序分析的技术采用基于编译器和软件工程理论来构建代码分析工具。这些方法有一个显著的缺点,即它们不能扩展到大型和复杂的程序。另一方面,最近的工作采用一种通用的数据驱动方法来训练神经网络,通过从以前的大量错误修复语料库中学习,自动获得错误修复模式。

然而,这些技术有一些主要的缺点:

  1. 需要利用特定于代码或特定于语言的特性,如控制流、数据流和抽象语法树(ast),这需要大量的代码特征工程,阻碍对更多样化的领域或编程语言的适用。
  2. 最近的研究集中在检测粗粒度(如函数级别或文件级别)的错误,这在实际使用中是不切实际的。而在像token级别这样的细粒度级别定位错误也不理想,这可能会导致大量的假阳性。
  3. 大多数技术只用于错误定位(bug localization)或程序修复(program repair),或将它们分开作为两个阶段,这未能利用它们潜在的互信息。

为此,本文提出了一个统一框架,来适应一般预训练的编程语言模型,用于行级代码调试和修复。本文的框架来源于平时对开发人员的观察:首先,开发者必须确定一个函数是否有bug。如果有bug,开发人员必须定位有问题的行,并提供补丁(修复) 。 作者强调,对代码使用预训练的语言模型有两个优点:

  1. 通过将代码视为自然语言,它减少了代码表示工程过程的工作量。
  2. 它可以利用从大量源代码中获得的预训练知识。

文本采用的Backbone模型为CodeT5,并设计了如下三个目标函数:

  1. 函数级错误检测任务,确定特定的代码段是否包含错误(D)。
  2. 错误行定位目标,确定包含错误的确切的代码行(L)。
  3. 代码修复目标,将有错误的代码行进行修复后输出。

CodeT5-DLR是通过应用所有微调目标创建的模型。为了评估整个调试过程(D-L-R),作者还从Github提交中收集了两个大型的Java和Python编程语言的错误修复数据集。实验结果表明,所提模型在所有任务上都显著优于现有的Baseline方法。并发现三个目标一起训练比单独训练每个任务产生更好的性能。

2 方法

模型的整体框架如图1所示。

CodeT5: 使用多任务学习进行代码Bug检测和修复

2.1 问题定义

CodeT5: 使用多任务学习进行代码Bug检测和修复是一个程序调试数据集,其中包含有CodeT5: 使用多任务学习进行代码Bug检测和修复个三元组CodeT5: 使用多任务学习进行代码Bug检测和修复CodeT5: 使用多任务学习进行代码Bug检测和修复是一个函数级别的源代码Patch,CodeT5: 使用多任务学习进行代码Bug检测和修复是X中每一行代码是否有bug的标签信息(0代表没bug,1代表有bug),CodeT5: 使用多任务学习进行代码Bug检测和修复是修复bug后的代码行。函数级别的分类结果为CodeT5: 使用多任务学习进行代码Bug检测和修复为1表示有bug,CodeT5: 使用多任务学习进行代码Bug检测和修复为0表示没有。对于输入CodeT5: 使用多任务学习进行代码Bug检测和修复,每一句之间使用[SEP]进行分隔。

2.2 CodeT5回顾

CodeT5是一个Encoder-decoder架构,详情参见我之前的笔记:论文笔记:CodeT5: Identifier-aware Unified Pre-trained Encoder-Decoder Models for Code .

2.3 Detect-Localize-Repair框架

Function-Level Bug Detection

第一个任务的目标是判断一个函数是否存在bug,即一个二分类任务,作者将输入给到CodeT5后,取Encoder的最后一个hidden state作为整个输入的表征,训练一个线性二分类器来进行分类。

Line-Level Bug Localization

如图1所示,作者取Encoder中每行代码后跟着的[SEP] token的hidden state将其映射为一个概率表示改行代码是否有bug。作者将这个任务建模为一个序列标注任务,并同样使用二分类的Cross-entropy loss。

Program Repair

这个任务将带有bug的代码patch转化修复后的代码CodeT5: 使用多任务学习进行代码Bug检测和修复 ,作者将此任务处理为seq2seq的问题,并使用标准序列生成损失进行训练。在推断时,则使用beam search技术。

联合训练

作者使用多任务学习的方式对三种任务进行联合训练,总体loss为3个之和。

CodeT5: 使用多任务学习进行代码Bug检测和修复

3 数据集

本文收集了两个新的数据集,分别是单行错误修复数据集称为SL-Java,另一个是多行错误修复数据集ML-Python。这些数据集主要从Github提交中提取bug修复代码更改,使用Pydriller工具处理得到。

表1显示了SL-Java数据集中13个错误模式的详细信息。总的来说,CHANGE_IDENTIFIER出现得最多,SWAP_BOOLEAN_LITERAL出现得最少。

CodeT5: 使用多任务学习进行代码Bug检测和修复

表2显示了数据集的统计数据。对于函数级的错误检测任务,使用整个代码片段。有bug或无bug的标签是通过简单地将前一个版本视为有bug(标签0),后一个版本视为无bug(标签1)来决定的。对于行级的bug定位任务,使用有bug的行的编号信息来训练模型来定位哪一行有bug。对于程序修复,使用前版本作为源输入,后版本作为目标序列。

CodeT5: 使用多任务学习进行代码Bug检测和修复

图2显示了SL-Java数据集中的一个示例。示例主要包括有bug的代码段(Before)和固定的代码段(After)。它还包括缺陷线的行号。ML-Python示例中出现了多个错误行,而不是单个错误行。每个实例还包括其他元数据,如提交消息、提交id (SHA1)和项目名称,以便于追溯原始错误信息。

4 实验

使用CodeT5-base (220M)作为基础模型,同时为了消融实验对比,实验了几个只在单一任务上训练的模型,分别是CodeT5-D(只在Detection任务上训练)、CodeT5-L(只在Localize任务上训练)、CodeT5-R(只在Repair任务上训练)。设置最大的source和target长度均为512。

4.1 Function-Level Bug Detection

评估指标采用F1分数和假阳性率(FPR)。F1是这类任务的标准度量标准,因为这是一个二元分类问题(不管有没有bug)。另一方面,在现实场景中,FPR对于确定错误定位系统的可用性至关重要。一个好的漏洞检测系统应该产生尽可能少的误报。FPR的计算方法是将非bug函数错误归类为bug(假阳性)的数量与实际非bug函数总数的比值。

CodeT5: 使用多任务学习进行代码Bug检测和修复

4.2 Line-Level Bug Localization

评估指标有三个,分别是MRR、MAP和FPR。实际上,由于不知道有多少行代码有bug,所以检索得分最高的top-k行,并度量真正有bug的行是否属于这些top-k行。因此,可以将这个问题表述为一个信息检索问题,其目标是向查询返回一个相关行的排序列表(该查询是检索行中所有有错误的行)。出于这个原因,使用MRR和MAP的知名指标来评估这个有bug的行检索任务。对于SL-Java,因为只有一条错误行,MRR适合用于评估该数据集的性能。另一方面,ML-Python中的每个样本都包含大量的错误行,MAP更适合ML-Python。这样,MRR和MAP将根据k计算,得到MRR@k和MAP@k,其中k是检索用于评估的行数。选择k = 1和k = 5作为实验分析。

CodeT5: 使用多任务学习进行代码Bug检测和修复

除了MRR和MAP外,还使用FPR来评估。给定一个代码片段和检索到的有bug的行,在这种情况下,FPR被计算为被错误分类为有bug(假阳性)的无bug行的数量与实际无bug行的总数之间的比率。同时,还计算与检索到的top-k线相关的FPR,类似于MRR和MAP。

4.3 Program Repair

使用EM(Exact Match)和BLEU作为评价指标。

CodeT5: 使用多任务学习进行代码Bug检测和修复

4.4 定性分析

图3显示了一个模型可以检测、定位和修复的错误示例。

CodeT5: 使用多任务学习进行代码Bug检测和修复

图4显示了另一个示例。这是在现实项目中发现的另一个bug。模型也可以识别正确的错误行,但不能推荐正确的修复。然而,这是因为该修复是针对模式change_numeric的,替换的确切数字(3476到3344)非常具有挑战性。

CodeT5: 使用多任务学习进行代码Bug检测和修复

图5给出了一些错误模式的分析。

4.5 端到端的bug检测和修复分析

除了第4.4.节中展示的示例之外,作者分析了这个端到端过程中,其他模型与CodeT5-DLR模型相比。表6显示了CodeT5-DLR继续优于它的变体。

CodeT5: 使用多任务学习进行代码Bug检测和修复

5 讨论

最近一个工作采用了错误定位和修复的联合目标函数。但是,他们的目标是在token级别检测错误,利用指针网络来预测位置是否有问题。他们的方法是基于给出错误代码的假设,目标是定位错误。由于高FPR,他们的模型在现实世界用例中是不切实际的。此外,这些技术的评估过程大多基于合成数据集,即使用一些启发式生成bug,使得评估结果不现实。相比之下,本文的工作并不依赖于合成的bug数据,而是依赖于来自Github项目的真实数据集,这使得结果在实践中更有用。此外,我们所针对的错误的粒度是不同的,因此我们的技术不能直接与他们的技术进行比较。

6 相关工作

7 总结

本文提出了一个新的检测-定位-修复框架,用于联合检测错误、定位错误和进行程序修复。模型建立在CodeT5基础上,并经过了共同的微调,以实现三个与调试相关的目标:函数级错误检测、行级错误定位和程序修复。这三个目标是基于软件开发人员在日常工作中定位错误和修复程序的方式。评估结果表明,同时训练这三个目标比单独微调每个目标产生更好的结果。此外,本文还提供了两个新的数据集,可用于评估错误定位和程序修复任务。所提出数据集提供了有bug的确切行,以及代码片段的前后版本。所有资源都将公开。

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

如何提取文章中的人名

2023-12-5 16:33:14

AI教程

SpanBERT: 改进预训练技术详解

2023-12-5 16:50:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索