解释Kullback-Leibler散度

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

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

这里写图片描述
空间中的虫子与KL散度

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

这里写图片描述
根据搜集到的数据得到的经验分布

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

这里写图片描述
均匀分布消灭了数据间的任何差异

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

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

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

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

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

我们的分布的熵

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

H=i=1Np(xi)log p(xi)

若选择2为对数底数,则熵可解释为“编码信息所需的最少比特数”。在此例中,信息指的是对经验分布中各个牙齿数的观测。根据观测数据,我们的分布的熵为3.12比特。比特数告诉我们,在平均意义下,我们编码单个样本的牙齿数所需的比特数下界。

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

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

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

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

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

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

KL散度常写成如下形式:

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

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

比较我们的近似分布

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

对均匀分布:

DKL(Observed||Uniform)=0.338

对二项分布:

DKL(Observed||Binomial)=0.477

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

散度,而距离

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

DKL(Binomial||Observed)=0.330

直观上来讲,这是合理的,因为我们做的是不同形式的近似。

使用KL散度做优化

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

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

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

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

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

注意,由于 log 0 没有定义,所以在 p(xi)=0 时必须有 q(xi)=0

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

这里写图片描述
改变参数值,找到最小的KL散度与最佳参数值

我们发现,当 p=0.47 时,KL散度最小,为0.338,这个值很眼熟:基本和之前得到的均匀分布的结果相同!我们画出理想 p 值下的分布,发现它和均匀分布很像:

这里写图片描述
我们的特别模型被优化成接近均匀分布

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

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/xzy_thu/article/details/71730507