机器学习的 Kullback-Leibler 散度

了解什么是 Kullback-Leibler 散度、如何计算它以及它为何对机器学习有用。本文解释了这一概念并提供了 Python 示例。

Kullback Leibler 散度简介

KL 散度以其研究人员 Solomon Kullback 和 Richard Leibler 的名字命名,他们在论文《论信息与充足性》中引入了这一概念。

当我研究 KL 散度时,我对这个指标如何量化两个概率分布之间的距离感到困惑。我开始知道 KL 散度是一种度量标准,但它并不完全测量“距离”,而是测量两个分布中信息的差异。

简而言之,它通过两个分布所包含的信息来区分它们。

给定两个概率分布 P 和 Q,这些分布的 KL 散度表示为:

KL(P||Q)

KL 散度的关键属性

为了更好地理解 KL 散度,我们可以看一下它的属性。

  • 不对称:KL散度的主要性质是散度不对称,即KL(P||Q) ≠ KL(Q||P)
  • 非负:散度始终大于零,且当且仅当 P=Q 时 KL(P||Q)=0

Kullback Leibler 背离的类型

概率分布可以分为两种类型——离散分布和连续分布。因此,我们可以对这些分布使用两种形式的 kl 散度。

连续回拉散度公式

连续 Kullback 散度公式

离散 Kullback 散度论坛

离散 Kullback 散度论坛

在机器学习中的应用

如果您熟悉使用 Keras 和 PyTorch 构建模型,那么 KL Divergence 这个名字一定很熟悉。 KL Divergence 用于设计损失函数或误差函数,可在 Keras 和 PyTorch 库中使用。

除此之外,KL 散度还用于对抗训练和 GAN 中,以衡量预测值与真实值之间的差异。

用Python计算KL散度

您可以定义一个采用两个分布并根据公式计算 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 散度

p=q 的 KL 散度

总结:KL 散度在信息论中的作用

尽管 KL 散度被认为是一种度量,但不要将其与其他距离度量(例如欧几里德距离或曼哈顿距离)混淆,因为它并不是字面上测量分布之间的距离,而是量化它们在它们包含的信息。这个概念在信息论中被广泛使用。

它以误差度量或损失函数的形式用于机器学习。

KL散度与相对熵密切相关,可以使用scipy库的rel_entr方法或使用公式计算。

#machinelearning  #ml 

机器学习的 Kullback-Leibler 散度
1.60 GEEK