编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

以更好的信息传播平衡缺陷预测(信息传递的效果好坏取决于哪三个因素)

wxchong 2024-07-29 07:51:09 开源技术 23 ℃ 0 评论

引用

Xianda Zheng, Yuan-Fang Li, Huan Gao, Yuncheng Hua,4,5 Guilin Qi, Towards Balanced Defect Prediction with Better Information Propagation.

摘要

缺陷预测,即预测源代码工件中是否存在缺陷,在软件开发中具有广泛的应用。缺陷预测面临两个主要挑战,标签稀缺性,其中只有一小部分代码工件被标记,以及数据不平衡,其中大多数标记工件是无缺陷的。此外,当前的缺陷预测方法忽略了代码工件之间信息传播的影响,这种疏忽会导致性能下降。在本文中,我们提出了 DPCAG,一种解决上述三个问题的新模型。我们将代码工件视为图中的节点,并学习在 EM 框架中迭代地在相邻节点之间传播影响。DPCAG 动态调整每个节点的贡献,选择高置信度节点进行数据增强。真实世界基准数据集的实验结果表明,与最先进的模型相比,DPCAG 提高了性能。特别是,当使用 Matthews 相关系数(MCC)衡量时,DPCAG 实现了显着的性能优势,该指标被广泛认为最适合不平衡数据。

导言

未检测到的缺陷对软件质量和安全性造成严重威胁。例如,2012 年 OpenSSL 中无意中引入了 Heartbleed Bug,并且两年多来一直没有修补。大量用户被迫在亚马逊网络服务和 GitHub 等热门网站上修改密码。缺陷预测目的是构建分类器来预测代码工件(例如类、方法)是否有缺陷。多年来已经提出了许多缺陷预测模型(Wang, Liu, and Tan 2016;Fan 等人 2019;Li 等人 2017;Qu 等人 2018)。然而,大多数都不能有效地处理由源代码的固有特征引起的以下三个挑战:(1)代码工件之间的信息传播需要很好地表示;(2)缺少代码工件的标签信息(即有缺陷与否);(3)数据类别严重失衡(即无缺陷工件占绝大多数)。

代码工件通过方法调用和消息传递(即信息传播)相互通信。在代码工件之间传播的信息可能会影响判断工件是否有缺陷。现有方法都没专门区分不同代码工件之间的信息传播。因此,需要设计一种精确描述信息传播的机制。标签稀缺是指源代码中没有标记的工件。标记数据的缺乏使得以高精度训练缺陷预测模型变得更加困难。实验结果表明,DP-CNN 在较大数据集上的性能比在较小数据集中更差,因为较大的数据集更容易受到标签稀缺的影响。因此,需要研究机制来解决标签稀缺性挑战。当绝大多数标记代码工件是无缺陷的并且是一种广泛存在的现象时,就会发生类不平衡。过度采样是处理这一挑战的常用方法之一。NSGLP (Zhang, Jing, and Wang 2017)等模型使用拉普拉斯抽样(Laplacian Sampling)并扩展小类别来解决这一挑战。但是这些方法带来了两个新问题:(1)类与同类方法没有区分;(2)可能会引入额外的噪音。因此,为每个类别和方法调整权重的重新加权方法可能更合适。

本文提出了一种基于代码工件图的缺陷预测方法(DPCAG)。构建一个代码工件图,并预先训练代码工件作为特性的嵌入。进一步提出了一种新的传播控制机制来自动学习信息传播矩阵来表示信息的传播强度。最后,我们在期望最大化(EM)框架中训练一个分类器。DPCAG 的一个关键组件是基于 EM 的分类器。在 E 步骤中,我们将嵌入与传播矩阵结合起来,在 GNN 模型上进行传播,以估计标签分布并更新嵌入。在此阶段,使用数据增强机制来扩展训练集以处理标签稀缺性。在 M 步中,我们在另一个 GNN 模型上传播标签而不是嵌入,并最大化标签分布的概率。我们采用动态加权损失函数来克服类不平衡。

