KL散度解释——来自COUNT BAYESIE

KL散度解释——来自COUNT BAYESIE

本文来自Count Bayesie https://www.countbayesie.com/blog/2017/5/9/kullback-leibler-divergence-explained

原文翻译:

在这篇文章中,我们将看一下比较两个概率分布的方法,称为Kullback-Leibler Divergence(通常简写为KL散度或KL距离)。通常在概率和统计学中,会使用更简单的近似分布代替观察的所得的复杂分布。KL散度可以使我们测量,在使用近似值代替时丢失的信息量。

让我们看一个问题开始解释。假设我们是太空科学家,访问一个遥远的星球,我们发现了一种叮咬蠕虫。这些蠕虫有最多有10颗牙齿,但由于咀嚼,许多牙齿最终都会脱落。在收集了许多样本后,我们得出了每个蠕虫中牙齿数量的经验概率分布:

虽然这些真实数据很好,但也有一些问题。我们远离地球,将数据发回去很昂贵的。我们需要将这些数据简化为只有一个或两个参数的简单模型。一种选择是将蠕虫中牙齿的分布表示为均匀分布。我们知道有11个可能的值,我们可以只分配统一概率 1 11 \frac{1} {11} 111 这些可能性中的每一种:

显然,真实数据并不符合均匀分布,也不像我们所知的任何常见分布。我们可以尝试的另一个选择是使用二项分布对我们的数据建模。在这种情况下,我们需要做的就是估计二项分布的概率参数。我们知道如果有的话ñn次试验和可能性pp那么期望就是E [x] = n \ cdot pë [ X ] = Ñp。在这种情况下n = 10n = 1 0,期望值只是我们数据的平均值,我们称之为5.7,因此我们对p的最佳估计值为0.57。这会给我们一个看起来像这样的分布式:

将均匀分布和二项分布,分别与原始数据进行比较,都没有完美匹配,但哪一个更好?

尽管采用近似估计会存在大量错误,但我们主要关心的是最小化我需要发送信息量。这两种模型(均匀分布、二项分布)都将我们的问题减少到两个参数,即吃树和概率(均匀分布只需要齿数)。要比较哪一个方案更好地保留了原始数据中的更多信息,KL散度就派上用场了。

概率分布熵(信息熵)

KL 散度起源于信息论。信息论的主要目标是量化数据中的信息量。信息论中最重要的指标称为熵,通常表示为H*^ h*。概率分布熵定义是:
H = − ∑ i = 1 N p ( x i ) ⋅ l o g   p ( x i ) H=−\sum_{i=1}^Np(x_i)⋅log\,p(x_i) H=i=1Np(xi)logp(xi)
如果我们使用 log_2来计算,我们可以这样理解熵:编码信息所需要的最小的比特数。在这种情况下,根据我们的经验分布,信息将是每次观察牙齿计数。鉴于我们观察到的数据,我们的概率分布具有3.12比特。比特数告诉我们平均来说我们至少需要多少比特才能完成信息编码。

熵没有告诉我们是如何实现压缩的最佳编码方案。信息的最佳编码是一个非常有趣的主题,但对于理解KL散度不是必需的。熵的关键在于,仅仅知道了编码位数的理论下限,可以精确地量化数据的信息量。现在我们想要量化当我们用观察到实际分布进行近似时丢失了多少信息。

使用KL散度度量信息损失

KL散度只是对在信息熵公式基础上稍加修改。除了需要概率分布p以外,我们还需要近似分布q。我们看看每个log值得差异:

D K L ( p ∣ ∣ q ) = ∑ i = 1 N p ( x i ) ⋅ ( log  p ( x i ) − log  q ( x i ) ) D_{KL}(p||q) = \sum_{i=1}^{N} p(x_i)\cdot (\text{log }p(x_i) - \text{log }q(x_i)) DKL(pq)=i=1Np(xi)(log p(xi)log q(xi))

事实上,KL散度是原始分布中的数据概率与近似分布之间的对数差异的期望值。如果我们仍然用log_2 作为基数,可以将其解释为“预计有多少比特的信息损失”。可以根据期望把公式改为:
D K L ( p ∣ ∣ q ) = E [ log  p ( x ) − log  q ( x ) ] D_{KL}(p||q) = E[\text{log } p(x) - \text{log } q(x)] DKL(pq)=E[log p(x)log q(x)]
KL散度更加常用的写法是:
D K L ( p ∣ ∣ q ) = ∑ i = 1 N p ( x i ) ⋅ l o g p ( x i ) q ( x i ) D_{KL}(p||q) = \sum_{i=1}^{N} p(x_i)\cdot log\frac{p(x_i)}{q(x_i)} DKL(pq)=i=1Np(xi)logq(xi)p(xi)
通过KL散度,可以准确计算当我们将一个分布与另一个分布近似时丢失了多少信息。让我们回到上面的例子,看看结果如何。

