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. workerman-todpole 执行流程(3)

    通过前两篇文章的分析: workerman-todpole 执行流程(1) workerman-todpole 执行流程(2) 我们已经详细了解了主进程以及子进程的启动细节,但之前的文章并没有考虑 W ...

  2. Win7查看开关机记录

    通过系统日志可以查看,这里记得的日志很多,需要筛选一下,来个图片看的清楚: 事件ID的12,13就代表开关机,具体信息会在窗口下方显示.

  3. eclipse 导出 javadoc

    项目右键Export ->java/javadoc -> 选择要导出的项目,javadoc.exe,存放路径,导出的级别(private可导出全部) ->在VM option中加入- ...

  4. HBuilder开发APP自动登录时跳过"登录页面"

    刚接触开发公司APP项目,用HBuilder开发工具. manifest.json中的入口页面就是"登录页面",现在获取到自动登录状态是true,但是真机联调时"登录页面 ...

  5. Delphi FrieDAC 大数据处理

    Delphi FrieDAC 大数据处理 大数据处理, 要用到Array DML 插入数据 先要设置插入的数据量 FQuery1.Params.ArraySize := 1000; for index ...

  6. 使用docker-compose创建启动容器时候提示服务名已存在

    今天在测试环境启动一个已有服务时候提示服务名已存在,造成这个原因是,前些天集群的一个节点挂了,导致这个节点上的docker容器全部没了,为了当时能正常使用就使用 docker-compose -H 1 ...

  7. 12.JDBC-mysql.md

    目录 API简述 Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序 Connection接 ...

  8. H5做的商城客户端,效果很不错

    H5做的商城客户端,效果很不错 H5做的商城客户端,效果和android原生客户端没多大区别,现在h5是越来越火了, android的小伙伴们又遇到一个新的挑战了.本项目只能学习一下WebViewAc ...

  9. 关于xml中自动提示功能的设置

    我们在编写xml文件时如果有自动提示功能,将会事半功倍,下面我就怎么设置xml进行说明: 在xml文件的开始几行一般有编写xml文件的语法要求;如 <!DOCTYPE hibernate-con ...

  10. 连接mysql连接不上遇到的问题

    连接不上mysql ,启动mysqld进程,发现可以启动成功,但几秒后进程立马关闭了,后来发现主要原因是因为磁盘空间满了. 报错: Can't connect to local MySQL serve ...