一种基于对抗判别的跨软件缺陷预测方法
技术领域
本发明涉及软件工程领域,特别涉及一种基于对抗判别的跨软件缺陷预测方法。
背景技术
软件开发生命周期里,如果内部潜在缺陷发现的越晚,后期为了修复这些缺陷的开销就越大。但是,若对每个软件模块都进行完备全面地测试,势必会注入过多地人力资源。所以项目经理希望预先识别软件模块中可能出现的缺陷,并重点测试该模块。因此,软件缺陷预测技术越来越受到广大软件工程研究人员和测试人员的关注,并且有一些基于机器学习和深度学习的软件缺陷方法被提出来,来检测软件中可能存在的有缺陷的文件。
基于机器学习的软件缺陷预测方法,利用专家从源项目中手工提取的特征,包括基于操作数和操作符的Halstead特征,基于代码依赖的McCabe特征,面向对象编程的CK特征等。基于以上手工提取的特征,一些机器学习算法如逻辑回归、随即森林、贝叶斯网络等训练出软件缺陷模型,在一定程度上,这类模型能预测出软件项目中的有缺陷的文件。但是,手工提取的特征没有考虑源代码中隐含的语义结构特征,这就导致基于机器学习的软件缺陷方法预测性能不太理想。因此,基于深度学习的软件缺陷预测方法被提出来,进一步提高了预测性能。然而,这类方法也存在一些问题,没有考虑源项目和目标项目之间的特征分布差异,这也会影响缺陷预测性能。
发明内容
本发明的主要目的在于克服现有技术的缺点与不足,提供一种基于对抗判别的跨软件缺陷预测方法。
本发明的目的通过以下的技术方案实现:
一种基于对抗判别的跨软件缺陷预测方法,包括以下步骤:
1)从开源项目中选择一成熟项目(有丰富的标签信息)作为源项目,需要进行缺陷预测的项目作为目标项目;
2)将步骤1)中选择的源项目和目标项目中的源代码转换成抽象语法树(AST),提取出节点向量集合;
3)对节点进行编码,将步骤2)中得到的节点向量集合转换成后续所需要的整数向量集合;
4)采用随机过采样的方式对步骤3)中得到的源项目中整数向量集合进行处理,解决源项目中的分类不平衡的问题;
5)采用对抗判别学***衡后的整数向量集合同时训练出源项目特征提取器和目标项目特征提取器;
6)用步骤5)训练得到的源项目特征提取器和目标项目特征提取器,提取出源项目和目标项目中的能够迁移的代码语义特征;
7)将步骤6)中的源项目能够迁移的代码语义特征输入到逻辑回归分类器中,训练出跨软件缺陷预测模型,将缺陷预测模型应用到目标项目上,进行缺陷预测分类。
步骤7)中,所述跨软件缺陷预测模型,具体训练步骤如下:
701、设计卷积神经网络模型:采用的卷积神经网络模型包括一个输入层,一个词嵌入层,一个卷积层,一个最大池化层,两个完全连接的隐含层,其中最后一个隐含层的输出作为模型从整数向量集合中学习出来的特征;
702、利用步骤701中设计的卷积神经网络模型,用分类平衡后的源项目整数向量和文件的标签信息训练源项目特征提取器;
703、将步骤702中源项目特征提取器的参数信息作为目标项目特征提取器的初始化参数,并且设计一个判别器,包含一个完全连接的隐含层和一个单独单元的输出层;
704、固定住源项目特征提取器的参数,用对抗判别的方式将以上得到的整数向量集合作为输入,同时训练目标项目特征提取器和判别器的权重和偏差,因此,源项目和目标项目特征提取器都能提取出能够迁移的代码语义特征。
步骤703中,所述源项目特征提取器的参数信息包括权重和偏差。
本发明与现有技术相比,具有如下优点和有益效果:
本发明将对抗判别方法作为强大的领域自适应技术之一,通过最小化源项目映射分布和目标项目映射分布之间的距离,可以解决特征分布差异的问题。
本发明结合对抗判别学习自动化提取可迁移的语义特征的技术,来解决源项目和目标项目的源代码语义特征分布的差异的问题。该方法使用简单,测试人员只要将需要进行测试的软件源码以及从开源成熟项目中选择一套可靠的软件源码和带标签信息的文件输入到该模型当中,就可以生成一套对该测试项目的各个文件有关缺陷的预测结果,为有效合理地分配有限的测试资源提供参考依据,提高软件开发质量。
本发明首先利用了卷积神经网络模型作为源项目和目标项目的特征提取器,克服了传统手工提取特征缺失源码中语义特征的缺点,同时采用对抗判别学习的方式,同时训练源项目特征提取器、目标项目特征提取器和判别器,缩小源项目和目标项目特征分布的距离,解决现有基于深度学习的软件缺陷预测技术源项目和目标项目特征分布差异的问题,进而提高缺陷预测模型的预测精度。
附图说明
图1是本发明所述一种基于对抗判别的跨软件缺陷预测方法的流程图。
图2为对抗判别学习的整体训练过程图。
图3为特征提取器和分类器的示意图。
具体实施方式
下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。
如图1所示,一种基于对抗判别的跨软件缺陷预测方法,具体步骤如下:
1)从开源项目中选择一成熟项目(有丰富的标签信息)作为源项目,需要进行缺陷预测的项目作为目标项目。现如今有很多开源仓库例如PROMISE、NASA、AEEEM等提供了各种主流编程语言的丰富的项目标签信息,并且可以根据仓库提供的信息在GitHub上找到对应的源代码。
2)将步骤1)中选择的源软件项目和目标软件项目中的源代码转换成抽象语法树(AST),提取出节点向量集合。具体实现为:本发明选择一个python开源库javalang(https://github.com/c2nes/javalang)来将源代码转换成抽象语法树。在提取节点向量的过程中,本发明用节点类型来表示每个节点,这是由于节点名称在不同的项目中的含义是项目独有的,不具有广泛适用性。对于源软件项目和目标软件项目中的节点,本发明主要挑选以下三类节点类型:方法和变量节点,例如方法声明和类声明等;声明节点,包含类型声明、方法声明和枚举声明;控制流节点,包含If、While、Try、Catch等语句。对于项目代码当中的其他节点,由于其通常是项目独有的,不具有迁移性,故舍去不做记录,例如assignment等。
3)对节点进行编码,将步骤2)中得到的节点向量集合转换成以下所设计的特征提取器所需要的整数向量集合。由于节点向量无法直接输入到特征提取器中训练学习相应的权重和偏差,故需要先将节点向量集合进行编码,转换成整数向量集合。在编码转换过程中,本发明同时将源项目和目标项目进行编码,首先统计源代码中节点类型总数;然后将每个节点类型与唯一一个整数形成映射关系,该编码从1开始,直到达到节点类型总数;最后将每一个节点向量根据映射关系转换成整数向量,同时对于节点向量长度小于最长节点向量长度的向量在尾部进行补0。同时,在转换过程中,为了保留更多的可迁移信息,本发明只舍去出现次数小于3次的节点类型。
4)采用随机过采样的方式对步骤3)中得到的源项目中整数向量集合处理,解决软件项目中的分类不平衡的问题。由于软件项目中广泛存在着分类不均衡的问题,也就是软件项目中通常有缺陷的模块要远少于没有缺陷的模块,这种情形的存在,会影响软件缺陷预测模型的预测性能。于是,本发明采用一种常用的分类不均衡技术,随机过采样,来解决软件缺陷预测中分类不均衡的问题。随机过采样是通过随机从少数类集合中多次抽取样本,使得少数类数量和多数类数量达到一致。此外,在本发明中,分类不均衡技术只应用在源软件项目的整数向量集合中。本发明中使用python开源库imblearn(https://pypi.org/project/imblearn/)中的RandomOverSampler来实现该随机过采样方法。
5)采用对抗判别学***衡后的整数向量集合同时训练出源项目特征提取器和目标项目特征提取器。图2为对抗判别学习的整体训练过程图。具体的步骤如下:
(1)设计卷积神经网络模型和分类器。由于卷积神经网络具有稀疏连接和权重共享这两个优点,本发明采用卷积神经网络作为源项目特征提取器和目标项目特征提取器。此外,本发明中采用的卷积神经网络结构包括一个输入层,一个词嵌入层,一个卷积层,一个最大池化层,两个完全连接的隐含层,其中最后一个隐含层的输出作为模型从整数向量集合中学习出来的特征;分类器包含一个输出为一单元的完全连接的输出层。本发明中,卷积神经网络和分类器采用pytorch框架快速灵活地实现。卷积神经网络中的所有层都采用ReLU作为激活函数,而分类器的输出层采用Sigmoid作为激活函数。
(2)利用步骤(1)中设计的卷积神经网络模型结构,用分类平衡后的源项目整数向量和文件的标签信息训练源项目特征提取器,学习合适的权重和偏差;图3为特征提取器和分类器的示意图。
(3)将步骤(2)中源项目特征提取器的权重和偏差等参数信息作为目标项目特征提取器的初始化参数,并且设计一个判别器,包含一个完全连接的隐含层和一个单独单元的输出层;同样判别器也是通过pytorch框架实现。
(4)固定住源项目特征提取器的参数,用对抗判别的方式将以上得到的整数向量集合作为输入,同时训练目标项目特征提取器和判别器的权重和偏差,因此,源项目和目标项目特征提取器都能提取出可迁移的代码语义特征。所谓对抗判别是指在每一次迭代过程中,源项目映射分布和目标项目映射分布对抗训练,最小化目标项目特征提取器的对应分类器的分类误差,最大化判别器的分类误差,使得目标项目特征提取器的特征映射分布与源项目的特征映射分布越来越相似,判别器不能准确地区分一个文件是来自于源项目还是目标项目。基于预测性能和训练时长的综合考虑,以上过程在本发明中建议迭代50次。
5)用步骤4)训练得到的源项目特征提取器和目标项目特征提取器,提取出源项目和目标项目中的可迁移的代码语义特征;
6)将步骤5)中的可迁移的代码语义特征输入到逻辑回归分类器中,训练出跨软件缺陷预测模型。本发明利用python开源库sklearn(https://github.com/scikit-learn/scikit-learn)中的LogicRegression方法实现逻辑回归分类器。
7)将步骤6)训练出的缺陷预测模型应用到目标项目上,进行缺陷预测分类。具体而言,将之前编码后的目标项目整数向量集合输入到步骤6)中训练好的跨软件缺陷预测模型中,输出目标项目中所有文件的缺陷倾向,为软件测试人员提供模块之间测试优先级。
上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。