Page 307 - 《软件学报》2021年第7期
P. 307
张献 等:基于代码自然性的切片粒度缺陷预测方法 2225
阶段 I(语料库学习阶段). 该阶段的目标是构建并训练一个神经语言模型(NLM),通过 NLM 对软件仓库的
学习,刻画编程语言的常见模式或使用规律.该阶段首先对收集到的软件项目进行数据预处理 [48] ,例如删除注
释、词化等;然后采用词嵌入方法,将词化后的代码序列表示为一组实值矢量;利用多层栈式 LSTM 网络从输入
的词向量序列中学习出隐含的语义特征,进而用于序列下一词的预测;最后,构建好的 NLM 可以对输入序列的
发生概率进行估计.
阶段 II(交叉熵度量阶段). 经过训练和测试后,阶段 I 设计的 NLM 将被用于度量待测软件模块的自然性,
即生成用于缺陷预测的 CE 值.这一过程是度量阶段的主要任务,其中,实际被度量的是模块对应的源代码序列.
因此,我们需要从软件仓库中提取出模块对应的代码区域,并执行与阶段 I 相同的数据预处理工作.然后,将预处
理后的代码序列输入给训练好的 NLM,进行软件模块的 CE 值计算.这里,新生成的 CE 值刻画了软件模块的自
然性,是对代码的一种抽象,我们把它作为一类新的度量元.
阶段 III(缺陷预测阶段). 新生成的 CE 类度量元被引入到典型的缺陷预测问题中.一般地,除 CE 外还需使
用其他度量方法抽取待测软件模块的不同特征,例如代码行、圈复杂度等.之后,依据代码区域是否包含缺陷对
每个模块进行标注,即为它们分配一个“有缺陷”或“无缺陷”标签.最后,我们将 CE 类度量元与其他特征结合起
来,一同输入给预测模型(即一个分类器)进行缺陷预测.
下面重点阐述阶段 I 和阶段 II 的关键技术,阶段 III 为经典的缺陷预测过程 [2,3] ,这里不再赘述.
2.2 加权神经语言模型
在本文方法阶段 I,我们提出了一种面向软件代码的加权神经语言模型(a Weighted Neural Language Model
for software code,简称 W-NLM),它由阶段 I 的核心构成.需要说明的是,CNDePor 方法中的双向语言模型是指分
别独立训练两个 W-NLM,一个用于学习代码的正序词序列,一个用于学习代码的逆序词序列,这里仅以前者为例
进行介绍.图 3 展示了 W-NLM 模型的整体架构.对比已有的 NLM 模型 [48,51] 不难看出,本文方法的主要改进在于模
型优化.原有的优化方法基于随机梯度下降(stochastic gradient descent,简称 SGD)算法,其构建的损失函数J 只与预
测目标和预测结果相关,因此,所有样本的权重是相同的.而在 W-NLM 模型中,我们还向损失函数 J 引入了与代码
相关的质量信息,用于样本加权.不同的权重信息将通过梯度 J 反传,引导模型更新参数,实现针对性学习.
由图 3 展示的模型架构可知,W-NLM 采用了基于多层栈式 LSTM 单元的 RNN 进行程序语言建模.在代码
表示方面,使用了词嵌入技术,分布式的词向量可以进行有效的语义表示和计算.最终,模型由一个 Softmax 多分
类器预测输入序列的下一词,并以输出的概率分布来刻画整段代码的发生规律.通过挖掘代码样本语料库,模型
可以学习到蕴涵于序列中的发生规律和使用模式,进而可用于代码自然性度量.特别地,W-NLM 首先在语料库
构建阶段除需收集待测样本外,还需收集样本对应的质量信息.本文中的质量信息是指代码的质量类型,包括未
知(unknown)、无缺陷(clean)和有缺陷(buggy)共 3 种.然后,经数据预处理阶段 [48,50] ,生成待测样本的代码序列 S,
并依据样本的质量信息生成对应的权重序列 Q.最后,模型输出的预测概率分布、预测目标及样本权重共 3 方面
的信息将一同输入给损失函数 J 用于模型优化.
(1) 模型形式化
这里重点阐述 W-NLM 的改进部分.形式化地,给定长度为 L 的代码序列 S www L , 其中, w S
... ...
,
1
t
t
,为最小语言单元集合(即词汇表), 为所有语言序列集合.代码序列 S 的质量类型记作,
*
*
{1,0,1}, 其
中,“1”代表未知类型,“0”代表无缺陷类型,“1”代表有缺陷类型,则 W-NLM 模型使用的改进损失函数 J 定义为
(对于序列 S):
()
J CE M () ( ; ) S Q 1 L CE ( , ˆ ; t M ( ) , ) PP q t 1 L q t P t ()j log 2 ˆ ()j 1
t
( )
L t 1 L t 1 j 1 P ; t M (1)
1
L
; )]
[q P (w w ()j | ,...,w t -1 ) log Pw w ()j | ,...,w 1 L [q log Pw w w 1 t -1 ; )]
ˆ
ˆ
(
| ,...,w
w
(
w
t
2
1
t
1
t
2
t
-1
L t 1 j 1 M L t 1 M