https://blog.csdn.net/weixinhum/article/details/85064685

上一篇文章我们简单介绍了信息熵的概念,知道了信息熵可以表达数据的信息量大小,是信息处理一个非常重要的概念。

对于离散型随机变量,信息熵公式如下:
H(p)=H(X)=Ex∼p(x)[−logp(x)]=−∑ni=1p(x)logp(x) H ( p ) = H ( X ) = \mathrm { E } _ { x \sim p ( x ) } [ - \log p ( x ) ] = -\sum_{i=1}^n p ( x )\log p ( x )
H(p)=H(X)=E
x∼p(x)

[−logp(x)]=−
i=1

n

p(x)logp(x)

对于连续型随机变量,信息熵公式如下:
H(p)=H(X)=Ex∼p(x)[−logp(x)]=−∫p(x)logp(x)dx H ( p ) = H ( X ) = \mathrm { E } _ { x \sim p ( x ) } [ - \log p ( x ) ] = - \int p ( x ) \log p ( x ) d x
H(p)=H(X)=E
x∼p(x)

[−logp(x)]=−∫p(x)logp(x)dx

注意,我们前面在说明的时候log \loglog是以2为底的,但是一般情况下在神经网络中,默认以e ee为底,这样算出来的香农信息量虽然不是最小的可用于完整表示事件的比特数,但对于信息熵的含义来说是区别不大的。其实只要这个底数是大于1的,都能用来表达信息熵的大小。

本篇我们来看看机器学习中比较重要的一个概念—相对熵。相对熵,又被称为KL散度或信息散度,是两个概率分布间差异的非对称性度量 。在信息论中,相对熵等价于两个概率分布的信息熵的差值,若其中一个概率分布为真实分布,另一个为理论(拟合)分布,则此时相对熵等于交叉熵与真实分布的信息熵之差,表示使用理论分布拟合真实分布时产生的信息损耗 。

看完上面的解释,我相信你跟我开始看的时候一模一样,一脸懵逼。下面我们直接看公式,然后慢慢理解:
DKL(p∥q)=∑Ni=1[p(xi)logp(xi)−p(xi)logq(xi)] D _ { K L } ( p \| q ) = \sum _ { i = 1 } ^ { N } \left[ p \left( x _ { i } \right)\log p \left( x _ { i } \right) - p \left( x _ { i } \right)\log q \left( x _ { i } \right)\right]
D
KL

(p∥q)=
i=1

N

[p(x
i

)logp(x
i

)−p(x
i

)logq(x
i

)]

上面的p(xi) p ( x _i)p(x
i

)为真实事件的概率分布,q(xi) q ( x _i)q(x
i

)为理论拟合出来的该事件的概率分布。

因此该公式的字面上含义就是真实事件的信息熵与理论拟合的事件的香农信息量与真实事件的概率的乘积的差的累加。比较难懂的是−∑Ni=1p(xi)logq(xi) -\sum _ { i = 1 } ^ { N } p \left( x _ { i } \right) \log q \left( x _ { i } \right)−∑
i=1
N

p(x
i

)logq(x
i

)这玩意,到底是什么鬼。经过我看了又看,我发现好像很难做出含义解释,估计这东西是前人凑出来的好用的东西(以后有新的理解会更新上来)。那么退而求其次看看它有什么用吧。

假设理论拟合出来的事件概率分布跟真实的一模一样,那么这玩意就等于真实事件的信息熵,这一点显而易见。

假设拟合的不是特别好,那么这个玩意会比真实事件的信息熵大(稍后证明)。

也就是在理论拟合出来的事件概率分布跟真实的一模一样的时候,相对熵等于0。而拟合出来不太一样的时候,相对熵大于0。这个性质很关键,因为它正是深度学习梯度下降法需要的特性。假设神经网络拟合完美了,那么它就不再梯度下降,而不完美则因为它大于0而继续下降。

但它有不好的地方,就是它是不对称的。举个例子,比如随机变量X∼P X \sim PX∼P取值为1,2,3时的概率分别为[0.1,0.4,0.5],随机变量Y∼Q Y \sim QY∼Q取值为1,2,3时的概率分别为[0.4,0.2,0.4],则:
D(P∥Q)=0.1×log(0.10.4)+0.4×log(0.40.2)+0.5×log(0.50.4)=0.250 D ( P \| Q ) = 0.1 \times \log \left( \frac { 0.1 } { 0.4 } \right) + 0.4 \times \log \left( \frac { 0.4 } { 0.2 } \right) + 0.5 \times \log \left( \frac { 0.5 } { 0.4 } \right)=0.250
D(P∥Q)=0.1×log(
0.4
0.1

)+0.4×log(
0.2
0.4

)+0.5×log(
0.4
0.5

)=0.250

