论文导读 | IBM推出DeepTriage,利用深度学习实现Bug自动分类

2018 年 1 月 14 日 AI前线 论文

作者|Senthil Mani 等
译者|Debra
编辑|Emily
AI 前线导读:当系统给出软件 bug 报告的时候,第一件应该做的事是选择一个合适的开发人员来修复这个 bug,也是执行 bug 分类过程的首要任务。大多数 bug 跟踪系统都有 bug 标题(摘要)和详细描述。bug 自动分类算法可以被视作分类问题,它将 bug 标题和描述作为输入,将其反馈给开发人员(类标签)。这个过程的主要挑战是 bug 描述通常包含很多非结构化的文本、代码片段和堆栈跟踪,使得输入数据非常杂乱。而目前的词库(BOW)特征模型不考虑非结构化文本的句法和词序信息。

在本研究中,我们提出了一种基于注意机制的深度双向递归神经网络(DBRNN-A)的新型 bug 报告表示算法,该模型可以无监督的方式从长字序列中学习句法和语义特征,然后使用基于 DBRNN-A 的 bug 表示来训练分类器,而不是用 BOW 特征。使用注意机制可以使模型学习 bug 报告中长词序列的上下文表示。未修复的 bug 报告(在开放源代码 bug 跟踪系统中占比约 70%)为本研究做出了重要贡献,为训练特征学习模型提供了大量数据,而它们在之前的研究中几乎完全被忽略。另外,三个开源 bug 跟踪系统(Google Chromium,Mozilla Core 和 Mozilla Firefox)提供的开源代码构建了我们的 bug 报告公共基准数据集,让这个实验具有可重复性。在此实验中,我们使用来自 Google Chromium 的 383,104 个 bug 报告,Mozilla Core 的 314,388 个 bug 报告,以及来自 Mozilla Firefox 的 162,307 个 bug 报告数据,并对我们提出的方法与 BOW 模型和 softmax 分类器、支持向量机、朴素贝叶斯和余弦距离进行比较,得到使用 DBRNN-A 进行分类的平均准确率。

更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)
简介

一般来说,当终端用户在系统工作遇到 bug(也称为错误或缺陷)会在 bug 跟踪系统中报告该问题 [8]。

图 1:Google Chromium 项目中的 bug 报告屏幕截图,bug ID:638277。bug 报告通常由简短摘要和详细描述组成。

bug 报告通常包含 bug 摘要和详细的描述,以及重新操作的步骤。bug 的固定格式还包含修复 bug 的开发人员,被称为所有者。bug 分类的过程分为多个步骤,其中第一步主要是将 bug 分配给有可能解决这个 bug 的开发人员。因此,在本研究的其余部分,bug 分类指的是为 bug 报告分配开发人员的任务 [1]。在大规模的系统中,有大量的输入 bug,手动分析和修改 bug 报告是一项艰巨的任务。手动进行 bug 分类时,开发人员通常使用 bug 报告内容,报告主要包括摘要和描述。尽管此前已经有文献探讨了额外的输入来源,例如 github 的开发者分析 [3] 和使用组件信息 [5],但大多数研究工作仍集中在利用 bug 报告内容进行分类 [2] [14] [ 27] [28] [29] [32] [33]。使用 bug 报告内容,可以将 bug 自动分类制定为分类问题,并将 bug 标题和描述反馈给开发者(类标签)。但是,bug 报告可能包含大量杂乱的文本信息,包括代码片段和堆栈跟踪详细信息,如图 1 所示。处理这种非结构化和有噪声的文本数据是学习分类器面临的主要挑战。


  • 标记的 bug 报告:599892

  • 修正:brettw@chromium.org

  • 标题:GN 应该只加载一次导入

  • 说明:在 GN 多重 BUILD 文件可以加载相同的导入。GN 缓存导入结果不需要多次加载。但是,如果两个 BUILD 文件同时加载相同的导入,就会产生竞争。代码不会锁定任务,而是允许同时加载文件,第一个完成加载的“胜出”。这是基于竞争少时加载速度快的原理。在 Windows 上,许多构建文件最终以 visual_studio_version.gni 文件结尾,调用 build / vs_toolchain.py。这个脚本可能运行得非常慢(在某些情况下比整个 GN 运行的其他部分慢)。结果导致基本上每一个引用.gni 文件的 BUILD 文件都会相互竞争,最终并行地运行脚本多次(这只会降低速度)。所以应该锁定任务,以防止额外加载产生竞争。

bug 存储库的 bug 报告,用作训练分类器的标签模板。

