Contents

信息量、熵、交叉熵与 KL 散度

术语说明

术语英文含义
真实分布true distribution数据实际服从的概率分布,记为 $P$。在信息论中,它是「世界本来的样子」;在机器学习中,常对应真实标签分布或数据生成分布。
经验分布empirical distribution由有限样本估计得到的分布,记为 $\hat{P}$。若样本 $x^{(1)}, \dots, x^{(n)}$ 中,$x$ 出现 $n_x$ 次,则 $\hat{P}(x) = n_x / n$。样本量越大,经验分布越接近真实分布。
模型分布model distribution由模型参数决定的分布,记为 $Q$ 或 $q(x;\theta)$。训练的目标是让模型分布接近真实分布(或经验分布)。

信息量

核心问题:信息量为什么定义为 $i(x) = -\log_2 p(x)$?

核心思想:信息是“消除不确定性”的程度。事件越可能发生,发生后带来的新信息越少;越不可能发生,发生后带来的新信息越多。

例如:

  • “太阳今天升起来了”几乎不会让人惊讶,因此信息量很小
  • “你的彩票中了一个亿”极其罕见,因此信息量很大

所以,信息量本质上应该是概率 $p$ 的某个函数 $I(p)$,并满足:

  1. 单调性:概率越小,信息量越大
  2. 可加性:若两个事件独立,则联合事件的信息量应该等于两者之和
  3. 非负性:信息量不应小于 $0$

其中,第二条最关键。

若事件 $A$ 和 $B$ 独立,则:

$$ P(A \cap B) = P(A)P(B) $$

而“知道 $A$ 发生”带来一部分信息,“知道 $B$ 发生”再带来一部分信息,那么“知道 $A$ 和 $B$ 同时发生”带来的信息,应该等于两者之和。因此信息量函数应满足:

$$ I(pq) = I(p) + I(q) $$

满足这个性质的函数,在附加适当正则性条件后,例如连续性、可测性或单调性,其标准形式就是对数函数:

$$ I(p) = -k \log p, \quad k > 0 $$

当取 $k = 1$ 且以 $2$ 为底时,就得到信息论中的标准定义:

$$ i(x) = -\log_2 p(x) $$

这里说“附加适当正则性条件”,是为了排除数学上那些极其诡异、现实中没有意义的怪函数。对本文而言,只需要理解:可加性会自然导向对数形式

为什么要以 $2$ 为底?bit 是什么?

当使用 $\log_2$ 时,信息量的单位就是 bit。因为以 $2$ 为底,对应的是二进制编码

例如,若一个事件的概率是 $1/2$,则其信息量为:

$$ -\log_2(1/2)=1 $$

这意味着该事件携带 $1$ bit 的信息,也就是一次二元区分(yes/no)所能提供的信息量。

再例如,公平骰子的某个具体结果,比如“掷出 6”,它的概率是 $1/6$,信息量为:

$$ -\log_2(1/6)=\log_2 6 \approx 2.585 $$

也就是说,它大约携带 $2.585$ bit 的信息。

这里的 $2.585$ bit 不是说单次真的可以问 $2.585$ 个问题,而是说:在理想编码或长序列平均意义下,确定这个结果所需的信息量约为 $2.585$ bit。单次编码长度必须是整数,但长期平均码长可以逼近这个值。

概率不等时:变长编码

当不同结果的概率不相等时,高概率结果应使用更短的码,低概率结果可使用更长的码。

例如:

$$ P(A)=0.5,\quad P(B)=0.25,\quad P(C)=0.125,\quad P(D)=0.125 $$

一种前缀编码可以写为:

  • $A \to 0$
  • $B \to 10$
  • $C \to 110$
  • $D \to 111$

对应码长分别为:

$$ \ell(A)=1,\quad \ell(B)=2,\quad \ell(C)=3,\quad \ell(D)=3 $$

平均码长就是各个结果的码长按其出现概率取期望:

