信息论里最反直觉的事情,是它的核心度量 logp-\log p 看起来完全像个随手挑的形式,却几乎是被三条无害的要求强制出来的。本文从这一点起步,走完香农体系的主干——熵、条件熵、互信息、KL 散度、最大熵原理——再回到当代深度学习里这些量反复出现的地方:分类损失、VAE 的 ELBO、信息瓶颈、SAC 里的 entropy bonus。

1. 信息量为什么是 logp-\log p

从单个事件的信息量起步。给"事件 xx 发生"这件事赋一个实数 I(x)I(x),代表它给观察者带来的信息。直觉上,这个数应该满足三个要求:

  1. 只依赖概率I(x)I(x) 只是 p(x)p(x) 的函数,记作 I(x)=f(p(x))I(x)=f(p(x));事件的语义不进入度量。
  2. 越罕见越多信息ff(0,1](0,1] 上严格单调递减,f(1)=0f(1)=0(确定发生的事不提供信息)。
  3. 独立事件信息量相加:若 x,yx,y 独立,则 I(x,y)=I(x)+I(y)I(x,y)=I(x)+I(y),亦即 f(pq)=f(p)+f(q)f(pq)=f(p)+f(q)

第三条配上连续性,是一条柯西型函数方程,唯一的连续解族是

f(p)=clogpf(p) = c\log p

要满足单调递减,cc 必须为负。取 c=1c=-1,固定 log\log 的底数 bb,就得到

I(x)=logbp(x)I(x) = -\log_b p(x)

底数只影响单位:b=2b=2 给出 bitb=eb=e 给出 natb=10b=10 给出 dit / hartley。后文除非特别说明,log\log 都用自然对数,结果以 nat 为单位。

这里隐含着一个语义边界:logp-\log p 量的是"惊讶度"或"编码代价",跟事件的语义重要性、效用、价值都无关。一条"明天太阳照常升起"的消息,在 p1p\to 1 的极限下信息量为零,哪怕它对生命体而言重要至极。

2. 熵:信息量的期望

I(x)I(x)pp 下求期望,就得到香农熵:

H(X)=Exp[logp(x)]=xp(x)logp(x)H(X) = \mathbb{E}_{x\sim p}\bigl[-\log p(x)\bigr] = -\sum_{x} p(x)\log p(x)

约定 0log0=00\log 0 = 0(由 limp0+plogp=0\lim_{p\to 0^+} p\log p = 0 取得)。H(X)H(X) 同样以 nat 为单位。

熵至少有三种等价解读,任何一种都足以从头建立整个理论:

解读一:不确定性度量。HH 看成定义在概率单纯形 Δn1\Delta^{n-1} 上的函数,它是严格凹的,在均匀分布处取最大值 logn\log n,在任何退化分布(某个 pi=1p_i = 1)处取最小值 00。这条性质源自 Khinchin 的公理化体系——只用四条公理(连续性、均匀分布上单调、可分性、对零概率事件不敏感)就能反推出 HH 必须是 plogp-\sum p\log p 这一形式(差一个正比例常数)。

解读二:最优编码长度的下界。 对任意 XX 的无前缀(prefix-free)二进制编码,平均码长 LL 满足

LH2(X)L \geq H_2(X)

其中 H2H_2 是以 2 为底的熵。Huffman 编码可以做到 L<H2(X)+1L < H_2(X)+1,算术编码在块长趋于无穷时逼近 H2(X)H_2(X)。换言之,熵是无损压缩的极限,给定信源以下走不通。

解读三:典型集的对数大小。 对 i.i.d. 序列 Xn=X1,,XnX^n = X_1,\dots,X_n,由 AEP(asymptotic equipartition property),存在所谓"典型集" Aϵ(n)A_\epsilon^{(n)},满足 Aϵ(n)2nH2(X)|A_\epsilon^{(n)}|\approx 2^{nH_2(X)} 且总概率趋于 11。所有"几乎会发生的"长序列大致均匀地分布在 2nH2^{nH} 条轨迹上——熵就是这种"有效自由度"的对数。

三种解读看起来风马牛不相及,但都指向同一个量。这种鲁棒性是判断一个数学对象重不重要的可靠信号:如果一个量从多个独立动机出发都自然涌现,它通常就抓住了某种结构性的东西。

