散度Divergence

熵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)=xip(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)=xip(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[pq]=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[pq]=jpjlogqjpj
因为自然对数函数 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[pq]=E[logq(x)p(x)]log(p(x)p(x)q(x)dx)=log(q(x)dx)=0DKL[pq]=jpjlogqjpj=E[logpjqj]log[jpjpjqj]=log[jqj]=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[pq]=DKL[qp]
  • KL散度不满足三角不等式,即 D K L [ p ∣ ∣ r ] + D K L [ r ∣ ∣ q ] D_{KL}[p||r]+D_{KL}[r||q] DKL[pr]+DKL[rq] D K L [ p ∣ ∣ q ] D_{KL}[p||q] DKL[pq]没有明确的大小关系。

相对熵可以用于比较文本的相似度,先统计出词的频率,然后计算相对熵。

生成对抗网络里,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[pq]=DKL(pq)+DKL(qp)
其离散形式定义如下:
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[pq]=j(pjqj)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[pq]=21DKL(p2p+q)+21DKL(q2p+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(pq)=JS(qp),而对称能让散度度量更准确,因此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)γ[xy]
其中 Π ( 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|| xy,所以可以计算该联合分布 γ \gamma γ下,样本对距离的期望值 E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] \mathbb{E}_{(x,y)\sim \gamma}[||x-y||] E(x,y)γ[xy]。在所有可能的联合分布中能够对这个期望取到的下界 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)γ[xy]就是Wasserstein距离。

直观上,可以把 E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] \mathbb{E}_{(x,y)\sim \gamma}[||x-y||] E(x,y)γ[xy]理解为在 γ \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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值