1. 什么是“信息量”?
要理解熵,首先要理解什么是“信息”。在香农(Claude Shannon)看来, 信息的本质是消除不确定性 。
举两个例子:
- 事件 A :明天太阳会从东边升起。
- 这句话的概率可以几乎说是100%。你早就知道了,所以这句话对你来说没有提供任何新信息 。
- 事件 B :明天巴西队会在世界杯决赛输给中国队。
- 这件事发生的概率极低(几乎为 0),一旦发生,它给人的震惊程度极高,因此它包含的信息量 巨大。
由此得到结论:一个事件发生的概率越高,它包含的信息量越低,同时概率越低,它的信息量也就越高。
数学定义推导
- 假设我有两件互不相关的事件 A 和 B。
- 概率论告诉我们:P(AB)=P(A)×P(B)P(AB) = P(A) \times P(B)P(AB)=P(A)×P(B)。(AB 表示事件 A 和 B 同时发生)
- 但在信息层面,告诉我 A 发生了,又告诉我 B 发生了,我获得的总信息应该是两者的叠加:
I(AB)=I(A)+I(B)I(AB) = I(A) + I(B)I(AB)=I(A)+I(B)
并且信息应该和概率成“反比”,为了满足这些关系,香农定义了事件 xxx 的信息量 I(x)I(x)I(x):
I(x)=−logP(x) I(x) = -\log P(x) I(x)=−logP(x)
- 当 P(x)=1P(x)=1P(x)=1(百分百发生),I(x)=0I(x)=0I(x)=0(信息量为0)。
- 当 P(x)→0P(x) \to 0P(x)→0(几乎不可能),I(x)→∞I(x) \to \inftyI(x)→∞(信息量巨大)。
- 满足信息可加性
I(AB)=I(A)+I(B)=−logP(AB)=−logP(A)−logP(B) I(AB) = I(A) + I(B) = -\log P(AB) = -\log P(A) - \log P(B) I(AB)=I(A)+I(B)=−logP(AB)=−logP(A)−logP(B)
2. 熵(Entropy):预期的“平均代价”
现在我们知道了一个具体事件的信息量。那么,对于一个系统(比如一个扔硬币的系统,或者一个语言模型预测下一个词的系统),它的整体不确定性有多大?
这就是熵(Entropy)。它是所有可能事件信息量的期望值(平均值)。
H(P)=Ex∼P[I(x)]=−∑xP(x)logP(x) H(P) = \mathbb{E}_{x \sim P} [I(x)] = - \sum_{x} P(x) \log P(x) H(P)=Ex∼P[I(x)]=−x∑P(x)logP(x)
这里用底数为2进行运算
举例扔骰子,每个面出现的概率都是 1/61/61/6。所以:
H(P)=−∑i=16P(i)logP(i)=−16∑i=16log16=2.58 H(P) = -\sum_{i=1}^6 P(i) \log P(i) = -\frac{1}{6} \sum_{i=1}^6 \log \frac{1}{6} = 2.58 H(P)=−i=1∑6P(i)logP(i)=−61i=1∑6log61=2.58
但是如果因为骰子质地不均匀,导致有点数为“2”的概率是 1/21/21/2,其它5个面均等概率,那就是其它每个面 1/101/101/10:
H(P)=−∑i=16P(i)logP(i)=−12log12−5∗110log110≈2.16 H(P) = -\sum_{i=1}^6 P(i) \log P(i) = -\frac{1}{2} \log \frac{1}{2} - 5 * \frac{1}{10} \log \frac{1}{10} \approx 2.16 H(P)=−i=1∑6P(i)logP(i)=−21log21−5∗101log101≈2.16
-
很明显,第一种情况的熵更大,说明第一种情况的信息更不确定,我们预测这个系统的结果会更困难。计算出的值比较大,也可以理解成为了预测这个系统的结果需要的平均成本更高。
-
而第二种情况的熵更小,我们预测这种情况更简单,我们会猜测它扔出来的结果大概率是“2”,计算出的熵值也比较小,也可以理解成为了预测这个系统的结果需要的平均成本更低。
这里的熵其实也可以用计算机编码成本角度来理解,来说明熵其实代表着系统的平均编码成本,从而将理解成“成本”。我这里还是只想给一个直观的解释,并不想深入到了编码的角度来探讨成本。
可以说,信息量越大,不确定越高,即这个事件或者说这个系统对我们而言,预测它的结果需要的平均成本越高。
3. KL 散度 (Kullback-Leibler Divergence):衡量两个分布的“差异”
既然我们已经有了“熵”来衡量一个系统的不确定性,那么接下来的问题是:如果我们有两个概率分布 PPP 和 QQQ,我们如何衡量它们之间的差异?
在机器学习中,这非常常见:
- P(x)P(x)P(x):真实分布(比如数据的真实标签分布,往往是 One-hot 编码)。
- Q(x)Q(x)Q(x):预测分布(模型预测出来的概率分布)。
- 我们的目标通常是让 QQQ 尽可能接近 PPP。
举例说明
还是扔骰子这个例子,质地不均匀的情况,假设 P(扔出2点)=12P(扔出2点) = \frac{1}{2}P(扔出2点)=21 (掷出“2”的概率是 1/21/21/2),而其它带你的面的概率都是 1/101/101/10。那么它的信息熵就是:
H(P)=−12log12−5∗110log110≈2.16 H(P) = -\frac{1}{2} \log \frac{1}{2} - 5 * \frac{1}{10} \log \frac{1}{10} \approx 2.16 H(P)=−21log21−5∗101log101≈2.16
这个系统最低的不确定性是 2.162.162.16,即我们预测这个系统的结果需要的平均成本最低。
假设我们由于预测这个骰子是平均的,即扔出所有点的概率都是 1/61/61/6。但是实际上,这个骰子的掷出结果是不均匀的,某个面的概率高,那么不确定性应该这么计算:
真实概率 P(2)=12P(2)=\frac{1}{2}P(2)=21,P(1)=P(3)=P(4)=P(5)=P(6)=110P(1)=P(3)=P(4)=P(5)=P(6)=\frac{1}{10}P(1)=P(3)=P(4)=P(5)=P(6)=101。
你的预测概率: Q(1)=Q(2)=Q(3)=Q(4)=Q(5)=Q(6)=16Q(1)=Q(2)=Q(3)=Q(4)=Q(5)=Q(6)=\frac{1}{6}Q(1)=Q(2)=Q(3)=Q(4)=Q(5)=Q(6)=61。
那么这时根据你的预测计算出的“信息熵”就是:
H(P,Q)=−∑i=16P(i)logQ(i) H(P,Q) = -\sum_{i=1}^6 P(i) \log Q(i) H(P,Q)=−i=1∑6P(i)logQ(i)
注意你的预测概率 Q(i)Q(i)Q(i) 放在 log 里,你的预测分布就是对整个系统的不确性的评估,所以将预测概率放在 log中来计算不确定性。
而外面乘以 P(i)P(i)P(i) 是我们基于真实概率来计算,我的评估出的情况在真实情况在的不确定性是多少。
H(P,Q)=−∑i=16P(i)logQ(i)=−12log16−5∗110log16≈2.58 H(P,Q) = -\sum_{i=1}^6 P(i) \log Q(i) = -\frac{1}{2} \log \frac{1}{6} - 5 * \frac{1}{10} \log \frac{1}{6} \approx 2.58 H(P,Q)=−i=1∑6P(i)logQ(i)=−21log61−5∗101log61≈2.58
可以看到熵变高了,因为我的预测和真实情况不同,我的预测结果的不确定性更高。对整个系统预测成本更高。
假设我们认为预测3点出现的概率高认为是 Q(3)=13Q(3) = \frac{1}{3}Q(3)=31,其它点的概率概率均等,就是 2/152/152/15。此时预测概率就是:
Q(3)=13,Q(1)=Q(2)=Q(4)=Q(5)=Q(6)=215 Q(3)=\frac{1}{3}, Q(1)=Q(2)=Q(4)=Q(5)=Q(6)=\frac{2}{15} Q(3)=31,Q(1)=Q(2)=Q(4)=Q(5)=Q(6)=152
那么这时根据你的预测计算出的“信息熵”就是:
H(P,Q)=−∑i=16P(i)logQ(i)=−12log215−110log13−4∗110log215≈2.77 H(P,Q) = -\sum_{i=1}^6 P(i) \log Q(i) = -\frac{1}{2} \log \frac{2}{15} - \frac{1}{10} \log \frac{1}{3} - 4 * \frac{1}{10} \log \frac{2}{15} \approx 2.77 H(P,Q)=−i=1∑6P(i)logQ(i)=−21log152−101log31−4∗101log152≈2.77
计算出的熵就越高,说明预测的不确定性越高。说明你预测的越不准,预测的成本越高。
3.2 数学定义
- 正常一个系统的系统的熵是 H(P)=−∑xP(x)logP(x)H(P) = -\sum_{x} P(x) \log P(x)H(P)=−∑xP(x)logP(x)。
- 但是我们给出自己的预测分布 QQQ,我们可以计算出这个预测分布的熵 H(P,Q)H(P,Q)H(P,Q)。
- 高出的熵 H(P,Q)−H(P)H(P,Q) - H(P)H(P,Q)−H(P) 就是 KL 散度,也可以理解为预测分布 QQQ 与真实分布 PPP 之间的差异。
DKL(P∣∣Q)=−∑xP(x)logQ(x)−(−∑xP(x)logP(x)) D_{KL}(P || Q) = -\sum_{x} P(x) \log Q(x) - (-\sum_{x} P(x) \log P(x)) DKL(P∣∣Q)=−x∑P(x)logQ(x)−(−x∑P(x)logP(x))
DKL(P∣∣Q)=∑xP(x)logP(x)Q(x) D_{KL}(P || Q) = \sum_{x} P(x) \log \frac{P(x)}{Q(x)} DKL(P∣∣Q)=x∑P(x)logQ(x)P(x)
注意:
- 非负性:DKL(P∣∣Q)≥0D_{KL}(P || Q) \geq 0DKL(P∣∣Q)≥0。当且仅当 P=QP=QP=Q 时为 0。
- 不对称性:DKL(P∣∣Q)≠DKL(Q∣∣P)D_{KL}(P || Q) \neq D_{KL}(Q || P)DKL(P∣∣Q)=DKL(Q∣∣P)。这就是为什么它叫“散度”而不是“距离”。
4. 交叉熵 (Cross Entropy):机器学习的核心
终于到了我们最熟悉的主角:交叉熵。
4.1 什么是交叉熵?
在 KL 散度的公式中,我们已经见到了它的身影。
回顾 KL 散度公式:
DKL(P∣∣Q)=∑xP(x)logP(x)Q(x) D_{KL}(P || Q) = \sum_{x} P(x) \log \frac{P(x)}{Q(x)} DKL(P∣∣Q)=x∑P(x)logQ(x)P(x)
=∑xP(x)logP(x)−∑xP(x)logQ(x) = \sum_{x} P(x) \log P(x) - \sum_{x} P(x) \log Q(x) =x∑P(x)logP(x)−x∑P(x)logQ(x)
=−(−∑xP(x)logP(x))⏟−H(P)+(−∑xP(x)logQ(x))⏟H(P,Q) = \underbrace{- (-\sum_{x} P(x) \log P(x))}_{-H(P)} + \underbrace{(-\sum_{x} P(x) \log Q(x))}_{H(P, Q)} =−H(P)−(−x∑P(x)logP(x))+H(P,Q)(−x∑P(x)logQ(x))
这里,后半部分就是交叉熵:
H(P,Q)=−∑xP(x)logQ(x) H(P, Q) = -\sum_{x} P(x) \log Q(x) H(P,Q)=−x∑P(x)logQ(x)
4.2 推导细节:为什么我们在机器学习中要最小化交叉熵?
我们训练模型的目标是:让预测分布 QQQ 尽可能接近真实分布 PPP。
换句话说,我们要最小化 PPP 和 QQQ 之间的差异,也就是最小化 KL 散度。
minDKL(P∣∣Q)=min(H(P,Q)−H(P)) \min D_{KL}(P || Q) = \min (H(P, Q) - H(P)) minDKL(P∣∣Q)=min(H(P,Q)−H(P))
观察这个公式:
- H(P)H(P)H(P):这是真实分布的熵。在训练数据集中,标签是固定的(比如这张图就是猫,那张图就是狗),所以 PPP 是固定的。因此,H(P)H(P)H(P) 是一个常数。
- H(P,Q)H(P, Q)H(P,Q):这是交叉熵。它取决于我们的模型预测 QQQ。
结论:
最小化 KL 散度,等价于 最小化交叉熵。
∇θDKL(P∣∣Q)=∇θ(H(P,Q)−constant)=∇θH(P,Q) \nabla_{\theta} D_{KL}(P || Q) = \nabla_{\theta} (H(P, Q) - \text{constant}) = \nabla_{\theta} H(P, Q) ∇θDKL(P∣∣Q)=∇θ(H(P,Q)−constant)=∇θH(P,Q)
这就是为什么我们在深度学习中(比如分类任务)直接使用交叉熵作为损失函数(Loss Function),因为它计算起来更简单(少算一项 H(P)H(P)H(P)),但效果和最小化 KL 散度是一模一样的。
4.3 常见形式
多分类任务 (Multi-class Classification)
假设是一个猫、狗、鸟的三分类问题。
- 真实标签 yyy 是 One-hot 编码:[1,0,0][1, 0, 0][1,0,0] (是猫)。即 P(cat)=1,P(dog)=0,P(bird)=0P(\text{cat})=1, P(\text{dog})=0, P(\text{bird})=0P(cat)=1,P(dog)=0,P(bird)=0。
- 预测概率 y^\hat{y}y^ 是 Softmax 输出:[0.7,0.2,0.1][0.7, 0.2, 0.1][0.7,0.2,0.1]。即 Q(cat)=0.7,...Q(\text{cat})=0.7, ...Q(cat)=0.7,...
交叉熵计算:
Loss=−∑iyilogy^i Loss = -\sum_{i} y_i \log \hat{y}_i Loss=−i∑yilogy^i
由于 yyy 中只有一项是 1,其它是 0,公式简化为:
Loss=−log(0.7)≈0.36 Loss = - \log(0.7) \approx 0.36 Loss=−log(0.7)≈0.36
二分类任务 (Binary Classification)
二分类其实是多分类的特例,只有两个类别(正类 1,负类 0)。
- 真实标签 y∈{0,1}y \in \{0, 1\}y∈{0,1}。
- 预测概率 y^∈[0,1]\hat{y} \in [0, 1]y^∈[0,1] (通常是 Sigmoid 输出)。
此时分布 PPP 为:P(1)=y,P(0)=1−yP(1)=y, P(0)=1-yP(1)=y,P(0)=1−y。
分布 QQQ 为:Q(1)=y^,Q(0)=1−y^Q(1)=\hat{y}, Q(0)=1-\hat{y}Q(1)=y^,Q(0)=1−y^。
代入交叉熵公式:
H(P,Q)=−∑x∈{0,1}P(x)logQ(x) H(P, Q) = - \sum_{x \in \{0, 1\}} P(x) \log Q(x) H(P,Q)=−x∈{0,1}∑P(x)logQ(x)
=−[P(1)logQ(1)+P(0)logQ(0)] = - [ P(1)\log Q(1) + P(0)\log Q(0) ] =−[P(1)logQ(1)+P(0)logQ(0)]
=−[ylogy^+(1−y)log(1−y^)] = - [ y \log \hat{y} + (1-y) \log (1-\hat{y}) ] =−[ylogy^+(1−y)log(1−y^)]
这就是我们在 PyTorch 或 TensorFlow 中常见的 Binary Cross Entropy (BCE) Loss。
5. 总结
我们可以用一个公式串联起它们的关系:
H(P,Q)⏟交叉熵=H(P)⏟真实熵+DKL(P∣∣Q)⏟KL散度 (差异) \underbrace{H(P, Q)}_{\text{交叉熵}} = \underbrace{H(P)}_{\text{真实熵}} + \underbrace{D_{KL}(P || Q)}_{\text{KL散度 (差异)}} 交叉熵H(P,Q)=真实熵H(P)+KL散度 (差异)DKL(P∣∣Q)
- 熵 H(P)H(P)H(P):事物本质的不确定性(无法改变的物理极限)。
- KL 散度 DKLD_{KL}DKL:我们认知的偏差(模型还需要学习多少)。
- 交叉熵 H(P,Q)H(P, Q)H(P,Q):我们要付出的总代价(实际用于优化的目标)。
一句话人话总结:
考试标准答案是 PPP,你的答案是 QQQ。
你的错误程度(KL散度) = 你现在的得分倒扣(交叉熵) - 卷子本身的难度(熵)。
因为卷子难度(熵)变不了,所以你想分高,就得死磕让倒扣分(交叉熵)变少。
3212

被折叠的 条评论
为什么被折叠?



