ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

最大似然估计与最大后验估计:从贝叶斯原理到深度学习正则化

最大似然估计与最大后验估计:从贝叶斯原理到深度学习正则化

开头想聊一个我实际调试模型时遇到的场景。某次训练一个分类模型,交叉熵损失降得很漂亮,训练准确率已经到了99%,但我把验证集上的预测概率打印出来一看,几乎所有输出的置信度要么在0.999以上,要么在0.001以下,说白了就是模型对自己过分自信。当时第一反应是"是不是过拟合了",于是开始调权重衰减。后来才意识到,这个问题本质上不是工程调参的琐事,而是最大似然估计(Maximum Likelihood Estimation,MLE)与最大后验估计(Maximum A Posteriori,MAP)这两个统计估计框架在深度学习里的日常投影。

如果你是做机器学习、深度学习或者统计建模的,MLE和MAP这两个词你肯定不陌生。教科书上的定义看起来很简单,一个最大化似然,一个最大化后验,就差了一个先验。但在实际写代码、调参、设计损失函数的时候,这两个概念的差距远比公式上看起来的大:交叉熵损失是怎么来的,权重衰减为什么会改变模型的最终表现,为什么样本少的时候模型容易失控,为什么加了先验之后预测概率会更保守——这些问题的答案,最后都会落到MLE和MAP的关系上。这篇内容就是想把两者的来龙去脉、数学推演和实操取舍讲透,适合正在学习贝叶斯统计的人,也适合已经在调模型但只知道"加正则化有效"的从业者。

1. 先搞清楚最大似然估计在做什么

1.1 一个硬币实验讲透"似然"到底是什么意思

先看最简单的场景:手里有一枚硬币,抛了10次,结果是7次正面、3次反面。你想估计这枚硬币正面朝上的概率 p 是多少。直觉上很多人直接说 p = 0.7,因为这个结果最像。这就是最大似然估计的朴素逻辑:在给定的参数取值下,我观测到的这组数据出现的概率有多大,然后找一个让这个概率最大的参数。

对同一份观测数据,不同的 p 会给出不同的"出现概率"。比如当 p = 0.7 时,抛10次出现"7正3反"的概率是 C(10,7) × 0.7^7 × 0.3^3。而当 p = 0.5 时,同样结果出现的概率是 C(10,7) × 0.5^7 × 0.5^3,算下来要比前者小得多。我们把"在参数 θ 下,当前观测数据 D 出现的概率"称作似然,写成 L(θ|D) = P(D|θ)。最大似然估计做的事情就是:

θ_mle = argmax_θ P(D|θ)

由于 P(D|θ) 通常是一堆概率相乘,数值会非常小,所以实际计算时会对对数后再优化,即最大化 log P(D|θ)。如果样本是独立同分布的,这个对数似然就是每个样本对数概率的求和。对于上面这个硬币问题,目标函数就是:

log L(p) = 7 × log(p) + 3 × log(1-p)

对 p 求导并令导数为零,解出来 p = 7/10。你会发现,MLE给出的答案和我们最初的直觉完全一致。

1.2 为什么MLE本质上是"让数据说了算"

MLE的哲学可以概括成一句话:数据是唯一可以依赖的证据。它假设我们手里这组观测是"真实世界"的一次抽样,然后去找最可能生成这组抽样的参数。这种思路的优点很直接——不需要任何额外的主观假设,只要有数据就能算;统计性质也很好,在样本量足够大的情况下,MLE具有一致性和渐近有效性。

但MLE也有一个非常明显的隐患:它对数据过度忠诚。如果你手里的数据有噪声、有偏、量又少,MLE就会为了拼命拟合这些数据而变得极端。还是说硬币的例子,如果只抛三次,三次全是正面,MLE给出的答案就是 p = 1。这个估计从"让观测出现概率最大"的角度看完全正确,可是你心里清楚,下一枚硬币正面朝上的概率不太可能是100%。问题出在哪里?出在MLE完全不考虑"p应该大概接近0.5"这种常识,也就是不考虑参数本身的先验信息。

这就是为什么在真实项目里,纯MLE训练的模型经常出现过拟合、预测概率过于自信、对训练集之外的分布毫无抵抗力。理解了这一点,再看最大后验估计就会顺理成章。

2. 最大后验估计是在MLE基础上加入了先验

2.1 从贝叶斯公式到MAP:参数也有自己的偏好