激活示例

如图 2 所示,bug 报告的 BOW 特征表示为 bug 报告 [2] 中的每个词汇创建了一个标记为真(或词频)的布尔数组。在训练过程中,分类器将学习到相应的类标签 brettw@chromium.org 的表示。对于图 3 中给出的两个测试示例,第一个示例的实际修复程序(bug 编号为 634446)为 brettw@chromium.org,而 id 为 616034 的第二个示例 bug 由 machenb ... @ chromium.org 修复。

但是,根据 BOW 特征,测试报告#1 和训练报告共有 12 个相同的字,测试报告#2 和训练报告则共有 21 个字。因此,BOW 模型将 id 为 616034 的测试 bug 报告误分类的报告#2 应该由 brettw@chromium.org 修复。bug 分类的原因是:(1)BOW 特征模型认为句子是一个丢失单词排序(上下文)的词组,(2)不考虑句子中同义词之间的语义相似性。尽管 n-gram 模型考虑到了词序的上下文,但是受到了高维和稀疏的数据 [12 的影响]。我们可以使用一个基于连续跳跃元语法,被称为 word2vec [22] 的神经网络模型来学习词语标记之间的语义相似性。这种模型依赖于分布假说,认为在句子中出现在同一语境中的词汇具有语义意义。Ye 等人 [34] 使用 word2vec 建立了一个共享词表示,用于代码语言和描述语言中的词语标记。word2vec 的主要缺点是它仅学习了单个单词记号的语义表示,但是不会将一个单词记号(如句子)的序列考虑在内。word2vec 的一个段落矢量 [19] 考虑了单词的排序,但仅限于在小的语境中。

本文的其余部分如下:第 2 节重点介绍了研究工作中涉及的主要研究问题和主要贡献,第 3 节详细介绍了包括深度学习算法和分类器在内的方法,第 4 节讨论了此次研究收集的实验数据,第 5 节讨论实验结果和分析,第 6 节讨论了一些可能推翻我们的结论结论的因素,第 7 节讨论可以应用我们提出的特征学习算法解决问题的其他程序,第 8 节解释了一些密切相关的工作成果,第 9 节以对未来的展望结束本文。

研究成果

从大量文本中学习语义表达(例如在 bug 报告的描述中),保留单词的顺序是一个具有挑战性的研究课题。因此,我们提出了一种深度学习技术,它将以无监督的方式学习对 bug 报告内容进行简洁和长度固定的表示,即直接使用数据学习表示,而无需手动完成特征工程。本文研究的主要研究问题(RQ)如下:

(1)RQ1:使用深度学习来执行自动化 bug 分类是否可行?



  • 未分类 bug 报告#1:634446

  • 修正者:brettw@chromium.org

  • 标题:GN toolchain_args 应该是一个范围而不是功能

  • 描述:目前工具链中的参数覆盖是:toolchain_args(){foo = 1bar =“baz”}我们将其转变为范围类型:toolchain_args = {foo = 1bar =“baz”}

这将使 gcc_toolchain从调用中转发数值,而无需知道整个构建中所有被覆写的构建参数。


未分类 bug 报告#2:616034修正:machenb ... @ chromium.org标题:GN toolchain_args 应该是一个范围,而不是一个函数说明:可以在谷歌浏览器中重写 v8_use_external_startup_data 吗?一方面,默认为 gn arg,这是正确的。另一方面,在 v8 中有一个“v8_use_external_startup_data =!is_ios”作为谷歌浏览器构建覆盖。如果用户更改 gn arg,所有的逻辑将被覆写。这同样适用于 v8_optimized_debug。这说明默认的 arg 不能通过命令行被覆盖。


图 3:来自谷歌浏览器 bug 存储库的两个 bug 报告示例,需要合适的开发人员来修复。实际上,bug 报告#1 由训练实例中的开发者修复。而 bug 报告#2 的 BOW 特征比 bug 报告#1 与训练实例更相似。

(2)RQ2:与传统特征工程方法相比,无监督特征工程方法如何实现?

(3)RQ3:每类训练样本的数量对分类器的性能是否有影响?

(4)RQ4:与使用描述相比,仅使用 bug 报告的标题(或摘要)进行分类的效果如何?

(5)RQ5:使用深度学习的迁移学习是否有效,深度学习模型仅使用一个数据集进行训练,并用于在另一个数据集中进行分类效果如何?

