AI/ML 详解:概率与信息论基础

Day 33 · 2026-06-19 · 难度:数学密集
面向:有编程经验的非 AI 方向工程师

几乎所有 ML 损失函数、生成模型目标、对齐数学,底层都是同一套信息论语言。今天讲清四个原子概念:(量化不确定性)、KL 散度(量化两个分布的差距)、互信息(量化两变量共享多少信息)、ELBO(让 intractable 的贝叶斯推断变可算)。理解它们,你再看 cross-entropy loss、VAE、对比学习就不再是黑箱。

Entropy

信息度量压缩下限
一句话类比

熵就是一份数据「理论上的最优压缩字节数下限」——你熟悉的 gzip、Huffman 编码,压到极限能压多小,由熵决定。一个全是 AAAA... 的文件熵接近 0(gzip 能压到几乎没有),一个真随机字节流熵最大(压不动)。熵 = 这份数据的「真实信息含量」,与你用什么编码无关。

它解决什么问题 + 工作机制

Shannon 1948 年要回答一个工程问题:通信信道里,一条消息最少需要多少 bit 才能无损传输?这就要先量化「信息量」。核心直觉是 惊讶度(surprise / self-information)

单个事件的信息量 = −log p(x)

越罕见的事件(p 越小)信息量越大——「太阳明天升起」p≈1,信息量≈0,没人会转发;「明天下陨石」p 极小,信息量爆炸,上头条。用 log 是因为信息要可加:两个独立事件一起发生,信息量应当相加,而概率是相乘的,log 正好把乘法变加法。底数取 2 时单位是 bit。

熵就是惊讶度的期望(按概率加权平均)——「平均每个事件带来多少信息」:

H(X) = −Σ p(x) log p(x) = E[ −log p(x) ]

分布越均匀(每个结果都可能),熵越大;分布越尖锐(某个结果几乎必然),熵越小。公平硬币 H=1 bit,灌铅到 99% 正面的硬币 H≈0.08 bit。

均匀分布(高熵,难压缩)    → H 大

尖锐分布(低熵,好压缩)    → H 小
代码示例
import numpy as np

def entropy(p, base=2):
    p = np.asarray(p, dtype=float)
    p = p[p > 0]                       # log(0) 无定义,丢掉零概率项
    return -np.sum(p * np.log(p) / np.log(base))

print(entropy([0.5, 0.5]))            # 1.0  公平硬币 = 1 bit
print(entropy([0.99, 0.01]))          # 0.08 几乎确定,信息量极低
print(entropy([0.25, 0.25, 0.25, 0.25])) # 2.0  4 个等概率事件 = 2 bit
# 直觉验证:4 个等概率结果需要 2 bit 编码(00/01/10/11),熵正好 = 2
常见误区 + 实践场景
误区:「熵越高 = 越混乱 = 越坏」。在信息论里熵是中性度量,不带价值判断。高熵意味着不可预测、信息密度高——一个好的密码、一段无冗余的压缩数据,熵都很高,这是优点。把熵直接等同于「坏的混乱」会误导你对模型输出多样性、采样温度的理解(高温 = 提高输出分布的熵)。
📌 BigCat 场景:评估你的「AI 超级个体」知识库去重质量。把每篇笔记的词频分布算熵,异常低熵的文档往往是模板复制、自动生成的水文(信息含量低);高熵且与已有内容互信息低的才是真增量。用熵做信息密度过滤器,比按字数筛靠谱得多。
Takeaway + 思考题
💡 熵 = 不确定性 = 最优压缩下限 = 平均信息量,三种说法是同一件事。它是后面三个概念的「计量单位」。
🤔 LLM 生成时的「温度(temperature)」直接调节输出分布的熵。如果把温度调到 0,输出熵≈0(永远选最高概率词),这和「确定性 = 零信息」在哲学上意味着什么?

KL 散度KL Divergence

分布差距交叉熵非对称
一句话类比

KL 散度 = 用错统计直方图的代价。数据库查询优化器靠列的统计分布(histogram)估基数、选执行计划。如果真实数据分布是 P,优化器却拿着一份过期的、偏差的分布 Q 去做决策——白白多扫的行数、多花的 I/O,就是 KL(P‖Q)。分布估得越偏,代价越大;估得完全准,代价为 0。

