基础 · 03

概率与信息论的几何直觉

分布是形状,熵衡量它有多「不确定」,交叉熵是「用 Q 描述 P 需要多少 bit」。一篇文章看清贝叶斯、MLE、MAP 与正则化的概率本质。

25 min read

为什么 ML 是概率游戏

一个分类器看到一张图说「这是猫」,它真正在做的是输出一组概率:

softmax([z,z,z,z])=[0.87, 0.10, 0.02, 0.01]\mathrm{softmax}([z_{\text{猫}}, z_{\text{狗}}, z_{\text{鸟}}, z_{\text{鱼}}]) = [0.87,\ 0.10,\ 0.02,\ 0.01]

LLM 生成下一个 token 也一样——给词表里每个 token 都打一个概率,再从里面采样。所有现代 ML 模型的输出本质都是一个分布,不是「答案本身」。

要训练这种模型,就必须能回答:

  • 怎么衡量「这个分布有多不确定」? → 熵
  • 怎么衡量「模型预测的分布和真实分布有多接近」? → 交叉熵 / KL 散度
  • 怎么从数据里反推出最好的分布参数? → 最大似然估计
  • 怎么把「先验信念」融合进来? → 贝叶斯 / MAP

这些量是分类、生成、强化学习几乎所有损失函数的底料。这篇把它们一个个画清楚。

分布:一个形状

把一个离散概率分布画成柱状图——每个柱子的高度就是那个事件发生的概率。这些柱子加起来必须等于 1。

骰子是均匀分布(6 个等高柱子)。一个有偏好的预测(比如「这张图大概率是猫」)是的(一根柱子很高,其他很矮)。

「分布」这个词听起来抽象,但几何上就只是一个形状。这个形状可以被参数控制——调参数就是在捏形状。接下来我们看几个 ML 里最常见的形状。

常见概率分布

机器学习里反复出现的分布就那么几个,每个都对应一种典型的现实场景。

伯努利分布(Bernoulli):最简单的分布,只有两个结果——「成功」和「失败」。一个参数 pp 就够了:

P(X=1)=p,P(X=0)=1pP(X=1) = p, \quad P(X=0) = 1-p

一枚硬币(可能是歪的)、一封邮件是不是垃圾邮件、一个病人有没有得病——凡是「是/否」问题,底层都是伯努利。Logistic 回归输出的那个概率 y^=σ(wx+b)\hat{y} = \sigma(\mathbf{w} \cdot \mathbf{x} + b),就是一个伯努利分布的参数。

高斯分布(Gaussian / Normal):连续世界的主角。两个参数:均值 μ\mu 和标准差 σ\sigma。概率密度函数(PDF):

p(x)=12πσexp((xμ)22σ2)p(x) = \frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)

几何上就是一个钟形曲线μ\mu 决定钟的中心在哪,σ\sigma 决定钟有多宽。σ\sigma 越小,钟越窄越尖——「我基本确定答案就在 μ\mu 附近」;σ\sigma 越大,钟越扁越宽——「我也不太确定,答案可能在很大范围内」。

拖动滑块感受:

-4.0-2.7-1.30.01.32.74.0μ
68% 落在 ±1σ95% 落在 ±2σ99.7% 落在 ±3σ
高斯分布由两个参数完全决定:μ 控制位置,σ 控制宽度。 σ 越小,分布越「尖」,信息越集中。

高斯分布为什么在 ML 里无处不在?一个原因是中心极限定理:大量独立随机变量之和趋向于高斯分布。另一个原因是它的数学性质特别好——高斯的线性变换还是高斯,高斯的条件分布还是高斯,这让很多推导有解析解。

多项式分布(Multinomial):伯努利从两个结果推广到 KK 个结果。KK 个概率 p1,p2,,pKp_1, p_2, \ldots, p_K,加起来等于 1。一次实验从 KK 个类别里选一个。

P(X=k)=pk,k=1Kpk=1P(X = k) = p_k, \quad \sum_{k=1}^{K} p_k = 1

分类器输出的 softmax 向量就是一个多项式分布的参数。LLM 最后一层给词表里每个 token 打的分数,也是多项式分布。当 K=2K=2 时,它退化回伯努利。

