机器学习小知识: 图解熵、交叉熵和 KL-散度

机器学习与数学

共 4619字,需浏览 10分钟

 ·

2020-08-18 11:39

交叉熵是分类问题中最常用的损失函数之一。但是由于如今有大量容易上手的现成库和框架,我们大多数人常常在没有真正了解熵的核心概念的情况下,就可以熟练地解决问题。
在本文中,让我们研究一下熵这个概念背后的基本直觉,并将其与交叉熵、KL-散度相关联。我们还将使用交叉熵作为损失函数,结合一个实例来看看它在分类问题中的应用。

1什么是熵?

首先,本文指的熵是指信息熵。想要明白熵的确切含义,先让我们了解一下信息论的一些基础知识。在这个数字时代,信息由位(即比特,由 0 和 1)组成。在通信时,有些位是有用的,有些是冗余的,有些是错误,依此类推。当我们传达信息时,我们希望向收件人发送尽可能多的有用信息。

在 Claude Shannon 的论文《通信的数学理论》(1948)中,他指出,传输 1 比特的信息意味着将接收者的不确定性降低 2 倍。

让我们来看看他说的意思。例如,考虑一个天气状况随机的地方,每天可能有 50% 的机率是晴天或阴雨。

现在,如果气象站告诉你明天要下雨,那么他们将不确定性降低了 2 倍。起初,有两种可能,但在收到气象站的信息后,就只有一种可能了。在这里,气象站向我们发送了一点点有用的信息,无论他们如何编码这些信息,这都是事实。

即使发送的信息是多雨(Rainy),并且每个字符占用一个字节,消息总的大小也相当于 40 比特,但是它们仍然只传达了 1 比特的有用信息。

假设天气有 8 种可能的状态,所有可能性都相同。

现在,当气象站为你提供第二天的天气时,它们会将不确定性降低了 8 倍。由于每个事件的发生机率为 1/8,因此降低因子为 8。

但是,如果不同天气的可能性不一样该怎么办呢?

假设有 75% 的概率是晴天,25% 的概率是下雨。

现在,如果气象站说第二天要下雨,那么不确定性就会降低 4 倍,即 2 个比特信息。减少的不确定性是事件概率的倒数。在这种情况下,25% 的倒数是 4,以 2 为底的 得到 2。因此,我们得到 2 个比特的有用信息。

解读

  • 原来凭空猜下雨,你只有 1/4 把握,得到天气预报后现在的把握是 1 了。确定性提升到 4 倍,或者说不确定性降低到 4 倍。
  • 原来猜晴天,你有 3/4 把握,得到天气预报后现在的把握是 1 了。确定性提升到 4/3 倍,或者说不确定性降低到 4/3 倍。

2信息熵

我们经常会说,某个新闻的信息量好大。那么这个信息量到底怎么定义呢?所含的文字?所表达的内容?貌似并不好定义。

可以这么来理解,对某个事件由不确定到确定就得到了所谓的信息量,那么如何来量化它呢?即这个信息量到底有多大呢?这个就需要对不确定到确定这个转化作量化了。首先看看怎么量化不确定性。通过前文我们知道,事件概率越大,不确定性自然就越小,再结合事件是独立的这个前提。信息量应该满足下面这些条件,

  • 信息量跟事件的概率值成反比,即 。概率越大的事件确定性越大,因此由不确定到确定的转化所含的信息量越小。
  • 两个独立事件所对应的信息量应等于各自信息量之和,因为相互不影响,所谓的可加性,即

满足这两个条件的常见函数有吗?答案是肯定的,比如

这个正是 Shannon 采用的函数。来一小段 Python 代码绘制一下这个函数,

# compare probability vs information entropy
from math import log2
from matplotlib import pyplot
# list of probabilities
probs = [0.10.20.30.40.50.60.70.80.91.0]
# calculate information
info = [-log2(p) for p in probs]
# plot probability vs information
pyplot.plot(probs, info, marker='.')
pyplot.title('Probability vs Information')
pyplot.xlabel('Probability')
pyplot.ylabel('Information')
pyplot.show()

结果见下图,对照一下图像来更好地理解一下这个函数吧。

好了,接下来我们就用这个函数来计算信息熵。熵,从数学上看,衡量的是一种期望值,即随机变量多次试验后所传递的信息量的平均值。假设离散随机变量对应的分布为 ,那么该离散随机变量的信息熵定义为,

这里用的都是以 2 为底的对数,也因此信息量对应的单位称为比特(bit)。下面我们回到前文的例子。

如果气象站说第二天是晴天,那么我们将获得 0.41 比特的信息量。因此,平均而言,我们将从气象站获得多少信息量呢?

好吧,明天有 75% 的机率是晴天,这会给你 0.41 比特的信息,明天有 25% 的机率会下雨,它为给你提供 2 比特的信息,对应于下图

平均而言,我们每天从气象站获得 0.81 比特的信息。因此,我们把刚刚计算出的平均值称为信息熵。这很好地衡量了事件的不确定性。

希望熵的公式现在完全有了意义。它衡量的是你每天收到天气预报时得到的平均信息量。通常,它给出了我们从给定的概率分布 抽取的一个样本中获得的平均信息量。它告诉我们某个概率分布对应的随机变量有多么不可预测,即它的不确定程度。

