原文地址:https://www.countbayesie.com/blog/2017/5/9/kullback-leibler-divergence-explained

在这篇文章中,我们要看看Kullback-Leibler散度(KL散度),它可以用来比较两个概率分布。在概率论与数理统计中,我们常常会用一个更简单的近似分布去替换观测到的数据或是一个复杂分布。KL散度帮助我们衡量当我们选择一个近似分布时,丢失了多少信息。


空间中的虫子与KL散度

我们先来看这样一个问题。假设我们是空间科学家,在一个遥远的星球上发现了一种虫子,这种虫子有10只牙齿,但是很多虫子都缺牙。我们根据收集到的样本得到了牙齿数的经验分布。


根据搜集到的数据得到的经验分布

然而这个分布的数据太多了,我们向地球传送信息的成本是很高的,因此我们希望使用一个只有一两个参数的简单模型来降低数据量。我们可以使用均匀分布,把牙齿数0~10十一个可能取值的概率都设置成1/11。


均匀分布消灭了数据间的任何差异

显然我们的数据不是均匀分布的,但是它也不像是任何我们所知的常见分布。我们还可以用二项分布作为我们数据的模型。在这个例子中,我们只需要估计二项分布中的概率参数。我们知道,如果我们进行nn 次试验,概率参数为pp 的话,那么期望为E[x]=n⋅pE[x] = n · p 。在这个例子中,n=10n = 10 ,期望即是我们数据的均值5.7,所以我们对pp 最好的估计就是0.57。这样,我们会得到一个长成这样的二项分布:


用二项分布作为近似会有更多的细节,但是它并不是一个完美的模型

将均匀分布、二项分布与我们的原始数据对比,我们会发现它们都没有完美匹配原始数据,但是哪个分布更好呢?


两种分布对原始数据的近似程度都是有限的,该如何选择用哪个呢?

现在有很多种误差度量,但我们首要关心的是最小化我们必须发送的信息量。这两种模型都只需要两个参数,即牙齿数与概率(虽然对均匀分布来讲只需要牙齿数)。要确定哪个模型更好的最好方法就是看看哪个分布保留了原始分布中更多的信息。这就是要用到KL散度的地方了。

我们的分布的熵

KL散度起源于信息论,信息论的首要目标是要量化数据中包含多少信息。信息论中最重要的度量叫做熵,一般用HH 表示。对一个概率分布,其熵的定义为:

H=−∑i=1Np(xi)⋅log p(xi)

H=-\sum_{i=1}^{N} p(x_i) \cdot \text{log }p(x_i)
若选择2为对数底数,则熵可解释为“编码信息所需的最少比特数”。在此例中,信息指的是对经验分布中各个牙齿数的观测。根据观测数据,我们的分布的熵为3.12比特。比特数告诉我们,在平均意义下,我们编码单个样本的牙齿数所需的比特数下界。

熵并没有告诉我们达到比特数下界的最优编码方案。信息的最优编码是一个很有趣的话题,但对理解KL散度来讲并不必要。对于熵来讲,最关键的事情就是,我们只需要知道理论上的所需比特数下界,我们就可以精确量化数据中包含多少信息。既然我们可以量化信息,我们就想要量化我们用参数化的近似代替我们观测到的数据时丢失了多少信息。

用KL散度来衡量丢失了多少信息

KL散度只是对熵的公式做了小小的修改。公式中不再只有我们的分布pp ,还加入了我们的近似分布qq ,并计算二者对数值之差:

DKL(p||q)=∑i=1Np(xi)⋅(log p(xi)−log q(xi))

D_{KL}(p||q)=\sum_{i=1}^{N} p(x_i) \cdot (\text{log }p(x_i) - \text{log }q(x_i))

本质上,KL散度是数据在原始分布与近似分布的概率值的对数值之差的期望。如果对数以2为底,则KL散度可解释为“我们期望损失多少比特的信息”。我们可以用期望的形式重写上式:

DKL(p||q)=E[log p(x)−log q(x)]

D_{KL}(p||q)=E[\text{log }p(x) - \text{log }q(x)]

KL散度常写成如下形式:

DKL(p||q)=∑i=1Np(xi)⋅log p(xi)q(xi)

D_{KL}(p||q)=\sum_{i=1}^{N} p(x_i) \cdot \text{log }\frac{p(x_i)}{q(x_i)}

