Skip to content

信息论精简:熵、交叉熵与 KL

WARNING

🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。

分类损失、VAE/RSSM 的正则、Dreamer 的 KL balancing——背后都是同一套语言。本章只建立三个量:交叉熵KL 散度,并说明它们如何接到「最大似然」。通信问题(信道、容量、Huffman / Hamming、高斯信道、率失真)请跳到领域 信息论:从 导论 进,容量章是 香农。量子信息的前置是香农容量,不是交叉熵损失。


一、熵:平均惊喜有多大

离散分布 p 的(香农)熵:

H(p)=xp(x)logp(x).
  • 事件越不可能,logp 越大(越「惊喜」);
  • 熵是按 p 平均的惊喜;
  • 均匀分布熵最大;确定性分布熵为 0

对数底决定单位:log2bitln(demo 用的 np.log)得 nat。公平硬币两种算法差一个常数 ln2H=log22=1bit=ln20.6931nat。偏硬币更「好猜」,熵更小。

保姆级数字例(与 demo.py 同一组,单位 nat)。

硬币pH=plnp
公平(0.5,0.5)ln20.6931
偏置(0.9,0.1)0.9ln0.90.1ln0.10.3251

偏置硬币大约只有公平硬币一半的不确定度:十次里九次你已经能猜对。p(1,0)H0(约定 0ln0=0)。

卡点。 熵描述的是分布,不是某一个样本。抽到了稀有事件,你「这一次」很惊喜,但熵是惊喜的平均。另一个卡点:连续分布的微分熵 h=plnp 可以是负的,并且随坐标缩放而变——不要把「离散熵 0」照搬到连续。本章 demo 只用离散两点分布。

逐步推导:从「平均惊喜」到 H=plogp,公平硬币为何是 ln2(点击展开)

要一条「惊喜」函数 I(p),合理要求:

  1. p=1(必然)时 I=0
  2. p 越小 I 越大;
  3. 独立事件的联合惊喜可加:I(pq)=I(p)+I(q)

可加性是对数的特征方程。再配 I(1)=0,得到 I(p)=logp(差一个正的底常数)。按真实频率 p(x) 平均:

H(p)=Exp[logp(x)]=xp(x)logp(x).

公平硬币两项相同:12ln1212ln12=ln12=ln20.6931。偏置 (0.9,0.1)

ln0.90.10536,ln0.12.30259,H=0.9×0.10536+0.1×2.302590.0948+0.2303=0.3251.

两点分布 H(q)=qlnq(1q)ln(1q)q=1/2 最大,向两端单调下降——demo 条形图就是这两个点。

编码视角:用长度 log2p(x) 的码字(理想香农码),平均码长正好是 H2(p) bit。更短的码会和别的消息撞车,这是无损压缩的下界。通信侧的展开见 熵与编码

公平 vs 偏置硬币的熵

图解说明:公平 0.693nat,偏置 0.325nat。越确定,熵越小。


二、交叉熵:用错误码本编码

若真实数据来自 p,却用 q 来编码(或用 q 当模型):

H(p,q)=xp(x)logq(x).

交叉熵 = 「平均码长」。分类里标签是 one-hot 的 p,网络输出是 q交叉熵损失就是 H(p,q)

对连续或大批数据,样本平均 logqθ(yx) 正是负对数似然——所以「最小化交叉熵 ≈ 最大似然」。

保姆级数字例。 固定 p=(0.7,0.3)(demo 扫描 q 时用的真分布)。若模型也输出 q=p,则 H(p,q)=H(p)0.6109。若模型瞎猜 q=(0.5,0.5)

H(p,q)=0.7ln0.50.3ln0.5=ln20.6931

——比用对码本多付 0.08nat。若 q 更偏,比如 (0.9,0.1),交叉熵会再升到约 0.76。左图那条交叉熵曲线在 q1=0.7 处触底,触到的就是 H(p)

卡点。 q 的某个分量若到 0,而 p 那边不是 0,则 logq+:这就是「对真实类别输出概率 0」会把损失打爆。实现里对 logit 做 softmax 再夹一个 ε,就是在防这个。


三、KL:多付的那一截

DKL(pq)=xp(x)logp(x)q(x)=H(p,q)H(p).

直觉:

q 编码真实来自 p 的数据时,比用正确码本多付的平均码长

性质(务必记住):

  1. DKL(pq)0,当且仅当 p=q 时为 0
  2. 不对称DKL(pq)DKL(qp)
  3. 不是距离(不满足三角不等式),但常被当「分布有多不像」用。

熵、交叉熵与 KL