最近,基于递归神经网络(RNN)的深度学习算法已经彻底改变了单词序列表示的概念,并在许多应用,如语言建模和机器翻译方面取得了巨大的突破。Lam 等人 [17] 使用深度神经网络(DNN)和 rSVM 来学习源代码和 bug 报告之间的共同表示,并将其用于有效的 bug 定位。 White 等人 [30] 也为如何在软件库中使用深度学习来解决一些具有挑战性的问题提供了开阔的思路。本研究的主要成果归纳如下:


  • 提出了一种使用 DBRNN-A 对 bug 报告进行分类的新方法:具有注意机制的深度双向递归神经网络和长短期记忆单元(LSTM)[24]。该深度算法算法能够记住长词序列的上下文。

图 4:算法流程图,突出显示了重要步骤

  • 一个开源 bug 报告库中,未分类和未解决的 bug 报告占比在 70%左右,而它们在文献中通常被忽略 [14]。在这项研究中,我们使用了一种利用所有的未分类 bug 报告,以无监督的方式学习 bug 表示的模型。


  • 从三个开源 bug 库中收集实验数据(bug 报告):来自 Chromium 的 3,83,104 个 bug,Mozilla Core 的 3,14,338 个 bug,和 Mozilla Firefox 的 1,62,307 个 bug。在不同的数据集上进行的训练对分类器的性能 [14] [18] 影响既不可比较也不可重现。因此,为了使我们的研究具有可重复性,整个数据集、单独的训练测试,以及此方法的源代码已公开,可用于研究目的。


  • 我们在交叉数据测试场景(迁移学习)中进一步测试了我们提出的 bug 分类训练的有效性。通过使用 Google Chromium 中的 bug 来训练模型,并重新使用 Mozilla Core 和 Mozilla Firefox bug 库,深度学习模型的迁移学习能力得以充分展现出来。

方法

软件 bug 自动分类是一种监督式分类方法,输入数据是 bug 报告摘要(标题)和 bug 描述。图 4 突出显示了自动化 bug 分类算法的主要步骤,原理如下:

(1)从开放源代码 bug 跟踪系统中提取 bug 报告的标题、描述、报告时间、状态和所有者信息,

(2)在非结构化描述中处理 URL、堆栈跟踪、十六进制代码,以及需要对深度学习模型进行专门训练的代码片段,这些内容将在预处理阶段被删除,

(3)在语料库中出现至少 k 次的词汇被提取出来作为词汇表,

(4)分类 bug(D2)用于分类器训练和测试,而所有的未分类 / 开放 bug(D1)用于学习深度学习模型,

(5)具有注意机制技术的深度双向递归神经网络,通过组合 bug 标题和描述作为一个词序列来学习 bug 表示,

(6)将分类 bug(D2)分成训练和测试数据集,并进行 10 倍交叉验证以消除训练偏差,

(7)使用 DB-RNN 算法提取训练 bug 报告的特征表示,

(8)训练监督分类器用于执行为开发者分配 bug 报告的任务,

(9)使用经过训练的深度学习算法提取测试 bug 的特征表示,

(10)使用提取的特征和学习分类器,预测每个潜在的开发者的概率分数,并在测试集合中计算准确度。

(i)在步骤 4 中,完全忽略了未发生的 bug(D1),(ii)步骤中 bug 报告表示是基于深度学习而不是词组,方法也随着传统的自动 bug 分类管道而变化。增加步骤 4 和 5,模型可以从数据本身自动学习 bug 报告表示,而不是通过手动训练。

深度双向递归神经网络(DBRNN-A)

本研究提出的基于 DBRNN-A 的特征学习方法,如图 5 所示,主要具有以下优点:


  • DBRNN-A 可以学习保留单词顺序和句法的句子表示,也可以保留语义关系。长时记忆(LSTM)单元 [13] 被用于隐藏层,它具有可以记忆长单词序列的记忆单元,也可以解决梯度消失的问题 [25]。

图 5:具有 LSTM 单元的深度双向递归神经网络(RNN)详细说明。可以看出,深度网络具有多个隐藏层,从输入数据中学习复杂的分层表示。

直观地说,bug 报告中所有单词在 bug 分类时可能并没有用处。为了添加这些单词,我们引入注意机制 [20],它在分类过程中只学习 bug 报告中的比较重要的单词。

由于注意机制在分类过程中只选择了若干个词,因此 DBRNN-A 可以从真正的长词序列中学习上下文的表示。

一个双向的 RNN [9] 均考虑到了正向(第一个字到最后一个字)和反向(最后一个字到第一个字)的单词序列,并合并这两个表示。因此,特定单词的上下文既包括前几个单词,又包括几个增强语义的单词。