3. 联合熵、条件熵、互信息

把熵推到多变量是直接的。对联合分布 p(x,y)p(x,y)

H(X,Y)=x,yp(x,y)logp(x,y)H(X,Y) = -\sum_{x,y} p(x,y)\log p(x,y)H(YX)=Exp(x)[H(YX=x)]=x,yp(x,y)logp(yx)H(Y\mid X) = \mathbb{E}_{x\sim p(x)}\bigl[H(Y\mid X=x)\bigr] = -\sum_{x,y} p(x,y)\log p(y\mid x)

注意条件熵是在 xx 上做外层期望,不是某个特定 xx 处的熵。两者满足链式法则

H(X,Y)=H(X)+H(YX)=H(Y)+H(XY)H(X,Y) = H(X) + H(Y\mid X) = H(Y) + H(X\mid Y)

证明只需展开 logp(x,y)=logp(x)+logp(yx)\log p(x,y)=\log p(x)+\log p(y\mid x),再取期望。链式法则会一直递推到任意多个变量:H(X1,,Xn)=iH(XiX<i)H(X_1,\dots,X_n)=\sum_i H(X_i\mid X_{<i})

把熵看成"集合的大小",链式法则就长得像容斥。这套类比里最有用的对象是互信息——直觉上,它回答的是:知道 YY 能给我们提供多少关于 XX 的"新信息",也就是 XXYY 之间的依赖(相关)程度。

I(X;Y)=H(X)H(XY)=H(Y)H(YX)=H(X)+H(Y)H(X,Y)I(X;Y) = H(X) - H(X\mid Y) = H(Y) - H(Y\mid X) = H(X) + H(Y) - H(X,Y)

H(X)H(XY)H(X) - H(X\mid Y) 这个写法可以直接读出来:XX 的不确定性原本是 H(X)H(X),已知 YY 后还剩 H(XY)H(X\mid Y),差值就是 “YY 替我们消掉了 XX 多少不确定性”,等同于 “YY 关于 XX 提供了多少信息”。它在维恩图里就是两个圆的交集面积。代入定义可以直接写成

I(X;Y)=x,yp(x,y)logp(x,y)p(x)p(y)I(X;Y) = \sum_{x,y} p(x,y)\log\frac{p(x,y)}{p(x)p(y)}

这个形式提示了它的另一个身份——联合分布 p(x,y)p(x,y) 与边际乘积 p(x)p(y)p(x)p(y) 之间的 KL 散度。互信息度量的是"XXYY 偏离独立的程度",且具有几条非常友好的性质:

  • I(X;Y)0I(X;Y) \geq 0,等号当且仅当 XYX\perp Y
  • 对称性:I(X;Y)=I(Y;X)I(X;Y)=I(Y;X)
  • 在可逆变换下不变:I(f(X);g(Y))=I(X;Y)I(f(X);g(Y)) = I(X;Y)f,gf,g 一一映射

最后一条是为什么 ML 里更喜欢用 II 而不是直接用相关系数——后者只能捕捉线性关系,且对单调变换不稳定。

数据处理不等式

如果 XYZX\to Y\to Z 构成马尔可夫链(ZZ 在给定 YY 后与 XX 条件独立),那么

I(X;Z)I(X;Y)I(X;Z) \leq I(X;Y)

证明从链式法则出发:I(X;Y,Z)=I(X;Y)+I(X;ZY)=I(X;Z)+I(X;YZ)I(X;Y,Z)=I(X;Y)+I(X;Z\mid Y)=I(X;Z)+I(X;Y\mid Z)。马尔可夫性使 I(X;ZY)=0I(X;Z\mid Y)=0,又 I(X;YZ)0I(X;Y\mid Z)\geq 0,结论直接得到。

这条不等式有一个朴素但深刻的含义:对数据做任何后处理都不能增加它关于源信号的信息。神经网络的每一层都是一次后处理,所以严格意义上每过一层 I(X;T)I(X;T_\ell) 只会下降。这是 Tishby 的 Information Bottleneck 把"压缩"与"泛化"挂钩的起点,我们在第 7 节会再看到它。

4. KL 散度:相对熵与编码代价

互信息已经用到了 KL 散度,现在正式展开。对两个定义在同一可测空间上的分布 P,QP,Q

