原文地址Count Bayesie
这篇文章是博客Count Bayesie 上 Will Kurt 的文章Kullback-Leibler Divergence Explained
的翻译和笔记
原文对 KL散度 的概念诠释得非常清晰易懂,评论区中有很多致谢,建议阅读
笔记
KL散度
是原始分布
中数据概率与近似分布
中数据概率的对数差
的期望
,用于量化参数化近似
代替观测分布
时丢失了多少信息。散度越小,说明模拟越逼近现实。
信息
信息论奠基人香农认为“信息是用来消除随机不确定性的东西”,也就是以前不知道现在知道的事实。
熵
作为度量信息的期望,引用PRML
中的观点,信息量
可以看成是在了解事物时,感受到的“惊讶程度”。低概率事件内蕴的信息会比高概率的信息多,比如革命性产品问世、突破性科学发现。正所谓“无常生妖”,低概率事件有更多信息符合直觉。
多个事件同时发生的概率是多个事件概率相乘,总信息量是多个事件信息量相加。熵
计算公式中的对数不大好理解,参考严谨推导可以发现信息量
确实是$f(x)=-log{x}$。
概率和信息量的对数关系,可以理解为 两件事情信息量之和 = 两件事情同时发生的信息量:
$x_1$和$x_2$同时发生的概率:$P(x_1, x_2) = P(x_1)×P(x_2)$
$x_1$和$x_2$的总信息量:$log_2(P(x_1)P(x_2)) = log_2P(x_1)+log_2P(x_2)$
趣闻
评论区中,作者有回复关于熵
的符号H
的提问:
谢谢你的评论,我不禁对这个符号的历史做了一些研究!如果你读过《通信的数学理论》(该书改编自香农为信息论奠定基础的原始论文 http://math.harvard.edu/~ctm/home/text/others/shannon/entropy/entropy.pdf )你会发现香农解释了H
的起源:
H
就是玻尔兹曼著名的H定理
中的H
。
有趣的是玻尔兹曼最初把它命名为E
,但后来他决定换成了H
,虽说对他是不是取了希腊字母Eta H
有些争议。
在玻尔兹曼关于熵的论文中,他使用了S
,而S
(不是E
)仍然是熵的标准物理符号。(维基百科中关于热力学第二定律的注释用了S
https://en.wikipedia.org/wiki/Second_law_of_thermodynamics)
参考
KL散度的理解(GAN网络的优化)
KL散度的理解
Tutorial on Variational Autoencoders
不知为不知—信息论和最大熵原则
信息量为什么要表示成对数的形式
译文
在这篇文章中,我们将研究一种比较两种概率分布的方法,即Kullback-Leibler散度(通常简称为KL散度)。在概率和统计中,我们经常用更简单的近似分布来代替观察到的数据或复杂分布。KL散度帮助我们测量当我们选择一个近似值时我们损失了多少信息。
让我们从一个问题开始我们的探索。假设我们是太空科学家,访问一个遥远的新行星,我们发现了一种我们想研究的噬虫。我们发现,这些蠕虫有10颗牙齿,但由于它们不停地咀嚼,它们中的许多最终失去了牙齿。在收集了大量样本后,我们得到了每只蠕虫中牙齿数量的经验概率分布:
虽然这些数据很好,但我们有一个小问题。我们远离地球,向地球发送原始数据成本高昂。我们要做的是将这些数据简化为只有一两个参数的简单模型。一种选择是把蠕虫牙齿的分布表示为均匀分布。我们知道有11个可能的值我们可以对每一种可能赋值相同的概率。
显然,我们的数据不是均匀分布的,但它看起来也不太像我们知道的任何常见分布。我们可以尝试的另一个选择是使用二项分布建模我们的数据。在这种情况下,我们需要做的就是估计二项分布的概率参数。我们知道,如果我们有 $n$ 次试验 它的概率是 $p$ 那期望就是 。这里的$ n = 10 $,而期望就是数据的均值,也就是5.7,因此我们对 $p$ 的最佳估计值为0.57。这将使我们得到一个二项分布,如下所示:
将我们的每个模型与原始数据进行比较,我们可以发现两者都不是完美的匹配,但是哪一个更好呢?
现有的错误度量有很多,但我们主要关心的是最小化我们必须发送的信息量。这两个模型都将问题简化为两个参数,牙齿数量和一个概率(尽管对于均匀分布,我们实际上只需要牙齿数量)。求证哪个分布更好的方法,就是去测试哪个分布保留了更多的原始数据源信息。这就是Kullback-Leibler散度出现的原因。
分布的熵
KL散度
起源于信息论。信息论的主要目标是量化数据中有多少信息。信息论中最重要的度量是熵,通常用$H$表示。概率分布的熵的定义是:
如果我们使用 来进行计算,我们可以将熵解释为“编码信息所需要的最小比特数”。在这种情况下,信息将是每次观察到的牙齿计数给定我们的经验分布。根据我们观察到的数据,我们的概率分布的熵是 3.12bits。比特的数量告诉我们,我们平均需要多少比特的下限,来编码我们在一轮观察到的牙齿数量。
熵没有告诉我们的是帮助我们实现这种压缩的最佳编码方案。信息的最优编码是一个非常有趣的话题,但对于理解KL散度并不是必要的。熵的关键在于,只要知道我们需要的比特数的理论下限,我们就能精确地量化数据中有多少信息。现在我们可以量化它了:我们想要量化当我们用参数化近似
来代替观测到的分布
时丢失了多少信息。
使用Kullback-Leibler散度度量丢失的信息
Kullback-Leibler散度只是对熵公式稍加修改。我们不仅用到概率分布 $p$,还加入了近似分布 $q$。然后我们看一下每一个对数值的差异:
实际上,KL散度是原始分布中数据概率与近似分布中数据概率的对数差的期望。同样,如果我们用 $log_2$ 来考虑,我们可以把它解释为“我们预计会丢失多少位信息”。我们可以把这个公式写成期望的形式
KL散度更常见的写法如下:
由于 $\text{log }a - \text{log b} = \text{log }\frac{a}{b}$
利用KL散度,我们可以精确地计算出当我们近似一个分布和另一个分布时丢失了多少信息。让我们回到我们的数据,看看结果是什么样子。
比较我们的近似分布
现在我们可以继续计算两个近似分布的KL散度。对于均匀分布,我们发现:
对于二项式近似:
我们可以看到,使用二项式近似
所丢失的信息要大于使用一致近似
所丢失的信息。如果我们必须选择一个来表示我们的观察结果,我们最好坚持一致近似
。
散度而不是距离
把KL散度看作距离度量的想法很诱人,但是我们不能用KL散度来度量两个分布之间的距离。原因是KL散度是不对称的。例如,如果我们使用观测数据来近似二项分布我们会得到一个非常不同的结果
这是符合直觉的,因为在各自的情形下,我们正在做非常不同形式的近似。
使用KL散度进行优化
当我们选择二项分布的值时,我们通过使用与数据匹配的期望值选择了概率的参数。但由于我们是在优化最小化信息损失,这可能不是选择参数的最佳方式。我们可以通过观察KL散度在改变参数值时的变化方式来再次检查我们的工作。下面是这值如何一起改变信息损失的图表:
正如您所看到的,我们对二项分布(用圆点标记)的估计是最小化KL散度的最佳估计。
假设我们希望创建一个特别分布来建模我们的数据。我们将把数据分成两部分。0-5个牙齿的概率和6-10个牙齿的概率。然后我们将使用一个参数来指定总概率分布中落在分布右侧的百分比。例如,如果我们选择1作为参数,那么6-10组的概率都是0.2, 0-5组的概率都是0。所以:
注意:因为 $log$ 对 $0$ 没有定义,所以只有当$p(x_i) = 0$ 暗示 $q(x_i) = 0$ 时,我们才允许概率为0。
我们怎样才能为我们的这个奇怪模型找到最佳的参数呢?我们所需要做的就是最小化KL散度,就像我们之前做的那样:
我们发现当p=0.47时,KL散度的最小值为0.338。最小KL散度的值看起来很熟悉:它几乎和我们从均匀分布中得到的值一样!当我们用p的理想值来绘制我们的特别分布的值时,我们发现它几乎是一致的:
由于我们不使用临时分布保存任何信息,所以最好使用更熟悉和更简单的模型。
这里的关键点是,我们可以使用KL散度作为一个目标函数来找到任何近似分布的最优值。虽然这个示例只优化了一个参数,但我们可以很容易地将此方法扩展到具有多个参数的高维模型中。
变分自动编码器和变分贝叶斯方法
如果您熟悉神经网络,您可能已经猜到了最后部分之后的学习方向。在最一般的意义上,神经网络是函数近似器。这意味着您可以使用神经网络来学习各种复杂的功能。使神经网络学习的关键是使用目标函数,该函数可以告知网络运行状况。您可以通过最小化目标函数的损失来训练神经网络。
正如我们已经看到的,我们可以使用KL散度来最小化近似分布时的信息损失。将KL散度与神经网络相结合,使我们能够学习非常复杂的数据近似分布。一种常见的解决方法称为“变分自动编码器”,它可以学习最佳方式来近似数据集中的信息。这里有一个很棒的教程,深入了解构建变分自动编码器的细节。
更普遍的是变分贝叶斯方法。在其他的文章中,我们已经看到了蒙特卡洛模拟在解决一系列概率问题上是多么的强大。虽然蒙特卡洛模拟可以帮助解决许多棘手的积分需要贝叶斯推理,即使这些方法可以非常昂贵的计算。变分贝叶斯方法,包括变分自编码器,使用KL散度产生最优近似分布,允许对非常困难的积分更有效的推理。要了解关于变分推理的更多信息,请查看Edward library for python。