记住这个对应关系:模型的输出形态,决定了它背后假设的分布形态。回归假设高斯,二分类假设伯努利,多分类假设多项式。这个对应关系后面在 MLE 里会变得很重要。

期望、方差、协方差

分布是一个形状,那怎么用一个数字来总结这个形状?这就需要几个「统计量」。

期望(Expectation)就是「按概率加权的平均」:

E[X]=ipixi(离散),E[X]=xp(x)dx(连续)\mathbb{E}[X] = \sum_i p_i \cdot x_i \quad (\text{离散}), \qquad \mathbb{E}[X] = \int x \cdot p(x)\,dx \quad (\text{连续})

几何上,期望是柱状图的重心——如果每个柱子是一坨质量,期望就是平衡点。如果你从分布里反复抽样、取平均,根据大数定律,这个平均值会趋近于期望。所以期望也是「长期来看,平均每次能拿到多少」。

方差(Variance)衡量分布的铺开程度——柱子离重心有多远:

Var(X)=E[(Xμ)2]=E[X2](E[X])2\mathrm{Var}(X) = \mathbb{E}[(X - \mu)^2] = \mathbb{E}[X^2] - (\mathbb{E}[X])^2

方差的平方根是标准差 σ\sigma,它和原变量同单位,更直观。在高斯分布里,σ\sigma 就是那个控制钟宽度的参数——68% 的数据落在 μ±σ\mu \pm \sigma 内,95% 落在 μ±2σ\mu \pm 2\sigma 内。

方差在 ML 里有一个很具体的含义:偏差-方差权衡(bias-variance tradeoff)。一个模型如果方差大,说明它对训练数据过度敏感——换一批数据,学到的东西就变了。这就是过拟合的概率本质。

协方差(Covariance)衡量两个随机变量一起变化的程度

Cov(X,Y)=E[(XμX)(YμY)]\mathrm{Cov}(X, Y) = \mathbb{E}[(X - \mu_X)(Y - \mu_Y)]

协方差为正,说明 XX 大时 YY 也倾向于大(同向变动);为负则反向;为零则(线性上)无关。把 nn 个特征两两之间的协方差排成矩阵,就得到了协方差矩阵 Σ\Sigma——它描述了特征之间的线性依赖关系。

协方差矩阵在 ML 里反复出现:PCA 就是对它做特征分解,找到数据变化最大的方向;高斯分布的多元版本 N(μ,Σ)\mathcal{N}(\boldsymbol{\mu}, \Sigma) 的形状完全由协方差矩阵决定——Σ\Sigma 的特征值控制每个主轴的伸展长度,特征向量控制主轴的朝向。

贝叶斯定理

概率论里最有用的一条定理。它回答的问题是:

我已经有一些信念(先验),现在来了新证据,我该怎么更新信念?

公式本身很简洁:

P(AB)=P(BA)P(A)P(B)P(A \mid B) = \frac{P(B \mid A) \cdot P(A)}{P(B)}

用 ML 的语言翻译:

P(θD)后验=P(Dθ)似然P(θ)先验P(D)证据\underbrace{P(\theta \mid \mathcal{D})}_{\text{后验}} = \frac{\overbrace{P(\mathcal{D} \mid \theta)}^{\text{似然}} \cdot \overbrace{P(\theta)}^{\text{先验}}}{\underbrace{P(\mathcal{D})}_{\text{证据}}}
  • 先验 P(θ)P(\theta):在看数据之前,你对参数的信念。比如「大多数 coin 大概是公平的」。
  • 似然 P(Dθ)P(\mathcal{D} \mid \theta):给定参数,数据出现的概率。这就是「模型解释数据的能力」。
  • 后验 P(θD)P(\theta \mid \mathcal{D}):看了数据之后,更新后的信念。
  • 证据 P(D)P(\mathcal{D}):所有可能参数下数据的总概率——一个归一化常数,保证后验加起来等于 1。

一句话总结:后验 ∝ 先验 × 似然