比较两个近似分布

回到以上的例子(虫子牙齿),分别计算两个近似分布的KL散度,对于平均分布:
D k l ( Observed  ∣ ∣  Uniform ) = 0.338 D_{kl}(\text{Observed } || \text{ Uniform}) = 0.338 Dkl(Observed  Uniform)=0.338
对于二项分布:
D k l ( Observed  ∣ ∣  Binomial ) = 0.477 D_{kl}(\text{Observed } || \text{ Binomial}) = 0.477 Dkl(Observed  Binomial)=0.477
经过比较,采用二项分布进行近似时,信息损失量大于均匀分布。如果必须二选一,使用均匀分布效果更好。

散度不是距离

将KL散度视为距离似乎可行,但是实际KL散度并不能用来两个分布之间的距离。原因是KL散度是不对称的(asymmetric)(注:可参见花书,非对称、不满足两边之和大于第三边)。例如,如果我们使用我们的观察数据作为堆二项分布进行近似,会得到一个非常不同的结果:
D k l ( Binomial ∣ ∣ Observed ) = 0.330 D_{kl}( \text{Binomial} || \text{Observed}) = 0.330 Dkl(BinomialObserved)=0.330
直觉上看这是合理的,因为在每种情况下我们都在采用了不同的近似形式。

使用KL散度进行优化

当我们使用二项分布时,我们通过使用与我们的数据匹配的期望值来选择我们的概率参数。但由于为了最大限度地减少信息丢失需要进行优化,因此这可能不是选择参数的最佳方式。我们可以通过观察随着二项分布的参数值的改变,KL散度变化情况进行检查。如下图表示了相互关系:

如上图,例子中已经实现了KL散度的最小化,所选择的参数实现了最佳估计(如原点标记)。

假设我们想要创建一个特殊的分布估计实际数据。我们将数据分为两部分:0-5颗牙齿的概率和6-10颗牙齿的概率。然后我们将使用单个参数来指定总概率分布的百分比落在分布的右侧。例如,如果我们为参数选择1,那么6-10中每一组都将具有0.2的概率,0-5组中的所有组的概率都为0。可以写为(译者注:两段均匀分布):
[ 6 , 11 ] = p 5 ; [ 0 , 5 ] = 1 − p 6 [6,11] = \frac{p}{5}; [0,5] = \frac{1-p}{6} [6,11]=5p;[0,5]=61p
怎样才能找到这个特殊估计的最佳参数?和以前一样,我们所需要做的就是最小化KL散度。

我们发现KL 散度的最小值是0.338时,发现的 p= 0.47。最小KL散度的值应该看起来非常熟悉:它与我们从均匀分布得到的值几乎相同。当我们绘制出具有理想值的ad hoc分布的值时p时,我们发现它和完全均匀几乎是一致的:

采用这一特殊的分布,并没有保留更多信息,因此我们最好使用更熟悉和更简单的模型。

这里的关键点是我们可以使用KL 散度作为目标函数来找到我们可以提出的任何近似分布的最优值。虽然这个例子只是优化单个参数,但我们可以很容易地想象将这种方法扩展到具有许多参数的高维模型。

变分自动编码器和变分贝叶斯方法

如果您熟悉神经网络,您可能已经猜到了我们在最后一节之后的目标。在最一般意义上,神经网络是函数逼近器。这意味着可以使用神经网络来学习各种复杂功能。让神经网络学习的关键是使用一个目标函数,它可以使神经网络度量当前的状态,即可以通过最小化目标函数的损失来训练神经网络。

正如我们所看到的,我们可以使用KL度量来最小化在近似分布时我们有多少信息丢失。将KL散度与神经网络相结合,可以让我们为数据学习非常复杂的近似分布。常见的方法称为“变分自动编码器”,它可以学习近似数据集中信息的最佳方法。这是一个很好的教程,深入研究构建变分自动编码器的细节。

更一般的是变分贝叶斯方法的领域。在其他帖子中,我们已经看到蒙特卡罗模拟有多强大,可以解决一系列概率问题。虽然蒙特卡罗模拟可以帮助解决贝叶斯推理所需的许多难以处理的积分,但即使这些方法在计算上也非常昂贵。变分贝叶斯方法,包括变分自动编码器,使用KL散度生成最佳近似分布,允许对非常困难的积分进行更有效的推理。

一些补充:

KL散度的性质(花书,第三章概率与信息论3.13小节)

非负性
KL散度为0,则估计分布和实际分布完全一致
非对称性: D K L ( P ∣ ∣ Q ) ≠ D K L ( Q ∣ ∣ P ) D_{KL}(P||Q) \neq D_{KL}(Q||P) DKL(PQ)̸=DKL(QP)

你可能感兴趣的:(Pytorch学习)