最大似然估计与最大后验估计:从贝叶斯原理到深度学习正则化
发布时间:2026/10/14 20:11:35 锦皓数字建站

开头想聊一个我实际调试模型时遇到的场景。某次训练一个分类模型交叉熵损失降得很漂亮训练准确率已经到了99%但我把验证集上的预测概率打印出来一看几乎所有输出的置信度要么在0.999以上要么在0.001以下说白了就是模型对自己过分自信。当时第一反应是是不是过拟合了于是开始调权重衰减。后来才意识到这个问题本质上不是工程调参的琐事而是最大似然估计Maximum Likelihood EstimationMLE与最大后验估计Maximum A PosterioriMAP这两个统计估计框架在深度学习里的日常投影。如果你是做机器学习、深度学习或者统计建模的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就是加正则化的MLE3.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的关系吃透其他自然就通了。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。