$$ \mathbb{E}[\ell(X)] = \sum_x P(x)\ell(x) $$

代入上面的分布:

$$ 0.5 \cdot 1 + 0.25 \cdot 2 + 0.125 \cdot 3 + 0.125 \cdot 3 = 1.75 $$

也就是说,如果长期从这个分布中采样并编码,平均每个样本需要 $1.75$ bit。

更直观地说,如果做 $8$ 次采样,大约会出现:

  • $A$ 出现 $4$ 次
  • $B$ 出现 $2$ 次
  • $C$ 出现 $1$ 次
  • $D$ 出现 $1$ 次

于是总码长约为:

$$ 4 \cdot 1 + 2 \cdot 2 + 1 \cdot 3 + 1 \cdot 3 = 14 $$

平均每次:

$$ 14/8 = 1.75 $$

这也是 $1.75$ bit。

这里之所以恰好等于熵,是因为这组概率刚好都是 $2^{-k}$ 形式:

$$ 0.5=2^{-1},\quad 0.25=2^{-2},\quad 0.125=2^{-3} $$

因此:

$$ -\log_2 0.5 = 1,\quad -\log_2 0.25 = 2,\quad -\log_2 0.125 = 3 $$

正好与前面分配的码长一致。一般情况下,最优平均码长只能逼近熵,不一定与熵严格相等。

(Shannon Entropy)是信息量的期望,也就是随机变量的平均信息量

$$ H(P) = -\sum_x P(x)\log_2 P(x) $$$$ = \mathbb{E}_{x \sim P}[-\log_2 P(x)] $$

它回答的是:当样本按分布 $P$ 生成时,平均每个样本携带多少 bit 的信息。

核心理解

熵可以从三个层面理解:

  1. 平均不确定性:分布越分散、越难预测,熵越大;分布越集中、越确定,熵越小
  2. 最优平均码长下限:熵给出了无失真二进制编码下平均码长的理论下限
  3. 分布复杂度:在支持集大小固定时,均匀分布熵最大;完全确定的分布熵为 $0$

例子

对于公平硬币:

$$ P(\text{正})=P(\text{反})=0.5 $$

其熵为:

$$ H(P)= -0.5\log_2 0.5 - 0.5\log_2 0.5 = 1 $$

也就是说,公平硬币的熵是 $1$ bit。

对于确定性硬币,也就是总是正面的硬币:

$$ H(P)=0 $$

因为结果完全确定,没有不确定性,也就没有信息增益。

交叉熵

如果熵 $H(P)$ 表示“样本真实来自分布 $P$,并且我们也按 $P$ 来设计编码时的平均代价”,那么更一般的问题是:

  • 样本仍然真实来自 $P$
  • 但我们却错误地使用另一个分布 $Q$ 来设计编码

这时,对单个样本 $x$,它的编码代价就不是:

$$ -\log_2 P(x) $$

而是:

$$ -\log_2 Q(x) $$

因为你是按 $Q$ 来分配码长的。

既然样本是按 $P$ 产生的,那么长期平均代价就应该对 $x \sim P$ 取期望:

$$ H(P,Q)=\mathbb{E}_{x\sim P}[-\log_2 Q(x)] $$$$ = -\sum_x P(x)\log_2 Q(x) $$

这就是交叉熵

交叉熵的直观含义

交叉熵描述的是:

真实世界服从分布 $P$,但你用分布 $Q$ 去描述它时,平均每个样本要付出的编码代价。

因此:

  • 熵 $H(P)$:使用正确分布 $P$ 编码时的平均代价
  • 交叉熵 $H(P,Q)$:使用错误分布 $Q$ 编码时的平均代价

所以,交叉熵总是不小于熵。当 $Q=P$ 时,两者相等:

$$ H(P,P)=H(P) $$

一个简单例子

设真实分布为:

$$ P(\text{正})=0.9,\quad P(\text{反})=0.1 $$

但你错误地用均匀分布:

