从信息熵到交叉熵
一页纸理清香农熵、交叉熵与 KL 散度——它们如何度量「不确定」与「错配」。
香农在 1948 年《通信的数学理论》里提出的信息熵,是信息论的地基。今天每个人都在用 log_loss 训练分类器,但很少有人意识到:损失函数背后的「交叉熵」,不过是从「度量不确定」到「度量错配」的一小步。这篇文章用一页纸把它们串起来。
不确定:香农熵
先问一个朴素的问题:一个随机事件有多「意外」?概率 越小,它发生时带来的信息量越大。我们定义某个结果 的自信息为 ,借鉴物理学的熵,把它的期望称为香农熵:
熵衡量的是不确定性:一个分布越平坦,结果越难预测,熵就越高。扔一枚均匀硬币, bit;而一枚几乎总是掷出正面的硬币,。
取 时熵的单位是 bit,取 时是 nat——这个基的取舍不影响数学结构,只影响刻度。后面我们统一用自然对数。
错配:交叉熵
现在换一个视角。假设真实分布是 ,我们却用 来预测。用 的编码去描述 的样本,平均需要多少比特?这就是交叉熵:
注意两个分布的角色不对称:加权的是 (真实概率),取对数的是 (预测概率)。当且仅当 时,它在所有 中取到最小值。
代价:KL 散度
交叉熵和我们熟悉的香农熵差多少?把上式的 拆成两层:
它度量的是 用 近似 所付出的额外代价。三者的关系一目了然:
跟随直觉核对: 时 ;对概率论稍熟的人也能验证,KL 恒非负。但正因为不对称,——它不是距离,而是散度,这也是它名字的由来。
为什么分类损失用交叉熵
训练分类器时,我们有样本与其标签,却不知道真实分布 本身。1 我们只能让模型输出 ,目标是让 尽量接近近似 的 经验分布(label 的 one-hot)。
若用「误差平方」做主,参数更新慢、且损失平面存在大量鞍点;而交叉熵对 的梯度写得干净。看关系式:,其中 是常数,最小化交叉熵 ≡ 最小化 KL 散度。
代码上它往往配合 softmax 一起用。NumPy 版本的交叉熵损失如下:
import numpy as np
def cross_entropy(p, q, eps=1e-12):
# p: one-hot 标签; q: softmax 输出, 剪裁避免 log(0)
q = np.clip(q, eps, 1.0)
return -np.sum(p * np.log(q))
更直观的对照
| 度量 | 公式 | 直觉 |
|---|---|---|
| 熵 | 一个分布本身有多不确定 | |
| 交叉熵 | 用 猜 的平均成本 | |
| KL 散度 | 猜错的额外代价(非对称) |
三种度量直观对照)

小记
顺一遍主线:熵度量「不确定」,交叉熵度量「错配」,KL 散度度量的正是这两者之差。二者不对称,是理解散度的钥匙。而在机器学习里,我们用一个恒定的 ,把难算的 悄悄换成了好算的 。更完整的推导可参考 维基百科:Cross entropy。
由此,交叉熵从一个纯数学对象,变成了所有分类任务的默认准绳。偏离真实越远,交叉熵惩罚越重——这就是逻辑回归与深度网络共享的同一块地基。
Footnotes
-
Cover, T. M., & Thomas, J. A. (2006). Elements of Information Theory, 2nd ed., Wiley. ↩