本页内容受版权保护 · 已添加水印 · 禁止任何形式转载
§1.3.14

Bayes 决策、最大似然 vs 最大后验?分类问题里的 softmax + CE 的概率解释?

核心概念

贝叶斯决策理论 (Bayes Decision Theory) 是一种在不完全信息下,基于概率和成本进行最优决策的数学框架。其核心思想是,对于一个给定的观测样本 x\mathbf{x},选择一个决策(例如,分类到某个类别 cic_i)使得该决策的期望损失(或称风险)最小。在分类问题中,如果采用0-1损失函数(即分对损失为0,分错损失为1),贝叶斯最优决策等价于选择具有最大后验概率 (Posterior Probability) P(cix)P(c_i|\mathbf{x}) 的类别。

最大似然估计 (Maximum Likelihood Estimation, MLE) 是一种点估计方法,用于根据观测到的数据来估计模型的参数。其核心思想是:寻找一组参数 θ\theta,使得在这组参数下,我们观测到的这组数据样本出现的概率(即似然 (Likelihood))最大。MLE 假设参数 θ\theta 本身没有先验分布,或者说其先验分布是均匀的。

最大后验概率估计 (Maximum A Posteriori, MAP) 同样是一种点估计方法,但它在 MLE 的基础上引入了对模型参数 θ\theta先验信念 (Prior)。其核心思想是:寻找一组参数 θ\theta,使得在观测到数据之后,这组参数的后验概率 P(θD)P(\theta|D) 最大。MAP 是贝叶斯思想在参数估计中的应用,它在似然和先验之间做了一个权衡。

原理与推导

1. 贝叶斯决策理论 (Bayes Decision Theory)