$$ Q(\text{正})=Q(\text{反})=0.5 $$

来设计编码。

由于:

$$ -\log_2 0.5 = 1 $$

所以无论真实出现正面还是反面,你都要付出 $1$ bit 的编码代价。于是交叉熵为:

$$ H(P,Q)=0.9\cdot 1 + 0.1\cdot 1 = 1 $$

也就是 $1$ bit。

而真实熵为:

$$ H(P)= -0.9\log_2 0.9 - 0.1\log_2 0.1 \approx 0.469 $$

也就是说,真实熵大约是 $0.469$ bit。

这意味着,你因为使用了错误分布 $Q$,平均每个样本多花了大约:

$$ 1 - 0.469 = 0.531 $$

这正是 KL 散度所要衡量的量,也就是大约多花了 $0.531$ bit。

KL 散度

一句话:如果你拿错误的概率分布 $Q$ 去描述真实世界 $P$,平均会多付出多少信息代价

其定义为:

$$ D_{KL}(P \Vert Q)= \sum_x P(x)\log_2 \frac{P(x)}{Q(x)} $$$$ = \mathbb{E}_{x\sim P}\left[\log_2 \frac{P(x)}{Q(x)}\right] $$

它衡量的是:当真实分布为 $P$ 时,使用 $Q$ 代替 $P$ 所带来的额外平均编码代价

从编码视角理解

对于样本 $x$:

  • 若按真实分布 $P$ 编码,代价是

    $$ -\log_2 P(x) $$
  • 若按错误分布 $Q$ 编码,代价是

    $$ -\log_2 Q(x) $$

两者之差为:

$$ -\log_2 Q(x) - \left(-\log_2 P(x)\right) $$$$ = \log_2 \frac{P(x)}{Q(x)} $$

再对真实分布 $P$ 取期望,就得到 KL 散度:

$$ D_{KL}(P \Vert Q)= \mathbb{E}_{x\sim P}\left[\log_2 \frac{P(x)}{Q(x)}\right] $$

因此,KL 散度本质上就是由于模型失配而产生的额外信息代价

三个关键性质

  1. 非负性

    $$ D_{KL}(P \Vert Q) \ge 0 $$

    且当且仅当 $P=Q$(几乎处处)时取等号

  2. 非对称性

    $$ D_{KL}(P \Vert Q) \neq D_{KL}(Q \Vert P) $$

    因此 KL 散度不是一个距离

  3. 支持集失配 若存在某个 $x$ 使得 $P(x)>0$ 但 $Q(x)=0$,则:

    $$ D_{KL}(P \Vert Q)=\infty $$

    因为真实会发生的事件,在模型 $Q$ 中却被赋予零概率,这会导致无限大的惩罚

熵、交叉熵与 KL 散度之间的关系

三者之间有一个非常重要的恒等式:

$$ H(P,Q)=H(P)+D_{KL}(P \Vert Q) $$

这个式子的含义很直接:

  • $H(P)$:使用正确分布编码时的平均代价
  • $H(P,Q)$:使用错误分布编码时的平均代价
  • $D_{KL}(P \Vert Q)$:两者之间多出来的那部分代价

从定义展开也很容易看出:

$$ H(P,Q) = -\sum_x P(x)\log_2 Q(x) $$$$ = -\sum_x P(x)\log_2 P(x) + \sum_x P(x)\log_2 \frac{P(x)}{Q(x)} $$$$ = H(P) + D_{KL}(P \Vert Q) $$

这也是为什么可以把 KL 散度理解为:

交叉熵减去熵

从统计学角度看:最大似然估计

到这里为止,前面的解释都来自信息论和编码视角。但这些概念并不只属于信息论,它们在统计学里也有一个完全等价的解释:最大似然估计

最大似然估计在做什么

设有一组独立同分布样本:

$$ x^{(1)}, x^{(2)}, \dots, x^{(n)} $$