D(Q∥P)=0.4×log(0.40.1)+0.2×log(0.20.4)+0.4×log(0.40.5)=0.327 D ( Q \| P ) = 0.4 \times \log \left( \frac { 0.4 } { 0.1 } \right) + 0.2 \times \log \left( \frac { 0.2 } { 0.4 } \right) + 0.4 \times \log \left( \frac { 0.4 } { 0.5 } \right)=0.327
D(Q∥P)=0.4×log(
0.1
0.4

)+0.2×log(
0.4
0.2

)+0.4×log(
0.5
0.4

)=0.327

也就是用P PP来拟合Q QQ和用Q QQ来拟合P PP的相对熵居然不一样,而他们的距离是一样的。这也就是说,相对熵的大小并不跟距离有一一对应的关系。这点蛮头疼的,因为一般我们希望距离越远下降越快,而相对熵取哪个为参考在同等距离情况下下降的速度都不一样,这就非常尴尬了。

推导到这相信很多人会想,既然如此,那为什么现在还是很多人用相对熵衍生出来的交叉熵作为损失函数来训练神经网络而不直接用距离相关的均方差呢?
以下面的例子稍作解释:
假设神经网络的最后一层激活函数为sigmoid sigmoidsigmoid,它长这样:

可以看到它的两头异常的平,也就是说在那些地方的导数接近于0。而反向传播是需要求导的,用了均方差损失函数之后求导结果包含y(y−1) y(y-1)y(y−1)(可参考这篇文章),这在y yy接近于0或者1的时候都趋于0,会导致梯度消失,网络训练不下去。但如果用相对熵衍生出来的交叉熵作为损失函数则没有这个问题。详细的分析可见这篇文章。因此虽然相对熵的距离特性不是特别好,但总归好过直接梯度消失玩不下去,因此很多用sigmoid sigmoidsigmoid作为激活函数的神经网络还是选择了用相对熵衍生出来的交叉熵作为损失函数。
当然如果你选用的不是sigmoid sigmoidsigmoid激活函数,则不需要考虑这些,这个是外话了。

最后来证明下相对熵公式只有在p(xi) p ( x _i)p(x
i

)等于q(xi) q ( x _i)q(x
i

)的时候等于0,其他时候大于0。
要证:DKL(p∥q)=∑Ni=1[p(xi)logp(xi)−p(xi)logq(xi)]≥0 要证:D _ { K L } ( p \| q ) = \sum _ { i = 1 } ^ { N } \left[ p \left( x _ { i } \right)\log p \left( x _ { i } \right) - p \left( x _ { i } \right)\log q \left( x _ { i } \right)\right]\geq0
要证:D
KL

(p∥q)=
i=1

N

[p(x
i

)logp(x
i

)−p(x
i

)logq(x
i

)]≥0

即证∑Ni=1p(xi)log q(xi)p(xi)≤0 即证\sum _ { i = 1 } ^ { N } p (x_ { i }) \log \ \frac { q (x_ { i }) } { p (x_ { i }) } \leq0
即证
i=1

N

p(x
i

)log 
p(x
i

)
q(x
i

)

≤0

又ln(x)≤x−1,当且仅当x=1时等号成立 又\ln ( x ) \leq x - 1,当且仅当x=1时等号成立
又ln(x)≤x−1,当且仅当x=1时等号成立

故∑Ni=1p(xi)log q(xi)p(xi)≤∑Ni=1p(xi)(q(xi)p(xi)−1)=∑Ni=1[p(xi)−q(xi)]=0 故\sum _ { i = 1 } ^ { N } p (x_ { i }) \log \ \frac { q (x_ { i }) } { p (x_ { i }) } \leq\sum _ { i = 1 } ^ { N } p (x_ { i }) (\frac { q (x_ { i }) } { p (x_ { i }) }-1)=\sum _ { i = 1 } ^ { N } [p (x_ { i })-q (x_ { i })]=0

i=1

N

p(x
i

)log 
p(x
i

)
q(x
i

)


i=1

N

p(x
i

)(
p(x
i

)
q(x
i

)

−1)=
i=1

N

[p(x
i

)−q(x
i

)]=0
上面式子中≤的等于号只在p(xi)=q(xi)时成立。 上面式子中\leq的等于号只在p (x_ { i })=q (x_ { i })时成立。
上面式子中≤的等于号只在p(x
i

)=q(x
i

)时成立。

