机器学习中的熵、信息量、交叉熵和 KL 散度:从入门到严谨
本文用 4 个难度层级,从"聊天版直觉"出发,一步步走到"比较严谨的数学表述",帮助你系统理解:
- 熵(Entropy)
- 信息量(Information)
- 交叉熵(Cross Entropy)
- KL 散度(KL Divergence)
Level 1:猜谜游戏版直觉
先想象一个场景:你在玩猜谜游戏。
熵:猜之前的"不确定程度"
- 只有 2 个选项:A 或 B,而且你几乎确定是 A(比如 A 的概率 0.99,B 的概率 0.01)
→ 你心里"八九不离十",不怎么不确定,熵很小。 - 有 4 个选项:A/B/C/D,每个 25%
→ 完全不知道会是哪一个,很不确定,熵大。
先记一句话:熵 = 系统的不确定程度。越难猜,熵越大。
信息量:看到结果时"有多惊讶"
- 一件事本来几乎肯定会发生(比如"明天早上太阳会升起"),结果真的发生了:
→ 一点也不惊讶,信息量很小。 - 一件事本来极不可能发生(比如"你中了 500 万大奖"),结果真发生了:
→ "卧槽!" → 信息量巨大。
直觉上:
- 越不可能的事情,一旦发生,携带的信息量越大。
交叉熵:用"错误认知"来猜的平均难度
你对世界有一套自己的主观认知:
- 你以为 :A 的概率是 0.7、B 是 0.3(这是你的分布 q)
- 真实世界:A 的概率是 0.3、B 是 0.7(真实分布是 p)
你始终按照自己的"错误认知" q 去猜、去压缩信息。
那么你平均要付出的"猜测成本",就是 交叉熵 H(p,q)H(p, q)H(p,q)。
可以先记住:
交叉熵 = 用错误认知去处理真实世界时的平均猜测难度(平均信息开销)。
在机器学习里:
- 模型给出的预测分布是 qqq
- 标签的真实分布是 ppp
- 交叉熵就是常见的 cross-entropy loss,衡量模型预测和真实分布差距有多大。
KL 散度:因为"想错了"多浪费的力气
既然有:
- 熵 H(p)H(p)H(p):在你知道真实概率的情况下,理论上最省力(最小平均 bit 数)
- 交叉熵 H(p,q)H(p, q)H(p,q):你用错误认知 qqq 来处理真实分布 ppp 时,实际平均付出的 bit 数
那么两者之差:
KL(p ∥ q)=H(p,q)−H(p) \mathrm{KL}(p \,\|\, q) = H(p, q) - H(p) KL(p∥q)=H(p,q)−H(p)
KL(p‖q) = 交叉熵 − 熵 = 你因为 "想错了" 多付出的额外代价
它就像是:
- 两个概率分布之间的一种"差异度量"
- 虽然不是对称的、也不满足三角不等式,但可以衡量分布的差异。
Level 2:工程师版 + 简单公式
这一层面向"会写代码的工程师",在直觉基础上加几个核心公式。
下面的 log\loglog 默认是以 222 为底,单位就是 bit(你也可以理解为换底后差一个常数因子)。
信息量(自信息)
一个具体结果 xxx 发生的概率是 p(x)p(x)p(x),它的"信息量"定义为:
I(x)=−log2p(x) I(x) = -\log_2 p(x) I(x)=−log2p(x)
- 如果 p(x)=12p(x)=\tfrac{1}{2}p(x)=21,那么 I(x)=1I(x)=1I(x)=1 bit
- 如果 p(x)=14p(x)=\tfrac{1}{4}p(x)=41,那么 I(x)=2I(x)=2I(x)=2 bit
→ 更不可能的事:信息量更大
熵:平均信息量
随机变量 XXX 的熵 = 在这个分布下结果出现时的 平均信息量:
H(X)=H(p)=−∑xp(x)log2p(x) H(X) = H(p) = - \sum_x p(x) \log_2 p(x) H(X)=H(p)=−x∑p(x)log2p(x)
观察:
- 分布越均匀,熵越大(越难猜);
- 分布越偏(一边倒),熵越小。
交叉熵:在真实分布下,用 qqq 的 log\loglog 取期望
真实分布是 p(x)p(x)p(x),你用来"解释/预测"的分布是 q(x)q(x)q(x),
交叉熵定义为:
H(p,q)=−∑xp(x)log2q(x) H(p, q) = - \sum_x p(x) \log_2 q(x) H(p,q)=−x∑p(x)log2q(x)
注意:
- 求和权重是 真实 p(x)p(x)p(x)
- log\loglog 的对象是 你假设的 q(x)q(x)q(x)
在深度学习分类任务中:
- 真实标签 one-hot,比如:
- 真实类别是 3 → p=(0,0,1,0,... )p = (0,0,1,0,\dots)p=(0,0,1,0,...)
- 模型预测分布 q=(q1,q2,...,qk)q = (q_1, q_2, \dots, q_k)q=(q1,q2,...,qk)
此时交叉熵:
H(p,q)=−log2qtrue class H(p, q) = -\log_2 q_{\text{true class}} H(p,q)=−log2qtrue class
这正是各种框架里 cross_entropy(pred, target) 的本质含义。
KL 散度:ppp 相对 qqq 的"额外损失"
KL 散度定义:
DKL(p ∥ q)=∑xp(x)log2p(x)q(x) D_{\mathrm{KL}}(p \,\|\, q) = \sum_x p(x) \log_2 \frac{p(x)}{q(x)} DKL(p∥q)=x∑p(x)log2q(x)p(x)
它和熵、交叉熵有一个重要关系式:
H(p,q)=H(p)+DKL(p ∥ q) H(p, q) = H(p) + D_{\mathrm{KL}}(p \,\|\, q) H(p,q)=H(p)+DKL(p∥q)
解释:
- H(p)H(p)H(p):理想最省的平均 bit 数
- H(p,q)H(p, q)H(p,q):你用 qqq 这套"错认知"实际花的平均 bit 数
- 差值 DKLD_{\mathrm{KL}}DKL:额外浪费的 bit,也就是分布不匹配带来的损失
在深度学习中:最小化交叉熵 ⇔ 最小化 KL(p∥q)\mathrm{KL}(p\|q)KL(p∥q)
也就是让模型分布 qqq 逼近真实数据分布 ppp。
Level 3:离散情况的严格定义与性质
这一层更偏"教材风",但仍然聚焦离散情形,公式更严谨。
假设:
- 随机变量 XXX 在有限或可数集合 X\mathcal{X}X 上取值;
- 概率质量函数为 p(x)=P(X=x)p(x) = \mathbb{P}(X = x)p(x)=P(X=x)。
自信息 & 熵
自信息:
I(x)=−logp(x) I(x) = -\log p(x) I(x)=−logp(x)
熵:
H(X)=H(p)=Ep[−logp(X)]=−∑x∈Xp(x)logp(x) H(X) = H(p) = \mathbb{E}p[-\log p(X)] = -\sum{x \in \mathcal{X}} p(x) \log p(x) H(X)=H(p)=Ep[−logp(X)]=−x∈X∑p(x)logp(x)
经典性质:
- 非负性:H(p)≥0H(p) \ge 0H(p)≥0
- 对于给定的状态数 nnn,在所有分布中,均匀分布的熵最大。
- 独立可加性:若 X,YX, YX,Y 独立,则
H(X,Y)=H(X)+H(Y) H(X, Y) = H(X) + H(Y) H(X,Y)=H(X)+H(Y)
信息度量的合理性(Shannon 公理)
如果你期望"熵"满足以下直觉化要求:
- 连续性:概率变化很小,熵也只小幅变化;
- 单调性:对于给定状态数,当分布更均匀时,不确定性更大;
- 可加性:独立系统的联合熵等于各自熵的和;
可以证明,此类"信息度量"一般都必须形如:
H(p)=−K∑xp(x)logp(x) H(p) = -K \sum_x p(x) \log p(x) H(p)=−Kx∑p(x)logp(x)
其中 KKK 为常数,决定单位是 bit 还是 nat。
交叉熵
给定两个分布 p,qp, qp,q,定义:
H(p,q)=−∑xp(x)logq(x) H(p, q) = -\sum_x p(x) \log q(x) H(p,q)=−x∑p(x)logq(x)
你可以把它视作:在真实分布 ppp 下,对 "logq(x)\log q(x)logq(x)" 的期望的相反数。
在统计学习中:
- 最小化经验交叉熵
≈ 最小化真实分布与模型分布之间的 KL 散度
≈ 做最大似然估计(MLE)的近似。
KL 散度(相对熵)
定义:
DKL(p ∥ q)=∑xp(x)logp(x)q(x) D_{\mathrm{KL}}(p \,\|\, q) = \sum_x p(x) \log \frac{p(x)}{q(x)} DKL(p∥q)=x∑p(x)logq(x)p(x)
基本性质:
- 非负性 :
DKL(p ∥ q)≥0 D_{\mathrm{KL}}(p \,\|\, q) \ge 0 DKL(p∥q)≥0
且等号当且仅当 p=qp = qp=q(几乎处处)。 - 非对称性 :一般
DKL(p∥q)≠DKL(q∥p) D_{\mathrm{KL}}(p\|q) \ne D_{\mathrm{KL}}(q\|p) DKL(p∥q)=DKL(q∥p) - 与熵和交叉熵的关系:
DKL(p ∥ q)=H(p,q)−H(p) D_{\mathrm{KL}}(p \,\|\, q) = H(p, q) - H(p) DKL(p∥q)=H(p,q)−H(p)
换句话说:KL 散度就是"错误模型"带来的额外信息开销。
Level 4:连续情形 & 与最大似然/深度学习的关系
这一层更偏"进阶阅读",涉及连续变量和统计学习的统一视角。
连续型随机变量:微分熵、交叉熵与 KL
若随机变量 XXX 在连续空间上取值,密度为 p(x)p(x)p(x),则:
-
微分熵(differential entropy) :
h(X)=−∫p(x)logp(x) dx h(X) = - \int p(x) \log p(x) \, dx h(X)=−∫p(x)logp(x)dx与离散熵不同,它可以为负数。
-
交叉熵 :
H(p,q)=−∫p(x)logq(x) dx H(p, q) = -\int p(x) \log q(x) \, dx H(p,q)=−∫p(x)logq(x)dx -
KL 散度 :
DKL(p ∥ q)=∫p(x)logp(x)q(x) dx D_{\mathrm{KL}}(p \,\|\, q) = \int p(x) \log \frac{p(x)}{q(x)} \, dx DKL(p∥q)=∫p(x)logq(x)p(x)dx
这些定义在高斯分布、连续密度估计、变分推断等场景下广泛使用。
最大似然、交叉熵与 KL:深度学习损失函数的统一理解
设:
- 数据来自某个真实分布 pdata(x)p_{\text{data}}(x)pdata(x)(未知解析形式);
- 模型族为 qθ(x)q_\theta(x)qθ(x)(参数为 θ\thetaθ);
- 观测到样本 x1,...,xnx_1, \dots, x_nx1,...,xn。
最大似然估计(MLE):
θ^MLE=argmaxθ1n∑i=1nlogqθ(xi) \hat{\theta}{\text{MLE}} = \arg\max\theta \frac{1}{n} \sum_{i=1}^n \log q_\theta(x_i) θ^MLE=argθmaxn1i=1∑nlogqθ(xi)
等价于最小化负对数似然:
θ^MLE=argminθ(−1n∑i=1nlogqθ(xi)) \hat{\theta}{\text{MLE}} = \arg\min\theta \left( -\frac{1}{n}\sum_{i=1}^n \log q_\theta(x_i) \right) θ^MLE=argθmin(−n1i=1∑nlogqθ(xi))
当 n→∞n \to \inftyn→∞ 时,有近似:
−1n∑i=1nlogqθ(xi)≈Epdata[−logqθ(X)]=H(pdata,qθ) -\frac{1}{n}\sum_{i=1}^n \log q_\theta(x_i) \approx \mathbb{E}{p{\text{data}}}[-\log q_\theta(X)] = H(p_{\text{data}}, q_\theta) −n1i=1∑nlogqθ(xi)≈Epdata[−logqθ(X)]=H(pdata,qθ)
而又有:
H(p_{\\text{data}}, q_\\theta) = H(p_{\\text{data}}) * D_{\\mathrm{KL}}(p_{\\text{data}} ,\|, q_\\theta)
其中 H(pdata)H(p_{\text{data}})H(pdata) 与 θ\thetaθ 无关,于是:
最小化交叉熵 ⇔ 最小化 KL(pdata∥qθ)\mathrm{KL}(p_{\text{data}}\|q_\theta)KL(pdata∥qθ) ⇔ 最大似然估计。
这给了我们一个统一视角:
- 分类任务里的
cross entropy loss - 语言模型的
next-token negative log-likelihood - 各种分布拟合问题
本质上都在做同一件事:
让模型分布尽可能贴近真实数据分布。
小结
- 熵:刻画系统整体的不确定性,等于平均信息量。
- 信息量:单个结果"有多出乎意料",概率越小、信息量越大。
- 交叉熵 :在真实分布下,使用"假设分布" qqq 来编码/预测时的平均信息代价。
- KL 散度 :交叉熵与真实熵的差值,表示用 qqq 描述 ppp 多付出的代价,是一种分布差异度量。