图解说明:熵描写 p 自身的不确定;交叉熵是用 q 编码 p 的代价;KL 是多出来的那截。

因为 H(p) 不依赖模型参数,minqH(p,q)minqDKL(pq) 是同一件事。训练交叉熵,就是在推 qθ 去贴 p

保姆级数字例:不对称。 仍取 p=(0.7,0.3)q=(0.9,0.1)

DKL(pq)=0.7ln0.70.9+0.3ln0.30.10.154,DKL(qp)=0.9ln0.90.7+0.1ln0.10.30.116.

两个数不同。pq 惩罚的是「p 有质量而 q 几乎没有」的地方(这里是第二类 0.3 vs 0.1);qp 惩罚的方向反过来。VAE 里 KL(qϕ(zx)p(z)) 是正向 KL:后验必须覆盖先验支持的地方,否则散度炸。

在世界模型里出现的样子

变分推断 / RSSM 常见项:

DKL(q(zo)p(z))DKL(q(zt)p(ztzt1,at1)).
  • 强迫后验别离开先验太远(正则);
  • 或强迫先验去追后验(学动力学)。

Dreamer 的 KL balancing / free bits,就是在调整这两边的梯度谁更大,避免某一侧把表示掐死。细节见 DreamerRSSM。图像生成里的 VAE 用的也是同一项:KL(qϕ(zx)p(z))

逐步推导:KL=H(p,q)H(p) 以及为何 KL0 且不对称(点击展开)

把定义展开:

xplogpq=xplogpxplogq=H(p)+H(p,q).

这就是「交叉熵减去熵」。p=q 时两项相等,KL 为 0

非负(Gibbs / Jensen)。 log 是凸函数。令 Y=q(X)/p(X)Xp

DKL(pq)=Ep[log(q/p)]logEp[q/p]=logxpqp=logxq(x)=0,

最后一步用了 q=1。等号当且仅当 q/p 几乎处处为常数,即 p=q。这叫 Gibbs 不等式。

不对称没有神秘处。 求和的权重是左边那个分布。DKL(pq)p 有质量的点上检查 q 够不够大;DKL(qp)q 有质量的点上检查 p。demo 右图对同一串 q1[0.05,0.95] 同时画两条曲线,只有 q=p 处相交于 0

二分类交叉熵。 标签 y{0,1} 是 one-hot 的 p,预测 y^=q(Y=1)

H(p,q)=ylogy^(1y)log(1y^).

这就是网络里那行 binary_cross_entropy。多类则换成 kyklogy^k。它对 y^ 的梯度在「预测很自信但错了」时最大——和「logqq0 爆炸」是同一件事。

两个对角高斯的 KL 有闭式(RSSM 常用)——实现时查公式即可,本章 demo 用离散分布把直觉算清楚。

交叉熵与 KL 随 q 变化;KL 不对称

图解说明:左:固定 p=(0.7,0.3),扫描 q1。交叉熵在 0.7 最低,KL 在同一点为 0。右:KL(pq)KL(qp) 不是同一条曲线。


四、两个常用计算

伯努利 / 二分类(标签 y{0,1},预测概率 y^):

=ylogy^(1y)log(1y^).

两个对角高斯的 KL 有闭式(RSSM 常用)——实现时查公式即可,本章 demo 用离散分布把直觉算清楚。


五、代码在做什么

demo.py

  1. 计算公平/偏置硬币的熵(0.6931 nat vs 0.3251 nat);
  2. 固定 p=(0.7,0.3),扫描不同 q,画交叉熵与 KL(pq)
  3. 展示 KL(pq)KL(qp) 不对称。

公平 vs 偏置硬币的熵

交叉熵与 KL 随 q 变化;KL 不对称


六、小结

概念一句话
H(p)p 的平均不确定度;公平硬币 ln2nat
交叉熵 H(p,q)q 编码 p 的平均代价
KL DKL(p|q)交叉熵减去熵;非负、不对称
训练联系交叉熵 ↓ ⇔ 似然 ↑
下游分类、VAE、RSSM/Dreamer、蒸馏;通信见 信息论

数学基础到此收束(微积分两章、线代三章、概率统计四章、优化、本章)。建议回到 线性回归 或按兴趣进入 机器学习。世界模型读者可带着 KL 直觉去看 RSSM;生成模型读者可看 VAE扩散压缩、信道、容量请跳到 信息论。领域地图:数学基础

📥 Code

FileViewDownload
demo.pyOpenDownload
exercise.pyOpenDownload

参考

  1. Cover & Thomas, Elements of Information Theory(经典)
  2. MacKay, Information Theory, Inference, and Learning Algorithms(免费电子书)