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 序列生