它解决什么问题 + 工作机制

需求:量化「真实分布 P」和「我的近似分布 Q」差多远。信息论的答案极优雅——用为 Q 设计的最优编码去压缩实际来自 P 的数据,平均每个符号多花的 bit 数

KL(P‖Q) = Σ p(x) log( p(x) / q(x) )

拆开看更清楚,它正好等于交叉熵减去真实熵

交叉熵 H(P,Q) = H(P) + KL(P‖Q)
交叉熵 H(P,Q)=真实熵 H(P)+KL(P‖Q) ≥ 0
「用 Q 编码 P 的总成本」 = 「P 本身不可压的下限」 + 「因为用错分布多付的罚款」

这就是整个深度学习训练的底层逻辑:分类任务最小化 cross-entropy loss,而 H(P) 是数据固有常数,所以最小化交叉熵 = 最小化 KL(P‖Q) = 让模型预测分布 Q 逼近真实标签分布 P。你天天用的 cross-entropy loss,本质是在压缩 KL。

三个关键性质:(1) KL ≥ 0,当且仅当 P=Q 时为 0;(2) 非对称:KL(P‖Q) ≠ KL(Q‖P)——它不是距离!(3) 方向有语义:forward KL(最小化 KL(P‖Q))倾向「覆盖 P 的所有模式」(mean-seeking,会糊在一起),reverse KL(最小化 KL(Q‖P))倾向「锁定一个模式」(mode-seeking,会漏掉其他峰)。VAE、变分推断用 reverse KL,所以 VAE 生成图像偏「保守、糊」。

代码示例
import numpy as np

def kl(p, q):
    p, q = np.asarray(p,float), np.asarray(q,float)
    return np.sum(np.where(p > 0, p * np.log(p / q), 0))  # p=0 处贡献为 0

p = [0.5, 0.5]
q = [0.9, 0.1]
print(kl(p, q))   # 0.51  用偏的 Q 编码 P,多付 0.51 nat
print(kl(q, p))   # 0.37  反方向 ≠ 正方向,证明非对称
# 工程含义:训练里「真实标签 P 在前、模型预测 Q 在后」的方向不能写反,
# 写反了优化的目标就变了(mean-seeking vs mode-seeking)
常见误区 + 实践场景
误区:「KL 散度是两个分布之间的距离」。它不是数学意义上的距离——既不对称(KL(P‖Q)≠KL(Q‖P)),也不满足三角不等式。把它当距离用会在推导时埋雷。要真正的对称距离,用 JS 散度(Jensen-Shannon)或 Wasserstein 距离。
📌 BigCat 场景:监控线上数据漂移(data drift)。把上线时的特征分布存为 P,每天线上实际分布算 Q,用 KL(P‖Q) 当漂移告警指标——KL 突然飙高说明输入分布偏离训练假设,模型可能要失准。这正是你分布式系统监控直觉的迁移:KL 就是「分布层面的 diff」。
Takeaway + 思考题
💡 KL 散度 = 交叉熵 − 真实熵 = 用错分布的「编码罚款」。最小化 cross-entropy loss 本质就是最小化 KL。
🤔 RLHF / DPO 的目标函数里有一个「KL 惩罚项」,把对齐后的模型拉住、别离原始模型太远。为什么是 KL 而不是别的差异度量?如果去掉这个 KL 约束会发生什么(提示:reward hacking)?

互信息Mutual Information

变量依赖非线性相关
一句话类比

互信息 = 两张表之间的函数依赖强度(functional dependency)。数据库里如果知道 zip_code 几乎就能推出 city,这两列高度冗余——互信息高。如果两列完全独立(知道一个对另一个毫无帮助),互信息为 0。互信息量化的是「知道 X 能帮你消除多少关于 Y 的不确定性」。

它解决什么问题 + 工作机制

痛点:皮尔逊相关系数(Pearson correlation)只能抓线性关系。Y = X² 这种强依赖,相关系数可能是 0,会骗你说「无关」。互信息抓任意形式的统计依赖。定义有两个等价视角:

I(X;Y) = H(X) − H(X|Y) = H(Y) − H(Y|X)