本文贡献总结如下:

  • 我们提出了一种名为 DPCAG 的新型半监督方法,利用代码工件的信息和代码工件之间的结构信息进行缺陷预测任务,同时有效地解决了上述三个主要挑战。
  • 我们采用传播矩阵来充分捕捉代码工件之间的信息传递,并提出一种数据增强机制,在克服标签稀缺性的同时,将高相似性样本添加到训练集中,我们还设计了一个损失函数,它动态地改变代码工件的权重,以减轻类不平衡问题的影响。
  • 通过广泛的实证研究,我们的方法在缺陷预测任务中优于最先进的模型。 特别值得注意的是,我们的方法在通过 Matthews 相关系数(MCC)衡量时取得了实质性的优势,该指标已被广泛认为是衡量不平衡数据性能的合适指标。

相关工作

缺陷预测模型

缺陷预测是一项预测代码工件是否有缺陷的任务(Bowes、Hall 和 Petric 2018)。大多数缺陷预测模型专注于从代码工件中提取更好的特征。他们使用代码工件的统计数据和流程度量作为特征(Nagappan 和 Ball 2005;Bibi 等人 2006)来训练分类器。最近的基于嵌入的模型更喜欢使用抽象语法树(AST)的嵌入作为特征,而 AST 包含语法和语义信息。例如,DP-CNN (Li 等人,2017)编码来自 AST 的标记向量并通过 CNN 生成特征。DBN-CP(Wang、Liu 和 Tan 2016)利用深度信念网络从 AST 中提取语义特征来训练分类器。DP-ARNN (Fan 等人,2019) 利用 word2vec (Mikolov 等人 2013)的词嵌入并使用注意力机制来生成特征。然而,这些最先进的模型只是忽略了类不平衡和信息传播。

一些模型试图在代码工件之间使用传播信息。 例如,node2defect(Qu et al. 2018)使用类依赖图对代码中的类进行编码,并使用 node2vec(Grover and Leskovec 2016)随机传播以生成类的嵌入作为特征。然而,这些方法构建的图的相邻节点属于相同类型(例如类),限制了它们对包含不同类型代码工件(例如类和方法)的数据的适用性。

其他研究侧重于阶级失衡问题。例如,ORB (Cabral et al. 2019)提出了一种处理类别不平衡问题的过采样机制,即根据偏差对不同类别进行评分,并根据评分重新抽样。NSGLP(Zhang, Jing, and Wang 2017)通过拉普拉斯抽样(Laplacian Sampling)对人工制品进行评估,并扩展次要类以解决类间不平衡。

基于网络的图卷积模型

图卷积网络(GCN)已经证明:(1)用图结构来表示代码工件之间的关系(Atzeni 和 Atzori 2017),(2)我们的模型修改来描述信息传播过程。GCN (Kipf and Welling 2017)是一种图神经网络(GNN)架构,用于对图中的节点进行分类。GCN 中的卷积运算是计算图中节点的拉普拉斯矩阵,然后将这些节点的表示相乘。GraphSAGE (Hamilton, Ying, and Leskovec 2017)等相关模型从邻域节点采样并聚合信息来预测未标记节点的标签。GAT (Velickovic et al. 2018)利用注意机制来学习传播步骤中节点间的系数权重。GMNN(Qu, Bengio, and Tang 2019)使用条件随随域对目标标签的联合分布进行建模,并利用 EM 算法对模型进行优化。然而,这些模型都没有解决类不平衡的问题,这是缺陷预测任务中的一个关键问题。

问题定义

我们使用解析器(Atzeni 和 Atzori 2017)将一个给定的项目的源代码转换成一个图 G=(V, E),其中 V 是一组节点和表示代码构件,即类和方法,和 E 是边的集合,表示节点之间的关系,例如继承关系,关联关系,和调用关系。节点可以被分成两个不相交的子集:标记节点 Vl 和未标记节点 Vu,使 V=Vl∪Vu。此外,标记节点还可以分为两个子类;非缺陷节点和缺陷节点,即 Vl= Vneg∪Vpos。