最大后验估计的核心是贝叶斯公式。我们把参数 θ 看成是一个随机变量,在看到数据之前,对它有一个先验分布 P(θ),它代表我们在数据之前对参数已有的认知。当观测到数据 D 之后,按照贝叶斯公式,θ 的后验分布是:

P(θ|D) = P(D|θ) × P(θ) / P(D)

分母 P(D) 是与 θ 无关的常数,在优化时可以忽略。于是最大化后验概率的问题就变成:

θ_map = argmax_θ [ log P(D|θ) + log P(θ) ]

对比一下MLE的目标函数,MAP正好多了一项 log P(θ)。这一项就是先验的"发言权"。它告诉优化过程:不要只为了拟合数据而把参数推到极端,参数自己还要满足一定的先验偏好。

回到硬币的例子。假如我知道这枚硬币是从某个自动贩卖机里拿出来的,而那种机器里的硬币通常是比较均匀的,我就可以给 p 设一个在 0.5 附近集中、不会猛冲到 0 或 1 的先验,比如 Beta(5,5) 分布。在这种先验约束下,即使观测到三次全是正面,MAP估计也不会给出 p = 1,而会落在比如 0.71 这样的值上。这就是先验在起"拉回"作用。

2.2 MAP和MLE的真正分界线:先验是不是均匀分布

一个重要的事实是:如果先验 P(θ) 是一个均匀分布,那么 log P(θ) 对所有 θ 都是同一个常数,在优化时可以直接删掉,此时MAP的优化目标和MLE完全一致。换句话说,MLE是MAP在"先验无信息"时的特例。

这里要提醒一句:均匀先验不等于"没有假设"。真正的区别在于你有没有对参数的分布形态施加偏好。当先验不是均匀分布时,MAP会把最优参数从"纯粹适合数据"的位置,拉向"既适合数据又符合先验"的位置。这个拉动的强度,取决于两个因素:一是先验本身的集中程度,比如方差越小约束越强;二是数据量的大小,样本越多,似然项的梯度越强势,先验的影响就越小。

在实践里,这种"拉回"效果体现得非常直观。我曾经在某个多分类项目中对比过纯MLE训练和加了先验的训练,数据只有两万条左右,纯MLE方案的训练损失很快降到接近0,但验证集上的泛化表现开始下滑,而且预测概率的分布明显两极化。而换成MAP目标之后,同样的模型结构、同样的数据,验证集的性能更稳定,预测概率的分布也更合理。这不是玄学,而是先验真的在限制参数的搜索空间。

3. 一个必须理解的等价关系:MAP就是加正则化的MLE

3.1 高斯先验是如何变成L2正则化的

很多人在初学机器学习时,是把L2正则化当作一个"防止过拟合的工程技巧"来接受的,很少有人告诉你它其实就是高斯先验下的MAP。推导过程其实很短。

假设模型参数 θ 的每一维都服从均值为0、方差为σ²的高斯先验,即:

P(θ) = ∏_i (1 / √(2πσ²)) × exp(-θ_i² / 2σ²)

取对数之后:

log P(θ) = -∑_i θ_i² / 2σ² + 常数

在MAP目标中,我们要最大化 log P(D|θ) + log P(θ),等价于最小化:

  • log P(D|θ) + ∑_i θ_i² / 2σ²

这个第二项正是L2正则化项(权重衰减),正则化系数 λ 在这里就对应着 1/(2σ²) 的角色(不同写法会有系数差异,但本质一致)。所以,所谓L2正则化,本质上是在假设参数应该集中在0附近,并且用一个高斯分布描述了这种集中程度。σ²越小,先验越"强势",λ就越大,参数就会被约束得更靠近0。

同样的道理,如果先验是拉普拉斯分布,取对数后得到的是绝对值项,也就是L1正则化。L1正则化容易让一些参数变成精确的0,这是因为拉普拉斯分布在0处的"尖峰"会更强地推动参数归零。

3.2 这个等价关系在生产环境中的价值

理解了这个等价关系,你在调参时的眼光就会不一样。以前可能是"过拟合了,加个weight decay试试",现在你会想"当前任务的参数先验应该怎么设计?是希望参数整体变小,还是只希望少数参数非零?"这会直接影响你选择L2还是L1,也会影响你对正则化系数量级的判断。

