最大似然估计与最大后验估计
MLE 和 MAP 是统计推断的两种核心方法。训练神经网络的本质 ≈ 最大似然估计。
概念解析
假设你手里有一组观测数据,你相信这些数据来自某个已知类型的概率分布(比如正态分布),但不知道这个分布的参数(均值 μ 和标准差 σ)。
MLE 和 MAP 回答的是同一个问题:给定数据,最合理的参数值是多少?
两者的区别在于——MLE 只看数据本身,MAP 还会参考你对参数的先验认知。
似然 vs 概率:两个方向看同一件事
概率 P(数据|参数):参数固定,问「在这个参数下,观察到这些数据的概率多大?」
似然 L(参数|数据):数据固定,问「哪个参数值最可能产生这些数据?」
似然函数的值本身不归一(不要求和为 1),它的意义在于 比较不同参数值的相对合理性。
MLE:什么参数最可能生成这些数据?
\[ \hat{\theta}_{\text{MLE}} = \arg\max_\theta P(D | \theta) \]只看数据,选择最可能产生观测数据的参数。
为什么取 log?
- 连乘变连加:数值更稳定(防止下溢)
- 求导更容易:对数把乘法变成加法
- 不改变极值点:log 是单调递增函数
MAP:引入先验知识
\[ \hat{\theta}_{\text{MAP}} = \arg\max_\theta P(\theta | D) = \arg\max_\theta P(D | \theta) \cdot P(\theta) \]MAP = MLE + 先验 P(θ)。当先验是均匀分布时,MAP = MLE。
MLE 只看数据,MAP 还看先验。数据量大时先验影响被稀释,MAP 趋近 MLE。
数据量小时,先验起到「正则化」作用——L2 正则化 ≡ Gaussian 先验的 MAP。
生活例子
估计日均销量
网店连续 10 天日销量:[23, 25, 22, 24, 26, 23, 25, 24, 22, 24]。
假设销量服从正态分布,均值的 MLE 估计 = 这些数的平均值 ≈ 23.8。
直觉上你也会这样做——MLE 就是把直觉数学化了。
Python 动手实践
实例
np.random.seed(42)
data = np.random.normal(5.0, 2.0, 100) # 真实 μ=5, σ=2
# MLE: μ = 样本均值
mu_mle = np.mean(data)
print(f"MLE μ = {mu_mle:.3f} (真实=5.0)")
# MAP: 先验 μ ~ N(0, 1),向先验方向收缩
prior_mu, prior_var = 0.0, 1.0
n = len(data)
mu_map = (prior_mu/prior_var + n*mu_mle/np.std(data)**2) / (1/prior_var + n/np.std(data)**2)
print(f"MAP μ = {mu_map:.3f} (在MLE和先验0之间折中)")
运行输出:
MLE μ = 4.968 (真实=5.0) MAP μ = 4.776 (在MLE和先验0之间折中)
AI 中的应用场景
损失函数设计 = MLE
最小化交叉熵损失 ≈ 在多项分布假设下做最大似然估计。最小化 MSE ≈ 在误差正态分布假设下做 MLE。损失函数不是随意选的——每种损失函数对应一个隐含的概率分布假设。
L2 正则化 = Gaussian 先验的 MAP
在损失中加 \( \lambda\|w\|^2 \),等价于假设权重 w 的先验是 \( N(0, 1/\lambda) \)。MAP 在数据似然和先验之间折中——数据少时先验主导(权重趋向 0),数据多时似然主导。
L1 正则化 = Laplace 先验的 MAP
在损失中加 \( \lambda\|w\|_1 \),等价于假设权重 w 的先验是 \( Laplace(0, 1/\lambda) \) 分布。Laplace 分布在 0 点尖锐——MAP 倾向于产生稀疏解(很多权重恰好为 0),实现了自动特征选择。
贝叶斯神经网络
普通神经网络的权重是确定的点估计(MLE/MAP)。贝叶斯神经网络给每个权重赋予一个概率分布(后验),输出也是概率分布——从而有天然的 uncertainty estimation。预测时可以对权重采样多次,看输出的方差来判断模型对自己预测的置信度。