对于每个单词来说,使用词汇表来提取一个单一的热| V |维表示法,在热| V |维表示法上学习 a | P |维的 word2vec 表示 [23]。如图 5(a)所示,通过此词汇表示学习一个带有 LSTM 单元的 DBRNN-A,以获得整个 bug 报告(标题 + 描述)的| D |维特征表示。RNN 是一个包含一个隐藏层的序列网络,其中有 m 个隐藏单元,h = {h1,h2,..., 。 ,HM}。系统的输入是一系列的词汇表示,x = {x1,x2,...。 。 ...,xm},并生成一个输出序列 y = {y1,y2,...。 。 ,YM}。每个隐藏单元都是一个状态模型,将前一个状态 si-1 和一个单词 xi 转换成下一个状态 si 和一个输出单词 yi。 “循环”这个术语说明,每一个隐藏的单位都以循环方式执行同样的功能:{si-1,xi}→{si,yi}。直观上来说,状态 si 携带了前一个词的累积信息。从最后一个隐藏节点获得的输出 ym 是整个句子的累积表示,例如,图 5 中被标记的输入句。当 i = 1 时,xi 是输入字的| P |维的 word2vec 表示,无响应和先前的状态 s0 被随机初始化。使用 LSTM 函数 f,可以预测当前状态 s1 和词汇输出 y1。如果下一个字是“stop”,当前状态为 s1,使用相同的函数 f 预测 s2 和 y2。共享函数减少了可学习参数的数量,并保留了序列中所有单词的上下文。对于语言建模或学习句子表示,yi 实际上是序列 xi + 1 中的下一个单词,即网络通过记忆句子中先前出现的单词来预测下一个单词。LSTM 函数 [9] 具有用于特殊用途的内置存储器单元,将上下文信息存储在更长的句子中。

此外,为了有选择地记忆和学习 bug 报告中的重要单词,我们使用了注意机制模型。注意矢量是通过对所有计算输出 yi 进行加权求和得到的,如下所示:

直观上,αi 将每个单词用于分类的重要性权重进行关联。两种基于 RNN 的不同深度特征模型,一种是输入字序列向前运行,另一种是输入字序列向后运行,经过训练学习后获得的 bug 报告最终表示 r 如下所示:

⊕表示这些向量的连接。相比之下,如图 5(b)所示,对于一份相同的 bug 报告,一个基于频率的 BOW 模型将生成一个| V |维表示,其中 V 表示词汇的大小。通常,| P |的大小被选为 300 [23],D 小于 4 | P | (<1200),远小于| V |的大小。

表 1:实验中使用的三种不同 bug 库概览,谷歌浏览器、Mozilla Core、Mozilla Firefox

例如,如果使用 10000 个 bug 数据用于训练(250000 个单词(| V |)),BOW 模型表示将生成一个大小为 10 000×250 000 的稀疏特征矩阵,而我们提出的 DBRNN-A 模型将生成一个密集紧凑的表示,其特征矩阵的大小为 10 000×1200。

整个深度学习模型使用的是 Python 的 Keras 库。就我们所知,这是第一次有人使用深度序列学习模型来学习 bug 表示,并用这些功能来学习自动化软件 bug 分类监督模型。

分类 bug 报告

监督分类器的目标是学习一个函数 C,可以将 bug 特征表示图匹配给一组合适的开发者。将自动化 bug 分类作为监督分类的问题已经在文献 [5] [32] 中得到了充分的证实。然而,分类和特征的质量相差无几,这一点很好理解。因此,本研究的主要成果,是提出了一个更好的 bug 报告表示模型,并提高了现有分类器的性能。在这项研究中,我们使用深度学习 [9][7][10] 从业者喜欢的 softmax 分类器。Softmax 分类器对多类分类进行逻辑回归,提取特征并提供了长度等于类数的分数向量。softmax 分类器对这些分值进行归一化,并得到该类的第 i 个 bug 报告的可解释的概率值。

大规模公开 bug 数据集

我们从三个流行的开源系统获得了大量的 bug 报告数据:Chromium 、Mozilla Core 和 Mozilla Firefox 。数据收集过程将在本节中详解。为了使这项研究具有可重复性,整个数据以及训练测试协议和源代码可在 http://bugtriage.mybluemix.net/ 上找到。

数据提取