DKL(PQ)=xp(x)logp(x)q(x)=ExP[logp(x)q(x)]D_{\mathrm{KL}}(P\Vert Q) = \sum_x p(x)\log\frac{p(x)}{q(x)} = \mathbb{E}_{x\sim P}\Bigl[\log\frac{p(x)}{q(x)}\Bigr]

约定 0log00=00\log\frac{0}{0}=0;若存在 xx 使 p(x)>0p(x)>0q(x)=0q(x)=0,则 DKL=D_{\mathrm{KL}}=\infty(这是后面 GAN 训练里 KL 爆炸的根源之一)。

KL 散度的几条核心性质:

  • 非负性(Gibbs 不等式):DKL(PQ)0D_{\mathrm{KL}}(P\Vert Q)\geq 0,等号当且仅当 P=QP=Q 几乎处处。证明用 logxx1\log x\leq x-1
  • 非对称DKL(PQ)DKL(QP)D_{\mathrm{KL}}(P\Vert Q)\neq D_{\mathrm{KL}}(Q\Vert P) 一般成立。
  • 不是距离:不满足三角不等式,也不对称。“散度"这个词就是用来强调"不是距离但还是某种 discrepancy”。

编码视角:用 QQ 设计的最优码(每个 xxlogq(x)-\log q(x) 比特表示)去编码服从 PP 的数据,平均码长是

H(P,Q):=ExP[logq(x)]=H(P)+DKL(PQ)H(P,Q) := \mathbb{E}_{x\sim P}[-\log q(x)] = H(P) + D_{\mathrm{KL}}(P\Vert Q)

左边是交叉熵。所以 KL 就是"用错了分布"所付的多余码长。这一物理解读使得"DKL=0D_{\mathrm{KL}}=0 当且仅当 P=QP=Q" 显得几乎是定义性的:错误码长为零,编码方案必然就是最优的。

与最大似然的等价性

设训练数据是 p^data\hat p_{\text{data}}(经验分布),模型是参数化族 pθp_\theta。最大化对数似然:

maxθExp^data[logpθ(x)]=maxθ(H(p^data,pθ))=minθDKL(p^datapθ)\max_\theta \mathbb{E}_{x\sim \hat p_{\text{data}}}[\log p_\theta(x)] = \max_\theta \bigl(-H(\hat p_{\text{data}},p_\theta)\bigr) = \min_\theta D_{\mathrm{KL}}(\hat p_{\text{data}}\Vert p_\theta)

第一步用了 H(p^data)H(\hat p_{\text{data}})θ\theta 无关。这给了交叉熵损失一个不假外求的解释:分类任务最小化交叉熵,本质上是在最小化经验分布到模型分布的 KL 散度,与最大似然估计完全等价。深度学习里几乎所有"用 softmax + 交叉熵"的设定都共享这一身份。

非对称的实际后果:mode-seeking vs mass-covering

DKL(PQ)D_{\mathrm{KL}}(P\Vert Q)DKL(QP)D_{\mathrm{KL}}(Q\Vert P) 的不对称对学习行为有明显影响。考虑 PP 是多模态的真实分布,用单模态的 QQ 去近似:

  • 正向 KL DKL(PQ)D_{\mathrm{KL}}(P\Vert Q):被 p(x)>0p(x)>0 处的 logq(x)\log q(x) 主导,迫使 QQ 在所有 PP 有质量的地方都不能太小——mass-coveringQQ 倾向于覆盖所有模态,可能产生模糊的折中。
  • 反向 KL DKL(QP)D_{\mathrm{KL}}(Q\Vert P):被 q(x)>0q(x)>0 处的 logp(x)\log p(x) 主导,禁止 QQPP 接近零的地方放质量——mode-seekingQQ 会塌缩到 PP 的某一个模态。

VAE 的 ELBO 用的是反向 KL(DKL(qϕ(zx)p(zx))D_{\mathrm{KL}}(q_\phi(z\mid x)\Vert p(z\mid x))),这是它倾向于产生过度平滑、模式塌缩样本的根本原因之一。GAN 在某种近似下对应反向 KL,所以也常出现 mode collapse。Diffusion 之所以更稳,部分原因是它的训练目标在每个噪声尺度上等价于一个加权的去噪得分匹配,绕开了直接最小化端到端 KL。

5. 微分熵:连续变量上的几个差别

