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 
   302   303   304   305   306   307   308   309   310   311   312