Page 309 - 《软件学报》2021年第7期
P. 309

张献  等:基于代码自然性的切片粒度缺陷预测方法                                                        2227


                                                    C   {(S k ,Q k , k  )} N k 1                   (4)
                    其中,三元组 (S   k ,Q k , k  ) 描述了集合中第 k 个样本的序列表示 S k 、权重信息 Q k 和质量类型  则 W-NLM
                                                                                              ,
                                                                                              k
                 模型的参数优化方法可描述为
                                                                                             
                          =argmin ( ; )    JC     argminCE     M  () ( )   C  argmin  1  N  k L  [q   , kt  log P    2  ˆ M (w    w  , k t |w k ,1 ,...,w k t , -1 ; )]  (5)
                                                          L C k   1 t  1
                    其中,N 表示序列总数,L k 表示序列 S k 的长度, L        N k 1 L 表示语料库的词汇规模; 表示模型参数  的(准)
                                                                                     
                                                         =
                                                        C
                                                               k
                 最优估计.
                    (2)  权重计算方法
                                                  k S
                    由式(2)的定义可知,序列 S k 的权重 q 依据样本质量类型取 {q                  ,q  ,q  } 中的某一值.为便于分析,
                                                                       unknown  clean  buggy
                 本文以未知类型的代码样本为基准,令
                                                                     1
                                                q unknown  : q clean  : q buggy   1:  :             (6)
                                                                     
                    式中,    1   ,   表示权重比例系数,例如,=2 时表示未知类型样本的权重是有缺陷类型的 2 倍,是无缺陷
                 类型的 1/2.因此,值越大,不同类型样本对模型优化(即梯度大小)的贡献差异就越明显(当=1 时,W-NLM 模型
                 退化为原有 NLM 模型      [48] ).考虑到权值的引入会引起交叉熵计算结果的尺度发生变化,为此,我们在训练语料库
                 C  {(S  ,Q  ,  )} N  上进行如下正规化处理:
                      k  k  k  k 1
                                                  1  N  k L  1  N  k L
                                                                    
                                                      q      11                                  (7)
                                                 L       , kt  L
                                                  C  k  1 t  1  C  k  1 t  1
                 即需满足
                                                   N        N
                                                     L q   k  k S    L    k  1=L C               (8)
                                                   k  1    k  1
                                               ()C 的尺度与原 CE   ()C 的尺度保持一致.那么,当给定语料库 C 和权重比
                    这样的处理可以保证修正的 CE                          M
                                             M
                 例系数后,我们便可以通过求解式(2)、式(4)、式(6)和式(7)联立的线性方程组求得 q                    unknown 、 q clean 、 q buggy  的具体
                                                            N
                 取值,进而生成用于 W-NLM 模型计算的权重序列{} .Q           kk  1
                 2.3   代码交叉熵度量元
                    本文 CNDePor 方法阶段 II 的核心任务是利用已训练好的 NLM 来度量软件模块的 CE 值,生成阶段 III 所
                 需的 CE 类度量元,其中,该类度量元是对软件模块自然性的一种表征.形式化地,给定语言模型 M 及一个长度为
                 L 的语言序列 S    w 1 ... ...w w 其中, w  ,S  为最小语言单元集合,  为所有语言序列集合,则模型 M 对
                                                                           *
                                                      *
                                       ,
                                                      ,
                                             i
                                      L
                                   i
                 序列 S 的 CE 值 [15,16] 为
                                          1  L          1  L         1 
                                  CE  () S   CE PP ˆ  )        P ()j    log   
                                                ( ,
                                    M     L  i  1  i  ; i M  L  i  1     j  1  i  2  P ˆ  ()j   ; iM 
                                               
                                             L
                                           1
                                                                
                                                                             w
                                              ( Pw   w  j  | ,...,w i  ) log P ˆ  (w   w   j  | ,...,w i  )  (9)
                                                         w
                                           L  i  1 j  1  1   1   2  M       1     1
                                             L
                                           1
                                                  ˆ
                                           log Pw   w w 1  i 1 )
                                                         | ,...,w
                                                    (
                                                         i
                                                 2
                                                   M
                                           L  i 1
                    式中, w ()j  表示词汇表  中的第 j 个词; P  ˆ  ; iM  表示模型 M 对序列 w 1 ,...,w i 1  下一词概率分布的估计;P i 表示序
                 列下一词的真实概率分布.由于 P i 一般不可知,所以通常采用序列实际下一词 w i 的 one-hot 编码 w i 近似表示,为
                 此,上式推导的第 3 步被简化为最后形式.最终,求交叉熵 CE M (S)即等同于求模型 M 对序列 S 估计的负对数似然
                 在序列词汇规模意义上的均值.
                    (1)  度量元的定义
                    定义 1.  代码的交叉熵度量元(CE)是一种代码度量元,其值由语言模型度量软件模块的代码 token 序列生
   304   305   306   307   308   309   310   311   312   313   314