参考文章:
KL散度(Kullback-Leibler Divergence)介绍及详细公式推导
变分自编码器(VAE)推导
KL散度简介
KL散度的概念来源于概率论和信息论中。KL散度又被称为:相对熵、互熵、鉴别信息、Kullback熵、Kullback-Leible散度(即KL散度的简写)。在机器学习、深度学习领域中,KL散度被广泛运用于变分自编码器中(Variational AutoEncoder,简称VAE)、EM算法、GAN网络中。是描述两个概率分布P和Q差异的一种方法。
KL散度定义
KL散度的定义是建立在熵(Entropy)的基础上的。此处以离散随机变量为例,先给出熵的定义,再给定KL散度定义。
若一个离散随机变量X的可能取值为
X
=
x
1
,
x
2
,
⋯
,
x
n
X={x_1,x_2,⋯,x_n}
X=x1,x2,⋯,xn,而对应的概率为
p
i
=
p
(
X
=
x
i
)
p_i=p(X=x_i)
pi=p(X=xi),则随机变量
X
X
X的熵定义为:
H
(
X
)
=
−
∑
i
n
=
p
(
x
i
)
l
o
g
p
(
x
i
)
H(X)=−∑_i^n=p(x_i)log_p(x_i)
H(X)=−i∑n=p(xi)logp(xi)规定当
p
(
x
i
)
=
0
时
,
p
(
x
i
)
l
o
g
p
(
x
i
)
=
0
p(x_i)=0时,p(x_i)log_p(x_i)=0
p(xi)=0时,p(xi)logp(xi)=0
若有两个随机变量
P
、
Q
P、Q
P、Q,且其概率分布分别为
p
(
x
)
、
q
(
x
)
p(x)、q(x)
p(x)、q(x),则
p
p
p相对
q
q
q的相对熵为:
D
K
L
(
p
∣
∣
q
)
=
∑
i
n
p
(
x
)
l
o
g
p
(
x
)
q
(
x
)
D_{KL}(p||q)=∑_i^np(x)log{p(x)\over q(x)}
DKL(p∣∣q)=i∑np(x)logq(x)p(x)
之所以称之为相对熵,是因为其可以通过两随机变量的交叉熵(Cross-Entropy)以及信息熵推导得到:
针对上述离散变量的概率分布
p
(
x
)
、
q
(
x
)
p(x)、q(x)
p(x)、q(x)而言,其交叉熵定义为:
H
(
p
,
q
)
=
∑
x
p
(
x
)
l
o
g
1
q
(
x
)
=
−
∑
x
p
(
x
)
l
o
g
q
(
x
)
H(p,q)=∑_xp(x)log{1\over q(x)}=−∑_xp(x)logq(x)
H(p,q)=x∑p(x)logq(x)1=−x∑p(x)logq(x)
在信息论中,交叉熵可认为是对预测分布
q
(
x
)
q(x)
q(x)用真实分布
p
(
x
)
p(x)
p(x)来进行编码时所需要的信息量大小。
因此,KL散度或相对熵可通过下式得出:
D K L ( p ∣ ∣ q ) = H ( p , q ) − H ( p ) = − ∑ x p ( x ) l o g q ( x ) − ∑ x − p ( x ) l o g p ( x ) = − ∑ x p ( x ) l o g q ( x ) p ( x ) D_{KL}(p||q)=H(p,q)−H(p)=−∑_xp(x)logq(x)−∑_x−p(x)logp(x)=−∑_xp(x)log{q(x)\over p(x)} DKL(p∣∣q)=H(p,q)−H(p)=−x∑p(x)logq(x)−x∑−p(x)logp(x)=−x∑p(x)logp(x)q(x)
代码
import numpy as np
from scipy import *
def asymmetricKL(P,Q):
return sum(P * log(P / Q)) #calculate the kl divergence between P and Q
def symmetricalKL(P,Q):
return (asymmetricKL(P,Q)+asymmetricKL(Q,P))/2.00
KL = scipy.stats.entropy(P,Q)