什么是信息熵?KL散度以及交叉熵推导

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)=−log⁡P(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)=−log⁡P(AB)=−log⁡P(A)−log⁡P(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)log⁡P(x) H(P) = \mathbb{E}_{x \sim P} [I(x)] = - \sum_{x} P(x) \log P(x) H(P)=ExP[I(x)]=xP(x)logP(x)

这里用底数为2进行运算

举例扔骰子,每个面出现的概率都是 1/61/61/6。所以:

H(P)=−∑i=16P(i)log⁡P(i)=−16∑i=16log⁡16=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=16P(i)logP(i)=61i=16log61=2.58

但是如果因为骰子质地不均匀,导致有点数为“2”的概率是 1/21/21/2,其它5个面均等概率,那就是其它每个面 1/101/101/10

H(P)=−∑i=16P(i)log⁡P(i)=−12log⁡12−5∗110log⁡110≈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=16P(i)logP(i)=21log215101log1012.16

  • 很明显,第一种情况的熵更大,说明第一种情况的信息更不确定,我们预测这个系统的结果会更困难。计算出的值比较大,也可以理解成为了预测这个系统的结果需要的平均成本更高。

  • 而第二种情况的熵更小,我们预测这种情况更简单,我们会猜测它扔出来的结果大概率是“2”,计算出的熵值也比较小,也可以理解成为了预测这个系统的结果需要的平均成本更低。

这里的熵其实也可以用计算机编码成本角度来理解,来说明熵其实代表着系统的平均编码成本,从而将理解成“成本”。我这里还是只想给一个直观的解释,并不想深入到了编码的角度来探讨成本。

可以说,信息量越大,不确定越高,即这个事件或者说这个系统对我们而言,预测它的结果需要的平均成本越高。

3. KL 散度 (Kullback-Leibler Divergence):衡量两个分布的“差异”

既然我们已经有了“熵”来衡量一个系统的不确定性,那么接下来的问题是:如果我们有两个概率分布 PPPQQQ,我们如何衡量它们之间的差异?

在机器学习中,这非常常见:

  • 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)=−12log⁡12−5∗110log⁡110≈2.16 H(P) = -\frac{1}{2} \log \frac{1}{2} - 5 * \frac{1}{10} \log \frac{1}{10} \approx 2.16 H(P)=21log215101log1012.16

这个系统最低的不确定性是 2.162.162.16,即我们预测这个系统的结果需要的平均成本最低。


假设我们由于预测这个骰子是平均的,即扔出所有点的概率都是 1/61/61/6。但是实际上,这个骰子的掷出结果是不均匀的,某个面的概率高,那么不确定性应该这么计算:

真实概率 P(2)=12P(2)=\frac{1}{2}P(2)=21P(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)log⁡Q(i) H(P,Q) = -\sum_{i=1}^6 P(i) \log Q(i) H(P,Q)=i=16P(i)logQ(i)

注意你的预测概率 Q(i)Q(i)Q(i) 放在 log 里,你的预测分布就是对整个系统的不确性的评估,所以将预测概率放在 log中来计算不确定性。
而外面乘以 P(i)P(i)P(i) 是我们基于真实概率来计算,我的评估出的情况在真实情况在的不确定性是多少。

H(P,Q)=−∑i=16P(i)log⁡Q(i)=−12log⁡16−5∗110log⁡16≈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=16P(i)logQ(i)=21log615101log612.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)log⁡Q(i)=−12log⁡215−110log⁡13−4∗110log⁡215≈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=16P(i)logQ(i)=21log152101log314101log1522.77

计算出的熵就越高,说明预测的不确定性越高。说明你预测的越不准,预测的成本越高。

3.2 数学定义

  • 正常一个系统的系统的熵是 H(P)=−∑xP(x)log⁡P(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)log⁡Q(x)−(−∑xP(x)log⁡P(x)) D_{KL}(P || Q) = -\sum_{x} P(x) \log Q(x) - (-\sum_{x} P(x) \log P(x)) DKL(P∣∣Q)=xP(x)logQ(x)(xP(x)logP(x))
DKL(P∣∣Q)=∑xP(x)log⁡P(x)Q(x) D_{KL}(P || Q) = \sum_{x} P(x) \log \frac{P(x)}{Q(x)} DKL(P∣∣Q)=xP(x)logQ(x)P(x)

注意

  1. 非负性DKL(P∣∣Q)≥0D_{KL}(P || Q) \geq 0DKL(P∣∣Q)0。当且仅当 P=QP=QP=Q 时为 0。
  2. 不对称性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)log⁡P(x)Q(x) D_{KL}(P || Q) = \sum_{x} P(x) \log \frac{P(x)}{Q(x)} DKL(P∣∣Q)=xP(x)logQ(x)P(x)
=∑xP(x)log⁡P(x)−∑xP(x)log⁡Q(x) = \sum_{x} P(x) \log P(x) - \sum_{x} P(x) \log Q(x) =xP(x)logP(x)xP(x)logQ(x)
=−(−∑xP(x)log⁡P(x))⏟−H(P)+(−∑xP(x)log⁡Q(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)(xP(x)logP(x))+H(P,Q)(xP(x)logQ(x))

这里,后半部分就是交叉熵

H(P,Q)=−∑xP(x)log⁡Q(x) H(P, Q) = -\sum_{x} P(x) \log Q(x) H(P,Q)=xP(x)logQ(x)

4.2 推导细节:为什么我们在机器学习中要最小化交叉熵?

我们训练模型的目标是:让预测分布 QQQ 尽可能接近真实分布 PPP

换句话说,我们要最小化 PPPQQQ 之间的差异,也就是最小化 KL 散度

min⁡DKL(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=−∑iyilog⁡y^i Loss = -\sum_{i} y_i \log \hat{y}_i Loss=iyilogy^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)=1y
分布 QQQ 为:Q(1)=y^,Q(0)=1−y^Q(1)=\hat{y}, Q(0)=1-\hat{y}Q(1)=y^,Q(0)=1y^

代入交叉熵公式:
H(P,Q)=−∑x∈{0,1}P(x)log⁡Q(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)log⁡Q(1)+P(0)log⁡Q(0)] = - [ P(1)\log Q(1) + P(0)\log Q(0) ] =[P(1)logQ(1)+P(0)logQ(0)]
=−[ylog⁡y^+(1−y)log⁡(1−y^)] = - [ y \log \hat{y} + (1-y) \log (1-\hat{y}) ] =[ylogy^+(1y)log(1y^)]

这就是我们在 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散度) = 你现在的得分倒扣(交叉熵) - 卷子本身的难度(熵)。
因为卷子难度(熵)变不了,所以你想分高,就得死磕让倒扣分(交叉熵)变少。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布鲁格若门

对你有用的话真是太好了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值