概率论基础
期望,均值,方差与KL散度
如果把概率论看作一门"描述不确定性"的语言,那么期望、均值、方差和 KL 散度并不是零散的公式,而是围绕同一个核心问题展开的不同刻画方式:当一个变量不再是确定值,而是一个分布时,我们如何用有限的信息去总结它、比较它、以及衡量它的不确定性。理解这些概念的关键,不在于记住公式本身,而在于把它们放回"随机变量与分布"的统一视角中。
首先需要明确一个前提,当我们说一个随机变量 XXX,本质上是在说"这个量的取值不是固定的,而是按照某种概率分布出现"。这个分布可以是离散的,也可以是连续的。期望的出现,正是为了回答一个最自然的问题:如果这个随机过程重复很多次,结果的平均值会是多少。数学上,期望定义为对所有可能取值按其概率加权的平均:
E[X]=∑xx⋅p(x)或E[X]=∫x⋅p(x) dx \mathbb{E}[X] = \sum_x x \cdot p(x) \quad \text{或} \quad \mathbb{E}[X] = \int x \cdot p(x) \, dx E[X]=x∑x⋅p(x)或E[X]=∫x⋅p(x)dx
这里的形式取决于变量是离散还是连续。期望不是某一次实验的结果,而是分布的一个整体属性,它描述的是"长期平均趋势"。因此它也常被称为均值,两者在绝大多数语境下是同一个概念,只是"期望"更强调从分布定义出发,"均值"更偏向统计直觉。
但是仅有期望是不够的,因为两个分布可能具有相同的均值,却有完全不同的波动情况。例如一个变量总是取 5,另一个变量一半概率取 0,一半概率取 10,它们的期望都是 5,但显然后者的不确定性更大。这种"围绕均值的离散程度"就是方差要刻画的内容。方差的定义是:
Var(X)=E[(X−E[X])2] \mathrm{Var}(X) = \mathbb{E}\big[(X - \mathbb{E}[X])^2\big] Var(X)=E[(X−E[X])2]
它本质上是"偏离均值的平方的期望"。之所以要平方,一方面是避免正负抵消,另一方面是强调偏离越大惩罚越重。方差越大,说明这个分布越"分散",不确定性越强;方差越小,说明变量更集中在均值附近。如果进一步取平方根,就得到标准差,它的量纲与原变量一致,更直观地反映波动大小。
在很多机器学习问题中,高斯分布之所以频繁出现,正是因为它可以用"均值 + 方差"这两个量完全刻画:
X∼N(μ,σ2) X \sim \mathcal{N}(\mu, \sigma^2) X∼N(μ,σ2)
其中 μ\muμ 就是期望,σ2\sigma^2σ2 是方差。均值决定分布中心位置,方差决定分布宽度。这种分布在统计上具有很多良好性质,例如最大熵性质、中心极限定理下的自然出现等,因此成为默认的噪声模型。
如果说期望和方差是在描述"单个分布内部的性质",那么 KL 散度则是在回答另一个问题:两个分布之间差异有多大。给定两个分布 p(x)p(x)p(x) 和 q(x)q(x)q(x),KL 散度定义为:
DKL(p∥q)=∑xp(x)logp(x)q(x)或∫p(x)logp(x)q(x)dx D_{\mathrm{KL}}(p \parallel q) = \sum_x p(x)\log\frac{p(x)}{q(x)} \quad \text{或} \quad \int p(x)\log\frac{p(x)}{q(x)}dx DKL(p∥q)=x∑p(x)logq(x)p(x)或∫p(x)logq(x)p(x)dx
这个量可以理解为:如果真实数据来自分布 ppp,但我们用分布 qqq 去近似,那么平均来说会多付出多少"信息代价"。从信息论角度看,它衡量的是编码效率的损失;从统计角度看,它衡量的是模型分布与真实分布之间的不匹配程度。
KL 散度有几个非常重要的性质。首先它永远非负,且只有当 p=qp=qp=q 时才为零,这意味着它可以作为一种"距离"的度量,但它并不对称,也不满足三角不等式,因此严格来说不是数学意义上的距离。其次它是有方向的,DKL(p∥q)D_{\mathrm{KL}}(p\parallel q)DKL(p∥q) 和 DKL(q∥p)D_{\mathrm{KL}}(q\parallel p)DKL(q∥p) 通常不同,这一点在机器学习中非常关键,因为选择哪一个方向会影响优化行为。
把这些概念串起来,可以看到一个清晰的层次结构。期望是对随机变量的"中心位置"的刻画,方差是对"波动程度"的刻画,它们都属于分布的低阶统计量,是对复杂分布的压缩描述。而 KL 散度则跳到更高一层,它不再关注单个分布内部,而是比较两个分布整体形状的差异。
在机器学习中,这些量并不是孤立使用的,而是形成一条闭环逻辑。以最常见的监督学习为例,我们假设存在一个真实条件分布 pdata(y∣x)p_{\text{data}}(y\mid x)pdata(y∣x),而模型给出一个参数化分布 pθ(y∣x)p_\theta(y\mid x)pθ(y∣x)。训练的目标就是让模型分布尽可能接近真实分布,这可以通过最小化 KL 散度来表达:
minθDKL(pdata∥pθ) \min_\theta D_{\mathrm{KL}}(p_{\text{data}} \parallel p_\theta) θminDKL(pdata∥pθ)
进一步展开可以得到最大似然训练目标,这又在具体分布假设下转化为熟悉的损失函数。例如在高斯假设下,最小化 KL 散度等价于最小化均方误差,这时方差控制误差的尺度;在分类任务中,对应的是交叉熵损失,本质上也是 KL 散度的具体形式。
概率分布与神经网络
从这个角度再回头看,可以把整个概率建模过程理解为:用期望去预测中心趋势,用方差去表达不确定性,用 KL 散度去衡量模型与真实世界之间的差距。神经网络则提供了一个强大的函数逼近工具,使得这些量不再是固定常数,而是可以随着输入 xxx 动态变化,从而刻画复杂的条件分布。
因此,这些概率论概念之所以重要,不在于它们各自的公式,而在于它们共同构成了一套描述不确定性的语言体系。期望告诉我们"平均会发生什么",方差告诉我们"可能偏离多少",KL 散度告诉我们"我们对世界的理解与真实情况差了多少"。一旦把它们放在"用模型逼近真实分布"的框架中,它们就不再是零散记忆点,而是彼此紧密连接的工具链。
这句话的核心其实是在说:训练神经网络时,我们表面上是在最小化某个损失函数,例如 MSE 或交叉熵;但更深一层看,我们是在让模型定义出来的概率分布 pθ(y∣x)p_\theta(y\mid x)pθ(y∣x) 尽量接近真实数据背后的分布 pdata(y∣x)p_{\text{data}}(y\mid x)pdata(y∣x)。KL 散度、最大似然、均方误差、交叉熵之间并不是四个孤立概念,而是从"分布逼近"这一个目标逐步展开得到的不同表达。
先从 KL 散度开始。假设真实世界存在一个条件分布 pdata(y∣x)p_{\text{data}}(y\mid x)pdata(y∣x),它表示给定输入 xxx 时,真实标签或真实输出 yyy 的概率规律。神经网络则给出一个模型分布 pθ(y∣x)p_\theta(y\mid x)pθ(y∣x),其中 θ\thetaθ 表示网络的所有参数,也就是权重和偏置。训练的目标可以写成:让模型分布尽量靠近真实分布。用 KL 散度表示就是:
DKL(pdata(y∣x)∥pθ(y∣x))=Epdata[logpdata(y∣x)pθ(y∣x)] D_{\mathrm{KL}}\big(p_{\text{data}}(y\mid x)\parallel p_\theta(y\mid x)\big)=\mathbb{E}{p{\text{data}}}\left[\log\frac{p_{\text{data}}(y\mid x)}{p_\theta(y\mid x)}\right] DKL(pdata(y∣x)∥pθ(y∣x))=Epdata[logpθ(y∣x)pdata(y∣x)]
把这个式子展开,就会发现关键关系。KL 散度等于:
DKL(pdata∥pθ)=Epdata[logpdata(y∣x)]−Epdata[logpθ(y∣x)] D_{\mathrm{KL}}(p_{\text{data}}\parallel p_\theta) = \mathbb{E}{p{\text{data}}}[\log p_{\text{data}}(y\mid x)] - \mathbb{E}{p{\text{data}}}[\log p_\theta(y\mid x)] DKL(pdata∥pθ)=Epdata[logpdata(y∣x)]−Epdata[logpθ(y∣x)]
这里第一项 Epdata[logpdata(y∣x)]\mathbb{E}{p{\text{data}}}[\log p_{\text{data}}(y\mid x)]Epdata[logpdata(y∣x)] 只和真实数据分布有关,不含模型参数 θ\thetaθ。训练时我们不能改变真实世界的数据分布,只能改变模型参数,所以第一项对优化来说是常数。于是最小化 KL 散度,就等价于最大化第二项:
maxθEpdata[logpθ(y∣x)] \max_\theta \mathbb{E}{p{\text{data}}}[\log p_\theta(y\mid x)] θmaxEpdata[logpθ(y∣x)]
这就是最大似然的来源。所谓最大似然,就是让模型给真实观测数据分配尽可能高的概率。换句话说,如果真实样本是 (xi,yi)(x_i,y_i)(xi,yi),那么一个好的模型应该让 pθ(yi∣xi)p_\theta(y_i\mid x_i)pθ(yi∣xi) 尽可能大。训练集中有很多样本时,就希望所有真实样本在模型下的联合概率尽可能大:
maxθ∏ipθ(yi∣xi) \max_\theta \prod_i p_\theta(y_i\mid x_i) θmaxi∏pθ(yi∣xi)
为了方便计算,通常取对数,把乘积变成求和:
maxθ∑ilogpθ(yi∣xi) \max_\theta \sum_i \log p_\theta(y_i\mid x_i) θmaxi∑logpθ(yi∣xi)
而深度学习里习惯做"最小化损失",所以再取负号,就得到负对数似然:
minθ−∑ilogpθ(yi∣xi) \min_\theta -\sum_i \log p_\theta(y_i\mid x_i) θmin−i∑logpθ(yi∣xi)
这一步非常重要。它说明很多损失函数的本质都是负对数似然,也就是"模型给真实答案的概率越低,惩罚越大;模型给真实答案的概率越高,惩罚越小"。因此,损失函数不是随便设计出来的,而是来自一个概率建模假设:你先假设 y∣xy\mid xy∣x 服从某个分布,然后最大化这个分布对真实数据的似然,最后就得到对应的损失函数。
回归任务中最常见的假设是高斯分布。也就是说,给定输入 xxx,真实输出 yyy 并不是严格等于某个确定值,而是围绕某个均值上下波动:
y∣x∼N(μθ(x),σ2) y\mid x \sim \mathcal{N}(\mu_\theta(x), \sigma^2) y∣x∼N(μθ(x),σ2)
这里 μθ(x)\mu_\theta(x)μθ(x) 是神经网络输出的预测值,表示条件分布的均值;σ2\sigma^2σ2 是噪声方差,表示真实值围绕均值的波动程度。高斯分布的概率密度为:
pθ(y∣x)=12πσ2exp(−(y−μθ(x))22σ2) p_\theta(y\mid x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(y-\mu_\theta(x))^2}{2\sigma^2}\right) pθ(y∣x)=2πσ2 1exp(−2σ2(y−μθ(x))2)
现在对它取负对数,就得到:
−logpθ(y∣x)=(y−μθ(x))22σ2+12log(2πσ2) -\log p_\theta(y\mid x) = \frac{(y-\mu_\theta(x))^2}{2\sigma^2} + \frac{1}{2}\log(2\pi\sigma^2) −logpθ(y∣x)=2σ2(y−μθ(x))2+21log(2πσ2)
如果 σ2\sigma^2σ2 被看作固定常数,那么第二项是常数,第一项前面的 12σ2\frac{1}{2\sigma^2}2σ21 也只是一个固定缩放系数,不改变最优解的位置。于是最小化负对数似然,就等价于最小化:
(y−μθ(x))2 (y-\mu_\theta(x))^2 (y−μθ(x))2
这就是均方误差 MSE 的概率来源。也就是说,当你使用 MSE 训练回归模型时,你实际上是在隐含地假设:真实输出等于模型预测均值加上一个高斯噪声:
y=μθ(x)+ϵ,ϵ∼N(0,σ2) y = \mu_\theta(x) + \epsilon,\qquad \epsilon\sim\mathcal{N}(0,\sigma^2) y=μθ(x)+ϵ,ϵ∼N(0,σ2)
所以 MSE 并不是单纯因为"平方误差看起来合理"才被使用,而是因为它对应了高斯噪声假设下的最大似然估计。预测错得越远,在高斯分布下这个真实样本出现的概率就越低,负对数似然就越大,于是损失越大。
这里"方差控制误差尺度"的意思也可以更具体地理解。如果 σ2\sigma^2σ2 很小,说明我们假设数据噪声很小,真实值应该非常接近模型预测均值。那么同样大小的误差会被惩罚得更重,因为 (y−μθ(x))22σ2\frac{(y-\mu_\theta(x))^2}{2\sigma^2}2σ2(y−μθ(x))2 中分母很小。相反,如果 σ2\sigma^2σ2 很大,说明我们认为数据本身噪声较强,真实值偏离预测均值是可以接受的,于是同样的误差惩罚会变小。在固定方差的普通 MSE 中,这个尺度通常被吸收到学习率或整体损失权重里;但如果模型同时预测方差,方差就会真正参与不确定性建模。
当网络不仅输出均值 μθ(x)\mu_\theta(x)μθ(x),还输出方差 σθ2(x)\sigma_\theta^2(x)σθ2(x) 时,损失会变成:
−logpθ(y∣x)=(y−μθ(x))22σθ2(x)+12logσθ2(x)+constant -\log p_\theta(y\mid x) = \frac{(y-\mu_\theta(x))^2}{2\sigma_\theta^2(x)} + \frac{1}{2}\log\sigma_\theta^2(x) + \text{constant} −logpθ(y∣x)=2σθ2(x)(y−μθ(x))2+21logσθ2(x)+constant
这个式子非常有意思。第一项表示误差越大损失越大,但如果模型认为当前样本不确定性很高,也就是 σθ2(x)\sigma_\theta^2(x)σθ2(x) 很大,那么这个误差会被降权。第二项 12logσθ2(x)\frac{1}{2}\log\sigma_\theta^2(x)21logσθ2(x) 则防止模型无脑把方差预测得无限大。如果没有这一项,模型可以通过把方差调得极大来掩盖所有预测错误。于是这个损失同时驱动模型学习两个东西:一方面让均值预测尽量准确,另一方面让方差预测能够合理反映不确定性。
分类任务的逻辑完全一样,只是分布换了。二分类中,标签 y∈{0,1}y\in\{0,1\}y∈{0,1},最自然的概率模型是伯努利分布。神经网络输出一个 logit zθ(x)z_\theta(x)zθ(x),经过 sigmoid 得到正类概率:
pθ(y=1∣x)=πθ(x)=11+e−zθ(x) p_\theta(y=1\mid x)=\pi_\theta(x)=\frac{1}{1+e^{-z_\theta(x)}} pθ(y=1∣x)=πθ(x)=1+e−zθ(x)1
那么标签 yyy 的概率可以统一写成:
pθ(y∣x)=πθ(x)y(1−πθ(x))1−y p_\theta(y\mid x) = \pi_\theta(x)^y \big(1-\pi_\theta(x)\big)^{1-y} pθ(y∣x)=πθ(x)y(1−πθ(x))1−y
如果真实标签是 1,那么这个式子变成 πθ(x)\pi_\theta(x)πθ(x);如果真实标签是 0,它变成 (1−πθ(x))(1-\pi_\theta(x))(1−πθ(x))。也就是说,模型给真实标签分配的概率越高,似然越大。对它取负对数,就得到:
−logpθ(y∣x)=−[ylogπθ(x)+(1−y)log(1−πθ(x))] -\log p_\theta(y\mid x) = -\big[y\log \pi_\theta(x) + (1-y)\log(1-\pi_\theta(x))\big] −logpθ(y∣x)=−[ylogπθ(x)+(1−y)log(1−πθ(x))]
这就是二分类交叉熵。它的含义非常直接:如果真实标签是 1,那么损失就是 −logπθ(x)-\log \pi_\theta(x)−logπθ(x),模型给正类概率越接近 1,损失越接近 0;如果真实标签是 0,那么损失就是 −log(1−πθ(x))-\log(1-\pi_\theta(x))−log(1−πθ(x)),模型给负类概率越高,损失越小。
多分类任务中,标签 yyy 属于 KKK 个类别之一,对应的概率模型是 categorical 分布,也可以理解为一次试验的多项分布。神经网络输出 KKK 个 logit:
zθ(x)=(z1,z2,...,zK) z_\theta(x) = (z_1,z_2,\dots,z_K) zθ(x)=(z1,z2,...,zK)
然后通过 softmax 变成一个概率分布:
pθ(y=k∣x)=exp(zk)∑j=1Kexp(zj) p_\theta(y=k\mid x) = \frac{\exp(z_k)}{\sum_{j=1}^{K}\exp(z_j)} pθ(y=k∣x)=∑j=1Kexp(zj)exp(zk)
如果真实类别是 ccc,那么最大似然就是希望 pθ(y=c∣x)p_\theta(y=c\mid x)pθ(y=c∣x) 尽可能大。负对数似然就是:
−logpθ(y=c∣x) -\log p_\theta(y=c\mid x) −logpθ(y=c∣x)
这就是多分类交叉熵在 one-hot 标签下的形式。如果把真实标签写成 one-hot 分布 pdata(y=k∣x)p_{\text{data}}(y=k\mid x)pdata(y=k∣x),也就是真实类别位置为 1,其余类别为 0,那么交叉熵可以写成:
H(pdata,pθ)=−∑k=1Kpdata(y=k∣x)logpθ(y=k∣x) H(p_{\text{data}},p_\theta) = -\sum_{k=1}^{K} p_{\text{data}}(y=k\mid x)\log p_\theta(y=k\mid x) H(pdata,pθ)=−k=1∑Kpdata(y=k∣x)logpθ(y=k∣x)
因为 one-hot 标签只有真实类别那一项为 1,所以它最终就退化成:
−logpθ(y=c∣x) -\log p_\theta(y=c\mid x) −logpθ(y=c∣x)
这也解释了为什么分类损失不是直接惩罚"类别编号差多少"。比如猫是类别 2、狗是类别 3,并不意味着狗比车更接近猫。分类任务真正关心的是概率分布:模型有没有把足够高的概率分配给真实类别,同时把其他类别的概率压低。因此交叉熵比平方误差更适合分类,因为它直接对应离散分布的最大似然。
交叉熵与 KL 散度的关系也可以从公式上看清楚。KL 散度展开为:
DKL(pdata∥pθ)=∑ypdata(y∣x)logpdata(y∣x)pθ(y∣x) D_{\mathrm{KL}}(p_{\text{data}}\parallel p_\theta) = \sum_y p_{\text{data}}(y\mid x) \log \frac{p_{\text{data}}(y\mid x)}{p_\theta(y\mid x)} DKL(pdata∥pθ)=y∑pdata(y∣x)logpθ(y∣x)pdata(y∣x)
继续拆开:
DKL(pdata∥pθ)=∑ypdata(y∣x)logpdata(y∣x)−∑ypdata(y∣x)logpθ(y∣x) D_{\mathrm{KL}}(p_{\text{data}}\parallel p_\theta) = \sum_y p_{\text{data}}(y\mid x)\log p_{\text{data}}(y\mid x) - \sum_y p_{\text{data}}(y\mid x)\log p_\theta(y\mid x) DKL(pdata∥pθ)=y∑pdata(y∣x)logpdata(y∣x)−y∑pdata(y∣x)logpθ(y∣x)
其中第二项的负号部分就是交叉熵:
H(pdata,pθ)=−∑ypdata(y∣x)logpθ(y∣x) H(p_{\text{data}},p_\theta) = -\sum_y p_{\text{data}}(y\mid x)\log p_\theta(y\mid x) H(pdata,pθ)=−y∑pdata(y∣x)logpθ(y∣x)
而第一项只和真实分布自己有关,可以写成真实分布熵的负值。于是有:
H(pdata,pθ)=H(pdata)+DKL(pdata∥pθ) H(p_{\text{data}},p_\theta) = H(p_{\text{data}}) + D_{\mathrm{KL}}(p_{\text{data}}\parallel p_\theta) H(pdata,pθ)=H(pdata)+DKL(pdata∥pθ)
因为 H(pdata)H(p_{\text{data}})H(pdata) 不依赖模型参数 θ\thetaθ,所以最小化交叉熵就等价于最小化 KL 散度。换句话说,交叉熵损失表面上是在惩罚分类错误,本质上是在让模型输出的类别分布靠近真实类别分布。
现在可以把整条逻辑完全串起来。我们先承认真实数据来自一个未知分布 pdata(y∣x)p_{\text{data}}(y\mid x)pdata(y∣x),然后用神经网络定义一个可学习分布 pθ(y∣x)p_\theta(y\mid x)pθ(y∣x)。训练目标是让这两个分布尽可能接近,所以自然可以写成最小化 KL 散度。KL 散度展开后,去掉与模型无关的常数项,就变成最大化真实数据在模型下的对数概率,也就是最大似然。最大似然取负号后,就是最小化负对数似然。最后,根据你对 y∣xy\mid xy∣x 选择的分布形式不同,负对数似然就表现为不同的常见损失函数:如果假设连续回归目标服从固定方差高斯分布,就得到 MSE;如果假设二分类标签服从伯努利分布,就得到二分类交叉熵;如果假设多分类标签服从 categorical 分布,就得到 softmax 交叉熵。
所以,MSE 和交叉熵不是两个毫无关系的经验公式,而是同一个概率建模原则在不同输出类型下的结果。回归中的 MSE 来自"真实值围绕预测均值做高斯波动"的假设,分类中的交叉熵来自"真实类别是离散分布采样结果"的假设。神经网络的角色,是把输入 xxx 映射成这些分布的参数:在回归中输出高斯分布的均值或方差,在分类中输出伯努利分布或 categorical 分布的概率。训练过程的本质,则是不断调整网络参数,让模型分布给真实样本分配越来越高的概率,也就是让模型对数据世界的概率解释越来越合理。