Skip to content

最大似然估计与最大后验估计

MLE 和 MAP 是统计推断的两种核心方法。训练神经网络的本质 ≈ 最大似然估计。


概念解析

假设你手里有一组观测数据,你相信这些数据来自某个已知类型的概率分布(比如正态分布),但不知道这个分布的参数(均值 μ 和标准差 σ)。

MLE 和 MAP 回答的是同一个问题:给定数据,最合理的参数值是多少?

两者的区别在于——MLE 只看数据本身,MAP 还会参考你对参数的先验认知。

似然 vs 概率:两个方向看同一件事

概率 P(数据|参数):参数固定,问「在这个参数下,观察到这些数据的概率多大?」

似然 L(参数|数据):数据固定,问「哪个参数值最可能产生这些数据?」

似然函数的值本身不归一(不要求和为 1),它的意义在于 比较不同参数值的相对合理性

MLE:什么参数最可能生成这些数据?

θ^_MLE=argmax_θP(D|θ)

只看数据,选择最可能产生观测数据的参数。

为什么取 log?

  • 连乘变连加:数值更稳定(防止下溢)
  • 求导更容易:对数把乘法变成加法
  • 不改变极值点:log 是单调递增函数

MAP:引入先验知识

θ^_MAP=argmax_θP(θ|D)=argmax_θP(D|θ)P(θ)

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 动手实践

实例

python

import numpy as np

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之间折中)")

运行输出:

python
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。预测时可以对权重采样多次,看输出的方差来判断模型对自己预测的置信度。


AI 思考中...

期望、方差与协方差 — 数据的数字特征

信息量与熵 — 量化不确定性

基于 VitePress 构建,部署于 GitHub Pages