什么是交叉熵?

What is cross-entropy?

我知道关于什么是交叉熵有很多解释,但我还是一头雾水。

难道只是一种描述损失函数的方法?我们可以使用梯度下降算法使用损失函数找到最小值吗?

Cross-entropy常用来量化两个概率分布的差异。在机器学习的上下文中,它是分类 multi-class class 化问题的误差度量。通常,“真实”分布(您的机器学习算法试图匹配的分布)用 one-hot 分布表示。

例如,假设对于特定的训练实例,真实标签是 B(在可能的标签 A、B 和 C 中)。因此,此训练实例的 one-hot 分布为:

Pr(Class A)  Pr(Class B)  Pr(Class C)
        0.0          1.0          0.0

你可以解释上面的真实分布意味着训练实例有 0% 的概率是 class A,100% 的概率是 class B,0% 的概率是 class C.

现在,假设您的机器学习算法预测以下概率分布:

Pr(Class A)  Pr(Class B)  Pr(Class C)
      0.228        0.619        0.153

预测分布与真实分布有多接近?这就是 cross-entropy 损失所决定的。使用这个公式:

其中 p(x) 是真实概率分布 (one-hot),q(x) 是预测概率分布。总和超过三个 classes A、B 和 C。在这种情况下,损失是 0.479 :

H = - (0.0*ln(0.228) + 1.0*ln(0.619) + 0.0*ln(0.153)) = 0.479

对数底

请注意,只要始终使用相同的对数底数,使用什么底数并不重要。碰巧,Python Numpy log() 函数计算自然对数(对数基数 e)。

Python代码

这里是使用 Numpy 以 Python 表示的上述示例:

import numpy as np

p = np.array([0, 1, 0])             # True probability (one-hot)
q = np.array([0.228, 0.619, 0.153]) # Predicted probability

cross_entropy_loss = -np.sum(p * np.log(q))
print(cross_entropy_loss)
# 0.47965000629754095

这就是您的预测与真实分布的“错误”或“差距”。机器学习优化器将尝试将损失最小化(即它将尝试将损失从 0.479 减少到 0.0)。

损失单位

我们在上面的例子中看到损失是0.4797。因为我们使用的是自然对数(log base e),所以单位在 nats, so we say that the loss is 0.4797 nats. If the log were instead log base 2, then the units are in bits. See this page 以供进一步解释。

更多示例

为了更直观地了解这些损失值所反映的内容,让我们看一些极端的例子。

再次假设真实的 (one-hot) 分布是:

Pr(Class A)  Pr(Class B)  Pr(Class C)
        0.0          1.0          0.0

现在假设您的机器学习算法做得非常好,并且以非常高的概率预测了 class B:

Pr(Class A)  Pr(Class B)  Pr(Class C)
      0.001        0.998        0.001

当我们计算交叉熵损失时,我们可以看到损失很小,只有 0.002:

p = np.array([0, 1, 0])
q = np.array([0.001, 0.998, 0.001])
print(-np.sum(p * np.log(q)))
# 0.0020020026706730793

在另一个极端,假设您的 ML 算法做得很糟糕,而是以高概率预测了 class C。由此产生的损失 6.91 将反映出较大的误差。

Pr(Class A)  Pr(Class B)  Pr(Class C)
      0.001        0.001        0.998
p = np.array([0, 1, 0])
q = np.array([0.001, 0.001, 0.998])
print(-np.sum(p * np.log(q)))
# 6.907755278982137

现在,在这两个极端中间会发生什么?假设您的 ML 算法拿不定主意,以几乎相等的概率预测出这三个 class。

Pr(Class A)  Pr(Class B)  Pr(Class C)
      0.333        0.333        0.334

最终损失为 1.10。

p = np.array([0, 1, 0])
q = np.array([0.333, 0.333, 0.334])
print(-np.sum(p * np.log(q)))
# 1.0996127890016931

拟合梯度下降

交叉熵是许多可能的损失函数之一(另一个流行的是 SVM 铰链损失)。这些损失函数通常写为 J(theta) 并且可以在梯度下降中使用,梯度下降是一种将参数(或系数)移向最佳值的迭代算法。在下面的等式中,您可以将 J(theta) 替换为 H(p, q)。但请注意,您需要先计算 H(p, q) 对参数的导数。

所以直接回答你原来的问题:

Is it only a method to describe the loss function?

正确,cross-entropy描述了两个概率分布之间的损失。它是许多可能的损失函数之一。

Then we can use, for example, gradient descent algorithm to find the minimum.

是的,cross-entropy 损失函数可以用作梯度下降的一部分。

进一步阅读:我的一篇 与 TensorFlow 相关。

简而言之,交叉熵 (CE) 是衡量您的预测值与真实标签相差多少的指标。

这里的叉是指计算两个或多个特征/真实标签(如0、1)之间的熵。

熵这个词本身指的是随机性,它的值太大意味着你的预测与真实标签相差甚远。

因此更改权重以减少 CE,从而最终导致预测和真实标签之间的差异减少,从而提高准确性。

添加到上述帖子中,最简单的交叉熵损失形式称为 binary-cross-entropy(用作二进制 classification 的损失函数,例如,逻辑回归),而广义版本是分类交叉熵(用作多class class化问题的损失函数,例如, 使用神经网络)。

思路不变:

  1. 当模型计算的 (softmax) class-概率对于训练实例的目标标签变得接近 1(例如,用单热编码表示),相应的 CCE 损失减少到零

  2. 否则随着目标class对应的预测概率变小而增加

下图说明概念(从图中注意当y和p都为高或同时为低时BCE变低,即一致):

交叉熵与计算的相对熵KL散度密切相关两个概率分布之间的距离。例如,在两个离散的pmfs之间,它们之间的关系如下图所示: