我知道有很多关于什么是交叉熵的解释,但我仍然感到困惑。
它只是描述损失函数的一种方法吗?我们可以使用梯度下降算法使用损失函数找到最小值吗?
我知道有很多关于什么是交叉熵的解释,但我仍然感到困惑。
它只是描述损失函数的一种方法吗?我们可以使用梯度下降算法使用损失函数找到最小值吗?
交叉熵通常用于量化两个概率分布之间的差异。在机器学习的背景下,它是分类多类分类问题的误差度量。通常,“真实”分布(您的机器学习算法试图匹配的分布)以单热分布表示。
例如,假设对于特定的训练实例,真正的标签是 B(在可能的标签 A、B 和 C 中)。因此,此训练实例的 one-hot 分布为:
Pr(Class A) Pr(Class B) Pr(Class C)
0.0 1.0 0.0
您可以将上述真实分布解释为表示训练实例有 0% 的概率为 A 类,100% 的概率为 B 类,0% 的概率为 C 类。
现在,假设您的机器学习算法预测以下概率分布:
Pr(Class A) Pr(Class B) Pr(Class C)
0.228 0.619 0.153
预测分布与真实分布有多接近?这就是交叉熵损失所决定的。使用这个公式:
其中p(x)
是真实概率分布(one-hot),q(x)
是预测概率分布。总和超过了 A、B 和 C 三个类别。在这种情况下,损失为0.479:
H = - (0.0*ln(0.228) + 1.0*ln(0.619) + 0.0*ln(0.153)) = 0.479
请注意,只要您始终使用相同的对数基数,使用什么对数基数都没有关系。碰巧的是,Python Numpylog()
函数计算自然对数(以 e 为底的对数)。
这是上面使用 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。因为我们使用的是自然对数(以 e 为底的对数),单位是nats,所以我们说损失是 0.4797 nats。如果日志改为以 2 为基数,则单位为位。请参阅此页面以获取更多说明。
为了更直观地了解这些损失值所反映的内容,让我们看一些极端的例子。
同样,让我们假设真正的(单热)分布是:
Pr(Class A) Pr(Class B) Pr(Class C)
0.0 1.0 0.0
现在假设您的机器学习算法做得非常好,并且以非常高的概率预测了 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 算法做得很糟糕,而是以高概率预测了 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 算法无法下定决心并以几乎相等的概率预测这三个类别。
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)
关于参数的导数。
所以直接回答你原来的问题:
它只是描述损失函数的一种方法吗?
正确的交叉熵描述了两个概率分布之间的损失。它是许多可能的损失函数之一。
然后我们可以使用例如梯度下降算法来找到最小值。
是的,交叉熵损失函数可以用作梯度下降的一部分。
进一步阅读:我与 TensorFlow 相关的其他答案之一。
添加到上述帖子中,交叉熵损失的最简单形式称为二元交叉熵(用作二元分类的损失函数,例如逻辑回归),而广义版本是分类交叉熵(使用作为多类分类问题的损失函数,例如神经网络)。
这个想法保持不变:
当训练实例的目标标签的模型计算(softmax)类概率接近 1 时(例如,用 one-hot-encoding 表示),相应的 CCE 损失减少到零
否则它会随着与目标类对应的预测概率变小而增加。
下图演示了这个概念(从图中注意到,当 y 和 p 都为高或同时为低时,BCE 变低,即有一致性):
交叉熵与计算两个概率分布之间距离的相对熵或KL 散度密切相关。例如,在两个离散的pmf之间,它们之间的关系如下图所示: