1. 引言
在当今数字化世界中,软件已成为各行各业的核心,尤其在航天领域,软件系统的可靠性和安全性直接关系到任务成败和宇航员安全。航天软件测试[1] [2]是确保软件质量的关键环节,其中静态测试通过在开发早期阶段审查代码和文档,能够提前发现问题并显著提高软件可靠性。然而,静态分析工具[3]-[5]存在误报率高(可达30%~100%)的问题[6],导致大量误报需要人工排查,增加了工作量和成本。
针对这一问题,本文从航天软件测试工程的角度出发,提出了一种基于深度学习的静态警报自动确认模型,旨在降低误报率并减少人工审查工作量。研究内容主要包括以下三个方面:
1) 静态警报数据集构建与向量化:针对缺乏相关数据集的问题,本文自行制作了静态警报数据集,并通过词法分析和预训练模型Codebert将静态警报代码转化为向量表示,解决了传统词嵌入模型(如Word2Vec)在代码语义理解上的局限性。
2) CNN-BiGRU模型构建:本文结合卷积神经网络(CNN)的局部特征提取能力和双向门控循环单元(BiGRU)的全局序列建模能力,提出了CNN-BiGRU模型。实验表明,该模型能够同时捕获局部特征和上下文信息,显著提升了静态警报自动确认的性能。
3) CNN-BiGRU-Multi-Head Attention模型构建:为进一步解决长代码中token距离较远、重要信息难以识别的问题,本文在CNN-BiGRU模型基础上引入多头注意力机制,提出了CNN-BiGRU-Multi-Head Attention模型。该模型通过并行计算多个注意力头,动态调整重要token的权重,有效处理长距离依赖问题,进一步提升了模型性能。
2. 相关工作
在静态警报自动确认领域,研究者们通过借鉴自然语言处理(NLP)和深度学习技术,提出了多种创新方法,显著提升了缺陷预测和警报确认的准确性。Xing等人[7]将NLP中的预处理和特征提取技术应用于跨项目缺陷预测(CPDP),通过连续袋模型将源代码和目标代码文件的抽象语法树转换为数值向量,并提出了生成对抗长短期记忆神经网络(GAN-LSTM)模型,结合生成对抗网络(GAN)和长短期记忆网络(LSTM)的优势,有效提升了跨项目缺陷预测的性能。Pin等人[8]提出了一种新型的一维卷积神经网络(1D-CNN)结构,通过卷积操作捕捉局部特征,减少过拟合并提升模型的泛化能力。Kharkar等人[9]则利用基于Transformer的自注意力机制,解决了长距离依赖问题,进一步提高了警报确认的准确性。G. S J等人[10]结合卷积神经网络(CNN)和长短期记忆单元(LSTM),通过CNN提取局部特征,LSTM捕捉时间序列依赖关系,综合提升了缺陷预测的性能。Sun等人[11]提出了一种混合深度学习网络模型,结合双向门控循环单元(BiGRU)和深度神经网络(DNN),通过BiGRU捕捉上下文信息,DNN优化特征表示,显著提升了模型的预测能力。Ansari等人[12]则提出了一种CNN-LSTM混合集合模型,通过集成表现最好的单个模型,综合了不同模型的优势,进一步提高了静态警报自动确认的准确性和鲁棒性。这些研究通过多样化的技术路径,推动了静态警报自动确认领域的发展,为缺陷预测和警报确认提供了更高效、更可靠的解决方案。
3. 方法
CNN-BiGRU-Multi-Head Attention网络包括CNN-BiGRU网络和多头注意力机制层两部分。输入数据首先经过CNN-BiGRU模型的输入层,采用预训练模型Codebert将输入的静态警报代码转换成768维数字向量。随后,数字向量输入到卷积层,本文卷积层采用两个一维卷积层,第一个一维卷积层,输入通道数为768,输出通道数为256,卷积核大小3,激活函数为ReLU函数,用于引入非线性,填充方式为“same”,来保持输出的宽度与输入相同。第一层将输入通道数从768(每个时间步的特征数量)转换为256。第二个一维卷积层,输入通道数为256,输出通道数为128,卷积核大小为3,它作用于第一个一维卷积层的输出,因此它的输入通道数是256,输出通道数是128。通过卷积核提取代码的局部特征。接着,BiGRU层对卷积层提取的特征进行进一步处理,捕捉代码中的全局序列信息。最后,融合后的特征经过多头注意力机制层,通过并行计算多个注意力头,动态调整重要token的权重,增强模型对长距离依赖关系的建模能力,从而提升对复杂代码结构的理解能力。这种层次化的特征提取与融合机制,显著提高了静态警报自动确认的准确性和效率。
3.1. 基于特征融合的CNN-BiGRU模块
卷积神经网络(CNN)和双向门控循环单元(BiGRU)在代码分析任务中各有优势:CNN通过卷积核捕获代码中的局部特征模式,如语法结构和操作符使用模式;而BiGRU通过双向递归结构捕捉代码中的前向和后向依赖关系,尤其适合处理跨越多行的控制流和变量作用域等长距离依赖特征。基于两者的互补特性,本研究创新性地构建了CNN-BiGRU联合模型,通过融合CNN提取的局部特征和BiGRU捕获的全局上下文信息,显著提升了模型的特征表达能力。模型结构如图1所示。
传统词嵌入模型Word2Vec通过CBOW或Skip-Gram架构将单词映射到低维向量空间,捕捉语义关系,但其存在上下文无关、无法处理一词多义和长距离依赖等局限性。针对这些问题,本文采用基于Transformer架构的CodeBERT预训练模型,通过双向编码和自注意力机制动态生成上下文相关的词向量,能够区分同一单词在不同上下文中的语义差异,并捕捉代码中的长距离依赖关系。
在静态警报自动确认任务中,输入层采用Codebert相比于Word2Vec,能够解决一词多义问题,为模型提供更准确的输入表示。卷积层采用一维卷积操作,通过滑动窗口提取代码序列中的局部模式,并使用两个卷积层分别将输入通道数从768降至256,再降至128,同时通过批标准化稳定训练过程。池化层则通过最大池化操作减少特征图尺寸,保留重要信息并降低计算量。
BiGRU层在卷积层提取局部特征的基础上,进一步捕捉全局特征和长距离依赖关系。通过更新门和重置门机制,解决了传统RNN的梯度消失问题,并利用双向结构全面理解上下文信息,增强模型的特征提取能力。最后,输出层将BiGRU的输出拼接并传递给分类器。由于任务需要区分真实缺陷及其类型,分类器采用Sigmoid函数分别计算每种类别的概率,从而完成静态警报的自动确认。
Figure 1. CNN-BiGRU model structure diagram
图1. CNN-BiGRU模型结构图
3.2. 多头注意力机制模块
多头注意力(Multi-Head Attention)是注意力机制的扩展形式,通过将输入映射到多个低维空间(称为“头”),在每个空间中独立应用注意力机制,最后合并结果。这种方式使模型能够在不同特征维度上同时关注多样化信息,显著提升了捕捉复杂模式的能力,是Transformer架构的核心组件之一。
多头注意力机制通过并行计算多个注意力头,能够从不同子空间捕获输入序列中多样化的依赖关系。每个注意力头独立工作,可以专注于输入的不同语义特征,这种并行化设计不仅提高了计算效率,还增强了模型的表征能力。具体而言,该机制的核心是对输入序列执行多次缩放点积注意力计算(Scaled Dot-Product Attention),然后将各注意力头的结果进行拼接和线性变换,最终生成综合的特征表示。多头注意力机制的结构如图2所示。
Figure 2. Multi-head attention mechanism structure diagram
图2. 多头注意力机制结构图
对于查询Q,键K和值V,先分别进行线性变换得到多个头的表示,计算公式如下:
(1)
(2)
(3)
在每个头中独立通过打分函数计算每个头的注意力分数,打分函数计算公式为:
(4)
应用softmax函数,将得分转换成权重分布,通过加权求和每个头的上下文向量,计算公式如下:
(5)
(6)
将所有头产生的上下文向量拼接起来,再进行一次线性变换获得最终的输出,计算公式为:
(7)
式中:
——键的维度;
——头的数量;
——可训练的权重矩阵,用于第i个头;
——可训练的权重矩阵,用于第i个头;
——可训练的权重矩阵,用于第i个头;
——拼接操作;
——可训练的矩阵。
为进一步提升模型对长距离依赖关系的建模能力,本文引入多头注意力机制,增强模型对重要特征的关注能力。输出层通过sigmoid函数将聚合的特征映射为概率值,生成预测结果,并通过反向传播优化模型参数。这种端到端的学习机制使模型能够自适应地学习任务相关特征,显著提升了静态警报自动确认的准确性和效率。
3.3. 损失函数
静态警报自动确认任务被视为一种特殊的多标签二分类问题,本文使用二元交叉熵损失函数。损失函数为:
(8)
式中:
N——样本数量;
——第i个样本的真实标签,取值为0或1;
——第i个样本的预测概率(模型输出的Sigmoid值),范围为[0, 1]。
4. 实验
4.1. 数据集介绍
进行静态警报自动确认研究,获取静态警报代码是必不可少的。然而,目前缺乏相关开源数据集,因此本文手动构建了一个综合性的静态警报数据集,数据来源包括SARO缺陷数据集和某型号航天软件操作系统的开源代码。SARO缺陷数据集可在链接https://samate.nist.gov/SARD/test-suites下载,某型号航天软件操作系统的开源代码为在北京航天自动控制研究所实习期间,研究所提供的非涉密但未公开的操作系统源码。通过静态分析工具对代码进行测试,生成静态分析报告,并利用Python工具提取警报代码信息。根据《GJB 8114 C/C+ + 语言编程安全子集》和航天软件工程需求,对警报代码进行人工标注,生成one-hot编码标签。最终构建的数据集包含18,585条静态警报代码,其中6441条为真实缺陷,12,144条为误报。
4.2. 实验设置
本文实验选用PyTorch框架实现模型,并在NVIDIA GeForce GTX 1050 Ti上进行训练和测试。对于模型的具体参数配置,本文采用Adam优化器,学习率为1e-4。由于受到GPU资源的限制,通过大量的实验验证,本文将批量大小(batch size)设置为64,训练周期(epoch)设为16,正则化参数(dropout)设置为0.5,以保证模型能够达到收敛。
4.3. 评价指标
在静态警报自动确认任务中,每条静态警报代码可以在是真实缺陷的前提下违反多个编码规则,所以需要对警报代码的每个类别都采用sigmoid函数,单独去计算警报代码属于每个类别的概率。
为全面评估各模型在静态警报自动确认任务中的性能,本研究采用多维度评价指标体系,包括Accuracy(准确率)、Precision(精确率)、Recall(召回率)和F1分数(F1-score)。对每一个类别计算混淆矩阵的值,继而可以计算出所有类的总体值。有了上面这四个所有类总体值之后,就可以通过计算得到上面这四个常用的评估指标。
其中,Accuracy反映模型整体预测的准确程度,Precision衡量预测为正例的样本中真实正例的比例,Recall评估模型识别正例的完整度,而F1分数则综合了Precision和Recall的平衡表现。通过这四个指标的协同分析,能够从不同角度全面评估模型的分类性能。
(9)
(10)
(11)
(12)
(13)
(14)
(15)
(16)
式中:
——第i类被正确预测为正类的样本数;
——第i类被错误预测为正类的样本数;
——第i类被错误预测为负类的样本数;
——第i类被正确预测为负类的样本数;
为真正类,用于表示被正确预测为正类的样本数;
为假正类,用于表示被错误预测为正类的样本数;
为真负类,用于表示被正确预测为负类的样本数;
为假负类,用于表示被错误预测为负类的样本数。
4.4. 对比方法
为了证明本文方法的改进方法的有效性,设置多组对比实验。对于模型的选择包括卷积神经网络,双向门控循环单元以及本文提出的CNN-BiGRU模型,对于代码序列向量化方法的选择包括Work2Vec和Codebert,对于注意力机制的选择包括传统的注意力机制和多头注意力机制。
4.5. 实验结果与分析
本节在自建数据集上对选择不同模块的不同方法进行对比实验。在自建数据集上选择Work2Vec和Codebert代码序列向量化方法时,三个模型的定量结果如表1所示。
Table 1. Quantitative results of vectorization of Work2Vec and Codebert code sequences
表1. Work2Vec和Codebert代码序列向量化的定量结果
模型 |
Accuracy |
Precision |
Recall |
F1分数 |
Work2Vec-CNN |
95.80% |
93.12% |
87.82% |
89.04% |
Work2Vec-BiGRU |
96.56% |
96.49% |
92.37% |
93.22% |
Work2Vec-CNN-BiGRU |
97.36% |
98.37% |
96.37% |
96.74% |
Codebert-CNN |
96.80% |
96.15% |
91.72% |
92.99% |
Codebert-BiGRU |
97.36% |
98.28% |
95.50% |
95.96% |
Ours (Codebert-CNN-BiGRU) |
97.54% |
98.40% |
97.56% |
97.28% |
Work2Vec和Codebert代码序列向量化的定量结果说明,选用Codebert代码序列向量化方法的CNN、BiGRU和CNN-BiGRU模型均优于选用传统Word2Vec代码序列向量化方法的模型,主要得益于Codebert的上下文感知特性,能够动态捕捉token间的长距离依赖关系。进一步对比发现,CNN-BiGRU模型在各项指标上均优于单一CNN和BiGRU模型,尤其是在使用Codebert时,准确率、精确率、召回率和F1分数分别提升了0.74%、2.25%、5.84%和4.29%(相较于CNN)以及0.18%、0.12%、2.06%和1.32%(相较于BiGRU),验证了其通过融合CNN的局部特征提取能力和BiGRU的序列建模优势显著提升了性能。
上文对比实验已经表明Codebert代码序列向量化方法相比于传统的Work2Vec方法的优越性,CNN-BiGRU模型相比于单模型(CNN或BiGRU)能进行更全面的特征提取,所以下面的对比实验均选用Codebert代码序列向量化方法和CNN-BiGRU模型。对比无注意力机制、传统注意力机制和多头注意力机制对模型的影响的定量结果如表2所示。
Table 2. Quantitative results of attention mechanisms
表2. 注意力机制的定量结果
模型 |
Accuracy |
Precision |
Recall |
F1分数 |
CNN-BiGRU |
97.31% |
98.36% |
95.78% |
96.42% |
CNN-BiGRU-Attention |
97.44% |
99.11% |
96.24% |
97.07% |
CNN-BiGRU-Multi-Head Attention |
97.66% |
99.20% |
97.39% |
97.78% |
注意力机制的定量结果表明引入传统注意力机制的CNN-BiGRU-Attention模型优于基础CNN-BiGRU模型,而CNN-BiGRU-Multi-Head Attention模型在准确率、精确率、召回率和F1分数上分别比CNN-BiGRU模型提升了0.31%、0.84%、1.61%和1.36%,相较于CNN-BiGRU-Attention模型分别提升了0.22%、0.1%、1.15%和0.71%。这一性能提升得益于多头注意力机制的设计,能够从不同子空间捕获多样化的依赖关系,显著增强了模型的表达能力。
4.6. 消融实验
消融实验主要是对代码序列向量化方法、CNN-BiGRU模型和多头注意力机制的效果进行验证,消融实验的定量结果如表3所示。
Table 3. Quantitative results of ablation experiments
表3. 消融实验的定量结果
模型 |
Accuracy |
Precision |
Recall |
F1分数 |
Work2Vec-CNN |
95.80% |
93.12% |
87.82% |
89.04% |
Codebert-CNN |
96.80% |
96.15% |
91.72% |
92.99% |
Codebert-CNN-BiGRU |
97.54% |
98.40% |
97.56% |
97.28% |
Codebert-CNN-BiGRU-Multi-Head Attention |
97.66% |
99.20% |
97.39% |
97.78% |
从表3的消融实验定量结果可以看出,Codebert-CNN-BiGRU-Multi-Head Attention在选用Codebert代码序列向量化方法、采用CNN-BiGRU融合模型并且引入多头注意力机制的共同作用下,在数据集上的分类预测能力显著优于移除任意模块后的模型版本。这充分说明了Codebert代码序列向量化方法、CNN-BiGRU融合模型并且多头注意力机制对模型提升整体性能的关键贡献。
5. 总结
在当今数字化时代,软件已成为推动社会发展的核心动力,尤其在航天领域,软件系统的可靠性和安全性至关重要。然而,传统静态分析工具存在误报率高、人工验证成本大等问题,且缺乏公开的基准数据集,制约了相关研究的深入开展。针对这些问题,本研究从航天软件工程的实际需求出发,构建了专用静态警报数据集,并提出了一种基于深度学习的静态警报自动确认方法。首先,通过静态分析工具收集静态警报代码,并采用Codebert预训练模型将token序列映射为768维数字向量,克服了传统词嵌入模型的局限性。其次,创新性地将卷积神经网络(CNN)与双向门控循环单元(BiGRU)结合,提出了CNN-BiGRU模型,实现了局部特征与全局序列信息的有效融合。进一步,针对长距离依赖问题,在CNN-BiGRU模型基础上引入多头注意力机制,增强了模型对复杂代码结构的理解能力。本研究的创新点包括专用数据集的构建、CNN-BiGRU混合模型的设计以及多头注意力机制的引入。然而,研究仍存在数据集来源单一、参数调优不全面以及实时性与效率不足等局限性,未来需进一步扩展数据来源、优化模型设计并提升实际应用价值。
NOTES
*通讯作者。