42 分钟
AI 数学精要

KL 散度与交叉熵:怎样度量两个分布的「距离」

手算 KL 散度和交叉熵,证明 KL 散度的非负性与不对称性,再推导出交叉熵 = 熵 + KL 散度——这条恒等式贯穿分类模型训练的整个过程。

  • 能写出 KL 散度与交叉熵公式并手算到具体数值
  • 能证明 KL≥0,并解释它为什么不对称、不能当严格距离
  • 推导并运用恒等式 H(P,Q)=H(P)+D_KL(P‖Q)
  • 搞懂 JS 散度、正向 KL 与反向 KL 的区别,还有最小化交叉熵为什么等价于逼近真实分布

训练就是让模型分布 Q 不断逼近数据分布 P,而 KL 散度正是这「差距」的标尺

真实标签构成一个分布 P(one-hot 或软标签),模型 softmax 输出另一个分布 Q,损失函数要回答「Q 离 P 还差多远」。 这一节推导信息论里度量两个分布差异的两个核心量——KL 散度与交叉熵,并证明那条贯穿整个分类训练的恒等式:交叉熵=熵+KL。理解它,你就明白为什么最小化交叉熵等价于让模型分布逼近数据分布。 因果链:用对数似然比定义 KL → 由 ln x≤x−1 证其非负 → 交叉熵拆成熵加 KL → 固定 P 时最小化交叉熵=最小化 KL → JS 与正反向 KL 处理对称性与覆盖模式。

2.1 KL 散度:以 P 为基准衡量 Q 的额外代价

KL 散度(相对熵)定义为 D_KL(P‖Q)=Σₓ p(x)·log₂[p(x)/q(x)]=EP[log(P/Q)],bit 为单位(用 ln 即 nat)。 说人话就是:真实分布是 P,你偏用分布 Q 去编码,平均每个样本要比用最优的 P 多花多少比特。 注意D_KL(P‖Q) 有方向,第一个 P 是「真实/基准」,加权的取值、期望的计算,全按 P 来。

手算一组(用 nat)。真实 P=[0.7,0.3],候选 Q₁=[0.5,0.5]:D_KL(P‖Q₁)=0.7ln(0.7/0.5)+0.3ln(0.3/0.5)=0.7ln1.4+0.3ln0.6≈0.7×0.3365+0.3×(−0.5108)≈0.2355−0.1532=0.0823。再算反方向 D_KL(Q₁‖P)=0.5ln(0.5/0.7)+0.5ln(0.5/0.3)≈−0.1682+0.2554=0.0872。两个方向数值不同,直接说明 KL 不对称。

KL 还有两个等价形式要认得:D_KL(P‖Q)=EP[log P]−EP[log Q]=−H(P)−EP[log Q],也就是「负的 P 自身熵」减去「P 下 Q 的平均负对数似然」,它也等于用 Q 代替 P 所造成的对数损失增量(excess log-loss)。正因如此,模型评估里的对数损失、最小描述长度原理、变分推断全都能写成 KL。注意期望按第一个分布 P 取——谁是基准就按谁的概率对各项加权,这决定了它在「P 有质量而 Q 给得少」的取值上惩罚极重。

选择题

关于 KL 散度,下列说法正确的是?

2.2 证明 KL≥0:Gibbs 不等式

KL 非负不是拍脑袋的经验结论,靠一条简单不等式就能推出来。对任意 x>0 有 ln x≤x−1——你想啊,ln x 在 x=1 处的切线就是 x−1,整条曲线都在切线下面,等号只有 x=1 的时候才成立。令 x=q/p,按 P 加权再取负:−D_KL(P‖Q)=Σp ln(q/p)≤Σp(q/p−1)=Σ(q−p)=Σq−Σp=1−1=0,于是 D_KL(P‖Q)≥0,等号当且仅当处处 p=q。这就是 Gibbs 不等式。

这个证明同时解释了三件事:KL 为 0 当且仅当两分布完全相同(可作为「拟合到位」的判据);它天然非负,适合当训练要最小化的目标;以及凡是「对数概率比的期望」形式的量都有这种非负结构(l4 的 ELBO、互信息都靠它)。要求 q(x)=0 而 p(x)>0 时 KL 趋于无穷——模型绝不能把真实可能出现的事件概率压成 0,这也是标签平滑与混合分布要避免零概率的原因。

推导

正向 KL 与反向 KL:mean-seeking 与 mode-seeking