几何直觉:想象一个面积图。整个方块代表所有可能的结果。先验把方块切成「A 发生」和「A 不发生」两块。似然把每块再切成「B 发生」和「B 不发生」的子块。后验就是在「B 发生了」的条件下,A 那块占多大比例。

经典的例子:一种病发病率 5%,检测的真阳性率 95%、假阳性率 10%。一个人检测阳性——他真的有病的概率是多少?直觉上很多人会说「95%」,但正确答案只有约 33%。这是因为先验(发病率)太低,假阳性的绝对数量反而比真阳性更多。

面积图 · 联合概率

病人 5.0%
+95.0%
健康 95.0%
+10.0%
真阳性区域假阳性区域

P(病|+) = P(病) × P(+|病) / P(+)

= 5.0% × 95.0% / 14.3%

后验 P(病|+)

33.3%

即使检测阳性,由于先验很低,健康的可能性仍然更大——这就是「基础概率谬误」。

贝叶斯定理: 后验 ∝ 先验 × 似然。 拖动滑块,看证据如何更新信念。

贝叶斯定理在 ML 里的地位:它是贝叶斯学派整个框架的基石。和它对应的是频率学派——后者认为参数是固定的未知数,用 MLE 去估计就够了。两种视角各有千秋,我们马上就会看到。

熵:意外的平均

一个事件的「意外感」(self-information)就是:

I(x)=log2p(x)I(x) = -\log_2 p(x)

概率越小,意外越大。 「明天太阳升起」p1p \approx 1I=0I = 0 bit,一点不意外;「今天 GPT-7 发布」p=1/1000p = 1/1000I10I \approx 10 bit,信息量大。底数取 2 让单位就是熟悉的 bit

把意外按概率加权平均,就是分布的

H(P)=ipilog2pi=EP[I(X)]H(P) = -\sum_i p_i \log_2 p_i = \mathbb{E}_P[\,I(X)\,]

直觉一句话:熵 = 平均每次抽样,你需要花多少 bit 才能描述结果

  • 均匀分布 → 完全猜不准 → 熵最大(N 个等概率事件,熵 = log2N\log_2 N)。
  • 一点冲突都没有(某事件概率 1)→ 闭着眼都能猜中 → 熵 = 0。

拖滑块感受:

46%
A
22%
B
14%
C
9%
D
6%
E
3%
F

熵 H(P)

2.10 bit

最大值 = log₂6 ≈ 2.58 bit(完全均匀时)

几乎能猜中 → 熵很低

熵 = 平均要花多少 bit 才能描述一次抽样。 分布越「平」,熵越大;越「尖」,熵越小。

熵是信息论的「主角色」。它不是抽象的——Shannon 在 1948 年证明,H(P)H(P) 就是用最优编码压缩这个分布的样本所需的平均比特数。换句话说,熵给出了「这个分布最少需要多少存储空间」的下界。

交叉熵:用 Q 描述 P

现在场景换一下:

真实分布是 PP,但我们手上只有一个估计的分布 QQ(模型的预测)。如果用为 QQ 设计的编码去压缩 PP 的样本,平均每次要花多少 bit?

答案就是交叉熵

H(P,Q)=ipilog2qiH(P, Q) = -\sum_i p_i \log_2 q_i
  • 如果 Q=PQ = PH(P,Q)=H(P)H(P, Q) = H(P)——最优情况,等于真分布的熵。
  • 如果 QPQ \neq PH(P,Q)>H(P)H(P, Q) > H(P)——你用了错的编码,被惩罚了多余的 bit。
  • H(P,Q)H(P, Q) 永远 ≥ H(P)H(P)(这就是著名的 Gibbs 不等式)。

这就是为什么 ML 里分类的损失函数就是交叉熵

L=ipilogqi\mathcal{L} = -\sum_i p_i \log q_i

真实标签是 one-hot,比如「猫」对应 P=[1,0,0,0]P = [1, 0, 0, 0]。这时:

L=logq\mathcal{L} = -\log q_{\text{猫}}

「最小化交叉熵」就翻译成了一句话:让模型预测真实类别的概率尽量大。LLM 训练里的 next-token loss 也是同一个公式,只是「类别」从「猫狗鸟鱼」换成了「词表里的几万个 token」。