有了KL散度,我们就可以精确计算用一个分布近似另一个分布时丢失了多少信息。让我们回到我们的数据,看看结果如何。

比较我们的近似分布

现在我们可以分别计算使用两个近似分布时的KL散度了。

对均匀分布:

DKL(Observed||Uniform)=0.338

D_{KL}(\text{Observed}||\text{Uniform})=0.338

对二项分布:

DKL(Observed||Binomial)=0.477

D_{KL}(\text{Observed}||\text{Binomial})=0.477

可见,使用二项分布时丢失的信息更多。如果要选一个分布来表示我们的观测的话,均匀分布更好。

散度,而距离

把KL散度当作一种距离度量是一个很吸引人的想法,但是我们不能用KL散度去衡量两个分布之间的距离。原因在于,KL散度是不对称的。例如,如果用我们观测到的分布作为二项分布的近似,我们会得到不同的KL散度:

DKL(Binomial||Observed)=0.330

D_{KL}(\text{Binomial}||\text{Observed})=0.330
直观上来讲,这是合理的,因为我们做的是不同形式的近似。

使用KL散度做优化

当我们选择二项分布中的参数时,我们是把期望值与我们的数据相匹配。但是要最小化信息损失,上面的方法可能不是选参数的最好方法。我们要看看这个参数变化时KL散度是如何变化的,下图说明了这种变化关系:


结果证明,我们选择了正确的方法找到了最好的二项分布来作为我们数据的模型

可见,我们对二项分布的估计(图中圆点所示)是可以最小化KL散度的最佳估计。

假设我们要创造一个特别的分布作为我们数据的模型,我们会把数据分成两个部分:0-5只牙齿的概率与6-10只牙齿的概率。然后用单个参数指定全概率分布落入右侧的百分比。例如,我们选择参数1,那么6-10只牙齿每种情况的概率为0.2,0-5只牙齿每种情况的概率为0。即:

[6,10]=p5;[0,5]=1−p6

[6,10]=\frac{p}{5}; [0,5]=\frac{1-p}{6}

注意,由于log 0\text{log }0 没有定义,所以在p(xi)=0p(x_i)=0 时必须有q(xi)=0q(x_i)=0。

我们该如何找到这个奇怪的模型的最佳参数呢?我们要做的就是像之前那样最小化KL散度:


改变参数值,找到最小的KL散度与最佳参数值

我们发现,当p=0.47p=0.47 时,KL散度最小,为0.338,这个值很眼熟:基本和之前得到的均匀分布的结果相同!我们画出理想p<script type="math/tex" id="MathJax-Element-4078">p</script> 值下的分布,发现它和均匀分布很像:


我们的特别模型被优化成接近均匀分布

既然这个特别模型并没有保留更多的信息,我们不妨还是用更常见和更简单的模型。

这里的关键在于,对于任何我们可以想到的近似分布,我们都可以用KL散度作为目标函数来找到最优值。这个例子只优化了一个参数,我们可以把这个方法扩展到高维模型中,优化多个参数。

变分自编码器与变分贝叶斯方法

如果你对神经网络很熟悉,你可能已经猜到了在上个部分中我们要做什么事。在最一般的意义上,神经网络是函数逼近器,这意味着可以用神经网络学到大量复杂函数,关键在于用一个目标函数告诉网络它做得如何。通过优化目标函数的的方式训练一个神经网络。

如上所述,可以用KL散度最小化采用近似分布时的信息损失。将KL散度与神经网络结合,可以使我们学到十分复杂的近似分布。常用方法叫做“变分自编码器”,它可以学到近似数据集的最佳方式。这里 有一个探究其细节的优秀教程。

更一般的,是变分贝叶斯方法领域。在其它文章中我们看到了蒙特卡罗模拟在解决一系列概率问题时是多么强大。即使蒙特卡罗模拟可以帮助解决贝叶斯推断中很多棘手的积分,这些方法在计算上是成本巨大的。变分贝叶斯方法,包括变分自编码器,使用KL散度生成最优近似分布,可对非常困难的积分做更有效的推断。(?)学习更多关于变分推断的知识,可参考Python中的Edward库。