方向不对称带来行为差异。正向 KL=D(P‖Q) 按真实 P 加权:只要 P 在某处有质量而 Q 给得少,就被重罚。因此 Q 必须覆盖 P 的所有峰,趋向「铺开、求全」,称 mean-seeking(如最大似然/交叉熵就是正向 KL)。反向 KL=D(Q‖P) 按模型 Q 加权:Q 只在自己有质量处需要贴近 P,它可以集中力量锁住 P 的某一个峰而忽略其余,称 mode-seeking,VAE 用的正是反向 KL,这解释了 VAE 生成偏模糊、易丢模态的部分原因。需要对称、有界的差异度量时用 JS 散度:JSD=½KL(P‖M)+½KL(Q‖M),M=½(P+Q),它对称且以 bit 计时落在 [0,1]。

2.3 交叉熵与核心恒等式 H(P,Q)=H(P)+KL(P‖Q)

交叉熵定义 H(P,Q)=−Σₓp(x)log q(x):用模型分布 Q 的 −log q 当「编码长度」,却按真实 P 取期望。它能拆成两项:H(P,Q)=−Σp log q=−Σp log p+Σp log(p/q)=H(P)+D_KL(P‖Q)。第一项 H(P) 只由真实分布决定、与模型 Q 无关,是个常数;第二项才衡量 Q 与 P 的差距。

这条恒等式是分类训练的理论核心:训练数据固定后 H(P) 不变,所以「最小化交叉熵 H(P,Q)」与「最小化 KL(P‖Q)」是完全等价的优化问题——模型调 Q 去逼近 P。手算(nat):P=[0.7,0.3] 的自身熵 H(P)=−0.7ln0.7−0.3ln0.3≈0.6109;对 Q₁=[0.5,0.5],H(P,Q₁)=−(0.7+0.3)ln0.5=−ln0.5≈0.6931,于是 KL=0.6931−0.6109=0.0823,与 2.1 直接算的完全一致。

填空题填写空白处的代码
P=[0.7,0.3], Q1=[0.5,0.5](单位 nat) # H(P)=-0.7ln0.7-0.3ln0.3 ≈ (填 0.611) # H(P,Q1)=-ln0.5 ≈ (填 0.693) # KL(P||Q1)=H(P,Q1)-H(P) ≈ (填 0.082)

再拿个更「自信」的候选 Q₂=[0.9,0.1] 对照,你就能直观感受到——自信不等于准确。算一下:H(P,Q₂)=−0.7ln0.9−0.3ln0.1≈0.0738+0.6908=0.7645,对应的 KL 散度是 0.7645−0.6109=0.1537,反而比之前「平庸」的 Q₁ 效果更差。原因很直白:真实占比 0.3 的第二类,Q₂ 只给了 0.1 的概率,−ln0.1 带来的重罚,远远盖过它在第一类上押对的那点优势。交叉熵只罚「在真实类别上不够自信」,你在别的类上瞎极端自信,半毛钱好处都没有。

先把正确类概率 qc 和交叉熵损失的对应关系列出来,帮你建立直觉:qc=1→L=0;0.7→0.357;0.5→0.693;0.1→2.303;0.01→4.605。损失是关于 qc 的凸函数,qc 接近 0 时损失急剧上升,梯度 −1/qc 也跟着变大——模型在「几乎全错」时收到的学习信号,远强于「基本正确」的时候。这和 MSE 那种有界的二次惩罚完全不同,也是分类任务偏爱交叉熵的原因之一。

再补一个三分类手算巩固「按 P 加权」的方向:P=[0.5,0.3,0.2]、Q=[0.4,0.4,0.2],D_KL(P‖Q)=0.5ln(0.5/0.4)+0.3ln(0.3/0.4)+0.2ln(0.2/0.2)=0.5ln1.25+0.3ln0.75+0≈0.5×0.2231+0.3×(−0.2877)≈0.1116−0.0863=0.0253 nat,两分布越接近值越小;若 Q 在 P=0.2 的第三类给 0,则该项 0.2ln(0.2/0)→+∞,仅一个未覆盖取值就能让 KL 爆炸,再次说明 Q 的支撑集必须覆盖 P。

预测输出
固定真实分布 P,下列哪个优化目标与「最小化交叉熵 H(P,Q)」等价?

2.4 连续情形、JS 散度与工程注意