每个节点 vi∈V 可以表示为其 d 维嵌入 ei∈R^d。为了简化符号,我们使用矩阵 X∈R^{|V|×d}表示 G 中所有节点的嵌入。假设集合 V, Vl 和 Vu 中节点的特定且一致的排序,我们分别定义 p(Y), p(Yl), p(Yu)为这些节点的标记分布。

我们将缺陷预测任务转换为二值分类任务。我们的目标是预测每个未标记节点的标签。因此,减少缺陷预测任务,以最大化未标记节点的标签的可能性。形式上,给定图 G = (V, E)和嵌入 X 的节点,我们的目标是学习一个 θ 参数化的缺陷预测模型,以最大化未标记节点的标签分布的对数似然,即 θ?= arg maxθlog p(Yu|Yl,X,G;θ)。为了方便起见,我们用 log pθ(Yu |yl, X, G)表示 logp (Yu|Yl, X, G;θ)。

方法

我们的方法的总体框架如图 1 所示,可分为三个主要步骤。


  1. 图构建和嵌入。为了利用源代码中的依赖关系,我们将源代码转换为如上所述的图 G,并计算节点 V 的嵌入 X 以促进模型的训练。
  2. 传播矩阵的学习。为了利用图 G 中节点间的传播信息,我们使用标签 Yl 构造并优化传播矩阵 A*,即表示传播强度的元素。
  3. 分类器训练。为了对节点 Vu 进行分类(即学习 Vu 的标签分布),我们将标签信息 Yl 与传播矩阵 A*和特征 X 相结合,训练基于 EM 的分类器,同时采用数据增强和动态加权损失函数,克服了标签稀缺和类别不平衡的问题。

图的构造与嵌入

给出一个项目,我们使用 CodeOntology (Atzeni and Atzori 2017)解析其源代码,并在资源描述框架中提取三元组,构造图 G。最后,我们使用一种图表示学习方法来预先训练节点 V 的嵌入 X。

传播矩阵学习

代码工件之间的信息传播会影响工件是否有缺陷,忽略信息传播可能导致分类器的次优性能。例如,在图 1 中,节点 v6 可能是一个缺陷节点,因为它利用了缺陷节点 v7 的信息。如中图所示,节点 v6 和 v7 之间的边的信息传播强度为 0.8,说明 v7 对 v6 的影响很大。

现有方法中所使用的传播矩阵都是完全基于图结构信息的,如邻接矩阵和拉普拉斯矩阵。这些矩阵不利用特征信息或标签信息,可能会影响预测性能。因此,我们利用图结构信息构造传播矩阵,然后结合标签信息进行自动优化。形式上,对于传播矩阵 A∈R|V|×|V|,定义每个元素 Aij 的初始值为:

其中 d(i)表示图 G 中节点 vi 的度,a、b 为超参数。初始化矩阵 A 后,我们使用 LPA (Zhu and Ghahra- mani 2002)对矩阵 A 进行自动优化。

其中 J()为交叉熵损失,yi^ lpa 为 LPA 预测的标签。因此 A? 包含了图结构信息和标签信息,我们在分类器中使用 A? 来控制信息的传播。

基于 EM 的缺陷预测模型

在缺陷预测任务中,缺陷可能发生在工件内部以及工件之间的接口上。因此,一个节点是否有缺陷是由它的特性和与它有依赖关系的节点的标签决定的。然而,目前的方法并没有有效地利用这些依赖关系,因为大多数节点的标签 Yu 是未知的。

为了充分利用每个节点的特征和邻近节点的标签,我们将 Yu 作为隐变量,提出了一种基于 EM 的半监督分类器。在期望步骤中,我们利用节点嵌入 X 来学习分布对数 qθ 来获得未标记节点的标签。在最大化步骤中,我们利用邻近节点的标记和依赖关系 A*来学习分布 logpθ,并最大化期望 E_{logqθ}log pθ。具体来说,在我们的分类器中,我们优化了对数似然的证据下限(ELBO),而不是直接优化对数似然,如下所示。

