当前位置: 首页 > 科技观察

在软件缺陷预测中使用软件可视化和迁移学习

时间:2023-03-21 10:56:01 科技观察

论文的数据集和代码是开源的:https://zenodo.org/record/3373409#.YrpiEBVBxHW。文章的动机是避免源代码的中间表示,将源代码表示为图像,直接提取代码的语义信息,以提高缺陷预测的性能。首先,请参阅下图中显示的动机示例。在File1.java和File2.java这两个例子中,虽然都包含1个if语句,2个for语句,4个函数调用,但是代码的语义和结构特征是不同的。为了验证将源码转换成图像是否有助于区分不同的编码,作者做了一个实验:将源码根据字符的ASCII十进制数映射到像素点,排列成像素矩阵,图像获得了源代码。作者指出,不同的源代码图像存在差异。Fig.1MotivationExample文章的主要贡献如下:将代码转换为图像,并从中提取语义和结构信息;提出了一种端到端的框架,结合自注意力机制和迁移学习来实现缺陷预测。本文提出的模型框架如图2所示,分为源代码可视化和深度迁移学习建模两个阶段。图2框架1。SourceCodeVisualization文章将源代码转换为6张图片,过程如图3所示。将源代码字符的十进制ASCII码转换为8位无符号整数向量,将这些向量按行列排列,生成图像矩阵。8bit整数直接对应灰度级。为了解决原始数据集小的问题,作者在文章中提出了一种基于颜色增强的数据集扩展方法:对R、G、B三个颜色通道的值进行排列组合,生成6彩色地图。这里看起来很混乱。改变通道值后,语义和结构信息应该改变,对吧?但作者在脚注中进行了解释,如图4所示。图3源代码可视化过程图4文章脚注22.深度迁移学习建模文章使用DAN网络来捕获源代码的语义和结构信息。为了增强模型表达重要信息的能力,作者在原有的DAN结构上增加了一个Attention层。训练和测试过程如图5所示,其中conv1-conv5来自AlexNet,四个全连接层fc6-fc9作为分类器。作者提到,对于一个新项目,训练一个深度学习模型需要大量的标注数据,难度很大。因此,作者首先在ImageNet2012上训练了一个预训练模型,将预训练模型的参数作为初始参数,对所有的卷积层进行fine-tune,从而减小码图与ImageNet2012中图像的差异.Fig.5训练和测试流程3.模型训练和预测为Source工程中有标注代码和Target工程中无标注代码生成代码图像,同时发送给模型;两者共享卷积层和注意力层来提取各自的特征。计算全连接层中Source和Target之间的MK-MDD(MultiKernelVariantMaximumMeanDiscrepancy)。由于Target没有标签,因此只计算Source的交叉熵。该模型使用小批量随机梯度下降沿损失函数进行训练。对于每个对500个epoch,根据最佳F-measure选择一个epoch。在实验部分,作者选取了PROMISE数据仓库中的所有Java开源项目,收集了它们的版本号、类名和bug标签。根据版本号和类名从github上下载源码。最终一共收集了10个Java项目。数据集结构如图6所示。图6DatasetstructureForintra-projectdefectprediction,文章选择以下baselinemodel进行比较:对于cross-projectdefectprediction,文章选择以下baselinemodel进行比较:To总结一下,虽然是两年前的论文,但思路还是比较新颖的,避免了AST等一系列代码的中间表示,直接将代码转化为图像提取特征。但是我还是很疑惑,代码转换出来的图像真的包含了源代码的语义和结构信息吗?感觉可解释性不是很强,哈哈。后面需要做实验分析。