第一视角:X 原本的不确定性,减去「已知 Y 之后」X 剩下的不确定性——差值就是 Y 替你消除掉的那部分不确定性。完全独立时知道 Y 没用,差值为 0;完全决定时知道 Y 就锁死 X,差值 = H(X)。

I(X;Y) = KL( p(x,y) ‖ p(x)p(y) )

第二视角更深刻:互信息就是「真实联合分布」偏离「假装两者独立」的 KL 散度。如果真独立,p(x,y)=p(x)p(y),KL=0。偏离越远,依赖越强。一句话:互信息 = 独立性被违反的程度

经典信息图(把熵想成集合面积):

 H(X|Y)  I(X;Y)  H(Y|X) 
└──── H(X) ────┘     
           └──── H(Y) ────┘
两圆重叠部分 = 互信息(共享信息);各自独占 = 条件熵(私有信息)
代码示例
import numpy as np
from sklearn.feature_selection import mutual_info_regression
from scipy.stats import pearsonr

np.random.seed(0)
x = np.random.uniform(-3, 3, 2000)
y = x**2 + np.random.normal(0, 0.1, 2000)   # 强非线性依赖

print(pearsonr(x, y)[0])                      # ≈ 0.01  线性相关骗你说「无关」
print(mutual_info_regression(x.reshape(-1,1), y)[0])  # ≈ 1.5  互信息抓到强依赖
# 结论:相关系数=0 不代表独立;互信息才是「真独立」的可靠检测器
常见误区 + 实践场景
误区:「相关系数为 0 = 两变量独立」。大错。相关系数 0 只说明没有线性关系,二者完全可能有强非线性依赖(如上面 Y=X²)。真正的独立要求互信息为 0,这是远强于「不相关」的条件。在特征工程里只看相关系数会漏掉大量非线性信号。
📌 BigCat 场景:对比学习(contrastive learning,接 Day 30)的训练目标 InfoNCE 本质是最大化「同一样本的两个视角」之间的互信息下界——让模型学会「哪些信息是跨视角共享的本质特征」。理解这点,你再看 CLIP、SimCLR 为什么 work 就通了:它们都在最大化互信息。
Takeaway + 思考题
💡 互信息 = 知道一个变量能消除多少另一个的不确定性 = 联合分布偏离独立的 KL 散度。它抓任意依赖,是「真独立」的金标准。
🤔 互信息对称:I(X;Y)=I(Y;X),「X 告诉你关于 Y 的」恰好等于「Y 告诉你关于 X 的」。这个对称性在因果推断里是优点还是缺陷(提示:相关 ≠ 因果,互信息能区分因果方向吗)?

证据下界ELBO · Evidence Lower Bound

变分推断VAE 目标近似
一句话类比

ELBO = 用近似查询代替全表精确聚合。你想算一个精确值,但它需要对海量隐藏状态求和/积分——计算上不可行(像在 PB 级表上跑 COUNT(DISTINCT) 精确去重,扫全表会爆)。工程上你怎么办?用 HyperLogLog、采样估算这类可计算的近似,并保证它不会高估真值。ELBO 就是贝叶斯推断里的这个「保证不高估的下界估计」,而且能不断把下界往上顶,逼近真值。

它解决什么问题 + 工作机制

贝叶斯推断的核心障碍:要算证据(evidence) p(x),即数据 x 的边际似然,需要对所有隐变量 z 积分:

p(x) = ∫ p(x,z) dz   ← 通常 intractable(z 维度爆炸)

算不动,怎么办?引入一个可计算的近似后验 q(z),做一个漂亮的恒等分解:

log p(x) = ELBO(q) + KL( q(z) ‖ p(z|x) )
log p(x) 目标(常数)=ELBO 我们能算+KL ≥ 0 近似误差
因为 KL ≥ 0,所以 ELBO ≤ log p(x):ELBO 永远是 evidence 的下界。
最大化 ELBO ⇒ 同时把下界顶高 + 缩小 KL(让 q 逼近真后验 p(z|x))——一箭双雕

ELBO 本身可以拆成两个有直觉的项:

ELBO = Eq[ log p(x|z) ] − KL( q(z) ‖ p(z) )