算法 1 总结了分类器的主要步骤。在 E 步中,我们固定 logpθ,更新 logqθ。我们分别使用动态加权损失和数据增强来解决类别不平衡和标签稀缺问题。在 M 步中,我们固定 logqθ 并更新 logqθ,再次使用动态加权损失来解决类的不平衡问题。我们将在下一小节和最后一小节中展示 E-step 和 M-step 的细节。

期望步骤

在期望步骤中,我们的目标是估计标签分布 logq θ(Y|X, A)。当更新 X,θ 和扩展训练集时,我们使用一个双层 GNN 预测标签分布 log qθ(Y |x, a)。具体来说,期望步骤包含以下三个主要步骤。

1. 学习分布。已经证明,节点(即 X)的表示受到其邻近节点的影响(Qu, Bengio, and Tang 2019)。因此,我们使用一个 GNN 来传播邻近节点的影响,通过传播矩阵 A*。具体来说,我们使用一个两层的 GNN,称为 GNNq,从邻近节点更新节点嵌入,并学习分布 logqθ(Y|X, A*)。GNNq 中的节点为节点嵌入 X,边缘权值由传播矩阵 A*给出。

其中 Wq1∈R^{d×h},Wq2∈R^{h×2}分别为 GNNq 第一层和第二层的权矩阵,h 为维数,σ 和 σ’为激活函数 ReLU 和 softmax, Xt 为 X 的第 t 次迭代。

2. 动态加权损失函数优化。我们设计了动态加权损失函数来减轻类别不平衡的影响。具体来说,我们使用 predi∈R2 表示 vi∈Vl 的概率从 logθ(Y^{t+1}|X^{t+1}),和 reali∈R2 代表 vi∈Vl 在 log pθ(Y|Yl, X, A*)的概率,其中 Yt 表示 t 次迭代的 Y。让 gapi = predi ? reali,损失函数可以定义如下,o 是元素积。

我们在损失函数中乘以 ?log(predi),因为它可以动态调整 vi 对损失函数的贡献。我们乘以 1+(gapi),因为当分类器错误分类时,它会增加惩罚。相反,当 vi 被正确分类时,损失几乎没有变化。