假设我们有 CC 个类别 {c1,c2,...,cC}\{c_1, c_2, ..., c_C\},对于一个输入样本 x\mathbf{x},我们需要决定它属于哪个类别。

  • 损失函数 (Loss Function): λ(ci,cj)\lambda(c_i, c_j) 表示将真实类别为 cjc_j 的样本错误地分类为 cic_i 时所带来的损失。

  • 条件风险 (Conditional Risk): 对于样本 x\mathbf{x},我们采取决策,将其分类为 cic_i 的期望损失(风险)为:

    R(cix)=j=1Cλ(ci,cj)P(cjx)R(c_i | \mathbf{x}) = \sum_{j=1}^{C} \lambda(c_i, c_j) P(c_j | \mathbf{x})

    其中 P(cjx)P(c_j | \mathbf{x}) 是后验概率,即在观测到 x\mathbf{x} 的条件下,其真实类别为 cjc_j 的概率。

  • 贝叶斯决策规则: 选择能够最小化条件风险的类别 cc^*

    c=argmini{1,...,C}R(cix)c^* = \arg\min_{i \in \{1,...,C\}} R(c_i | \mathbf{x})
  • 0-1 损失下的特例: 在分类问题中,最常用的损失是 0-1 损失:

    λ(ci,cj)={0,if i=j(分类正确)1,if ij(分类错误)\lambda(c_i, c_j) = \begin{cases} 0, & \text{if } i=j \quad \text{(分类正确)} \\ 1, & \text{if } i \neq j \quad \text{(分类错误)} \end{cases}

    在这种情况下,条件风险变为:

    R(cix)=j=1Cλ(ci,cj)P(cjx)=jiP(cjx)=1P(cix)R(c_i | \mathbf{x}) = \sum_{j=1}^{C} \lambda(c_i, c_j) P(c_j | \mathbf{x}) = \sum_{j \neq i} P(c_j | \mathbf{x}) = 1 - P(c_i | \mathbf{x})

    为了最小化风险 R(cix)R(c_i | \mathbf{x}),我们必须最大化后验概率 P(cix)P(c_i | \mathbf{x})

  • 结论: 在 0-1 损失下,贝叶斯最优分类器就是选择后验概率最大的那个类别。

    c=argmaxi{1,...,C}P(cix)c^* = \arg\max_{i \in \{1,...,C\}} P(c_i | \mathbf{x})

    根据贝叶斯公式,P(cix)=P(xci)P(ci)P(x)P(c_i | \mathbf{x}) = \frac{P(\mathbf{x} | c_i) P(c_i)}{P(\mathbf{x})}。由于对于给定的 x\mathbf{x}P(x)P(\mathbf{x}) 是一个与类别无关的常数,因此决策规则等价于:

    c=argmaxi{1,...,C}P(xci)P(ci)c^* = \arg\max_{i \in \{1,...,C\}} P(\mathbf{x} | c_i) P(c_i)

    其中 P(xci)P(\mathbf{x} | c_i) 是类条件概率(似然),P(ci)P(c_i) 是类先验概率。

2. 最大似然估计 (MLE) vs 最大后验概率估计 (MAP)

这是两种估计模型参数 θ\theta 的方法,注意与上面决定样本类别的贝叶斯决策相区分。

假设我们有一个数据集 D={(x1,y1),...,(xN,yN)}D = \{(\mathbf{x}_1, y_1), ..., (\mathbf{x}_N, y_N)\},其中样本是独立同分布 (i.i.d.) 的。

最大似然估计 (MLE)

  • 目标: 找到参数 θ\theta 使得观测数据 DD 出现的概率最大。
  • 似然函数: L(θ)=P(Dθ)=n=1NP(ynxn,θ)L(\theta) = P(D|\theta) = \prod_{n=1}^{N} P(y_n | \mathbf{x}_n, \theta)
  • 对数似然: 为了计算方便,通常最大化对数似然函数: L(θ)=logL(θ)=n=1NlogP(ynxn,θ)\mathcal{L}(\theta) = \log L(\theta) = \sum_{n=1}^{N} \log P(y_n | \mathbf{x}_n, \theta)
  • MLE 估计: θMLE=argmaxθL(θ)\theta_{MLE} = \arg\max_{\theta} \mathcal{L}(\theta) MLE 只关心数据本身,认为能最好地解释当前数据的模型参数就是最好的参数。

最大后验概率估计 (MAP)

  • 目标: 找到给定数据 DD 后,参数 θ\theta 最有可能的值。
  • 参数的后验概率: 根据贝叶斯定理: P(θD)=P(Dθ)P(θ)P(D)P(\theta|D) = \frac{P(D|\theta) P(\theta)}{P(D)} 其中 P(Dθ)P(D|\theta) 是似然,P(θ)P(\theta) 是参数的先验概率,P(D)P(D) 是证据因子。
  • MAP 估计: θMAP=argmaxθP(θD)=argmaxθP(Dθ)P(θ)P(D)\theta_{MAP} = \arg\max_{\theta} P(\theta|D) = \arg\max_{\theta} \frac{P(D|\theta) P(\theta)}{P(D)} 由于 P(D)P(D)θ\theta 无关,上式等价于: θMAP=argmaxθP(Dθ)P(θ)\theta_{MAP} = \arg\max_{\theta} P(D|\theta) P(\theta) 取对数后: θMAP=argmaxθ(n=1NlogP(ynxn,θ)+logP(θ))\theta_{MAP} = \arg\max_{\theta} \left( \sum_{n=1}^{N} \log P(y_n | \mathbf{x}_n, \theta) + \log P(\theta) \right)

两者关系

θMAP=argmaxθ(L(θ)对数似然+logP(θ)对数先验)\theta_{MAP} = \arg\max_{\theta} (\underbrace{\mathcal{L}(\theta)}_{\text{对数似然}} + \underbrace{\log P(\theta)}_{\text{对数先验}})
  • 当参数的先验分布 P(θ)P(\theta) 是一个均匀分布时(即认为所有参数取值的可能性都相同),logP(θ)\log P(\theta) 是一个常数,此时 MAP 退化为 MLE。
  • MAP 可以看作是带有正则化的 MLE。例如,假设参数的先验分布是一个均值为0的高斯分布 P(θ)N(0,σ2)P(\theta) \sim \mathcal{N}(0, \sigma^2),那么 logP(θ)θ22\log P(\theta) \propto -||\theta||_2^2。最大化 logP(θ)\log P(\theta) 就等价于最小化 θ22||\theta||_2^2。因此,带有 L2 正则化(权重衰减)的线性回归或逻辑回归,实际上是在执行 MAP 估计,其假设了参数具有高斯先验。

3. Softmax + Cross-Entropy 的概率解释

在深度学习分类任务中,我们通常使用 Softmax 作为输出层的激活函数,并用交叉熵 (Cross-Entropy, CE) 作为损失函数。这个组合可以被解释为对模型参数进行 MLE。

  • 模型输出: 神经网络 f(x;θ)f(\mathbf{x}; \theta) 对输入 x\mathbf{x} 输出一个 C 维的实数向量,称为 logits,记为 z=[z1,...,zC]\mathbf{z} = [z_1, ..., z_C]
  • Softmax 函数: 将 logits 转换为概率分布。对于类别 cc,其概率为: p^c=P(y=cx,θ)=exp(zc)j=1Cexp(zj)\hat{p}_c = P(y=c | \mathbf{x}, \theta) = \frac{\exp(z_c)}{\sum_{j=1}^{C} \exp(z_j)} 这建立了从模型输出到类后验概率的映射。
  • MLE 目标: 我们希望最大化对数似然函数 L(θ)=n=1NlogP(ynxn,θ)\mathcal{L}(\theta) = \sum_{n=1}^{N} \log P(y_n | \mathbf{x}_n, \theta)
  • 单一样本的对数似然: 考虑单个样本 (xn,yn)(\mathbf{x}_n, y_n),其中 yny_n 是真实类别。其对数似然为 logP(y=ynxn,θ)\log P(y=y_n | \mathbf{x}_n, \theta)
  • 与交叉熵的联系: 交叉熵损失的定义为: LCE(yn,p^n)=c=1Cynclog(p^nc)L_{CE}(\mathbf{y}_n, \hat{\mathbf{p}}_n) = - \sum_{c=1}^{C} y_{nc} \log(\hat{p}_{nc}) 其中 yn\mathbf{y}_n 是真实标签的 one-hot 编码向量(即如果真实类别是 kk,则 ynk=1y_{nk}=1,其余为0),p^n\hat{\mathbf{p}}_n 是模型预测的概率向量。 由于 yn\mathbf{y}_n 是 one-hot 的,上式可以简化为: LCE=log(p^nyn)=logP(y=ynxn,θ)L_{CE} = - \log(\hat{p}_{ny_n}) = - \log P(y=y_n | \mathbf{x}_n, \theta)
  • 结论: 最小化单个样本的交叉熵损失,等价于最大化该样本的对数似然。因此,在整个数据集上最小化平均交叉熵损失,完全等价于对模型参数 θ\theta 进行最大似然估计 (MLE)

代码实现

下面通过 PyTorch 代码演示 Softmax + Cross-Entropy 如何与概率和对数似然联系起来。

python
1import torch
2import torch.nn as nn
3import numpy as np
4
5# 设定随机种子以保证结果可复现
6torch.manual_seed(42)
7
8# 1. 模拟神经网络的输出 (logits)
9# 假设我们有一个 batch,包含 3 个样本, 每个样本要分到 4 个类别中
10batch_size = 3
11num_classes = 4
12# logits 是神经网络在 Softmax 层之前的原始输出
13logits = torch.randn(batch_size, num_classes)
14print("模拟的 Logits:\n", logits)
15
16# 2. 模拟真实标签 (ground truth)
17labels = torch.tensor([1, 3, 0]) # 第一个样本是类别1, 第二个是类别3, 第三个是类别0
18print("\n真实标签 (索引):\n", labels)
19
20# 3. 使用 Softmax 将 logits 转换为概率
21# 这是在模型中对 P(y|x, theta) 的建模
22softmax = nn.Softmax(dim=1)
23probs = softmax(logits)
24print("\n经过 Softmax 后的概率分布:\n", probs)
25print("概率和 (验证每行和为1):", probs.sum(dim=1))
26
27# 4. 使用 PyTorch 内置的 CrossEntropyLoss 计算损失
28# 注意: nn.CrossEntropyLoss 内部自动完成了 softmax 操作, 所以它的输入应该是 logits
29criterion = nn.CrossEntropyLoss()
30loss_pytorch = criterion(logits, labels)
31print(f"\nPyTorch nn.CrossEntropyLoss 计算的损失: {loss_pytorch.item():.4f}")
32
33# 5. 手动计算损失, 以验证其 MLE 本质
34# 目标: 最小化负对数似然 -log P(y_true | x, theta)
35# a. 从概率矩阵中, 挑出每个样本对应其真实类别的概率
36# 例如, 第一个样本真实类别是1, 我们就取出 probs[0, 1]
37# 这等价于 P(y=y_true | x, theta)
38true_class_probs = probs[range(batch_size), labels]
39print("\n每个样本对应其真实类别的概率 (似然):\n", true_class_probs)
40
41# b. 计算对数似然 log(P(y_true | x, theta))
42log_likelihood = torch.log(true_class_probs)
43print("\n每个样本的对数似然:\n", log_likelihood)
44
45# c. 计算负对数似然, 并求平均值, 这就是交叉熵损失
46# 最小化负对数似然, 就是最大化对数似然
47manual_loss = -log_likelihood.mean()
48print(f"\n手动计算的平均负对数似然 (损失): {manual_loss.item():.4f}")
49
50# 验证手动计算结果与 PyTorch 函数结果是否一致
51assert np.isclose(loss_pytorch.item(), manual_loss.item()), "计算结果不一致!"
52print("\n验证成功: nn.CrossEntropyLoss 等价于最小化平均负对数似然。")

工程实践

  • MLE (Softmax+CE) 是分类任务的基石: 在绝大多数 CV 分类任务中,Softmax + Cross-Entropy 是默认且效果最好的选择。它简单、高效,并且具有良好的概率解释。

  • MAP 体现为正则化: 在实践中,我们很少直接定义一个复杂的先验 P(θ)P(\theta)。取而代之的是使用正则化项。

    • L2 正则化 (Weight Decay): 这是最常用的正则化方法。它等价于为模型参数 θ\theta 施加一个均值为0的高斯先验。这个先验的直观意义是“我们相信好的模型参数应该比较小,接近于0”,这能有效防止模型参数变得过大,从而避免过拟合。在 PyTorch 的优化器中(如 torch.optim.AdamW),weight_decay 参数就是用来实现 L2 正则化的。
    • L1 正则化: 等价于为参数 θ\theta 施加一个拉普拉斯先验。L1 正则化会倾向于产生稀疏的权重(即很多权重为0),可以用于特征选择,但在深度学习中不如 L2 常用。
  • 贝叶斯决策的应用: 训练好的分类器 f(x;θMLE)f(\mathbf{x}; \theta_{MLE}) 输出的 Softmax 概率 p^\hat{\mathbf{p}},就是对后验概率 P(yx)P(y|\mathbf{x}) 的一个近似估计。在推理时,我们直接取 argmax,这正是在实践贝叶斯决策规则(在0-1损失下)。

  • 处理类别不平衡: 贝叶斯决策公式 c=argmaxP(xci)P(ci)c^* = \arg\max P(\mathbf{x} | c_i) P(c_i) 告诉我们,类先验 P(ci)P(c_i) 很重要。如果训练数据类别严重不平衡,模型可能会倾向于预测多数类。工程上,可以通过以下方式调整:

    • 加权交叉熵: 在计算 Cross-Entropy Loss 时,为不同类别的损失赋予不同权重,通常是类别频率的倒数。这相当于在 MLE 的目标函数中隐式地调整了先验的重要性。
    • 重采样: 对少数类进行过采样(Oversampling)或对多数类进行欠采样(Undersampling)。
  • 模型校准 (Model Calibration): 神经网络的 Softmax 输出虽然形式上是概率,但往往过于自信(例如,对一个错误的预测给出 99% 的置信度)。这说明 p^\hat{\mathbf{p}} 并不是后验概率 P(yx)P(y|\mathbf{x}) 的完美估计。温度缩放 (Temperature Scaling) 是一种简单有效的后处理校准技术,它在推理时对 logits 除以一个可学习的温度系数 TT,使得输出的概率更能反映真实的置信水平。

常见误区与边界情况

  • 误区:Bayes 决策 vs MLE/MAP: 初学者容易混淆。Bayes 决策是关于推理/决策阶段,即给定一个模型,如何做出最优预测。MLE/MAP 是关于学习/训练阶段,即如何根据数据找到最好的模型参数。

  • 误区:Softmax 是损失函数: Softmax 本身不是损失函数,它是一个将任意实数向量转换为概率分布的激活函数。Cross-Entropy 才是衡量预测概率分布与真实分布之间差异的损失函数。

  • 数值稳定性: 在代码实现中,直接计算 log(softmax(z)) 在数值上是不稳定的。当 ziz_i 非常大时,exp(z_i) 可能溢出;当 ziz_i 是很大的负数时,exp(z_i) 可能下溢为0,导致 log(0) 为负无穷。因此,PyTorch 的 nn.CrossEntropyLoss 内部实现的是 log_softmaxNLLLoss 的组合,它使用了 Log-Sum-Exp 技巧来保证数值稳定性:

    log(jezj)=M+log(jezjM)where M=maxj(zj)\log(\sum_j e^{z_j}) = M + \log(\sum_j e^{z_j - M}) \quad \text{where } M = \max_j(z_j)

    面试时能讲出这一点是很大的加分项。

  • MLE 的过拟合风险: 当训练数据量较少时,MLE 容易过拟合。因为它唯一的目标就是最大化数据的似然,可能会学到一些只在训练集上成立的“噪音”模式。此时,引入先验的 MAP(即使用正则化)通常会得到泛化能力更好的模型。

  • 面试追问:

    • : L2 正则化和 MAP 是什么关系?
    • : L2 正则化等价于对模型参数施加了一个零均值的高斯先验,此时的优化目标就是 MAP 估计。
    • : 什么时候 MAP 和 MLE 结果一样?
    • : 当参数的先验分布是均匀分布时,MAP 退化为 MLE。
    • : 既然 Softmax+CE 是在做 MLE,那它有过拟合风险吗?如何解决?
    • : 是的,有风险。解决方法就是引入正则化,比如在优化器里设置 weight_decay,这就从 MLE 转向了 MAP,从而抑制过拟合。其他方法还包括 Dropout、数据增强等。
相关题目