第一项 = 重构项:从隐变量 z 解码回 x 能还原得多好(越像原数据越高)。第二项 = 正则项:近似后验 q(z) 别偏离先验 p(z) 太远(通常先验是标准正态)。这正是 VAE(变分自编码器)的损失函数——Kingma & Welling 2013 的 Auto-Encoding Variational Bayes:encoder 产出 q(z|x),decoder 算 p(x|z),训练就是最大化 ELBO。Diffusion 模型、变分推断全建在这套框架上。

代码示例
import torch
import torch.nn.functional as F

def vae_loss(x, x_recon, mu, logvar):
    # 第一项:重构项(负号因为要最大化 ELBO = 最小化 -ELBO)
    recon = F.binary_cross_entropy(x_recon, x, reduction='sum')
    # 第二项:KL( q(z|x)=N(mu,σ²) ‖ p(z)=N(0,1) ),高斯有闭式解
    kl = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
    return recon + kl          # = -ELBO,最小化它 = 最大化 ELBO

# 直觉:recon 逼模型「学会还原数据」,kl 逼隐空间「贴近标准正态、别乱长」。
# 两者拉锯 —— 这就是 VAE 生成又连续又稍糊的根本原因。
常见误区 + 实践场景
误区:「最大化 ELBO 就是在直接算 evidence」。不是。ELBO 与真实 log p(x) 之间永远隔着一个 gap = KL(q‖p(z|x))。只有当近似后验 q 完美等于真后验时 gap 才为 0。所以 ELBO 是下界估计,不是精确值;q 的表达能力(family)限制了能逼多近。这也是「变分」二字的来历——在一族 q 里变分搜索最优近似。
📌 BigCat 场景:把 ELBO 的思维模式迁移到决策辅助——当一个量「精确算不动」时,找一个可计算的、方向有保证(下界/上界)的代理指标,再持续优化它逼近真值。这和你做分布式系统时「用近似一致性 + 单调收敛」替代「强一致性精确解」是同一种工程哲学:放弃精确、保证方向、迭代逼近。
Takeaway + 思考题
💡 ELBO 把 intractable 的 evidence 变成可优化的下界:log p(x) = ELBO + KL,最大化 ELBO 同时逼近真后验。它 = 重构项 − KL 正则项,是 VAE / 变分推断 / diffusion 的共同地基。
🤔 ELBO 里重构项和 KL 项在拉锯:KL 权重调大,隐空间更规整但重构更糊(β-VAE 就在调这个权重)。这个「保真 vs 规整」的取舍,和你熟悉的「一致性 vs 可用性」(CAP)在结构上是不是同一类张力?

深入资源Further Reading

深入思考Deep Questions

