KL散度的计算及其相关问题题
关键词: K L KL KL散度计算, s o f t m a x softmax softmax,可不可以用 s i g m o i d sigmoid sigmoid, K L KL KL散度为负数
KL散度的计算
KL散度可以用来衡量两个概率分布之间的相似性,两个概率分布越相近,KL散度越小。计算公式如下:
D K L ( P ∣ ∣ Q ) = ∑ i = 1 N [ p ( x i ) l o g p ( x i ) − p ( x i ) l o g q ( x i ) ] D_{KL}(P||Q)=∑_{i=1}^N[p(x_i)logp(x_i)−p(x_i)logq(x_i)] DKL(P∣∣Q)=∑i=1N[p(xi)logp(xi)−p(xi)logq(xi)]
P P P为真实事件的概率分布, Q Q Q为预测分布。例如现在真实分布为 [ 0.1 , 0.9 ] [0.1,0.9] [0.1,0.9],预测分布为 [ 0.2 , 0.8 ] [0.2,0.8] [0.2,0.8],则 k l kl kl散度为:
k l = ( 0.1 ∗ l o g 0.1 − 0.1 ∗ l o g 0.2 ) + ( 0.9 ∗ l o g 0.9 − 0.9 ∗ l o g 0.8 ) kl=(0.1*log0.1-0.1*log0.2)+(0.9*log0.9-0.9*log0.8) kl=(0.1∗log0.1−0.1∗log0.2)+(0.9∗log0.9−0.9∗log0.8)
KL散度相关问题
分布有0值怎么办
在实际的预测当中是很有可能遇到预测为0值得,一旦遇到0,由于计算当中有 l o g log log , K L KL KL就会不可计算,在pytorch中表现为Nan值。为了防止这种事情发生,我们可以给预测值加上一个很小的数,比如 1 e − 10 1e^{-10} 1e−10
pytorch为什么要softmax,而且要进行log运算
比如在三分类问题中,模型最后的输出为三个值,分别对应三个分类, s o f t m a x softmax softmax就是为了保证这三个值和为1,如果不等于1,算出来的 K L KL KL值就有可能为负数。
至于为什么要用 l o g log log运算,我也不清楚,就当是pytorch的规定。
能不能用sigmoid
可以用,会多一些步骤
在二分类任务中,最后输出的可能是一个值,经过 s i g m o i d sigmoid sigmoid后变成一个概率,这个概率就代表了一个分类,直接用1减去预测的概率就是另一个分类的概率,这个时候如果计算 K L KL KL很容易出现负值,例如真实分布 [ 0.2 ] [0.2] [0.2],预测分布 [ 0.5 ] [0.5] [0.5],则 K L = 0.2 l o g 0.2 − 0.2 l o g 0.5 = − 0.183 KL=0.2log0.2-0.2log0.5=-0.183 KL=0.2log0.2−0.2log0.5=−0.183,为负数。
因为这个时候知识计算一个类别的 K L KL KL散度,另一个类别没有计算,为了避免为负值的情况,我们可以将真实分布和预测分布手动都扩展一个维度,真实分布为 [ 0.2 , 0.8 ] [0.2,0.8] [0.2,0.8],预测分布为 [ 0.5 , 0.5 ] [0.5,0.5] [0.5,0.5],这样就不会出现负数了。