连续分布把求和换积分:D_KL(p‖q)=∫p(x)log[p(x)/q(x)]dx,变分自编码器里两个高斯的 KL 就有闭式解(l4 细算)。当需要一个真正对称、平滑、有界的度量时用 JS 散度 JSD(P,Q)=½KL(P‖M)+½KL(Q‖M),M=½(P+Q):它对称、非负、上界有限,GAN 早期的目标就与 JS 散度同源(后来因 JS 在不交叠分布上梯度为零而改用 Wasserstein 距离)。

示例代码(可运行)

顺带讲清 GAN 后来为什么弃 JS 改用 Wasserstein(推土机距离):JS 与 KL 在两个分布支撑集不重叠时要么梯度恒为零(JS)、要么直接无穷大(KL),而高维空间里真实数据流形与生成流形维度都很低、几乎不可能相交重叠,原始 GAN 因而频繁梯度消失。Wasserstein 度量「把一堆概率土 P 搬运成 Q 的最小代价」,即便分布不重叠也平滑、能给出有意义的梯度,WGAN 据此显著稳定训练。这里不要求会推,而是让你建立选型直觉:选散度前先问「分布是否可能不交叠、梯度是否连续、是否需要对称有界」。

按真实 P 加权,Q 漏掉 P 的任何峰都被重罚,倾向覆盖全部模态(mean-seeking);最大似然/交叉熵即此方向。

配对题把量对到它的关系或性质
找 BugKL 不对称,不能当距离用。 交叉熵是按真实分布 P 加权的,写法是 H(P,Q)。 碰到 q=0 但 p>0 的情况,结果会是无穷大,得加 eps 做平滑处理。
# 三个典型错误:把 KL 当对称距离、交叉熵方向写反、零概率 import math P=[0.7,0.3]; Q=[0.5,0.5,0.0] # 错误一:断言 KL(P||Q)==KL(Q||P) # 错误二:模型把某真实可能类概率压成 0.0,再算 -p*log(0) print(-0.3*math.log(0.0))
🐍一线视角:为什么分类损失非交叉熵不可

one-hot 真实分布 P 的 H(P)=0,这时候交叉熵 H(P,Q)=KL(P‖Q)=−log qc,就是「正确类预测概率的负对数」。它是 MLE、是正向 KL,梯度形式是 s−y,形式干净,而且错误越大梯度越大。换成 MSE 套 softmax 不行,严重错误时会梯度饱和。l3 用推导对比。

⚠️log(0) 与维度错配是两大崩溃源

交叉熵、KL 散度碰到 q=0 的情况,会算出 −log0=+∞,训练直接出 NaN。softmax 本身不会输出精确的 0,但手写归一化、硬掩码、混合专家门控这些场景可能产生 0,要加 eps 或者用 log-sum-exp 处理。另外 P、Q 必须在同一支撑集、概率和都为 1,不然 KL 没意义。

ℹ️KL 与对数损失、证据下界同源

KL 是对数似然比的期望:D_KL(P‖Q)=EP[log P]−EP[log Q]。最大似然在最小化正向 KL,变分推断在最小化反向 KL,互信息是联合相对独立乘积分布的 KL,l4 会看到它们全部由这一个定义串起。

💡三句话判断用哪个散度

做分类器训练、走最大似然路线→用交叉熵/正向 KL;要对称有界、对比两个经验分布→用 JS;生成模型里要让模型挑模态、能闭式计算高斯差异→用反向 KL。选之前先想清楚三个问题:按谁加权、要不要对称、是否需要有界。

选择题

对固定的真实分布 P,最小化交叉熵 H(P,Q) 等价于?

本节小结

一条推导链顺下来:KL(P‖Q)=EP[log(P/Q)] 是以 P 为基准、用 Q 编码的额外代价 → 由 ln x≤x−1 推出 Gibbs 不等式 KL≥0、P=Q 才为 0,但方向不对称(手算 0.0823≠0.0872)→ 交叉熵 H(P,Q)=−Σp log q=H(P)+KL,固定 P 时最小化交叉熵=最小化正向 KL(数值 0.6109+0.0823=0.6931)→ 自信不等于准确(Q₂ 的 KL 0.1537 更大)→ 连续用积分、对称有界用 JS、生成模型按模态需求选正/反向 KL,并严防 log(0)。

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

信息熵度量一个分布的不确定程度,越随机熵越大。交叉熵衡量「用模型预测的分布去编码真实分布」所需的平均代价:模型预测越接近真实标签,交叉熵越小。因此多分类任务用交叉熵做损失不是拍脑袋,而是有严格信息论依据的最大似然等价形式。