记模型为 $q(x;\theta)$,其中 $\theta$ 是参数。最大似然估计希望找到一个参数,使观测到这组数据的概率最大:

$$ \theta^\star = \arg\max_{\theta} \prod_{i=1}^{n} q(x^{(i)};\theta) $$

取对数后等价于:

$$ \theta^\star = \arg\max_{\theta} \sum\_{i=1}^{n} \log q(x^{(i)};\theta) $$

乘上 $-\frac{1}{n}$:$n$ 与 $\theta$ 无关,不改变最优解;$\frac{1}{n}$ 得到平均,负号把最大化变为最小化。于是等价于最小化平均负对数似然:

$$ \theta^\star = \arg\min\_{\theta} \left( -\frac{1}{n}\sum\_{i=1}^{n} \log q(x^{(i)};\theta) \right) $$

为什么这就是交叉熵

定义样本的经验分布为:

$$ \hat{P}(x) = \frac{1}{n}\sum_{i=1}^{n} \mathbf{1}\!\left[x^{(i)} = x\right] $$

则有:

$$ -\frac{1}{n}\sum_{i=1}^{n} \log q(x^{(i)};\theta) $$$$ = -\sum_x \hat{P}(x)\log q(x;\theta) $$

这正是经验分布 $\hat{P}$ 与模型 $q(x;\theta)$ 之间的交叉熵。

也就是说:

最大似然估计 = 最小化经验分布与模型分布之间的交叉熵。

进一步,由于:

$$ H\left(\hat{P}, q(\cdot;\theta)\right) = H(\hat{P}) + D\_{KL}\left(\hat{P} \Vert q(\cdot;\theta)\right) $$

而 $H(\hat{P})$ 与模型参数 $\theta$ 无关,因此最大似然估计又等价于:

最小化经验分布到模型分布的 KL 散度。

这在机器学习里意味着什么

在分类任务中,常见的交叉熵损失并不是一个经验性的技巧,而是有很清晰的理论来源:

  • 从统计学看,它对应最大似然估计
  • 从信息论看,它对应平均编码代价
  • 从分布匹配看,它对应最小化 KL 散度

这三种说法,本质上描述的是同一个优化目标。

机器学习中的视角

分类任务

在分类任务中,真实标签分布为 $P$,模型输出分布为 $Q$。训练时常见的交叉熵损失,本质上是在最小化:

$$ H(P,Q) $$

由于 $H(P)$ 对模型参数是常数,因此最小化交叉熵等价于最小化:

$$ D_{KL}(P \Vert Q) $$

对于 one-hot 标签,这又等价于最小化负对数似然。

生成建模与变分推断

在生成模型与变分推断中,KL 散度常用于衡量近似分布与目标分布之间的失配。例如在 VAE 中,常见项为:

$$ D_{KL}(q(z|x)\Vert p(z)) $$

它用于约束近似后验 $q(z|x)$ 不要偏离先验 $p(z)$ 太远,从而让潜变量空间保持规整、可采样。

常见误区

  1. 信息量不是主观“重要性”
    信息量衡量的是事件发生后消除了多少不确定性,而不是它在人类语境中的现实重要程度。

  2. KL divergence is not a distance
    KL 不对称,也不满足三角不等式,因此不是严格意义上的距离。

  3. 熵、交叉熵和 KL 散度依赖对数底数
    若使用 $\log_2$,单位是 bit;若使用自然对数,单位是 nat。底数不同只会带来一个常数缩放,但全文必须保持一致。

  4. 平均码长不等于单次码长
    信息量、熵、交叉熵通常都应理解为长期平均意义下的编码极限,而不是单次事件必须使用的整数码长。

总结

这几个概念可以用一句统一的话串起来:

  • 信息量:单个事件发生时带来的不确定性消除量
  • :按真实分布编码时的平均代价
  • 交叉熵:按错误分布编码时的平均代价
  • KL 散度:错误编码相对正确编码多出来的平均代价