解释Kullback-Leibler散度相关推荐

  1. 中计算散度的函数_理解 Kullback–Leibler 散度的近似

    作者:John Schulman(OpenAI) 译者:朱小虎 Xiaohu (Neil) Zhu(CSAGI / University AI) 原文链接:http://joschu.net/blog ...

  2. Kullback–Leibler divergence(相对熵,KL距离,KL散度)

    1 前言 注意两个名词的区别: 相对熵:Kullback–Leibler divergence 交叉熵:cross entropy KL距离的几个用途: ① 衡量两个概率分布的差异. ② 衡量利用概率 ...

  3. 相对熵/KL散度(Kullback–Leibler divergence,KLD)

    相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information divergence),信息增益(in ...

  4. KL散度(Kullback–Leibler divergence,KLD)

    一篇来自知乎问答 https://www.zhihu.com/question/41252833 一篇来自COUNT BAYESIE https://www.countbayesie.com/blog ...

  5. 深度学习debug沉思录!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:土豆@知乎,来源:极市平台 原文丨https://zhuanlan ...

  6. 深度学习debug沉思录

    作者丨土豆@知乎 来源丨https://zhuanlan.zhihu.com/p/158739701 前言 接触深度学习也有一两年了,一直没有将一些实战经验整理一下形成文字.本文打算用来记录一些在深度 ...

  7. 【今日CV 计算机视觉论文速览 第123期】Mon, 3 Jun 2019

    今日CS.CV 计算机视觉论文速览 Mon, 3 Jun 2019 Totally 54 papers ?上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Ske ...

  8. 收藏 | 深度学习调试经验

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨土豆@知乎 来源丨https://zhuanlan.z ...

  9. BERT通俗笔记:从Word2Vec/Transformer逐步理解到BERT

    前言 我在写上一篇博客<22下半年>时,有读者在文章下面评论道:"july大神,请问BERT的通俗理解还做吗?",我当时给他发了张俊林老师的BERT文章,所以没太在意. ...

  10. 【GAN ZOO阅读】Generative Adversarial Nets 生成对抗网络 原文翻译 by zk

    Ian J. Goodfellow, Jean Pouget-Abadie ∗ , Mehdi Mirza, Bing Xu, David Warde-Farley, Sherjil Ozair † ...

最新文章

  1. 【转】ubuntu 12.04 下 Vim 插件 YouCompleteMe 的安装
  2. 第十四届智能车竞赛规则浅聊
  3. (转)Spring读书笔记-----Spring的Bean之Bean的基本概念
  4. 学习css3的弹性盒模型
  5. Java 洛谷 P1200 [USACO1.1]你的飞碟在这儿 Your Ride Is Here
  6. Matlab 重命名
  7. 大道至简第五章阅读笔记
  8. abap submit 的使用方法
  9. 推荐:周志华《机器学习》西瓜书精炼版笔记来了!
  10. Windows11——Modern Standby(现代待机) S0改Suspend to RAM(待机到内存)S3睡眠解决方案
  11. html上传预览图片原理,关于html中图片上传预览的实现
  12. mysql dba证书挂靠_这7种情况都叫“证书挂靠”!看看你是否在挂证的边缘试探?...
  13. 今天突然领悟到,想要赚钱必须先放平心态
  14. sql学习指南_SQL格式功能的全面指南
  15. android 分割字符 指定长度_[Android]TextUtils.ellipsize()截取指定长度字符串(附图文混排)...
  16. Spark on Yarn查看删除日志
  17. 南大通用发布数据库新产品 携手用户伙伴点亮世界级
  18. ps还原上一步快捷键,ps返回上一步快捷键是什么
  19. 水清冷冷:Photoshop CC 2020/PSCC 2020安装教程及学习技巧(附工具)
  20. Android M及以上版本系统 悬浮窗权限 的解决方案

热门文章

  1. verilog 赋值
  2. 2021-12-03 WPF上位机 109-欧姆龙协议
  3. 苹果iPhone手机在升级时出现意外,开不了机怎么办?
  4. 小米10 android11降级,MIUI11降级到MIUI10的操作步骤(米6)
  5. 阿里巴巴为什么能抗住双十一?看完这篇你就明白了!
  6. 微信小程序之复选框打对号
  7. 无法读取excel: Excel file format cannot be determined, you must specify an engine manually.建模题目的数据
  8. 【用JavaScript代码写“蝴蝶飞舞“】
  9. Android9.0 应用待机群组
  10. 【JAVA】应声虫程序