我们下载了 Google Chromium 从 2008 年 8 月(Bug ID:2)—2016 年 7 月(Bug ID:633012)期间的 bug 报告,总共收集了 383104 个 bug 数据,包括 bug 的标题、描述、bug 所有者和报告时间。 “所有者”字段中的开发人员被视为给定 bug 的真正分类。状态为“已验证”或“已修正”,并且类型为 bug,具有有效的 bug 所有者数据被用于训练和测试分类器,其余 bug 用于学习 bug 表示。

但是,我们注意到共计有 11044 个被验证或修复的 bug 并没有对应的所有者。这些公开的 bug 共有 263,936(68.9%)个,均用于深度学习,118,643(31%)个 bug 报告被用于分类器的训练和测试。

我们从 Mozilla 两个 bug 数据库 Core 和 Firefox 中提取数据,包括 1998 年 4 月(Bug ID:91)和 2016 年 6 月(Bug ID:1278040)之间 Mozilla Core 的 314,388 个 bug 报告,以及 1999 年 7 月(Bug ID:10954)到 2016 年 6 月(bug 号 1278030)期间 Mozilla Firefox 的 162307 个 bug 报告。被“分配”的开发人员在分类过程中被认为是实际上的分类。在分类器的训练和测试中,我们使用了状态为已验证修复、已解决修复状和已关闭修复 bug 报告。然而,有些修复报告没有对应的分配开发人员,例如在 Core(7219/135434 = 5.33%)和 Firefox(3716/27930 = 13.3%)中。忽略这些 bug,Core 中的 1,28,215 个 bug, Firefox 中的 24,214 个 bug 被用于分类器的训练和测试,数据集总结见表 1。

数据预处理

我们使用相同的步骤对三个数据集进行单独的预处理,并创建基准协议,每个 bug 报告中相同的 bug 标题和描述文本内容。预处理非结构化文本内容的过程包括删除 URL、十六进制代码和堆栈跟踪信息,并将所有文本转换为小写字母,并使用斯坦福大学的 NLTK 包进行词汇标记。所有单词的词汇都是使用整个语料库构建的。为了去除很少出现的单词并减少词汇量,系统通常选择高频词或出现频率极低的词汇 [34]。对于提取的数据,我们通过实验观察到,词汇的最小频率为 5 会让词汇大小和性能之间达到很好的平衡。

深入学习数据训练

在我们的数据分割机制中,分类器测试数据是不可见的数据,因此不能用于深度学习算法。我们的设计是不使用分类器训练数据来训练深度学习模型,因为这些数据对提高准确性帮助极小,但却大大增加了训练时间。因此,只有非故障的 bug(在数据提取小节中解释)被用于训练深度学习模型。此外,使用非重叠数据集来训练特征模型和分类器模型,则突出了特征的泛化能力。

训练分类数据

对于监督分类器的训练和测试,我们使用 Betternburg 等 [4] 提出的 10 倍交叉验证模型,将所有已修复的 bug 报告数据按时间顺序排列分成 11 组。从第二次交叉验证开始,每一次验证被视为一个测试集合,此前的验证用于训练。

图 6:DBRNN-A 的体系结构,包括模型的所有参数。

通常情况下,在开源项目中,开发人员会不断更改时间,因此按时间顺序分类可确保训练和测试集的开发人员高度重合。此外,为了保证训练的有效性,我们需要每个开发者更多的训练样本。在最近的一项研究中,Jonsson 等 [14] 使用那些至少修复了 50 个 bug 报告的开发者样本进行训练,即每类训练样本的最小数目为 50。从文献 [2] [5] 的不同研究可以看出,阈值参数会影响分类性能。因此,在这个研究中,我们研究阈值和分类性能之间的直接关系,通过对每个类别的最小训练样本数量具有四个不同的阈值 0,5,10,20。为了进行闭合的训练实验,确保测试中可用的所有类都可用于训练,我们在测试集中还加入了训练集中不包括的分类。因此,对于每个有所有者的测试 bug 报告,分类器已经经过了同一所有者修复 bug 的训练。

实验评估
评估协议和度量

对于给定的 bug 报告,训练的 softmax 分类器给出每个开发者的概率值,表示它们与 bug 报告的关联。因此,所使用的评估度量达到 top-k 准确率,表示实际开发人员在 top-k 检索得出的结果。交叉验证(CV)集包括不同类别或一组开发人员。因此,在 CV#1 期间,用于训练和测试的类别与 CV#2 中使用的类别不同。由于整个 CV 的分类器模型是在不同的类别上进行训练的,所以平均准确度只能给出一个性能表现的大概范围,而不能达到可解释的准确率。因此,需要报告每个交叉验证集前 k 个数据的准确性,以了解其在模型训练中导致的方差 [16]。