plogp-\sum p\log p 平移到连续情形:

h(X)=p(x)logp(x)dxh(X) = -\int p(x)\log p(x)\,\mathrm dx

记号上用小写 hh 与离散 HH 区分。这个量看起来是自然推广,但有几个性质和离散熵截然不同,容易混淆。

可以为负。 把方差很小的高斯 N(0,σ2)\mathcal N(0,\sigma^2) 代入:

h(X)=12log(2πeσ2)h(X) = \tfrac{1}{2}\log(2\pi e\sigma^2)

σ2<12πe0.0585\sigma^2 < \frac{1}{2\pi e}\approx 0.0585h(X)<0h(X)<0。直觉上没有矛盾——离散熵的非负性来自 pi1p_i\leq 1 使 logpi0\log p_i\leq 0,但概率密度可以远大于 11,没有理由保证 logp(x)0\log p(x)\leq 0

不是坐标变换不变量。Y=aXY=aX,雅可比给出 pY(y)=pX(y/a)/ap_Y(y)=p_X(y/a)/|a|,代入定义可得

h(aX)=h(X)+logah(aX) = h(X) + \log|a|

XX 放大 aa 倍,微分熵会平移 loga\log|a|。这意味着"h(X)h(X) 的绝对数值"在物理上没有不依赖单位的含义——把米换成厘米,熵就涨 log100\log 100 nat。

但 KL 和互信息仍然良定且不变。 直接计算:

DKL(PYQY)=pY(y)logpY(y)qY(y)dy=DKL(PXQX)D_{\mathrm{KL}}(P_Y\Vert Q_Y) = \int p_Y(y)\log\frac{p_Y(y)}{q_Y(y)}\,\mathrm dy = D_{\mathrm{KL}}(P_X\Vert Q_X)

雅可比在分子分母里抵消。互信息同理。这是为什么深度学习中我们到处用 KL、cross-entropy、I(X;Y)I(X;Y),却很少直接用微分熵——前者是真正的"物理量",后者只是个相对参考。

给定约束下的最大熵分布

微分熵的一个重要用途,是回答"在某某约束下,哪个分布最难预测"。三个经典结果:

  • 支撑有界 [a,b][a,b]:最大熵分布是 Uniform(a,b)\mathrm{Uniform}(a,b)h=log(ba)h=\log(b-a)
  • x0x\geq 0E[X]=μ\mathbb E[X]=\mu 固定:最大熵分布是指数分布 p(x)=1μex/μp(x)=\tfrac{1}{\mu}e^{-x/\mu}h=1+logμh=1+\log\mu
  • E[X]=μ,Var(X)=σ2\mathbb E[X]=\mu, \mathrm{Var}(X)=\sigma^2 固定:最大熵分布是高斯 N(μ,σ2)\mathcal N(\mu,\sigma^2)h=12log(2πeσ2)h=\tfrac{1}{2}\log(2\pi e\sigma^2)

最后一条尤其重要:在所有方差固定的实值分布中,高斯熵最大。这给了"做先验假设时偏好高斯"一个客观依据——在只知道均值和方差的情况下,选高斯就是选了"假设最少"(=熵最大)的分布。它也是 VAE 让先验 p(z)=N(0,I)p(z)=\mathcal N(0,I) 之所以"无害"的理论支撑。

6. 最大熵原理:一种构造分布的方法

上一节末尾列出的"约束 + 最大熵"对应表,背后是一条统一的原理:在所有满足给定经验约束的分布中,选熵最大的那个。这一原理由 Jaynes 在 1957 年正式提出,物理动机来自统计力学,但作为一种统计推断方法,它的适用范围远不止物理。

拉格朗日乘子推导

设我们要选一个定义在某空间上的分布 p(x)p(x),已知它满足若干形如 Ep[fi(X)]=ci\mathbb E_p[f_i(X)] = c_i 的约束(i=1,,ki=1,\dots,k),以及归一化 pdx=1\int p\,\mathrm dx = 1。在这些约束下最大化 h(p)=plogpdxh(p) = -\int p\log p\,\mathrm dx

拉格朗日量:

L=plogpdxλ0(pdx1)i=1kλi(fipdxci)\mathcal L = -\int p\log p\,\mathrm dx - \lambda_0\Bigl(\int p\,\mathrm dx - 1\Bigr) - \sum_{i=1}^k \lambda_i\Bigl(\int f_i p\,\mathrm dx - c_i\Bigr)