3.数据增强。通过反向传播计算上一步的损失后,我们使用更新后的嵌入 X^{t+1}来选择高可靠的节点并将其添加到训练集。对于每个未标记节点 v∈Vu,设 s' = maxv'∈Vneg Sim(ev, ev')为最高的非缺陷置信度,设 s'' = maxv'∈Vpos Sim(ev, ev')为最高的缺陷置信度。给定一个预定义的阈值 t,如果 s'>max(s'', t),则将节点 v 添加到 Vneg 中。否则,如果 s'>max(s', t),则节点 v 加入 Vpos。

在我们的模型中,我们使用余弦相似度作为相似函数。然后将扩展的训练集用于后续的训练过程。

最大化步骤

在最大化步骤中,我们固定了 log pθ 的分布,并利用邻近节点的标签信息来学习分布 log pθ 和最大化 Elog qθ log pθ。我们使用另一个 GNN,即 GNNp 来传播这个信息。GNNp 中的节点表示更新的节点标签,边缘权值由传播矩阵 A 给。当 E 步和 M 步的损失不再减少时,训练过程停止,我们将 log qθ 作为最终的标记分布。

实验

数据集和指标

我们使用 ELFF (Shippey et al. 2016)的三个数据集,即 DrJava、Genoviz 和 Jmol 来评估模型性能。在 ELFF 的所有数据集中,DrJava 是最大的数据集;Jmol 是最常用的小规模数据集;

Genoviz 也是一个常用的数据集,它的大小介于 DrJava 和 Jmol 之间。它们的简要统计信息如表 1 所示。可以清楚地观察到,所有三个数据集都表现出标签稀缺和类别不平衡的重要问题。

在所有节点中,标注节点在三个数据集中分别占 4.53%、5.57%和 7.12%。缺陷节点分别占标记节点的 1.8%、3.6%和 4.9%。对于每个数据集,标记节点集按 90-5-5 的比例分为训练集、验证集和测试集。

我们使用马修斯相关系数(MCC)作为主要的评价指标,以及准确性(ACC), F1-得分。在文献中,MCC 是衡量不平衡数据集分类性能的更合适的度量标准已得到广泛认可(Boughorbel, Jarray,和 El-Anbari 2017;Song, Guo, and Shepperd 2019;Shepperd, Bowes, and Hall 2014),使其特别适合缺陷预测。MCC 由混淆矩阵中的四个元素计算,即真正(tp)、真负(tn)、假正(fp)、假负(fn)。

基线

我们将我们的模型与许多最先进的缺陷预测模型进行了比较:有影响力的传统模型 DBNCP(Wang、Liu 和 Tan 2016)、基于 CNN 的模型 DPCNN(Li 等人 2017)、Transformer 基于模型 DPARNN (Fan et al. 2019) 和基于网络嵌入的模型 Node2defect (Qu et al. 2018)。此外,我们针对图马尔可夫神经网络 (GMNN)(Qu、Bengio 和 Tang 2019)评估我们的模型。GMNN 是一种结合了马尔可夫网络和图神经网络的最先进的半监督分类模型。请注意,DBN-CP、DP-CNN 和 DP-ARNN 不是端到端模型,需要使用额外的分类器对测试数据进行缺陷预测。我们对这些模型采用随机森林(RF)和逻辑回归(LR)。

实验设置

对于我们的模型,学习速率 lr 设置为 0.006,退出率 p 设置为 0.5。对于所有三个数据集,超参数 a 都设置为 25。超参数 b 在 DrJava 中设置为 1300,在 Genoviz 和 Jmol 中设置为 2000。隐含层的维数为 h = 20。我们使用 RMSProp (Tieleman and Hinton 2012)作为优化器。向训练集添加节点的置信阈值为 t = 0.8。在每次迭代中,期望步骤和最大化步骤的 epoch 被设置为 200。根据验证集结果选择超参数值。

实验结果

缺陷预测任务的主要结果如表 2 所示。可以得出一些重要的结论。

  1. 总的来说,我们的模型在所有三个数据集上的所有最先进的基线都优于一个案例(Jmol 上的 ACC),尤其是在 MCC 和 F1 中。
  2. 更重要的是,在 MCC 的值中可以观察到最显着的性能差异,其中 MCC 更忠实地衡量模型在不平衡数据上的性能。 与每个数据集的次优方法相比,我们的模型分别优于它们 48.2%、44.6% 和 24.6%。 这些结果清楚地证明了我们模型的优越性,尤其是在不平衡和大型数据集上。
  3. 相比之下,不同模型的准确率值都很高且彼此接近,反映了 ACC 对类不平衡问题的不敏感。 换句话说,模型只需要将未标记的节点分类为多数类(非缺陷)即可获得高精度值。 对于需要归类为缺陷节点的节点,我们的模型比每个数据集的次优方法高 46.1%、16.7% 和 9.1%。 这表明我们的模型可以正确地对缺陷节点进行分类,并帮助我们在实际任务中找到存在缺陷的代码。

总之,这些观察结果清楚地表明,我们的模型在处理标签稀缺和类别不平衡问题时是有效的,同时充分利用了缺陷预测任务中的信息传播。在下一节中,我们将进一步分析主要组件对模型性能的影响。

模型分析

在本节中,我们将介绍消融研究和我们模型的其他分析。选择 DrJava 作为分析的数据集,因为它是 ELFF 中最大的数据集,也是三者中标签稀缺和类别不平衡问题最多的数据集。因此,它可以最恰当地反映我们模型的性能。

DPDAG为什么使用 EM 框架?

在我们的模型中,我们使用基于 EM 的分类器来利用节点及其邻域的嵌入 X 和标签 Y。我们通过构建一个监督分类器来检查使用 EM 框架的必要性,该分类器以嵌入 X 作为特征,已经传播,并带有节点标签。比较表明,我们的模型在三个数据集中的 MCC 上显着优于基于 GNNq 的分类器 19.2%、8.8%和 7.6%。它表明我们基于 EM 的分类器可以有效地利用来自相邻节点的标签信息。

信息传播分析

我们设计此分析以验证传播矩阵对模型性能的影响。传播矩阵可以看作是 GNN 上传播过程的关键,其中这些矩阵的元素代表了节点之间信息传播的强度。在本实验中,我们将公式(2)中定义的自动优化传播矩阵 A*与三个不同的传播矩阵进行比较:邻接矩阵 AD ∈ R|V|×|V|,GMNN 的传播矩阵 GM∈ R|V|×|V|和固定在公式(1)定义的初值处的传播矩阵 A。

结果如表 3 所示。它表明我们的传播矩阵具有最佳性能。性能差异可归因于以下主要原因。(1)邻接矩阵 AD 只包含图中节点是否相关的粗粒度信息。(2) GMNN GM 的传播矩阵在邻接矩阵中加入了节点的度信息,但忽略了不同类别节点(未标记、缺陷或非缺陷)的不同影响。(3)传播矩阵 A 考虑了基于 GM 的不同类别的节点,但修复了它们的影响。(4)相比之下,我们自动优化的传播矩阵 A*充分利用标签信息对矩阵进行微调,以进一步提高性能。

为了进一步证明我们的案例,我们在图 2 中展示了 DrJava 中的三个代表性节点,其中显示了通过颜色编码对中心节点的预测以及由我们的传播矩阵 A 学习到的边缘权重。 在所有三种情况下,中心节点的标签都被我们的方法正确预测,而被其他方法(例如 GMNN)错误分类。 正如我们所见,每个中心节点都与具有最高边权重的相同标签节点相连。

标签稀缺分析

为了证明数据增强在克服标签稀缺问题上的有效性,我们用节点相似度阈值 t 来控制添加到训练集的节点数量。当 t 减小时,添加到训练集中的节点数量增加。结果如表 4 所示,表明随着 t 的减小,模型性能先上升后下降。主要原因是在传播过程中,训练集中的每个节点都将信息传播到相邻节点作为源。传播源越多,每个节点通过 GNNs 卷积到相邻节点的信息越多,分类结果越准确。但是,添加过多节点可能会引入噪声并导致性能下降。因此,我们选择 t = 0.8 作为最终参数值。

阶级不平衡分析

在这个实验中,我们检查我们的损失函数是否可以有效缓解类别不平衡的影响。 我们将公式(5)和(7)中定义的损失函数与其他三个损失函数进行比较:交叉熵损失(CEL)、均方误差(MSE)和 GMNN(Qu、Bengio 和 Tang 2019)的损失函数),最大化每个节点被正确分类的概率之和。我们将一个节点的不平衡率定义为其相邻节点中多数类别的节点数除以少数类别的节点数

结果如图 3 所示。它表明,随着不平衡率从<2 增加到>4,我们的损失函数始终且越来越优于其他损失函数。与其他损失函数相比,我们的损失函数可以动态调整每个节点的损失和嵌入的贡献权重,这有助于模型克服类不平衡的影响。

结论

在本文中,我们为缺陷预测任务提出了一种名为 DPCAG 的新型半监督模型。 DPCAG 结合传播控制、数据增强和动态加权损失来表示代码工件之间的信息传播,解决缺乏标签信息和类别不平衡的问题。 结果表明,与 SOTA 方法相比,DPCAG 实现了性能提升。 对于未来的工作,我们将使用语义信息进一步优化传播矩阵,以提高缺陷预测任务的性能。

致谢

本文由南京大学软件学院 2021 级硕士石孟雨翻译转述。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表