相对熵(KL散度)的更多相关文章

  1. 【原】浅谈KL散度(相对熵)在用户画像中的应用

    最近做用户画像,用到了KL散度,发现效果还是不错的,现跟大家分享一下,为了文章的易读性,不具体讲公式的计算,主要讲应用,不过公式也不复杂,具体可以看链接. 首先先介绍一下KL散度是啥.KL散度全称Ku ...

  2. 交叉熵cross entropy和相对熵(kl散度)

    交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量真实分布p与当前训练得到的概率分布q有多么大的差异. 相对熵(relativ ...

  3. 熵、交叉熵、相对熵(KL 散度)意义及其关系

    熵:H(p)=−∑xp(x)logp(x) 交叉熵:H(p,q)=−∑xp(x)logq(x) 相对熵:KL(p∥q)=−∑xp(x)logq(x)p(x) 相对熵(relative entropy) ...

  4. 机器学习、深度学习中的信息熵、相对熵(KL散度)、交叉熵、条件熵

    信息熵 信息量和信息熵的概念最早是出现在通信理论中的,其概念最早是由信息论鼻祖香农在其经典著作<A Mathematical Theory of Communication>中提出的.如今 ...

  5. PRML读书会第十章 Approximate Inference(近似推断,变分推断,KL散度,平均场, Mean Field )

    主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:02:04 我们在前面看到,概率推断的核心任务就是计算某分布下的某个函数的期望.或者计算边缘概率分布.条件 ...

  6. 浅谈KL散度

    一.第一种理解 相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information divergence) ...

  7. 非负矩阵分解(1):准则函数及KL散度

    作者:桂. 时间:2017-04-06  12:29:26 链接:http://www.cnblogs.com/xingshansi/p/6672908.html 声明:欢迎被转载,不过记得注明出处哦 ...

  8. KL散度、JS散度、Wasserstein距离

    1. KL散度 KL散度又称为相对熵,信息散度,信息增益.KL散度是是两个概率分布 $P$ 和 $Q$  之间差别的非对称性的度量. KL散度是用来 度量使用基于 $Q$ 的编码来编码来自 $P$ 的 ...

  9. ELBO 与 KL散度

    浅谈KL散度 一.第一种理解 相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information dive ...

随机推荐

  1. 使用cuteFTP与虚拟机交互文件---安装ftp服务

    安装ftp服务,以便在Windows中使用cuteFTP与虚拟机交互文件,使用sudo apt-get install vsftpd 安装完后,打开/etc/vsftpd.conf文件,去掉local ...

  2. delphi面向对象 继承窗体

    delphi继承form TFrmBase = class(TForm) procedure FormShow(Sender: TObject); end; procedure TFrmBase.Fo ...

  3. day08-MySQl创建用户和授权

    权限管理 我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作.包括select.update.delete.grant等操作.那么一般情况DBA工程师会创建一个用户和密码,让你去连接数 ...

  4. curl 超时设置<转>

    PHP cURL 的超时设置有两个 CURLOPT_CONNECTTIMEOUT 和 CURLOPT_TIMEOUT,他们的区别是: CURLOPT_CONNECTTIMEOUT 用来告诉 PHP 在 ...

  5. es6 初级之箭头函数

    1.先看一个例子: <script> function show() { console.log('aluoha'); } show(); </script> 2. 改写成简单 ...

  6. while read line

    # grep "请求报文:" application-20170822-*.log >> applog # cat applog|cut -d ":" ...

  7. avalon2学习教程08插入移除操作

    本节介绍的ms-if指令与ms-visible很相似,都是让某元素"看不见",不同的是ms-visible是通过CSS实现,ms-if是通过移除插入节点实现. ms-if的用法与1 ...

  8. avalon2学习教程02之vm

    avalon2的vm是一个非常重要的东西,其设计原型最初脱胎于knockout.js,但到avalon1.6中,终于寻得自己的方案,更精简,更易用,更魔幻. vm是一种特殊的数据结构,看起来像普通对象 ...

  9. 如何遍历Map对象

    方法一 通过Map.entrySet遍历key和value,在for-each循环中使用entries来遍历.推荐,尤其是容量大时 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使 ...

  10. angularjs中安卓原生APP调用H5页面js函数,js写法应注意

    安卓原生app调用js方法,js方法应写在html下的script标签内,不能有任何function包裹,例如angular的controller层,这样APP也是获取不到的: 所以只有放在html中 ...