为了学习深度表示,我们构建了具有 300 个 LSTM 单元的 DBRNN-A,其丢失概率为 0.3。Adam 优化器使用了基于分类交叉熵的损失函数,学习率为 0.001,训练了 100 个具有早期停止的时期,所用的模型架构和参数如图 6 所示。

与现有算法相比

算法性能交叉比较的主要挑战,是缺少公开的基准数据集和已有研究的源代码。因此,之前的研究工作获得的 bug 分类准确性无法与我们所提出的方法进行比较,除非结果在相同的数据集中显示。为此,我们采用文献 [2] [32] [14] 中提到的一些已经实验成功的自动化 bug 分类方法,与使用了我们的基准数据集的算法进行了比较。我们使用了基于词频的 BOW 表示 bug 报告中的标题和描述,如图 5 所示。我们使用这些功能,评估四个不同分类器的性能:(i)Softmax 分类器 [26],(ii)支持向量机(SVM)[31],(iii)多项朴素贝叶斯(MNB)[15],以及(iv)基于余弦距离的匹配 [21]。四个监督分类器均使用了 Python scikit-learn 包,且仅使用了分类器训练和测试数据,而未使用非分类 bug 报告。

图 7:深度学习算法在所有三个数据集的平均准确率。可以看到,随着每个类别训练样本数量增加,解决 RQ3 的分类准确性整体提高。

表 2:谷歌浏览器 bug 报告十次交叉验证的准确率。报告中包含所有验证和标准偏差信息,性能最好的结果加粗显示。

表 3:Mozilla Core bug 报告十次交叉验证的准确率。报告中包含所有验证和标准偏差信息,性能最好的结果加粗显示。

表 4:Mozilla Firefoxbug 报告十次交叉验证的准确率。报告中包含所有验证和标准偏差信息,性能最好的结果加粗显示。

结果分析

使用 Google Chromium、Mozilla Core 和 Mozilla Firefox 数据集得出的结果如表 2、表 3、表 4 所示,回答了本文的重点研究问题。

RQ1:使用深度学习来自动执行 bug 分类是否可行?

图 8:在 bug 报告中,仅使用标题或标题和描述,所有三个数据集上的深度学习算法精准度。未使用描述会显著降低分类的准确性,解答了 RQ4 提出的问题。

从获得的结果可以清楚地看到,深度学习 bug 报告表示是完全可以胜任 bug 分类任务的可行方法。我们提出的 DBRNNA 方法分类准确性达到 34 - 47%,并且所有的实验都是在 Intel(R)Xeon(R)CPU E5-2660 v3 上运行,运行频率为 2.60GHz,配置 Tesla K80 GPU。

学习特征表示模型和训练分类器通常是离线任务,对测试时间没有影响。例如,使用 Google Chroimum 数据集来训练 DBRNN-A,每小节需要大约 300 秒。对于整个 CV#10 子集,softmax 分类器的训练和测试时间分别为约 121 秒和 73 秒。但是,在对模型进行训练之后,使用我们提出的方法(特征提取 + 分类),为开发者分配新的 bug 报告仅需要 8 毫秒,这样的速度让人印象深刻。

RQ2:与传统方式相比,无监督的方法性能如何?

从结果中可以看到,DBRNN-A 的特征学习性能优于传统的 BOW 特征模型。使用 Chromium 数据集,BOW + Softmax 分类的平均精确度在 9-12%左右,而最好的分类器准确率可以达到 26-28%。这突出了在我们创建的大型数据集中进行 bug 分类十分具有挑战性。然而,DBRNN-A 的精准度达 37-43%,精准度提高 12-15%。同样,在 Mozilla Core 和 Mozilla Firefox 数据集中,使用了深度学习功能后,平均精准度分别提高 3-5%和 7-17%。因为深度学习模型可以从 bug 报告中记忆更长的句子,从而使得性能大幅提高。从结果中,我们观察到,BOW 特征 MNB 和基于余弦距离的匹配性能优于 SVM(支持向量机)和 softmax 分类器。

RQ3:每类训练样本的数量对分类器的性能是否有影响?

实验证明,随着每类训练样本的最小数量增加,通过更好地学习分类边界,所有 bug 报告库中的分类性能均有所提高。例如,在 Chromium 数据集中,当分类器训练阈值为零时,DBRNNA 的平均准确率为 37.9%,而当阈值为 20 时则稳定地上升到 42.7%。图 7 表示三个数据集分类平均准确率均提高。然而,当阈值大于 20 时,分类的准确率不再上升。另外,CV#10 到 CV#1 的数据也表明,DBRNN 的性能提高了。尽管测试数据种类数量有所增加,但分类性能随着训练数据的增加不断提高。因此,从经验上来说,分类器可用的训练数据越多,性能就越好。

