散度是一个概率分布与另一个预期概率分布发散程度的度量。它是比较两种概率分布的一种方法,通常是 "真实"分布和该分布的近似值。它量化了这两种分布之间的 “距离”,或者说,当使用一种分布来近似另一种分布时,会损失多少信息。
在机器学习、统计学和信息论等许多领域,我们经常需要用较简单的分布来近似复杂的分布,以提高计算效率,或者因为我们不知道复杂的分布。 散度可以帮助我们量化这种近似的权衡。
在讨论 散度之前,让我们先回顾一些概念。
-
概率分布: 概率分布是一个数学函数,它提供了实验中不同可能结果的发生概率。例如,在一次简单的抛硬币中,得到正面( )或反面( )的概率分布为 。 -
熵: 在信息论中,熵是随机变量不确定性的量度。换句话说,它衡量的是当你得知变量的结时,平均预期会得到的 “惊喜”。离散随机变量 的熵的熵定义如下:
其中, 是 的所有可能结果求和, 是自然对数。
KL 散度
离散概率分布 和 的 散度公式定义如下:
其中的 是所有可能结果的总和。
与 的 散度(表示为 )是衡量用 近似 时所损失信息的一个指标。它不是对称的,也就是说, 与 并不相同。
在上式中, 是真实分布, 是估计分布。
让我们来分析一下这个公式:
-
第一部分p(x)
这是事件 在第一次分布中的概率。这个被用作加权因子,即在第一个分布中更有可能发生的事件对差异的影响相对更大。
我们使用这个术语是因为我们对 和 之间的差异感兴趣,其中 分配了更大的概率。如果某个事件在 中的概率很高,但在 中的概率却不高,我们就会期望它对我们的散度产生更大的影响。反之,如果某个事件在 中的可能性很低,即使 给出了很高的概率,我们也不期望它对我们的散度产生太大影响。这是因为我们测量的是从 到 的散度,而不是相反。
正如你在这里注意到的, 只会给在 中更有可能发生的事件更多权重,这是因为我们本质上是在问 “Q 与 有多大不同?”,而偏向于 P 认为更有可能发生的事件。这在很多情况下都很有用,因为我们要惩罚那些没有为真实数据生成过程(P)中可能发生的事件赋予高概率的模型(Q)。
-
对数部分
如果 和 Q 赋予 的概率相同,则该比率为 1,1 的对数为 0,因此 和 一致认为的事件不会导致差异。 如果 赋予 的概率大于 赋予 的概率,则该比率大于 1,对数为正,因此该事件会导致差异。如果 赋予 的概率小于 赋予 的概率,则该比率小于 1,对数为负,但记住,我们是将其乘以 ,因此 赋予低概率的事件不会对散度产生太大影响。
使用对数函数有几个原因。其一是它能将比值转化为差值,而差值通常很容易处理。另一个原因是,根据詹森不等式,它可以确保 散度始终为非负。对数在信息论方面也有很好的解释:
是指当你得知概率为 的事件已经发生时所获得的信息量。
-
对于每个结果,我们先计算 赋予它的概率是多少,然后乘以 和 赋予它的概率之比的对数。这个比率告诉我们 和 在这个特定结果上的差异有多大。是指当你得知概率为 p 的事件已经发生时所获得的信息量。
-
然后,我们对所有可能的结果求和。这样就得到了一个数字,代表 和 之间的总差异。
这意味着 KL Divergence 是概率对数差的加权和,其中权重是根据第一个分布得出的概率。
散度具有以下特性:
-
非负性:
这就是所谓的吉布斯不等式。当且仅当 和 是相同的分布时, 散度为 0,在这种情况下不会有信息损失。
-
不对称:
不是对称的,这意味着 与 并不相同
如前所述, 与 并不相同。这是因为 KL 散度测量的是 被用来近似 时的信息损失,而不是相反。
真实分布 通常是我们知道或假定为正确的理论或实际基本事实。然而,在许多实际应用中,我们并不能直接获取这一真实分布。相反,我们有一个从这个分布中抽取的数据样本,并试图根据这个样本来估计这个分布。这个估计的分布就是 .。
因此,虽然我们在计算中使用了真实分布,但它往往是我们试图使用的理论构造或已知的基本事实,而不是我们可以直接用于预测或其他任务的东西。
请看一个使用垃圾邮件过滤的例子。
在这种情况下,真实的分布可能是非垃圾邮件(合法)中单词的实际分布。例如,在合法邮件中,"offer"一词可能出现在 5%的邮件中,"free"出现在 10%的邮件中,以此类推。
现在,假设您开发了一个垃圾邮件过滤器,它正试图根据它所看到的邮件样本来估计这种分布。这个估计分布是 Q。也许您的垃圾邮件过滤器估计 "offer"出现在 7% 的非垃圾邮件中,而 “free”出现在 12% 的非垃圾邮件中。
分歧可以用来衡量垃圾邮件过滤器估计的分布 与真实分布 的近似程度。如果 散度很高,说明您的垃圾邮件过滤器的估计值与真实分布相差很大,可能无法很好地区分垃圾邮件和非垃圾邮件。如果 散度度较低,则说明垃圾邮件过滤器的估计值接近真实分布,它可能做得很好。
在这种情况下,即使您知道真实分布,也不能直接用它来过滤邮件,因为您的垃圾邮件过滤器需要根据它看到的邮件进行估计。 散度是一种衡量它在这方面做得如何的方法。
您确实可以使用假阳性、真阳性等指标来评估垃圾邮件过滤器的性能。这些指标在实践中经常被使用,并提供了有关分类器性能的宝贵信息。
然而,KL 分歧提供了一个不同的视角。它不只是告诉您垃圾邮件过滤器正确或错误的频率(就像误报和真报一样),还能告诉您垃圾邮件过滤器估计的非垃圾邮件中的词语分布与实际分布的匹配程度。
在单词分布非常重要的情况下,这一点尤其有用。例如,如果某些单词在非垃圾邮件中非常常见,但您的垃圾邮件过滤器却认为它们很少见,那么它就更有可能错误地将非垃圾邮件归类为垃圾邮件。通过使用 散度,您可以识别并纠正这些差异。
此外, 散度还可用于具有大量潜在特征(如电子邮件中可能出现的所有单词)的情况。假阳性和真阳性等指标只能给出一个数字来概括分类器的性能,但它们并不能告诉你分类器对哪些特征(单词)处理得好,哪些处理得不好。而 散度则可以提供这方面的信息。
**因此,基本上您的分类器可以学习到复杂的模式,如检测垃圾邮件时涉及的成千上万个特征和交互。
Example (1)
从一个简单的例子开始。假设我们有一个二元结果,比如掷硬币,结果要么是正面( ),要么是反面( )。
假设真实分布 是一个公平的硬币,那么 , 。现在,假设我们有一个估计分布 ,其中 , 。这意味着我们的模型在 70% 的情况下预测正面,在 30% 的情况下预测反面。
KL 散度是衡量一种概率分布与第二种预期概率分布发散程度的指标。它的定义是:
对于我们的二进制情况,这就变成了:
代入我们的值:
散度值越大,说明我们估计的分布 Q 在逼近真实分布 P 方面做得越差。
散度是没有边界的。它可以取 0 到无穷大的任何值。 散值为 0 表示两个分布完全相同。随着 散度的增大,两者之间的差异也会增大。
也就是说,对于任何特定结果 , 和 之间的绝对差值介于 0 和 1 之间。这可以让我们对两种分布之间可能存在的最大散度有一定的了解,但并不能为 散度本身提供约束。
示例(2)
让我们来看一个简化的电影推荐系统示例。为了简单起见,我们将使用一种非常基本的用户偏好预测形式。
假设有一个用户在过去给 5 部电影打了分。评分从 1 到 5,5 分最高。以下是评分:
-
Movie A: 5 -
Movie B: 4 -
Movie C: 5 -
Movie D: 1 -
Movie E: 2
我们可以将这些评分视为用户偏好的 “真实 ”分布。我们将对这些评分进行归一化处理,将其转化为概率:
true_distribution = np.array([5, 4, 5, 1, 2])
true_distribution = true_distribution / true_distribution.sum()
现在,假设我们的推荐系统为每部电影提供了一些特征(如类型、导演、演员等),并使用这些特征来预测用户对每部电影的评分。基于这些特征,它预测了以下评分:
-
Movie A: 4 -
Movie B: 3 -
Movie C: 5 -
Movie D: 2 -
Movie E: 3
我们将再次对这些评级进行归一化处理,将其转化为概率:
predicted_distribution = np.array([4, 3, 5, 2, 3])
predicted_distribution = predicted_distribution / predicted_distribution.sum()
现在我们有两个概率分布:基于用户实际评分的真实分布和基于推荐系统预测的预测分布。我们可以使用 KL Divergence 来衡量这两个分布的接近程度:
kl_divergence = kl_div(true_distribution, predicted_distribution).sum()
print(f"KL Divergence is {kl_divergence}")
散度将为我们提供一个单一的数字,量化真实分布和预测分布之间的差异。K 散度越小,说明预测结果越接近真实偏好,我们的推荐系统就做得越好。
这是一个非常简单的例子。真实的推荐系统使用的模型要复杂得多,还必须应对许多额外的挑战,比如处理稀疏数据(用户只对所有可能的项目中的一小部分进行评分)、时间动态(用户的偏好会随着时间的推移而改变)和可扩展性(可能有数百万用户和项目)。但是,使用 等方法比较预测偏好和真实偏好的基本思想是相同的。
散度主要是衡量一种概率分布与第二种预期概率分布的发散程度。它通常被用来量化模型的 “好坏”,类似于回归问题中的均方误差(MSE)。
在推荐系统中, 可以作为评估流程的一部分,用于比较不同的模型或模型的不同版本。例如,您可以用它来比较新版本的推荐算法和当前版本的推荐算法,看看后者是否更好。
不过, 背离通常不会直接用于推荐系统的优化过程。优化过程通常涉及最小化一个损失函数,该函数与所使用的推荐算法类型有关。例如,系统中常用的矩阵因式分解算法通常使用一种平方误差损失函数。
尽管如此,也有一些学习模型,例如变异自动编码器,其 散度直接包含在损失函数中,并在训练过程中最小化。这些模型试图学习一种近似真实分布的概率分布,而 散度 则用来衡量它们的学习效果。
此外, 还经常用于我们想用一个更简单的已知分布来近似一个复杂的未知分布的情况。
一个典型的例子是在贝叶斯统计领域,我们经常要根据一些数据来估计一个参数的后验分布。真正的后验分布通常很复杂,很难直接使用,尤其是对于高维参数。因此,我们会用一个更简单的分布(如高斯分布)来近似它,然后使用变异推理等技术找到高斯分布的参数,使真实分布和近似分布之间的 散度最小化。 散度主要是衡量一种概率分布与第二种预期概率分布的发散程度。它通常被用来量化模型的 “好坏”,类似于回归问题中的均方误差(MSE)。
在推荐系统中, 可以作为评估流程的一部分,用于比较不同的模型或模型的不同版本。例如,您可以用它来比较新版本的推荐算法和当前版本的推荐算法,看看后者是否更好。
不过, 背离通常不会直接用于推荐系统的优化过程。优化过程通常涉及最小化一个损失函数,该函数与所使用的推荐算法类型有关。例如,系统中常用的矩阵因式分解算法通常使用一种平方误差损失函数。
尽管如此,也有一些学习模型,例如变异自动编码器,其 散度直接包含在损失函数中,并在训练过程中最小化。这些模型试图学习一种近似真实分布的概率分布,而 KL 则用来衡量它们的学习效果。
此外 KL还经常用于我们想用一个更简单的已知分布来近似一个复杂的未知分布的情况。
一个典型的例子是在贝叶斯统计领域,我们经常要根据一些数据来估计一个参数的后验分布。真正的后验分布通常很复杂,很难直接使用,尤其是对于高维参数。因此,我们会用一个更简单的分布(如高斯分布)来近似它,然后使用变异推理等技术找到高斯分布的参数,使真实分布和近似分布之间的 散度最小化。
另一个例子是在机器学习中,我们经常希望学习数据的基本分布。例如,在生成对抗网络(GAN)中,生成器网络会尝试生成与训练数据分布相同的数据。KL散度可以作为损失函数的一部分,用来衡量生成器的表现,KL散度越小,说明生成的数据越接近真实的数据分布。
在这些示例中, 提供了一种方法来量化我们简单的已知分布对复杂的未知分布的逼近程度。通过最小化 KL ,我们可以在所选的简单分布系列中找到最佳近似值。