试试调一下模型分布 Q,看 cross-entropy 怎么变:

P · 真实分布(固定)Q · 模型预测

Q 押注哪一类?

H(P) · 真实分布的熵

1.28 bit

H(P, Q) · 交叉熵

1.36 bit

KL(P ∥ Q) · 差距

0.07 bit

押对类但不够自信 → KL 还能更低

训练分类器 = 调 Q 让 H(P, Q) 尽量小。 最小值就是 H(P)——此时 Q = P,KL = 0。

KL 散度:两个分布的差距

把交叉熵和真分布的熵相减,得到一个非常有用的量:

DKL(PQ)=H(P,Q)H(P)=ipilog2piqiD_{\mathrm{KL}}(P \,\|\, Q) = H(P, Q) - H(P) = \sum_i p_i \log_2 \frac{p_i}{q_i}

这就是 KL 散度(Kullback–Leibler divergence)。

直觉上:

KL 是「用 QQ 而不是 PP 来描述 PP 时,多浪费了几个 bit」。

它有三个值得记住的性质:

  1. DKL0D_{\mathrm{KL}} \geq 0,等于 0 当且仅当 P=QP = Q。所以可以当「距离」用。
  2. 不对称DKL(PQ)DKL(QP)D_{\mathrm{KL}}(P \,\|\, Q) \neq D_{\mathrm{KL}}(Q \,\|\, P)。所以不是真正的距离——选哪个方向有讲究。
  3. 训练分类器最小化交叉熵 = 最小化 KL 散度——因为 H(P)H(P) 在数据集固定时是常数。

第二条的不对称很微妙:DKL(PQ)D_{\mathrm{KL}}(P \,\|\, Q) 强迫 QQ 覆盖 PP 的所有支持区域(否则 logp/q\log p/q \to \infty);而 DKL(QP)D_{\mathrm{KL}}(Q \,\|\, P) 反过来,允许 QQ 只「贴」到 PP 的某个模态上。前者叫 mode-covering,后者叫 mode-seeking——这在 VAE、扩散模型、GAN 里是核心的设计差异。

最大似然估计

到现在为止,我们一直在讨论「给定分布,怎么衡量它好不好」。但 ML 的核心问题是反过来的:给定数据,怎么找到那个最好的分布?

最大似然估计(Maximum Likelihood Estimation, MLE)的思路极其朴素:

找一组参数 θ\theta,让已经看到的数据出现的概率最大

假设我们有 nn 个独立同分布(i.i.d.)的数据点 D={x1,x2,,xn}\mathcal{D} = \{x_1, x_2, \ldots, x_n\},似然函数是:

L(θ)=P(Dθ)=i=1np(xiθ)L(\theta) = P(\mathcal{D} \mid \theta) = \prod_{i=1}^{n} p(x_i \mid \theta)

MLE 就是找 θ^MLE=argmaxθL(θ)\hat{\theta}_{\mathrm{MLE}} = \arg\max_\theta L(\theta)

因为连乘容易溢出,实际操作中取对数——对数似然

(θ)=logL(θ)=i=1nlogp(xiθ)\ell(\theta) = \log L(\theta) = \sum_{i=1}^{n} \log p(x_i \mid \theta)

MLE = 最大化对数似然 = 最小化负对数似然 (θ)-\ell(\theta)

这个「负对数似然」就是 ML 里几乎所有损失函数的概率起源。来看三个关键例子:

硬币问题(伯努利 + MLE):抛 10 次硬币,7 次正面。pp 的 MLE 是多少?对数似然 (p)=7logp+3log(1p)\ell(p) = 7\log p + 3\log(1-p),求导令其为零,得到 p^=7/10\hat{p} = 7/10。直觉完全吻合——正面出现的频率就是 MLE 的估计。

线性回归(高斯 + MLE):假设 yi=wxi+b+ϵy_i = \mathbf{w} \cdot \mathbf{x}_i + b + \epsilon,其中 ϵN(0,σ2)\epsilon \sim \mathcal{N}(0, \sigma^2) 是高斯噪声。那么每个数据点的条件概率是:

p(yixi,w,b)=12πσexp((yiwxib)22σ2)p(y_i \mid \mathbf{x}_i, \mathbf{w}, b) = \frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(y_i - \mathbf{w}\cdot\mathbf{x}_i - b)^2}{2\sigma^2}\right)

取负对数似然,忽略常数项,就得到了:

(w,b)i=1n(yiwxib)2=MSE-\ell(\mathbf{w}, b) \propto \sum_{i=1}^{n}(y_i - \mathbf{w}\cdot\mathbf{x}_i - b)^2 = \text{MSE}

最小化 MSE 等价于高斯噪声假设下的 MLE。 这就是为什么线性回调用 MSE——不是随便选的,而是「假设误差是高斯的」这个前提下,MLE 自然给出的答案。

分类(多项式 + MLE):真实标签 one-hot,模型输出 softmax 概率。负对数似然就是交叉熵。最小化交叉熵等价于多项式分布下的 MLE。

统一的视角:选损失函数 = 选分布假设 + 做 MLE。MSE 对应高斯,交叉熵对应伯努利/多项式。损失函数不是拍脑袋的——它有严格的概率理由。

MAP 与正则化

MLE 有一个问题:它完全信任数据。数据少的时候,MLE 容易给出极端的估计——抛 3 次硬币全正面,MLE 就说 p=1p = 1。这显然不合理。

最大后验估计(Maximum A Posteriori, MAP) 的解决办法:给参数加一个先验信念,然后用贝叶斯定理更新。

θ^MAP=argmaxθP(θD)=argmaxθP(Dθ)似然P(θ)先验\hat{\theta}_{\mathrm{MAP}} = \arg\max_\theta P(\theta \mid \mathcal{D}) = \arg\max_\theta \underbrace{P(\mathcal{D} \mid \theta)}_{\text{似然}} \cdot \underbrace{P(\theta)}_{\text{先验}}

取负对数:

logP(θD)=logP(Dθ)负对数似然 (MLE 部分)+logP(θ)先验惩罚项+const-\log P(\theta \mid \mathcal{D}) = \underbrace{-\log P(\mathcal{D} \mid \theta)}_{\text{负对数似然 (MLE 部分)}} + \underbrace{-\log P(\theta)}_{\text{先验惩罚项}} + \text{const}

这个公式揭示了 ML 里一个深刻的对应关系:

MAP = MLE + 正则化。 正则化项就是先验的负对数。

具体来说:

先验负对数先验对应的正则化
高斯先验 θN(0,τ2)\theta \sim \mathcal{N}(0, \tau^2)12τ2θ22\propto \frac{1}{2\tau^2}\|\theta\|_2^2L2 正则化(Ridge)
拉普拉斯先验 θLaplace(0,b)\theta \sim \mathrm{Laplace}(0, b)1bθ1\propto \frac{1}{b}\|\theta\|_1L1 正则化(Lasso)

L2 正则化说「参数应该在零附近,但不用精确为零」——这恰好是高斯先验的信念。L1 正则化说「参数应该大部分是零」——拉普拉斯分布在零点有一个尖峰,鼓励稀疏。

τ\tau(或 bb)控制先验的强度。τ\tau 大 → 先验宽松 → 正则化弱;τ\tau 小 → 先验紧凑 → 正则化强。调正则化系数,就是在调「我有多相信先验」。

数据量也决定了先验的影响力:数据少时,先验主导,MAP 远离 MLE;数据多时,似然主导,MAP 趋近 MLE。这就是为什么大数据时代,MLE 和 MAP 的差异越来越小——但在小样本或微调场景下,正则化(先验)仍然至关重要。

到这里,整个概率框架就闭环了:

  • 分布描述数据生成的形状
  • MLE 从数据里反推最好的参数
  • MAP 加入先验信念,得到更稳健的估计
  • 熵 / 交叉熵 / KL 衡量分布之间的差距,定义损失函数
  • 贝叶斯定理把所有这些统一在一个框架下

下一篇我们会把这些工具用到具体的模型上——线性回归和 logistic 回归正是 MLE 在两种分布假设下的经典案例。

这个想法在前沿里