熵Entropy and 散度Divergence
Shannon信息量
信息量也称为Shannon信息量,常用于刻画消除随机变量x在
x
i
x_i
xi处的不确定性所需的信息量的大小。假设考虑离散型随机变量的情况,设p为随机变量x的概率分布,即
p
(
x
i
)
p(x_i)
p(xi)为随机变量x在
x
=
x
i
x=x_i
x=xi处的概率密度函数值,则随机变量x在
x
=
x
i
x=x_i
x=xi处的Shannon信息量定义如下
log
1
p
(
x
i
)
\log\frac{1}{p(x_i)}
logp(xi)1
当对数的底数为2时,Shannon信息量的单位为bit。
信息熵
Shannon信息量描述的是随机变量在某一点处的信息量,而衡量随机变量在整个样本空间的信息量,就需要用随机变量x的信息熵(differential entropy)来表示,即Shannon信息量的数学期望,所有 x = x i x=x_i x=xi处的Shannon信息量的和。由于每一个 x i x_i xi出现的概率不一样,需要用 p ( x i ) p(x_i) p(xi)加权求和。
因此可以将信息熵理解为Shannon信息量的数学期望,将信息熵理解为消除随机变量不确定性所需要的总体信息量的大小,熵越大,随机变量的不确定性就越大。其离散形式定义如下:
H
(
p
)
=
−
∑
x
i
p
(
x
i
)
log
p
(
x
i
)
H(p)=-\sum_{x_i} p(x_i)\log p(x_i)
H(p)=−xi∑p(xi)logp(xi)
其连续形式定义如下:
H
(
p
)
=
−
∫
p
(
x
)
log
p
(
x
)
d
x
H(p)=-\int p(x)\log p(x) dx
H(p)=−∫p(x)logp(x)dx
交叉熵
假设用
q
(
x
)
q(x)
q(x)来拟合
p
(
x
)
p(x)
p(x)的概率分布,交叉熵用来描述p和q的相似性,表示在给定的真实分布
p
(
x
)
p(x)
p(x)下,使用非真实分布
q
(
x
)
q(x)
q(x)用来消除系统不确定性所需付出的努力的大小。由于在每一点
x
i
x_i
xi处q的Shannon信息量为
−
log
q
(
x
i
)
-\log q(x_i)
−logq(xi),那么在整个样本空间中考虑不确定性时,使用的信息量为其数学期望,由于每个
x
i
x_i
xi的权重为
p
(
x
i
)
p(x_i)
p(xi),因此交叉熵的定义为
H
(
p
,
q
)
=
∑
x
i
p
(
x
i
)
log
1
q
(
x
i
)
H(p,q)=\sum_{x_i}p(x_i)\log\frac{1}{q(x_i)}
H(p,q)=xi∑p(xi)logq(xi)1
其连续形式定义为:
H
(
p
,
q
)
=
∫
p
(
x
)
log
1
q
(
x
)
d
x
H(p,q)=\int p(x)\log \frac{1}{q(x)}dx
H(p,q)=∫p(x)logq(x)1dx
交叉熵可以在神经网络中作为损失函数,p表示真实的标记分布,q表示训练后的预测标记分布,交叉熵损失函数可以衡量p和q的相似性。它作为损失函数的一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。
KL散度
KL(Kullback–Leibler)散度也称相对熵(relative entropy)、信息散度、信息增益。KL散度一般用来衡量两个概率密度分布
p
(
x
)
p(x)
p(x)和
q
(
x
)
q(x)
q(x)的相似性,典型情况下,
p
(
x
)
p(x)
p(x)表示数据的真实分布(已知表征该分布的参数),
q
(
x
)
q(x)
q(x)表示数据的理论分布、模型分布或者
p
(
x
)
p(x)
p(x)的近似分布。因此它描述了概率分布q拟合概率分布p的程度,其定义如下:
D
K
L
[
p
∣
∣
q
]
=
∫
p
(
x
)
log
p
(
x
)
q
(
x
)
d
x
=
∫
p
(
x
)
[
log
p
(
x
)
−
log
q
(
x
)
]
=
E
[
log
p
(
x
)
q
(
x
)
]
=
E
[
log
p
(
x
)
−
log
q
(
x
)
]
=
H
(
p
,
q
)
−
H
(
p
)
D_{KL}[p||q]=\int p(x)\log \frac{p(x)}{q(x)}dx=\int p(x)[\log p(x)-\log q(x)]\\ =\mathbb{E}[\log \frac{p(x)}{q(x)}]=\mathbb{E}[\log p(x)-\log q(x)]=H(p,q)-H(p)
DKL[p∣∣q]=∫p(x)logq(x)p(x)dx=∫p(x)[logp(x)−logq(x)]=E[logq(x)p(x)]=E[logp(x)−logq(x)]=H(p,q)−H(p)
其离散形式定义如下:
D
K
L
[
p
∣
∣
q
]
=
∑
j
p
j
log
p
j
q
j
D_{KL}[p||q]=\sum_j p_j\log\frac{p_j}{q_j}
DKL[p∣∣q]=j∑pjlogqjpj
因为自然对数函数
log
(
x
)
\log(x)
log(x)是凹函数(这里凹函数是根据二阶导数小于0定义的),所以由Jensen不等式可得:
log
(
λ
x
+
(
1
−
λ
)
y
)
≥
λ
log
(
x
)
+
(
1
−
λ
)
log
(
y
)
\log(\lambda x+(1-\lambda)y)\geq \lambda\log(x)+(1-\lambda)\log(y)
log(λx+(1−λ)y)≥λlog(x)+(1−λ)log(y)
如果将线性组合看成是求期望,则
log
(
E
[
⋅
]
)
≥
E
[
log
(
⋅
)
]
\log(\mathbb{E}[\cdot])\geq \mathbb{E}[\log(\cdot)]
log(E[⋅])≥E[log(⋅)]
也可以将
−
log
(
x
)
-\log(x)
−log(x)看成凸函数,则
−
log
(
E
[
⋅
]
)
≤
−
E
[
log
(
⋅
)
]
-\log(\mathbb{E}[\cdot])\leq -\mathbb{E}[\log(\cdot)]
−log(E[⋅])≤−E[log(⋅)]。更形象的理解见:快速了解Jensen’s Inequality与KL散度。
因此可以证明KL散度大于等于0:
D
K
L
[
p
∣
∣
q
]
=
E
[
log
p
(
x
)
q
(
x
)
]
≥
−
log
(
∫
p
(
x
)
q
(
x
)
p
(
x
)
d
x
)
=
−
log
(
∫
q
(
x
)
d
x
)
=
0
D
K
L
[
p
∣
∣
q
]
=
∑
j
p
j
log
p
j
q
j
=
−
E
[
log
q
j
p
j
]
≥
log
[
∑
j
p
j
q
j
p
j
]
=
log
[
∑
j
q
j
]
=
0
D_{KL}[p||q]=\mathbb{E}[\log \frac{p(x)}{q(x)}]\geq -\log (\int p(x)\frac{q(x)}{p(x)}dx)=-\log (\int q(x)dx)=0\\ D_{KL}[p||q]=\sum_j p_j\log\frac{p_j}{q_j}=-\mathbb{E}[\log\frac{q_j}{p_j}]\geq\log[\sum_j p_j \frac{q_j}{p_j}]=\log[\sum_j q_j]=0
DKL[p∣∣q]=E[logq(x)p(x)]≥−log(∫p(x)p(x)q(x)dx)=−log(∫q(x)dx)=0DKL[p∣∣q]=j∑pjlogqjpj=−E[logpjqj]≥log[j∑pjpjqj]=log[j∑qj]=0
上式取等号当且仅当
p
=
q
p=q
p=q。KL散度越小,真实分布
p
(
x
)
p(x)
p(x)与近似分布
q
(
x
)
q(x)
q(x)之间的匹配程度就越好。
KL散度有时也会称为KL距离,但它并不满足距离的性质,因为:
- KL散度不满足对称性, D K L [ p ∣ ∣ q ] ≠ D K L [ q ∣ ∣ p ] D_{KL}[p||q]\neq D_{KL}[q||p] DKL[p∣∣q]=DKL[q∣∣p];
- KL散度不满足三角不等式,即 D K L [ p ∣ ∣ r ] + D K L [ r ∣ ∣ q ] D_{KL}[p||r]+D_{KL}[r||q] DKL[p∣∣r]+DKL[r∣∣q]与 D K L [ p ∣ ∣ q ] D_{KL}[p||q] DKL[p∣∣q]没有明确的大小关系。
相对熵可以用于比较文本的相似度,先统计出词的频率,然后计算相对熵。
在
生成对抗网络
里,p为真实数据的概率分布,q为随机噪声生成数据的概率分布,对抗的目的是让q充分拟合p。如果q完全拟合p,就会有 H ( p ) = H ( p , q ) H(p)=H(p,q) H(p)=H(p,q);如果拟合不充分,就会产生信息损失 H ( p , q ) − H ( p ) H(p,q)-H(p) H(p,q)−H(p),整个信息损耗就是p和q的KL散度。
计算KL散度的几个例子
原理:生成两个分布,并且生成它们的ksdensity, 和histogram, 最后计算ksdensity 和 histogram与真实分布的KL散度。
- 真实分布是用normpdf计算出来的
- Kernel Density, 默认宽度
- Kernel Density,默认宽度/2
- Histogram
clear vars
%generate random data
class_a = randn(30,1);
class_b = 5+randn(30,1);
x = [class_a; class_b];
%calculate the params for normpdf
mu_a = mean(class_a);
mu_b = mean(class_b);
sig_a = std(class_a);
sig_b = std(class_b);
testpoints = linspace(min(x), max(x));
%generate mix gaussians
p_mix = normpdf(testpoints,mu_a,sig_a)/2 + normpdf(testpoints,mu_b,sig_b)/2;
%calculate two kernel density
[p_ks_default,dum,width_default] = ksdensity(x,testpoints);
p_ks_half_default = ksdensity(x,testpoints,'bandwidth',width_default/2);
%calculate histogram probability
[c_hist,centers_hist] = hist(x,20);
p_hist = c_hist/60;%we have 60 data instances
p_hist = p_hist + 0.00001;%avoid all the zeros
%we need to generate true distribution vector over 20 instances provided by histogram
p_mix_20 = normpdf(centers_hist,mu_a,sig_a)/2 + normpdf(centers_hist,mu_b,sig_b)/2;
kld_ks_default = sum(p_mix .* log(p_mix ./ p_ks_default));
kld_ks_half_default = sum(p_mix .* log(p_mix ./ p_ks_half_default));
kld_histo = sum(p_mix_20 .* log(p_mix_20 ./ p_hist));
figure
plot(testpoints,p_mix);
title('True distribution');
figure
plot(testpoints,p_ks_default);
title(['Kernel density (default width), KLD = ' num2str(kld_ks_default)]);
figure
plot(testpoints,p_ks_half_default);
title(['Kernel density (half default width), KLD = ' num2str(kld_ks_half_default)]);
figure
hold on
hist(x,20);
%plot(centers_hist,p_mix_20);
%plot(centers_hist,p_hist);
title(['Histogram (20 bins), KLD = ' num2str(kld_histo)]);
一个英文的KL散度解释:Kullback-Leibler Divergence Explained
https://github.com/thushv89/exercises_thushv_dot_com/blob/master/kl_divergence.ipynb
Jeffery散度
Jeffery散度的定义如下:
D
J
[
p
∣
∣
q
]
=
D
K
L
(
p
∣
∣
q
)
+
D
K
L
(
q
∣
∣
p
)
D_J[p||q]=D_{KL}(p||q)+D_{KL}(q||p)
DJ[p∣∣q]=DKL(p∣∣q)+DKL(q∣∣p)
其离散形式定义如下:
D
J
[
p
∣
∣
q
]
=
∑
j
(
p
j
−
q
j
)
log
p
j
q
j
D_J[p||q]=\sum_j(p_j-q_j)\log\frac{p_j}{q_j}
DJ[p∣∣q]=j∑(pj−qj)logqjpj
JS散度
JS散度衡量了两个概率分布的相似度,是基于KL散度的变体。它解决了KL散度非对称的问题,因此JS散度是对称的。
JS散度的定义如下:
D
J
S
[
p
∣
∣
q
]
=
1
2
D
K
L
(
p
∣
∣
p
+
q
2
)
+
1
2
D
K
L
(
q
∣
∣
p
+
q
2
)
D_{JS}[p||q]=\frac{1}{2}D_{KL}(p||\frac{p+q}{2})+\frac{1}{2}D_{KL}(q||\frac{p+q}{2})
DJS[p∣∣q]=21DKL(p∣∣2p+q)+21DKL(q∣∣2p+q)
- JS散度的值域为 [ 0 , 1 ] [0,1] [0,1],当且仅当 p = q p=q p=q时取0,当且仅当 p = − q p=-q p=−q时取1;
- JS散度满足对称性,即 J S ( p ∣ ∣ q ) = J S ( q ∣ ∣ p ) JS(p||q)=JS(q||p) JS(p∣∣q)=JS(q∣∣p),而对称能让散度度量更准确,因此JS散度相对KL散度来说对相似度的判别更精确。
- KL散度和JS散度度量的时候有一个问题:如果两个分配p,q离得很远,完全没有重叠的时候,那么KL散度值是没有意义的,而JS散度值是一个常数。这在学习算法中是比较致命的,这就意味这这一点的梯度为0,也即梯度消失了。
import numpy as np
import math
# 离散随机变量的KL散度和JS散度的计算方法
def KL(p,q):
#p,q为两个list,里面存着对应的取值的概率,整个list相加为1
if 0 in q:
raise ValueError
return sum(_p * math.log(_p/_q) for (_p,_q) in zip(p,q) if _p != 0)
def JS(p,q):
M = [0.5 * (_p + _q) for (_p,_q) in zip(p,q)]
return 0.5 * (KL(p,M) + KL(q,M))
def exp(a,b):
a = np.array(a,dtype=np.float32)
b = np.array(b,dtype=np.float32)
a /= a.sum()
b /= b.sum()
print(a)
print(b)
print(KL(a,b))
print(JS(a,b))
# exp 1
exp([1,2,3,4,5],[5,4,3,2,1])
[0.06666667 0.13333334 0.2 0.26666668 0.33333334]
[0.33333334 0.26666668 0.2 0.13333334 0.06666667]
0.5216030835963031
0.11968758856917597
# exp 2
#把公式中的第二个分布做修改,假设这个分布中有某个值的取值非常小,就有可能增加两个分布的散度值
exp([1,2,3,4,5],[1e-12,4,3,2,1])
exp([1,2,3,4,5],[5,4,3,2,1e-12])
[0.06666667 0.13333334 0.2 0.26666668 0.33333334]
[1.e-13 4.e-01 3.e-01 2.e-01 1.e-01]
2.065502018456509
0.0985487692550548
[0.06666667 0.13333334 0.2 0.26666668 0.33333334]
[3.5714287e-01 2.8571430e-01 2.1428572e-01 1.4285715e-01 7.1428574e-14]
9.662950847122168
0.19399530008415986
# exp 3
exp([1e-12,2,3,4,5],[5,4,3,2,1])
exp([1,2,3,4,1e-12],[5,4,3,2,1])
[7.1428574e-14 1.4285715e-01 2.1428572e-01 2.8571430e-01 3.5714287e-01]
[0.33333334 0.26666668 0.2 0.13333334 0.06666667]
0.7428131560123377
0.19399530008415986
[1.e-01 2.e-01 3.e-01 4.e-01 1.e-13]
[0.33333334 0.26666668 0.2 0.13333334 0.06666667]
0.38315075574389773
0.0985487692550548
将第一个实验与第二个实验做对比,可以看出KL散度的波动比较大,而JS的波动相对小。
如果将第二个实验和第三个实验做对比,可以发现KL散度在衡量两个分布的差异时具有很大的不对称性。如果后面的分布在某一个值上缺失,就回得到很大的散度值;但是如果前面的分布在某一个值上缺失,最终的KL散度并没有太大的波动。这个demo可以清楚地看出KL不对称性带来的一些小问题,而JS具有对称性,所以第二个实验和第三个实验的JS散度实际上是距离相等的分布组。
JS散度用在GAN的数学推导上,克服了KL散度不是距离的缺点。
Wasserstein距离
由于KL散度和JS散度存在同一个问题,如果p分布和q分布相距很远完全没有重叠,则会导致梯度消失,故引出了Wasserstein距离,即使两个分布的支撑集没有重叠仍能反映两个分布的远近。
Wasserstein距离度量两个概率分布之间的距离,其定义如下:
W
(
p
,
q
)
=
inf
γ
∼
Π
(
p
,
q
)
E
(
x
,
y
)
∼
γ
[
∣
∣
x
−
y
∣
∣
]
W(p,q)=\inf_{\gamma \sim \Pi(p,q)}\mathbb{E}_{(x,y)\sim \gamma}[||x-y||]
W(p,q)=γ∼Π(p,q)infE(x,y)∼γ[∣∣x−y∣∣]
其中
Π
(
p
,
q
)
\Pi(p,q)
Π(p,q)是p(x)和q(x)分布组合起来的所有可能的联合分布的集合。
对于每一个可能的联合分布 γ \gamma γ,可以从中采样 ( x , y ) ∼ γ (x,y)\sim \gamma (x,y)∼γ得到一个样本x和y,并计算出这对样本的距离 ∣ ∣ x − y ∣ ∣ ||x-y|| ∣∣x−y∣∣,所以可以计算该联合分布 γ \gamma γ下,样本对距离的期望值 E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] \mathbb{E}_{(x,y)\sim \gamma}[||x-y||] E(x,y)∼γ[∣∣x−y∣∣]。在所有可能的联合分布中能够对这个期望取到的下界 inf γ ∼ Π ( p , q ) E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] \inf_{\gamma \sim \Pi(p,q)}\mathbb{E}_{(x,y)\sim \gamma}[||x-y||] infγ∼Π(p,q)E(x,y)∼γ[∣∣x−y∣∣]就是Wasserstein距离。
直观上,可以把 E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] \mathbb{E}_{(x,y)\sim \gamma}[||x-y||] E(x,y)∼γ[∣∣x−y∣∣]理解为在 γ \gamma γ这个路径规划下把土堆p(x)挪到土堆q(x)所需要的消耗。而Wasserstein距离就是在最优路径规划下的最小消耗。所以Wasserstein距离又叫Earth-Mover距离。
Wessertein距离相比KL散度和JS散度的优势在于:即使两个分布的支撑集没有重叠或者重叠非常少,仍然能反映两个分布的远近。而JS散度在此情况下是常量,KL散度可能无意义。
总结
信息量代表的是一种不确定性;信息熵代表的是不确定性的期望值;KL散度,JS散度,交叉熵都可以用来衡量两个概率分布之间的差异性。
在机器学习中,由于训练数据的分布已知,因此交叉熵等价于KL散度。
参考
[1]https://zxth93.github.io/2017/09/27/KL散度JS散度Wasserstein距离/
[2]https://zh.wikipedia.org/wiki/%E7%9B%B8%E5%AF%B9%E7%86%B5 [3]https://en.wikipedia.org/wiki/Jensen%E2%80%93Shannon_divergence [4]https://en.wikipedia.org/wiki/Wasserstein_metric
[5]https://blog.csdn.net/qq_29053993/article/details/83313866