而从统计学角度看,这同一套量又对应于:

  • 负对数似然
  • 最大似然估计
  • 模型分布与真实分布之间的拟合程度

因此,信息论和统计学在这里并不是两套不同理论,而是对同一个目标函数的两种表述。

深度学习里的一个直观对应:二分类交叉熵与生成模型中的 KL 损失

在深度学习里,交叉熵和 KL 散度都常作为 loss 使用,但它们对应的模型输出计算方式并不一样。

1. 二分类中的交叉熵 loss

以二分类为例,模型最后通常输出一个标量 $z$,称为 logit。经过 sigmoid 后得到预测概率:

$$ p = \sigma(z) = \frac{1}{1+e^{-z}} $$

其中 $p$ 表示模型认为标签为 $1$ 的概率,真实标签 $y \in \{0,1\}$。

单个样本的二分类交叉熵为:

$$ L_{\text{BCE}}(y,p) = -\left[ y \log p + (1-y)\log(1-p) \right] $$

这里的含义很直接:

  • 若真实标签 $y=1$,loss 变成 $-\log p$
  • 若真实标签 $y=0$,loss 变成 $-\log(1-p)$

也就是说,模型对真实标签越自信、概率给得越高,loss 越小;反之 loss 越大。

loss 的输出是什么?

  • 对单个样本:输出一个标量
  • 对一个 batch:通常先对每个样本算 loss,再做 meansum
  • 训练时反向传播的,通常就是这个 batch 的单个标量 loss

2. 生成模型中的 KL loss:以 VAE 为例

在 VAE 中,编码器不是直接输出类别概率,而是输出隐变量分布 $q(z|x)$ 的参数。通常假设:

$$ q(z|x) = \mathcal{N}(z;\mu,\mathrm{diag}(v)) $$

这里:

  • $\mu$ 是均值向量
  • $v$ 是方差向量

先验通常取标准高斯:

$$ p(z) = \mathcal{N}(z;0,I) $$

这时 KL 项写成:

$$ D_{KL}\bigl(q(z|x)\Vert p(z)\bigr) $$

它的闭式解为:

$$ L_{\text{KL}} = \frac{1}{2}\sum_j \left( \mu_j^2 + v_j - \log v_j - 1 \right) $$

实际实现中,编码器更常输出:

$$ a = \log v $$

这时同一个 KL 项通常写成:

$$ L_{\text{KL}} = -\frac{1}{2}\sum_j \left( 1 + a_j - \mu_j^2 - e^{a_j} \right) $$

这两种写法是等价的。

它的含义是:约束编码器输出的隐变量分布不要偏离标准高斯太远,否则 latent space 会变得不规整、难以采样。

loss 的输出是什么?

  • 对单个样本:先对 latent 各维求和,得到一个标量
  • 对一个 batch:再对样本做 meansum
  • 最终训练时,KL loss 也是一个用于反向传播的单个标量

3. 两者的本质区别

二分类交叉熵里:

  • 模型输出的是类别概率
  • loss 衡量的是预测标签分布和真实标签之间的误差

VAE 的 KL loss 里:

  • 模型输出的是隐变量分布的参数
  • loss 衡量的是编码器产生的分布和先验分布之间的差异

所以两者虽然都叫 loss,也都和概率分布有关,但作用位置不同:

  • 交叉熵主要作用在监督信号和标签预测
  • KL 散度主要作用在分布约束和隐变量正则化

4. VAE 的总 loss

VAE 训练时通常不是只优化 KL,而是优化:

$$ L = L_{\text{rec}} + \beta L_{\text{KL}} $$

其中:

  • $L_{\text{rec}}$ 是重建损失,例如重建误差或像素级负对数似然
  • $L_{\text{KL}}$ 是分布正则项
  • $\beta$ 用来控制 KL 项的权重

所以在生成模型里,KL loss 往往不是唯一的 loss,而是总目标中的一个组成部分。

References