另一个常见的应用是贝叶斯优化和不确定性估计。如果你只做MLE,模型给出的只是参数空间中的一个点,你对"模型哪里不确定"一无所知。而MAP给了你一个带约束的点估计,但它仍然是点估计,并不能完全代表后验分布。如果你想要真正的贝叶斯推断,需要做的是拿到完整的 P(θ|D),再用这个分布去做预测积分,而不是只取它的众数。不过由于高维空间里这个积分基本不可解,深度学习里常见的妥协方案就是:先取MAP作为参数点,然后在附近做近似,比如MC Dropout、拉普拉斯近似、变分推断等方法,本质上都是在把后验分布的信息一点点加回来。

这里我建议所有做深度学习的同学都亲手推一遍高斯先验等价L2的公式,大概只要十分钟。推完之后你对"权重衰减系数为什么不能随便设得太大"会有新的理解:λ太大相当于把一个方差极小的先验强加给参数,参数全部挤到0附近,模型表达能力会被严重削弱,在训练集上就会出现欠拟合。λ太小又等于先验很弱,模型退化成纯MLE,过拟合风险上升。这不是调参口诀,而是先验方差的直观影响。

4. 实操中的选择:损失函数、先验设计与调参策略

4.1 交叉熵和MSE其实都是MLE的化身

在深度学习里,MLE不是一个需要显式写出来的模块,它藏在损失函数里。

分类任务常用的交叉熵损失,本质上是"模型输出类别概率分布,并最大化观测标签的负对数似然"。你训练一个softmax分类器,最小化交叉熵,就是假设训练样本的标签服从一个多项分布,然后用MLE去估计网络参数。回归任务常用的MSE损失,本质上是假设观测值等于模型输出加上一个高斯噪声,这个高斯噪声的方差固定,然后对这个带噪声的观测做MLE。

很多时候我会在项目复盘时问团队同学一个问题:你的损失函数对应的是什么似然假设?如果回答不上来,那模型表现诡异时你就少了非常重要的一个排查角度。比如某个回归任务残差明显是重尾分布,却用了MSE(高斯假设),那预测会被个别极端样本带偏,这时切换到MAE(拉普拉斯假设)或Huber损失通常会好很多。这说明损失函数的选择,本质上是在选择你对数据生成过程的假设。

在分类任务中,标签平滑(Label Smoothing)也值得一提。它把one-hot标签变成一部分概率分配给其他类别,表面上是防止模型过度自信,实际上是在修改"似然模型"——不再假设标签是一个确定性的one-hot分布,而是引入了"标注本身可能含噪声"的先验信息。这也是MLE和MAP思想在工程中的一种变体。

4.2 当数据变少时,MAP的优势就冒出来了

在小数据场景下,MLE和MAP的差异会变得非常明显。MLE在小样本上容易在训练集上做到完美,但一旦换到分布略有变化的测试环境,立刻崩盘。MAP因为先验的约束,参数不会走得太远,泛化相对稳定。

我在做某个边缘设备上的分类原型时,每个类别只有几百条样本。起初我用纯交叉熵训练一个轻量网络,验证准确率达到可以接受的水平,但到了夜间光照条件下测试,准确率掉了接近20个百分点。排查了很多工程问题之后,我试着给网络加上了权重衰减,并稍微调大了系数,提升了验证集和跨场景测试的表现。虽然提升幅度不是那种"突然翻盘"的级别,但稳定性明显改善。事后分析,其实就是MAP的高斯先验帮模型筛选出了更平滑、更不依赖训练集特有纹理的特征。

不过要特别提醒的是,MAP不是万能的。如果你对参数的先验假设本身是错的,比如参数真实分布离0很远,你却用了一个强高斯先验强行把它们拉向0,那模型同样会崩。这种冲突在小模型上尤其常见:卷积核初始化时已经工作在某个合理尺度,你不加思考地设一个很大的权重衰减,很容易把有效特征全部压没了。先验需要对任务有基本合理性,而不是默认可加。

4.3 一个可以直接抄的先验强度调法

以深度学习里的L2权重衰减为例,我通常这样调先验强度:

  • 第一步,先关掉权重衰减(相当于纯MLE),跑一个较小的模型,确认数据管道、损失函数、学习率没有问题。
  • 第二步,给一个中等强度的权重衰减,比如 1e-4 到 5e-4 量级,观察验证集变化。如果验证损失开始出现明显下降或稳定,说明先验有正面作用。
  • 第三步,在中等强度的基础上按对数尺度做几组实验,比如 1e-4、5e-4、1e-3、5e-3,对比验证集表现和预测概率分布。
  • 第四步,观察训练集上的表现。如果训练集损失始终比验证集高很多,通常意味着先验过强,这时需要调低λ。

