信息量、熵、KL散度和交叉熵
信息量与熵
大家都说,熵是用于衡量信息量的多少。那么信息量又是什么呢?一种解释是:信息量更多,代表消除了更多的不确定性。
对于某个事件 xxx,如果它的概率 p(x)p(x)p(x) 很大(例如“明天太阳会升起”,概率几乎为 1),那么即使它发生了,由于它发生的概率很大,本身几乎没有不确定性,所以消除的不确定性也特别小,因此它的信息量就更少。反之,如果一个事件非常罕见(如“明天下陨石”),一旦发生,就会极大地改变我们的认知,带来巨大的“信息冲击”,因此它的信息量就非常大。
由此,我们认为:概率越大,信息量越少;概率越小,信息量越大。因此,事件 xxx 的信息量 I(x)I(x)I(x) 应该是其概率 p(x)p(x)p(x) 的减函数。香农指出,最符合直觉和数学性质的函数形式是对数的负值:
I(x)=−log2p(x) I(x) = -\log_2 p(x) I(x)=−log2p(x)
这里的对数底数通常取 2,单位是比特 (bit)。这个定义完美契合了我们的直觉:
- 当 p(x)=1p(x) = 1p(x)=1,I(x)=−log21=0I(x) = -\log_2 1 = 0I(x)=−log21=0,确定事件不带来新信息。
- 当 p(x)→0p(x) \to 0p(x)→0,I(x)→∞I(x) \to \inftyI(x)→∞,极小概率事件蕴含巨大信息量。
那么,对于一个随机变量 XXX(代表一个信源,有多个可能的取值 x∈Xx \in \mathcal{X}x∈X),我们如何衡量它平均包含多少信息量呢?我们可以对每个可能事件的信息量 I(x)I(x)I(x) 按其发生概率 p(x)p(x)p(x) 进行加权平均,这就是香农熵 (Shannon Entropy):
H(X)=Ex∼p(x)[I(x)]=−∑x∈Xp(x)log2p(x) H(X) = \mathbb{E}_{x \sim p(x)}[I(x)] = -\sum_{x \in \mathcal{X}} p(x) \log_2 p(x) H(X)=Ex∼p(x)[I(x)]=−x∈X∑p(x)log2p(x)
这个表达式 H(X)H(X)H(X) 衡量了信源 XXX 的平均不确定性或平均信息量。熵越大,说明信源越“混乱”,越难预测,平均每次观测带来的信息越多。
有趣的是,这个表达式恰好是最佳编码长度的理论下限。在数据压缩中(如哈夫曼编码),我们为高频事件分配短码,为低频事件分配长码。最优编码的平均码长趋近于香农熵 H(X)H(X)H(X)。这可以理解为:我们为每个事件 xxx 分配的比特数应尽可能接近其信息量 I(x)=−logp(x)I(x) = -\log p(x)I(x)=−logp(x),这样编码最紧凑,没有浪费信息量。
KL 散度:衡量分布之间的“信息距离”
在机器学习中,我们通常假设数据背后存在一个真实的概率分布 P(X)P(X)P(X)(“金科玉律”)。我们的目标是训练一个模型 Q(X)Q(X)Q(X),使其预测的概率分布尽可能接近 P(X)P(X)P(X)。那么,如何量化 QQQ 到底有多“接近” PPP 呢?
KL 散度(Kullback-Leibler Divergence)正是这样一个衡量两个概率分布差异的标量指标。
我们从编码的代价角度来理解 KL 散度。
-
假设真实分布是 P(X)P(X)P(X)。如果我们知道 PPP,我们可以设计一个最优编码方案,其平均编码长度就是 PPP 的熵:
H(P)=−∑xp(x)log2p(x) H(P) = -\sum_x p(x) \log_2 p(x) H(P)=−x∑p(x)log2p(x) -
但现在,我们错误地认为数据的真实分布是 Q(X)Q(X)Q(X),并基于 QQQ 来设计编码。那么,为事件 xxx 分配的最优码长应为 −log2q(x)-\log_2 q(x)−log2q(x)。
-
当我们用基于 QQQ 的编码来传输服从 PPP 分布的数据时,实际的平均编码长度为:
H(P,Q)=−∑xp(x)log2q(x) H(P, Q) = -\sum_x p(x) \log_2 q(x) H(P,Q)=−x∑p(x)log2q(x)
这被称为交叉熵 (Cross-Entropy),记作 H(P,Q)H(P, Q)H(P,Q)。 -
显然,由于我们用错了分布 QQQ,这个平均长度 H(P,Q)H(P, Q)H(P,Q) 通常会比使用正确分布 PPP 的最优长度 H(P)H(P)H(P) 更长。
证明如下:
根据lnx≤x−1\ln x \le x - 1lnx≤x−1有:
∑p(x)log2q(x)p(x)≤1ln2∑p(x)(q(x)p(x)−1)=1ln2(∑p(x)−∑q(x))=0\sum p(x) \log_2 \frac{q(x)}{p(x)} \le \frac{1}{\ln 2}\sum p(x) (\frac{q(x)}{p(x)}-1)= \frac{1}{\ln 2} (\sum p(x) - \sum q(x))=0 ∑p(x)log2p(x)q(x)≤ln21∑p(x)(p(x)q(x)−1)=ln21(∑p(x)−∑q(x))=0
也就是:
∑p(x)log2q(x)≤∑p(x)log2p(x)−∑p(x)log2q(x)≥−∑p(x)log2p(x) \sum p(x) \log_2 q(x) \le \sum p(x) \log_2 p(x) \\ -\sum p(x) \log_2 q(x) \ge - \sum p(x) \log_2 p(x) ∑p(x)log2q(x)≤∑p(x)log2p(x)−∑p(x)log2q(x)≥−∑p(x)log2p(x)
当且仅当p(x)==q(x)p(x)==q(x)p(x)==q(x)时取等 -
这个额外付出的平均编码代价,就是 KL 散度:
DKL(P∥Q)=H(P,Q)−H(P)=(−∑xp(x)log2q(x))−(−∑xp(x)log2p(x)) D_{\text{KL}}(P \parallel Q) = H(P, Q) - H(P) = \left( -\sum_x p(x) \log_2 q(x) \right) - \left( -\sum_x p(x) \log_2 p(x) \right) DKL(P∥Q)=H(P,Q)−H(P)=(−x∑p(x)log2q(x))−(−x∑p(x)log2p(x))
DKL(P∥Q)=∑xp(x)log2p(x)q(x) \boxed{D_{\text{KL}}(P \parallel Q) = \sum_x p(x) \log_2 \frac{p(x)}{q(x)}} DKL(P∥Q)=x∑p(x)log2q(x)p(x)
KL 散度的性质
- 非负性:DKL(P∥Q)≥0D_{\text{KL}}(P \parallel Q) \geq 0DKL(P∥Q)≥0,当且仅当 P=QP = QP=Q 时取等号。
- 非对称性:DKL(P∥Q)≠DKL(Q∥P)D_{\text{KL}}(P \parallel Q) \neq D_{\text{KL}}(Q \parallel P)DKL(P∥Q)=DKL(Q∥P)。这表示 KL 散度不是传统意义上的“距离”(不满足对称性)。
- 信息解释:KL 散度衡量了由于使用 QQQ 来近似 PPP 而损失的信息量或增加的编码冗余。
KL散度的简易理解:在所有可能的编码方案中,基于真实分布 PPP 的编码是最优的(平均长度最短,H(P)H(P)H(P) 最小),任何其他基于 Q≠PQ \neq PQ=P 的编码都会导致更长的平均长度,其差值就是 KL 散度。
在机器学习中的应用
在分类任务中,我们通常最小化交叉熵损失:
L=−∑xp(x)logq(x)
\mathcal{L} = -\sum_x p(x) \log q(x)
L=−x∑p(x)logq(x)
这等价于最小化 DKL(P∥Q)+H(P)D_{\text{KL}}(P \parallel Q) + H(P)DKL(P∥Q)+H(P)。由于 H(P)H(P)H(P) 是固定的(数据本身的熵,无法改变),最小化交叉熵就等价于最小化 DKL(P∥Q)D_{\text{KL}}(P \parallel Q)DKL(P∥Q),即让模型分布 QQQ 尽可能接近真实分布 PPP。
总结:
- 信息量 I(x)I(x)I(x):衡量单个事件带来的“惊喜度”,I(x)=−logp(x)I(x) = -\log p(x)I(x)=−logp(x)。
- 熵 H(X)H(X)H(X):衡量一个分布的平均不确定性,H(X)=E[I(x)]H(X) = \mathbb{E}[I(x)]H(X)=E[I(x)]。
- 交叉熵 H(P,Q)H(P,Q)H(P,Q):用错误分布 QQQ 编码服从真实分布 PPP 的数据所带来的平均代价。
- KL 散度 DKL(P∥Q)D_{\text{KL}}(P \parallel Q)DKL(P∥Q):衡量用 QQQ 近似 PPP 时的额外信息代价,DKL=H(P,Q)−H(P)D_{\text{KL}} = H(P,Q) - H(P)DKL=H(P,Q)−H(P)。