如果我们生活在每天阳光明媚的沙漠中,平均来说,每天我们不会从气象站获得太多信息。熵值将接近于零。另一方面,如果每天的天气情况变化很大,熵值将很大。

3交叉熵

现在,让我们谈谈交叉熵。可以将它看成平均信息长度。比如上面例子中,考虑到有 8 种可能的天气状况,它们的可能性均等,可以使用 3 个比特的信息对每种状况来编码。

如图所示,这里的平均信息长度为 3,这就是这个例子的交叉熵。

但是现在,假设你住在阳光充足的地区,天气的概率分布并不均匀,具体如下图所示,

每天都有 35% 的机率是晴天,雷雨的可能性只有 1%。因此,我们可以计算该概率分布的熵,得,

请注意,此处使用的是以 2 为底的对数。

因此,气象站平均发送 3 个比特信息,但是接收者仅获得 2.23 个有用的比特信息。那么,是不是说明我们还可以做得更好呢?

例如,像下面这样来更改编码,

现在,我们只使用 2 个比特信息表示晴天或部分晴天,使用 3 个比特信息表示多云和大部分多云,使用 4 个比特信息表示中雨和小雨,使用 5 个比特信息表示大雨和雷暴。对天气坐这样的编码方式是不会引起歧义的,例如,你链接多条消息,则只有一种方法可以解释比特流。例如,01100 只能表示部分晴天(01),然后是小雨(100)。因此,如果我们计算该站每天发送的平均比特数,则可以得出,

这是我们新的和改进的交叉熵,它比以前的 3 个比特更好。现在,假设我们在不同的地方使用相同的代码,那儿的天气是相反的,多雨。

现在,如果我们计算交叉熵,

我们得到 4.58 个比特,大约是熵的两倍。平均而言,该站发送 4.58 个比特信息,但只有 2.23 个比特信息对接收者来说是有用的。每条消息发送的信息量是必要信息的两倍。这是因为我们使用的代码对天气分布做出了一些隐含的假设。例如,当我们在晴天使用 2 个比特信息时,我们含蓄地预测了晴天的概况为 25%。这是因为

同样,我们计算所有的天气情况。

分母中 2 的幂对应于用于传输信息的比特数。很明显,预测分布 与真实分布 完全不同。

因此,现在我们可以将交叉熵表示为真实概率分布 和预测概率分布 的函数 ,具体公式为,

请注意,本示例中使用的对数均是以 2 为底的。

正如你所见,除了我们在这里使用预测概率的对数外,它看起来与熵的等式非常相似。如果我们的预测是完美的,那就是预测分布等于真实分布,那么交叉熵就等于熵。但是,如果分布不同,交叉熵就会比熵更大一些,因为多了一些比特。交叉熵超过熵的数量,被称为相对熵,或更通常称为 Kullback-Leibler Divergence(KL-散度)。总结一下,简而言之,

从上面的例子中,我们得到

4应用

现在,让我们在实际应用中来用一用交叉熵。比如,我们正在训练一个图像分类器,对看起来比较相似的不同动物进行分类,例如浣熊啊、小熊猫啊、狐狸之类等等。

因此,对于可能的 7 个类别中的每一个类别,分类器会分别给出一个概率,即所谓的预测分布。由于这是有监督的学习问题,因此我们是知道真实分布的。

在上面的示例中,我拍了一只浣熊的照片,因此在真实分布中,浣熊类的概率应该为 100%,其他类的概率为 0。我们可以将这两个分布之间的交叉熵作为成本函数,称为交叉熵损失

这只是我们前面看到的等式,除了它通常使用自然对数而不是 以 2 为底的对数。对于训练而言,这无关紧要,因为以 2 为底的对数 与自然对数之间的转换关系为 ,其中分母是常数。注意,本文其他地方如没有特别说明, 都是指以 2 为底的对数。

因此,当类别概率被称为一个独热编码向量(这意味着一个类别具有 100% 概率,其余类别均为 0%)时,交叉熵只是真实类别的估计概率的负对数。

在这个例子中,交叉熵为

现在,你可以看到,当对真实类别的预测概率接近 0 时,成本函数可能会非常大。但是,当预测概率接近 1 时,成本函数将接近 0。因此,我们需要对每个类使用更多的例子来训练分类器,以减少损失。

5小结

我们以气象站更新第二天的天气为例,了解了香农信息理论的概念。然后我们将其与熵、交叉熵相关联。最后,我们使用一个例子看了下交叉熵损失函数的实际用法。我希望本文能帮大家弄清熵、交叉熵和 KL-散度以及他们之间的联系。

小结一下: 给定一个分布为  的随机变量,如果你用分布  去编码它,那你就得付出额外的编码税。这个税要缴多少呢,正是 KL-散度。


- 完 -

⟳参考资料⟲

[1]

Hands-On Machine Learning with Scikit-Learn and TensorFlow: https://www.oreilly.com/library/view/hands-on-machine-learning/9781491962282/

[2]

Entropy, Cross-Entropy, and KL-Divergence Explained: https://towardsdatascience.com/entropy-cross-entropy-and-kl-divergence-explained-b09cdae917a

[3]

A Gentle Introduction to Information Entropy: https://machinelearningmastery.com/what-is-information-entropy

[4]

Entropy_information_theory: https://en.wikipedia.org/wiki/Entropy_information_theory


浏览 54
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报