一个重要原则是:梯度、归一化层的存在会改变权重衰减的实际影响。加了BatchNorm之后,权重衰减主要作用于缩放系数和偏置,先验的影响路径和普通卷积网络不完全一样。所以不要指望换了个归一化方式之后,同一个λ还能有完全相同的效果,务重建实验。

5. 常见困惑与排查经验实录

5.1 问题一:MAP是不是一定比MLE好?

不是。MAP在数据量大的情况下会逐渐趋近于MLE,因为似然项的贡献会压倒先验项;但在数据量有限且先验合理时,MAP通常更稳。反过来,如果先验设计得离谱,MAP可以比MLE差很多。比如某分类问题里,业务上知道模型输出应该满足某种频率规律,你却硬套了一个对称先验,模型的表现就会被扭曲。

判断依据很简单:先验是你对参数的全部"先于数据的认识",它必须有实际依据,不能是默认设置。没有依据时,老老实实用MLE或弱先验,别为了显得专业而强行加一个不合理的先验。

5.2 问题二:后验分布无法解析求解,MAP算不出来怎么办?

这是初学者最容易卡住的地方。严格来说,MAP需要计算后验分布,但在绝大多数真实模型里,后验分布没有解析形式。好在做MAP只需要最大化一个目标函数,不需要真正积分。所以实践中普遍的做法是:

  • 如果是线性模型或一些共轭先验的场景,可以直接解析求解。
  • 如果是深度学习模型,把MAP目标中的两项加在一起,直接用梯度下降优化即可。
  • 如果确实需要完整的后验分布来做不确定性估计,再考虑MCMC采样、变分推断、MC Dropout近似等更重的方法。

我的习惯是:先做MAP点估计,把模型跑通、业务能上线,然后再评估要不要为了不确定性估计上更复杂的方案。很多团队的误区是一上来就追求全贝叶斯,结果模型训练极其耗时,收益却难以度量。

5.3 问题三:怎么判断当前是"欠正则"还是"过正则"

这个可以通过记录训练集和验证集的差距来判断。欠正则的典型信号是训练损失远小于验证损失,预测概率分布两极分化,验证集表现震荡大。过正则的典型信号则是训练损失和验证损失一起高,模型容量明显受限,验证集表现平稳但上不去。

在调优流程里我建议把训练损失曲线、验证损失曲线、预测置信度分布同时记录下来,不只看准确率。很多时候准确率表面上差不多,但置信度分布已经出了问题,那对于高可靠场景就是隐患。

5.4 问题四:深度学习里到底有没有"真正的贝叶斯"

严格地说,绝大多数深度学习训练过程不是真正的贝叶斯推断,因为只取了MAP点,没有求完整的后验积分。不过这不妨碍我们用贝叶斯视角去理解和改进模型。比如MC Dropout就是在预测时打开Dropout多次采样,近似模拟后验采样;又比如一些不确定性校准方法,本质上是在估计后验预测分布的方差。

在这个方向上,我的实操建议是:如果你想给模型加上不确定度输出,先别急着改整个训练框架,可以在已经训练好的MAP模型上做小改,比如加一层温度缩放、做集成、或者在推理阶段做MC Dropout。这些方法见效快、改动小,是工程上最务实的过渡方案。

一点个人体会

MLE和MAP这两个概念我学生时代就背过公式,但真正觉得"懂了"是在做了几年模型调优之后。因为你会发现,很多看似靠经验才能判断的决策——要不要加正则化、加多强、用什么类型的正则化、模型为什么过于自信、小数据为什么容易崩——本质上都是在一个点估计和另一个点估计之间做选择。搞懂了背后的似然假设和先验假设,你就不是在"碰运气调参",而是在有依据地设计模型。

最后分享一个小技巧:调试任何模型之前,先把"我的损失函数对应什么似然假设"和"我加的每一项正则化对应什么先验假设"写在一张纸上。这两个问题一旦明确,你就已经比很多只会套框架的人走得远了。至于后面的贝叶斯扩展、不确定性估计,也都是顺着这条路继续往前走的事,不用急,先把MAP和MLE的关系吃透,其他自然就通了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进