1. 为什么几乎所有分类模型都用 cross-entropy loss,而不是更直观的「预测错误率」或 MSE?
三层原因。信息论层:最小化交叉熵 = 最小化 KL(真实分布‖预测分布),等价于让模型分布逼近数据分布——这是有理论保证的「学到真实分布」,而错误率只看对错、丢掉了「错得多离谱」的信息。梯度层:交叉熵配 softmax,梯度是干净的 (预测−标签),不会像 MSE+sigmoid 那样在预测极端错误时梯度反而趋零(饱和),训练不动。概率层:交叉熵是「最大似然估计」的直接体现——最小化交叉熵 = 最大化训练数据的对数似然,统计学上是渐近最优估计量。错误率不可微、没法直接梯度下降;MSE 假设高斯噪声,不匹配分类的离散类别结构。所以交叉熵不是工程偏好,是从信息论 / 极大似然 / 优化三个方向共同指出的「正确答案」。
2. KL 散度的非对称性 KL(P‖Q)≠KL(Q‖P) 不是「数学瑕疵」,而是有深刻语义。forward 和 reverse KL 在生成模型里分别导致什么行为?
这是理解生成模型「画风」的钥匙。Forward KL,最小化 KL(P‖Q)(P 真实、Q 模型):在 P 有概率质量的地方,Q 必须也有,否则 log(p/q) 中 q→0 会让代价爆炸——结果 Q 被迫「覆盖 P 的所有模式」,即 mean-seeking / mode-covering。代价是当 P 是多峰分布时,Q 会糊在峰之间的低概率区,生成出「四不像」。最大似然训练就是 forward KL,这是早期 VAE 输出偏糊的一个原因。Reverse KL,最小化 KL(Q‖P):只要 Q 把质量放在 P 高的地方就行,可以安心忽略 P 的其他峰——结果 mode-seeking / mode-collapse:锁定一个峰,画得清晰但多样性差。变分推断、部分 GAN 训练倾向 reverse KL,所以会有 mode collapse 问题。一句话:forward KL「宁可糊也不漏」,reverse KL「宁可漏也要清」。选哪个方向,等于在「多样性 vs 保真度」之间表态。
3. 熵、KL、互信息、ELBO 看似四个概念,能不能用「KL 是唯一原子」把它们串成一棵树?
可以,而且这棵树很优雅。KL 是底层原子。(1) 是 KL 的退化特例方向:交叉熵 H(P,Q)=H(P)+KL(P‖Q),当 Q 取均匀分布时,KL(P‖均匀) = log N − H(P),所以熵 = 最大熵减去「P 离均匀有多远」的 KL。(2) 互信息直接就是 KL:I(X;Y)=KL(联合 p(x,y) ‖ 独立 p(x)p(y))——衡量「联合偏离独立」的 KL。(3) ELBO由 KL 定义出生:log p(x)=ELBO+KL(q‖真后验),ELBO 就是「证据减去近似的 KL gap」。所以四者本质是「用 KL 衡量某两个分布的差距」在不同对象上的应用:熵 = 对均匀的 KL(取负调整),互信息 = 联合对独立的 KL,ELBO = 近似对真后验的 KL。掌握「KL 衡量分布差距」这一个直觉,四个概念全部贯通——这也是为什么信息论能成为整个深度学习的统一语言。
4. 信息论的「熵」和物理学(热力学 / 统计力学)的「熵」是同名巧合,还是同一个东西?这对理解智能 / 生命有什么启发?
不是巧合,是同一个数学对象在不同语境的实例。玻尔兹曼的统计力学熵 S=k·ln W(W 是微观状态数)和 Shannon 熵 H=−Σp log p,在「均匀分布」假设下数学完全一致——Shannon 当年正是在 von Neumann 建议下沿用了「熵」这个名字。深层联系:两者都度量「宏观可观测之下,微观有多少种可能排列」= 不确定性 = 缺失的信息。这给智能 / 生命一个迷人视角:生命是「局部对抗熵增」的耗散结构——薛定谔《生命是什么》说生命「以负熵为食」。而智能体(包括 LLM)做的事,本质是用观测降低对环境的不确定性(减少熵 / 获取互信息),再据此行动。自由能原理(Friston)更进一步:大脑就是在最小化「预测与现实的差距」——一个 ELBO/变分自由能的最小化器。对追求「意识 × 复杂性科学 × 分布式系统」的人,这条线索把信息论、热力学、神经科学、佛学的「无常 / 不确定」串成了一张网:智能或许就是宇宙局部把不确定性转成结构的过程。
5. ELBO 的「放弃精确解、优化一个有保证的下界」思路,在你的分布式系统经验里有哪些同构的工程模式?
这是一个跨领域的「近似 + 单调保证 + 迭代逼近」元模式,分布式系统里到处都是同构。(1) 最终一致性:放弃强一致性的精确即时解,保证「最终收敛」的方向,用迭代(gossip / anti-entropy 协议——名字里就有 entropy)逼近一致状态。(2) 近似聚合:HyperLogLog / Count-Min Sketch 放弃精确去重 / 计数,换可控误差界的近似,正如 ELBO 放弃精确 evidence 换可计算下界。(3) 限界松弛优化:很多 NP-hard 调度问题用 LP relaxation 求下界,再逐步收紧——和「最大化 ELBO 顶高下界」结构一致。(4) 梯度下降本身:放弃解析最优解,用可计算的局部梯度迭代逼近。共同哲学:当精确解 intractable 时,第一步不是放弃,而是构造一个「方向有保证(单调 / 有界)+ 可计算」的代理量,然后把工程火力全压在迭代优化它上。ELBO 把这个哲学写成了数学;分布式系统把它写成了协议。识别出这个同构,你看新的 ML 目标函数时就有了现成的工程直觉锚点。