而且,在所有的交叉验证中,所有数据集都存在大约(2 - 7)%的标准偏差。这强调了研究每个交叉验证集的性能以及平均准确率的重要性。

RQ4:与使用描述相比,只使用 bug 报告的标题(或摘要)进行分类的效果如何?

我们仅使用 bug 报告的标题(摘要)并完全忽略描述信息,对深度学习模型的性能进行了测试。在所有三个数据集上进行实验时,最小训练样本数量为 N = 20,CV#10。图 8 对在使用描述内容和不使用描述内容的情况下所有三个数据集上的平均准确率进行了比较。结果,我们可以清楚地看到,未使用描述显著降低了 Firefox 数据集中分类的性能,降幅高达 23%。

RQ5:当学习模型使用一个数据集进行训练,并用于在另一个数据集中进行分类时,使用深度学习、迁移学习或交叉数据学习是否有效?

通过重复使用已经过其他数据集训练的模型,转移学习可以显著减少离线训练所需的时间。但是,大多数模型在跨数据集学习的过程以失败告终。我们在 Chromium 数据集中训练模型,然后在 Core 和 Firefox 数据集(Mozilla 数据集)中进行测试,以探究深度学习模型在转移学习中的有效性。测试结果显示,使用在 Chromium 数据集上训练的深度学习模型,当 N = 20 时,Chromium 测试集中的平均准确率为 42.7%,Core 为 39.6%,Firefox 为 43%。通过这种方法获得的结果与在相同数据集上训练和测试获得的结果相差无几。这表明,我们所提出的方法能够有效地使用在数据集上训练的模型,在另一数据集中完成 bug 报告分类任务。

实验的影响因素

我们的实验结果可能受到一些因素的影响。虽然任何基于学习的分类系统普遍都会受到一些因素的影响,但这些因素并不是我们的方法面临的问题,而是另外一些因素,具体如下:

(1)使用三个具有不同特征的开源 bug 库得出结果,以确保泛化。

然而,商业化 bug 跟踪系统可能会采用不同的模型,因此我们的结果可能不能直接应用到这样的库。

(2)目前,我们的方法只测试了 bug 报告的标题和描述。虽然实验结果显示,这两个非结构化的文本数据在得出充分的 bug 报告过程中是必要的,但可能还需要其他额外的信息。

(3)为了进行对比,我们还重新测试了一些文献中提到,目前还未公开应用的 bug 分类算法。虽然我们已经尽力以最好的方式应用这些算法,但结果还是与原始应用有一定偏差。

(4)在分类器的训练和测试期间,我们假设每个 bug 报告只对应一个修复所有者。但是,根据已解决的 bug 报告模式和历史记录,项目中可能有多个活跃的开发人员可以解决该 bug。

其他应用

bug 表示是直接从数据中以无监督的方式习得的,且功能的实现不依赖于任务。这使我们可以灵活地使用这些功能,来学习所有任务或应用程序的监督分类器。我们还讨论了这一特征表示方法在其他应用中的可能性。


  • 哪个 bug 被修复:虽然非常具有挑战性,但是这个问题已经在文献 [11] 中得以解决。通过使用本研究中提取的相同特征表示,我们可以对二元分类器进行有监督或半监督式的训练,用已修复的 bug 对未修复的 bug 进行分类。

  • bug 修复时间预测:正如 Bhattacharya 等人 [6] 所说,我们可以使用这一功能构建一个预测模型,以了解修复 bug 所需的时间。

  • 重新打开分析:从维护的角度研究哪些 bug 在其生命周期中重新打开。正如 Zimmermann 等人所讨论的那样 [35],我们可以使用深度学习功能来执行 bug 表征。

  • bug 优先评估:bug 优先级评估发生在分类开始之前 [6]。按照优先级,bug 和为其分配开发人员的 SLA clock 可能会随之改变。

相关结果

表 5 按照时间顺序(2010 年至 2016 年)列出了与 bug 分类密切相关的结果列表。以前的大多数技术都使用了 bug 摘要 / 标题和描述 [2] [28] [32] [33] 数据,因为它们在报告提交时是可用的,并且不会随着报告的周期而改变。Bhattacharya 等人 [5] 将产品、组件和最后的开发人员活动也加入了开发者名单,Shokripour 等人 [27] 使用代码信息以改善性能,而 Badashian 等人 [3] 使用堆栈溢出和 bug 描述中的关键字来识别开发人员的专业知识。