p(x)p(x) 变分求导并置零:

logp(x)1λ0iλifi(x)=0-\log p(x) - 1 - \lambda_0 - \sum_i \lambda_i f_i(x) = 0

解出

p(x)=1Z(λ)exp(i=1kλifi(x))\boxed{\,p(x) = \frac{1}{Z(\lambda)}\exp\Bigl(-\sum_{i=1}^k \lambda_i f_i(x)\Bigr)\,}

其中 Z(λ)=exp(iλifi(x))dxZ(\lambda)=\int \exp(-\sum_i\lambda_i f_i(x))\,\mathrm dx 是归一化常数。{λi}\{\lambda_i\} 由约束 Ep[fi]=ci\mathbb E_p[f_i]=c_i 反解出来。

这个形式有名字:指数族。它告诉我们一件相当深的事——在自然界中我们偏爱的"经典分布"几乎全是某种最大熵分布。

约束最大熵分布
支撑有界均匀分布
E[X]\mathbb E[X] 固定,X0X\geq 0指数分布
E[X],Var(X)\mathbb E[X], \mathrm{Var}(X) 固定高斯分布
E[logX],E[X]\mathbb E[\log X], \mathbb E[X] 固定Gamma 分布
分类 logits E[f(X)]\mathbb E[\mathbf f(X)] 固定玻尔兹曼 / Softmax
二阶矩固定(向量情形)多元高斯

Softmax 是最大熵策略

最后一行特别值得注意。考虑一个离散动作空间 A\mathcal A,我们希望策略 π(a)\pi(a) 在约束 Eπ[f(a)]=μ\mathbb E_\pi[\mathbf f(a)] = \boldsymbol\mu 下熵最大。代入上面的公式:

π(a)=exp(λf(a))aexp(λf(a))\pi(a) = \frac{\exp(\boldsymbol\lambda^\top \mathbf f(a))}{\sum_{a'}\exp(\boldsymbol\lambda^\top \mathbf f(a'))}

这就是 softmax 的来源。当 f(a)\mathbf f(a) 就是某个标量"分数"或 “logit"时,softmax 即"在期望 logit 固定的约束下熵最大的离散分布”。深度学习里 softmax 几乎是默认的离散输出激活,这个选择有客观的最大熵最优性背书,不只是历史习惯。

同样的逻辑解释了为什么在物理学中 Boltzmann 分布 p(state)eE/kTp(\text{state})\propto e^{-E/kT} 是平衡态的描述:给定平均能量约束 E[E]=Eˉ\mathbb E[E]=\bar E,最大熵就给出指数族形式,kTkT 就是拉格朗日乘子的倒数。统计物理与统计学习其实是一回事,温度 TT 在 RL 里就直接出现在最大熵策略的"温度参数"α\alpha 中。

7. 在深度学习里反复出现的形态

第 1—6 节几乎都是 1948—1957 年间就定型的内容。但这套理论在当代深度学习里反复出现,下面挑几个最常碰到的场景。

7.1 分类损失就是 KL 散度

第 4 节已经推过——分类问题最小化交叉熵等价于最小化 DKL(p^datapθ)D_{\mathrm{KL}}(\hat p_{\text{data}}\Vert p_\theta),也等价于最大似然。这就是为什么 CrossEntropyLoss 在 PyTorch 里几乎是分类的默认配置:它的统计学身份就是 KL 散度在 one-hot 标签下的退化形式,并非某种工程上拍脑袋选的"经验损失"。

具体地,当 ground truth 是 one-hot yiy_i,模型输出为 softmax 概率 p^i\hat p_i

L=iyilogp^i=logp^c\mathcal L = -\sum_i y_i \log \hat p_i = -\log \hat p_{c^*}

其中 cc^* 是真实类别。这就是 negative log-likelihood,本质上是"用 p^\hat p 编码真实样本所付的码长"。

7.2 VAE 的 ELBO

VAE 的目标是优化对数边际似然 logp(x)\log p(x),但它含有不可解的积分 p(xz)p(z)dz\int p(x\mid z)p(z)\,\mathrm dz。引入变分后验 qϕ(zx)q_\phi(z\mid x),可以做如下分解:

