第九部分 · 概率、统计与信息
信息论:熵、交叉熵与 KL 散度
上一课,贝叶斯告诉我们怎么用证据更新信念;可当我们真去训练一个分类器时,一个最朴素的问题冒了出来:到底该最小化什么?这一课,我们要从"度量惊讶"这件事出发,看着分类用的「交叉熵损失」从最大似然里自己长出来——它不是谁拍脑袋发明的,而是被逼出来的。
留下的问题:模型吐出的是一个预测分布 q,真实答案是另一个分布 p(标准答案"是猫"就是 p = (猫 1, 狗 0))。要训练它,我们得先有一把尺,量出 q 离 p 有多远——可"两个分布的距离"该怎么定义?为什么偏偏用对数?
本课新增:信息论——熵(一个分布"有多不确定/多让人惊讶")、交叉熵(用错误的分布去编码真分布要付出的代价)、KL 散度(两个分布的差距,永远 ≥ 0)。我们会证明:在最大似然下,交叉熵损失是被自然逼出来的。
一条消息值多少:信息 = 惊讶
1948 年,香农(Claude Shannon)问了一个看似哲学、实则可量化的问题:"信息"能不能用一个数来衡量?他的切入点出奇地朴素——一条消息带来的信息量,取决于它有多出乎意料。
"明天太阳照常升起"几乎必然发生,听了等于没听,信息量近乎零;"明天日全食"很罕见,一旦发生信息量巨大。越不可能的事,发生时越令人惊讶,带来的信息越多。于是信息量应该是概率的某种递减函数:P 越小,信息越大。
那为什么是对数?香农要求信息量满足一条铁律:两件独立的事一起发生,信息量应当相加。"今天下雨"和"明天下雨"如果独立,告诉我这两件事的总信息,该等于分别告诉我的信息之和。可两件独立事件同时发生的概率是相乘的(P(A 且 B) = P(A)·P(B))。要让"概率相乘"变成"信息相加",唯一的桥就是对数——因为 log(a·b) = log a + log b。于是一条概率为 p 的消息,它的信息量(也叫"惊讶度")被定义为:
信息量 = −log p (读作"负 log p")
负号是因为 p ≤ 1 时 log p ≤ 0,取负后变正;p 越小,−log p 越大,惊讶越多——和直觉完全吻合。底数取 2 时单位叫"比特"(bit),取自然底 e 时叫"奈特"(nat);机器学习里几乎都用自然对数,本课也用 e。一件必然发生(p = 1)的事,信息量 −log 1 = 0,毫不惊讶——一切都对上了。
熵:一个分布平均有多让人惊讶
单条消息的惊讶有了,那整个分布呢?一枚均匀硬币、一颗骰子、一个"99% 是猫"的预测——它们各自的"不确定程度"如何比较?答案是把每个结果的惊讶度 −log p(x),按它发生的概率 p(x) 加权平均。这个平均惊讶,就是分布的熵,记作 H(p)(H 取自 entropy):
H(p) = −∑ p(x)·log p(x) (读作"对所有结果 x,把 p(x) 乘以 −log p(x) 全加起来")
这里 ∑(西格玛,求和号)对所有可能结果 x 求和,p(x) 是结果 x 的概率。注意熵正是第 10 课"期望"的应用——它就是惊讶度这个随机量的期望值 𝔼[−log p(x)](读作"−log p 的期望")。两个直觉要抓住:
- 越均匀,熵越大。一枚公平硬币 p = (0.5, 0.5),熵 H = −(0.5·log 0.5 + 0.5·log 0.5) = log 2 ≈ 0.69(用自然对数)——这是两个结果时熵能达到的最大值,因为你最摸不着头脑。
- 越确定,熵越小。一枚永远朝上的"硬币" p = (1, 0),熵 H = −(1·log 1 + 0·log 0) = 0(约定 0·log 0 = 0)——毫无不确定,平均惊讶为零。
所以熵就是一把刻在分布自己身上的尺:它的内在不确定度、它"最少需要多少信息才能说清楚一个结果"。它只跟 p 有关,是分布的固有属性。
交叉熵:用错的分布去描述真分布
现在回到训练分类器的现场。真相由 p 描述(标准答案),而我们的模型给出预测 q。一个绝妙的视角是把信息论翻译成编码:如果你知道真分布 p,就能设计一套最省的编码(常见的结果用短码、罕见的用长码),平均码长正好是熵 H(p)。可如果你误以为分布是 q,按 q 去设计编码,再拿去编真正服从 p 的数据——平均码长会变成交叉熵 H(p,q):
H(p,q) = −∑ p(x)·log q(x) (读作"按真概率 p(x) 加权,但惊讶度用预测的 −log q(x)")
看清这个式子和熵的区别:求和的权重还是真分布 p(x)(事情按真概率发生),可惊讶度用的是预测 q(x)(你是按 q 来"吃惊"的)。如果你的预测 q 恰好等于真相 p,交叉熵就退回成熵 H(p,p) = H(p),代价最低;q 错得越离谱,H(p,q) 越大——尤其当 q 给真正会发生的结果分配了极小的概率时,−log q(x) 会爆炸式增大。这就是分类训练里的"交叉熵损失"。但它为什么是对的损失?且看下一步。
KL 散度:纯粹"多付出的代价",而且永远 ≥ 0
交叉熵 H(p,q) 里其实混了两样东西:一部分是真相本身就有的、不可避免的不确定度 H(p);另一部分才是因为你猜错、用了 q 而额外多付的代价。把后者单独拎出来,就是 KL 散度(Kullback–Leibler divergence,又叫相对熵):
KL(p‖q) = H(p,q) − H(p) = ∑ p(x)·log( p(x) / q(x) ) (读作"p 相对 q 的散度,等于交叉熵减去熵")
它度量的是"你用 q 而非真分布 p 时,多浪费了多少信息"。KL 散度有两条性质,是它能当"差距尺"的命根子:
这正是我们苦苦寻找的那把尺:KL(p‖q) 越小,q 越贴近 p;唯有 q = p 时它才归零。要提醒一点:KL 不对称,KL(p‖q) ≠ KL(q‖p),所以它不是严格意义上的"距离"(距离要对称),人们称它"散度"。但用作"把预测拉向真相"的目标,它再合适不过。
合体:交叉熵损失就是最大似然
现在揭开本课最关键的一层——为什么分类一定要用交叉熵,而不是随便挑一个误差。我们从第 31 课的最大似然出发。训练时真分布 p 是固定的标准答案,所以它的熵 H(p) 是个常数,跟模型参数无关。于是:
H(p,q) = H(p) + KL(p‖q) = 常数 + "差距"
调参数只能改 q,因此最小化交叉熵 H(p,q),就等价于最小化 KL(p‖q)——也就是把预测分布尽量拉到和真相重合。而前面已证 KL ≥ 0,最好的情况是 q = p。这把损失安在了坚实的地基上:它有明确的最优解,而且最优解就是"说对真相"。
更漂亮的是它和似然的关系。对一批独立样本求最大似然,是让模型给真实标签分配的概率连乘 ∏ q(真实标签) 最大;取对数(连乘变连加)再取负,就是 −∑ log q(真实标签)——这恰好是交叉熵在数据上的形式(每个样本的真分布 p 是 one-hot,只在真实标签处为 1)。三句话连成一串:
它无处不在:语言模型与扩散
这不是纸上谈兵。今天最强的模型,训练目标几乎都是某种交叉熵或 KL:
- 语言模型(见 gpt_mini):每一步预测"下一个词"的分布 q,真实下一个词是 one-hot 的 p,损失就是交叉熵 −log q(真实词)。模型的"困惑度"(perplexity)正是交叉熵取指数 exp(H(p,q))(读作"以 e 为底、H(p,q) 次方")——直接报告"平均每步它在多少个词里犯难"。
- 扩散模型(见 扩散模型):训练时反复用 KL 散度去对齐"模型预测的去噪分布"和"真实的后验分布",让生成过程一步步逼近数据的真分布。
- 知识蒸馏、变分推断、强化学习里的策略约束,全都把 KL 当作"别离参照分布太远"的缰绳。
下面的小实验,让你亲手把熵、交叉熵、KL 三者的关系看个透:固定真分布 p,自己挪动预测 q,盯着 KL 在 q = p 那一刻精确地归零。
常见误解
- "KL 散度是两个分布之间的距离。"不全对。它确实 ≥ 0、且只在 p = q 时为 0,很像距离;但它不对称(KL(p‖q) ≠ KL(q‖p)),也不满足三角不等式,所以数学上不是距离,只能叫"散度"。训练时用哪个方向(KL(p‖q) 还是 KL(q‖p))会得到不同性格的模型,这是变分推断里反复纠结的事。
- "交叉熵可以是负的。"对离散分类不会。每个 q(x) ≤ 1,所以 −log q(x) ≥ 0,加权平均的交叉熵 H(p,q) ≥ 0。(连续分布的"微分熵"才可能为负,那是另一回事,别和这里混。)
- "熵越大越糟。"看场合。作为真分布的固有不确定度,熵只是个客观事实,无所谓好坏;可作为损失要最小化的,是交叉熵 / KL,不是 H(p)——后者你根本动不了,它是常数。有时我们还故意鼓励高熵(如给策略加"熵正则"防止它过早笃定),这时熵大反而是好事。
- "既然底数无所谓,比特和奈特能混用。"换底只是整体乘一个常数(log₂ x = log x / log 2),不改变"谁最小"的结论,所以优化时无所谓;但报告数值、和别人对比时务必说清单位,否则差出一个 ln 2 ≈ 0.69 的倍数。