选自arXiv
机器之心编译
参与:黄小天、刘晓坤
自动 bug 归类算法可以被形式化为分类任务,其中主要挑战在于 bug 描述通常包含噪声。在这项研究中,作者提出了一种新型 bug 报告表征算法 DBRNN-A,能无监督地学习长词序列的句法和语义特征,以及语境表征。他们主要使用了未修复的 bug 报告,而过去的研究都没有重视这一点。此外,作者还开源了整个数据集、具体的数据集划分以及源代码,使得该研究可复现。
在通常的过程中,终端用户在系统上工作时遇到 bug(也称为问题或缺陷),并在 bug 追踪系统中报告这一问题 [8]。图 1 展示了谷歌 Chromium 项目中(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 所示。处理这些非结构和噪音数据是分类器学习中的一个主要挑战。
图 1:谷歌 Chromium 项目中 bug 报告的一个截图(bug ID: 638277)。
图 2:来自谷歌 Chromium bug 库中的 bug 报告,被用作标注模板以训练分类器。
研究贡献
从长文本(例如 bug 报告描述)中按单词顺序学习语义表征是很有挑战性的研究问题。因此,作者提出了一种深度学习技术,能以无监督的方式从 bug 报告内容中学习简明的固定长度的表征,即该表征可以直接通过学习数据得到,而不需要手动特征工程。作者尝试解决的问题如下:
(1)使用深度学习进行自动 bug 归类是否可行?
(2)和传统的特征工程方法对比,无监督特征工程如何执行?
(3)每个类的训练样本数会影响分类器的性能吗?
(4)仅使用 bug 总结或描述进行 bug 归类的性能会不会受影响?
(5)在 bug 归类中使用迁移学习是否可行?
最近,基于 RNN 的深度学习算法革新了词序列表征的概念,并在很多应用中(例如语言建模和机器翻译)做出了很有潜在价值的突破。Lam 等人 [17] 使用 DNN 结合 rSVM 以学习源代码和 bug 报告之间的普遍关系,并用于有效的 bug 定位。White 等人 [30] 提供了一个广泛的视角,讨论了深度学习如何应用于软件库中以解决一些挑战性的问题。本项研究的主要贡献可总结为:
提出了一种使用 DBRNN-A(基于注意力和 LSTM 单元的深度双向循环神经网络)的新型的 bug 报告表征方法。作者提出的深度学习算法可以在长文本中「记住」其中的语境。
一个开源 bug 库中有 70% 的未归类和未解决的 bug 报告,很多文献都忽略了这一点 [14]。在本项研究中,作者提出了一种机制,能以无监督的方式利用所有未归类的 bug 学习 bug 表征。
作者在实验中使用了来自三个开源 bug 库的实验数据,分别是来自 Google Chromium 的 383104 个 bug 报告、来自 Mozilla Core 的 314388 个 bug 报告,和来自 Mozilla Firefox 的 162307 个 bug 报告。由于在不同的训练-测试划分的数据集上的分类器性能是不可比较和不可复现的,因此作者开源了整个数据集、具体的数据集划分以及源代码,使得该研究可复现。
作者进一步研究了提出的 bug 训练方法在交叉数据测试场景中的有效性。通过使用 Chromium 项目中的 bug 训练模型,并将模型用在 Core 和 Firefox 项目(Mozilla bug 库)中进行 bug 归类,展示了该深度学习模型的迁移学习能力。
本文提出的方法
图 4:本文提出的完整算法的重要步骤流程图。
自动 bug 归类算法可以被形式化为一个分类任务,取 bug 标题和描述为输入,将其映射到开发者(分类标签)之一。图 4 展示了自动 bug 归类算法的主要步骤,详细解释如下:
(1)一个 bug 语料库的总结(标题)、描述、报告时间、状态和所有者都是从一个开源 bug 追踪系统中提取出来的。
(2)处理非结构化描述中的 URL、堆栈轨迹、十六进制代码和代码片段需要对深度学习模型进行特定的训练,因此在本研究工作中,这些内容在预处理阶段被删除了。
(3)在语料库中出现至少 k 次的独特单词被提取为词汇表。
(4)已归类的 bug(D2)被用于训练和测试分类器,而所有未归类/开放的 bug(D1)被用于训练深度学习模型。
(5)使用基于注意力机制的深度双向循环神经网络学习 bug 表征,其中考虑了 bug 总结和描述,并将其组合为词 token 序列。
(6) 将归类 bug(D2)分成训练和测试数据,并进行 10 倍交叉验证以消除训练偏差,
(7) 使用已学习的 DB-RNN 算法提取训练 bug 报告的特征表征,
(8) 训练监督分类器以执行作为 bug 归类过程一部分的开发者分配,
(9) 接着使用已学习的深度学习算法提取测试 bug 的特征表征,
(10) 通过提取的特征和已学习的分类器,可以在测试集中为每一个潜在的开发者预测概率值并计算分类准确率。
该方法和传统的自动归类 bug 通道不同,(i) 步骤 4 中,考虑了未归类的 bug(D1)(在传统方法中完全被忽略),(ii) 基于深度学习的 bug 报告表征取代了 BOW 表征。步骤 4 和 5 的添加,使得可以自动从数据本身而不是通过手工工程学习 bug 报告表征。
图 5:具有 LSTM 单元的深度双向循环神经网络(RNN)的详细解释,用于图 1 所示的示例性 bug 报告。可以看出,深度网络有多个隐藏层,以学习一个复杂的来自输入数据的层级表征。作为对比,还展示了针对相同示例语句的基于 tf 的 BOW 表征。
论文:DeepTriage: Exploring the Effectiveness of Deep Learning for Bug Triaging
bug 归类处理的主要任务是对给定的软件 bug 报告,确定更有可能修复 bug 的开发者。大多数 bug 追踪系统都会展示 bug 标题(总结)和细节描述。自动 bug 归类算法可以被形式化为一个分类任务,取 bug 标题和描述为输入,将其映射到开发者(分类标签)之一。其中主要的挑战在于 bug 描述通常包含非结构化的文本、代码片段和堆栈轨迹,使输入数据充满噪声。过去十年内出现了很多研究,使用基于 tf-idf 的词袋特征(bag-of-words feature,BOW)模型来表征 bug 报告。然而,BOW 模型并没有考虑描述性语句中的句法型和序列型的词信息。
在这项研究中,我们提出了一种使用基于注意力的深度双向循环神经网络(deep bidirectional recurrent neural network,DBRNN-A)模型的新型 bug 报告表征算法,它能以无监督的方式从长词序列中学习句法的和语义的特征。我们用基于 DBRNN-A 的鲁棒的 bug 表征取代 BOW 特征,用于训练分类模型。此外,使用注意力机制使得模型可以学习 bug 报告中长词序列的语境表征。为了提供大量的数据用于训练该特征学习模型,我们在该项研究中主要使用了未修复的 bug 报告(包含一个开源 bug 追踪系统的 70% 的 bug),而过去的研究都没有重视这一点。
我们的另一项主要的贡献是将代码开源,并从三个开源 bug 追踪系统(Google Chromium、Mozilla Core 和 Mozilla Firefox)创建了一个公开的 bug 报告的基准数据集,使这项研究可以被复现。我们在实验中使用了来自 Google Chromium 的 383104 个 bug 报告、来自 Mozilla Core 的 314388 个 bug 报告,和来自 Mozilla Firefox 的 162307 个 bug 报告。我们实验地比较将该模型与 BOW 模型、softmax 分类器、支持向量机、朴素贝叶斯和余弦距离进行了比较,并观察到 DBRNN-A 可以得到高 10 级的平均准确率。
本文为机器之心编译,转载请联系本公众号获得授权。
✄------------------------------------------------
领取专属 10元无门槛券
私享最新 技术干货