了解什么是 Kullback-Leibler 散度、如何计算它以及它为何对机器学习有用。本文解释了这一概念并提供了 Python 示例。。
KL 散度以其研究人员 Solomon Kullback 和 Richard Leibler 的名字命名,他们在论文《论信息与充足性》中引入了这一概念。
当我研究 KL 散度时,我对这个指标如何量化两个概率分布之间的距离感到困惑。我开始知道 KL 散度是一种度量标准,但它并不完全测量“距离”,而是测量两个分布中信息的差异。
简而言之,它通过两个分布所包含的信息来区分它们。
给定两个概率分布 P 和 Q,这些分布的 KL 散度表示为:
KL(P||Q) |
为了更好地理解 KL 散度,我们可以看一下它的属性。
概率分布可以分为两种类型——离散分布和连续分布。因此,我们可以对这些分布使用两种形式的 kl 散度。
连续 Kullback 散度公式
离散 Kullback 散度论坛
如果您熟悉使用 Keras 和 PyTorch 构建模型,那么 KL Divergence 这个名字一定很熟悉。 KL Divergence 用于设计损失函数或误差函数,可在 Keras 和 PyTorch 库中使用。
除此之外,KL 散度还用于对抗训练和 GAN 中,以衡量预测值与真实值之间的差异。
您可以定义一个采用两个分布并根据公式计算 Kullback Leibler 散度的函数,也可以只导入 Scipy 库的一个方法来为您完成工作!
在这个例子中,我们将使用 scipy 库的特殊模块来计算两个分布之间的 KL 散度。
该方法称为相对熵(rel_entr)。让我们看看如何计算每个元素和整个分布的 KL 散度。
#import the scipy library
import scipy
from scipy.special import rel_entr
import numpy as np
#define the probability distributions p and q
#element wise kl div
p = [0.23,0.78,0.91,0.86]
q = [0.12,0.57,0.45,0.34]
kldiv = rel_entr(p,q)
print("KL(P||Q):",kldiv)
#kl div of whole distribution
p = [0.23,0.78,0.91,0.86]
q = [0.12,0.57,0.45,0.34]
kldiv = np.sum(rel_entr(p,q))
print("KL(P||Q):",kldiv)
在继续计算之前,我们必须导入 scipy 库和我们要使用的方法。导入numpy库来计算总和。
概率分布存储在两个变量 p 和 q 中。调用 rel_entr 方法来计算 p 和 q 之间的散度。最后,散度被打印在屏幕上。
如果我们想计算整个分布的散度,只需在计算相对熵之前使用np.sum即可。
库尔贝克·莱布勒散度
如果两个分布相同怎么办?
#what if p and q are same?
p = [0.23,0.57,0.91,0.86]
q = [0.23,0.57,0.91,0.86]
kldiv=rel_entr(p,q)
print("KL(P||Q):",kldiv)
正如我们在 KL 散度的属性中所看到的,这应该会导致散度等于 0。
p=q 的 KL 散度
尽管 KL 散度被认为是一种度量,但不要将其与其他距离度量(例如欧几里德距离或曼哈顿距离)混淆,因为它并不是字面上测量分布之间的距离,而是量化它们在它们包含的信息。这个概念在信息论中被广泛使用。
它以误差度量或损失函数的形式用于机器学习。
KL散度与相对熵密切相关,可以使用scipy库的rel_entr方法或使用公式计算。