表 5 显示,我们采用了许多不同的特征模型,如 tf、归一化 tf、tf-idf 和 n-gram。我们通过工程设计来选择要使用哪种特征模型,然而,选择哪个特征模型最能代表所收集的数据是一项具有挑战性的任务。在这项研究中,我们设计了一个深度双向 RNN 解决了这个问题,它以无监督的方式从数据中直接学习到最优特征表示。此外,我们还超越单词级别的表示模型,提出了一个多单词序列表示模型,学习整个 bug 报告的统一表示方法。

结论

在这项研究中,我们提出了一个基于深度双向注意机制的递归神经网络(DBRNN-A)的新型软件 bug 报告(标题 + 描述)表示算法。该深度学习算法可以学习保留了较长上下文词序和语义关系的段落级表示方法。我们对四种不同分类器、多项朴素贝叶斯、余弦距离、支持向量机和 softmax 分类器的性能进行了对比。为了进行实验分析,我们收集了来自三个受欢迎的开源 bug 库的 bug 报告数据:谷歌浏览器(383,104)、Mozilla Core(314,388)和 Mozilla Firefox(162,307)。实验结果表明,DBRNN-A 和 softmax 分类器的性能优于 bag-of-words(词库)模型,三个数据集的平均准确率均有所提高。此外,研究结果还显示,仅使用标题信息进行分类会显著降低分类的性能,突出了描述的重要性。值得注意的是,深度学习模型的转换学习能力得以体现,Chromium 数据集上学习的模型在调整 Mozilla bug 时表现出竞争性。

此外,该实验的数据集连同其完整的基准测试协议和实施的源代码是公开的,以实现实验的可重复性。

原文链接:

http://bugtriage.mybluemix.net/

小彩蛋:如果您平常有阅读论文的习惯,并且愿意做一些论文编译整理的工作,或者有论文导读类稿件希望可以发布,欢迎关注 AI 前线(ai-front),在后台留下联系方式,我们将与您联系,并进行更多交流!

登录查看更多
2

相关内容

深度学习自然语言处理概述,216页ppt,Jindřich Helcl
专知会员服务
215+阅读 · 2020年4月26日
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
120+阅读 · 2019年12月31日
深度学习视频中多目标跟踪:论文综述
专知会员服务
94+阅读 · 2019年10月13日
用深度学习做文本摘要
专知
24+阅读 · 2019年3月30日
用PyTorch实现各种GANs(附论文和代码地址)
已删除
生物探索
3+阅读 · 2018年2月10日
机器学习自动文本分类
AI前线
23+阅读 · 2018年2月4日
开源自动语音识别系统wav2letter (附实现教程)
七月在线实验室
9+阅读 · 2018年1月8日
论文 | 深度学习实现目标跟踪
七月在线实验室
48+阅读 · 2017年12月8日
在深度学习TensorFlow 框架上使用 LSTM 进行情感分析
北京思腾合力科技有限公司
4+阅读 · 2017年8月9日
A Sketch-Based System for Semantic Parsing
Arxiv
4+阅读 · 2019年9月12日
A Survey on Deep Transfer Learning
Arxiv
11+阅读 · 2018年8月6日
Arxiv
8+阅读 · 2018年5月15日
VIP会员
相关VIP内容
深度学习自然语言处理概述,216页ppt,Jindřich Helcl
专知会员服务
215+阅读 · 2020年4月26日
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
120+阅读 · 2019年12月31日
深度学习视频中多目标跟踪:论文综述
专知会员服务
94+阅读 · 2019年10月13日
相关资讯
用深度学习做文本摘要
专知
24+阅读 · 2019年3月30日
用PyTorch实现各种GANs(附论文和代码地址)
已删除
生物探索
3+阅读 · 2018年2月10日
机器学习自动文本分类
AI前线
23+阅读 · 2018年2月4日
开源自动语音识别系统wav2letter (附实现教程)
七月在线实验室
9+阅读 · 2018年1月8日
论文 | 深度学习实现目标跟踪
七月在线实验室
48+阅读 · 2017年12月8日
在深度学习TensorFlow 框架上使用 LSTM 进行情感分析
北京思腾合力科技有限公司
4+阅读 · 2017年8月9日
相关论文
Top
微信扫码咨询专知VIP会员