logp(x)=Eqϕ[logp(xz)]DKL(qϕ(zx)p(z))+DKL(qϕ(zx)p(zx))\log p(x) = \mathbb E_{q_\phi}[\log p(x\mid z)] - D_{\mathrm{KL}}\bigl(q_\phi(z\mid x)\Vert p(z)\bigr) + D_{\mathrm{KL}}\bigl(q_\phi(z\mid x)\Vert p(z\mid x)\bigr)

最后一项非负且不可计算,丢掉它得到 ELBO(变分下界):

ELBO=Eqϕ[logp(xz)]重构DKL(qϕ(zx)p(z))正则\mathrm{ELBO} = \underbrace{\mathbb E_{q_\phi}[\log p(x\mid z)]}_{\text{重构}} - \underbrace{D_{\mathrm{KL}}(q_\phi(z\mid x)\Vert p(z))}_{\text{正则}}

两个 KL 在这里同时出现:一个被显式优化(正则项),一个被默默承受(变分推断的 gap)。β\beta-VAE 就是把正则项乘上 β\beta,强制 qϕq_\phi 更接近 p(z)p(z)——但这会让 ELBO 不再是 logp(x)\log p(x) 的下界,变成"信息瓶颈视角下"的另一个目标。

7.3 信息瓶颈

Tishby 提出:一个好的中间表示 TT,应当最大化与标签的互信息 I(T;Y)I(T;Y),同时最小化与输入的互信息 I(T;X)I(T;X)。也就是

LIB=I(T;Y)βI(T;X)\mathcal L_{\mathrm{IB}} = I(T;Y) - \beta\, I(T;X)

把这两项理解为"保留预测信息"和"压缩冗余信息"。深度学习中很难直接计算 I(T;X)I(T;X)(高维连续变量上的互信息估计本身就是个未解决的问题),但 IB 给了一个有用的指导思想:训练过程可以看成在某个 β\beta 下的 IB 解,泛化能力与压缩程度挂钩。

值得说明的是,Tishby 后来把 IB 推到了"深度学习训练分为 fitting 阶段和 compression 阶段"的强论断,而 Saxe 等人用更严格的实验反驳了这个分阶段现象的普适性。理论本身依然有用,但"DNN 训练动力学 = IB 动力学"这一命题在 2026 年仍是开放问题,不应作为既定事实引用。

7.4 最大熵强化学习(SAC)

第 6 节给出的"softmax 是最大熵策略"在强化学习里被直接采用。Soft Actor-Critic 把目标改为

J(π)=tE(st,at)ρπ[r(st,at)+αH(π(st))]J(\pi) = \sum_t \mathbb E_{(s_t,a_t)\sim \rho_\pi}\Bigl[r(s_t,a_t) + \alpha\, \mathcal H(\pi(\cdot\mid s_t))\Bigr]

第二项就是策略熵的奖励。α\alpha 是温度参数,对应第 6 节里"约束—乘子"对偶中的温度(kTkT 类比)。这一项的实际作用:

  1. 鼓励探索:策略不愿意过早确定到某个动作,自动维持多样性。
  2. 多解鲁棒性:如果存在多个奖励近似最优的动作,最大熵会给它们都分配质量,比 vanilla policy gradient 稳得多。
  3. 温度自适应:SAC 实现里 α\alpha 可以自动调整以满足目标熵约束——这又是一个第 6 节里"用拉格朗日乘子反求约束分布"的具体实例。

7.5 KL 在 RLHF / 偏好对齐中

近两年最普及的 KL 应用大概是 RLHF。PPO 阶段的目标含有

L=E[rϕ(x,y)]βDKL(πθ(yx)πref(yx))\mathcal L = \mathbb E\bigl[r_\phi(x,y)\bigr] - \beta\, D_{\mathrm{KL}}\bigl(\pi_\theta(y\mid x)\Vert \pi_{\text{ref}}(y\mid x)\bigr)

KL 项防止策略偏离参考模型太远,避免奖励模型外推到训练分布之外。DPO 进一步把这个目标解析积分掉,得到一个只依赖偏好对的闭式损失,但其推导起点仍然是这个带 KL 约束的 RL 目标。

KL 在这里的角色与其说是"正则项",不如说是"信任域"——它锚定了策略不能跑得太远的边界。