极大似然估计:从抛硬币到交叉熵的AI基石 📅 发布时间:2026/9/7 17:25:52 👁 浏览次数: 1. 为什么搞AI的人迟早都要啃下极大似然估计这块硬骨头做人工智能这一行不管你是搞机器学习、深度学习还是大模型微调迟早会在某个深夜面对一堆数学符号然后发现卡住你的不是框架API而是极大似然估计Maximum Likelihood Estimation简称MLE这个老朋友。这个词在人工智能的数学基础里出现频率极高无论是线性回归的损失函数推导、逻辑回归的交叉熵损失还是贝叶斯推断里的先验与后验背后都站着它的影子。我见过太多人调参调得很好但一问为什么损失函数是MSE而不是MAE就答不上来。这不是什么难堪的事——我自己刚入行时也是先会用再理解但后来发现不理解极大似然估计很多事只能停留在调参侠的层面模型效果不好时不知道从哪下手换了损失函数不知道会发生什么甚至面试时被问到原理只能背结论。这篇东西就是想把这块基石讲透。文章适合三类人看正在系统学习人工智能数学基础的初学者已经会用sklearn、PyTorch但想补原理的工程师以及准备面试、想把这些知识串成体系的人。我会从抛硬币讲到交叉熵尽量不跳步所有关键推导都写出来保证你合上文章能自己推一遍。1.1 极大似然估计在AI体系里的位置先把地图画出来。人工智能和机器学习要解决的问题本质上是一个从数据中找规律的问题给定一堆样本数据希望找到一个模型和一组参数让模型能很好地把数据背后的规律描述出来。那好怎么定义极大似然估计给出的回答是让模型在这些数据上出现的概率最大。这个想法朴素得惊人。你手里有一组观测数据假设它们是某个概率分布生成的现在要在所有可能的参数里挑一个使得这组数据被生成出来的概率最大——这个参数就是极大似然估计的解。整个监督学习的三件套——模型、损失函数、优化算法其实都是在给这个思想套上具体的壳。模型定义了概率分布的形式损失函数来自对似然函数取负对数优化算法就是在找让负对数似然最小的参数。所以你会发现极大似然估计不只是数学课上的一个概念它是连接概率论和机器学习算法之间的桥。理解了它后面看逻辑回归、softmax分类、高斯混合模型甚至Transformer的预训练目标都会有原来如此的感觉。我甚至觉得把MLE吃透比多学十个模型的调用API都值。1.2 一句话直觉谁的解释力最强谁就是答案我给学生讲MLE时最爱用侦探破案做类比。案发现场有脚印、指纹、目击证词这些观测数据现在有几个嫌疑人候选参数每个嫌疑人能解释这些证据的可能性不同。极大似然估计做的事情就是挑那个能把证据解释得最连贯、最没有违和感的嫌疑人。用概率的语言说就是找让这些观测同时出现的概率最大的人。这个直觉一旦建立后面很多公式就有了解释。为什么参数估计要找极大值而不是别的因为我们相信已经发生的事大概率会发生。观测数据既然拿到了它们被抽样出来的概率就不应该是小概率事件所以我们去找那个让这个概率最大的参数。这就是MLE的哲学核心让已经发生的事变得尽可能合理。听起来很简单但整个统计学习的大厦就是在这个简单思想上盖起来的。2. 从抛硬币说起极大似然估计的核心思想拆解理论说再多不如动手算一遍。抛硬币是理解MLE最经典的入门场景我们来完整走一遍。这个例子小到可以用纸笔算完但麻雀虽小五脏俱全里面包含了MLE的全部核心操作写似然函数、取对数、求导、令零、解参数。2.1 概率和似然到底有什么区别这是初学者第一个容易卡住的地方。我当年也迷糊了很久概率和似然不是一回事吗都是那个公式怎么换个名字严格来说它俩用的是同一个函数但看待的角度完全不同。概率是在参数已知的条件下预测不同结果出现的可能性似然是在结果已知观测到数据的条件下评估不同参数值对这批数据的解释能力。参数是变量还是数据是变量决定了你是在算概率还是在算似然。举个例子。一枚硬币假设正面概率p0.5抛10次出现6次正面的概率是多少这是概率问题。反过来我不知道p是多少但实际抛了10次看到6次正面我想反推p最可能是多少——这就是似然问题。同样一个6/10的事实概率视角下p是固定的、结果是随机的似然视角下结果是固定的、p是变量。这个区别虽然抽象但理解了它后面看贝叶斯公式或者其他估计方法时会顺很多。2.2 手算一个最简版的极大似然估计设硬币正面概率为p0到1之间反面概率为1-p。抛了n次假设看到k次正面、n-k次反面。如果每次抛硬币是独立同分布的这一整串结果的联合概率就是L(p) p^k * (1-p)^(n-k)这个L(p)就是似然函数。注意这里把p当自变量k和n是已知数。我们的任务变成了p取什么值时L(p)最大对单变量函数求极大值标准操作是求导令其为零。但直接对连乘形式求导很麻烦所以两边取对数对数函数单调递增所以最大化对数似然和最大化似然是等价的ln L(p) k * ln(p) (n-k) * ln(1-p)对p求导d(ln L)/dp k/p - (n-k)/(1-p)令导数等于零k/p (n-k)/(1-p)解得 p k/n。这个结果平淡无奇却意味深长极大似然估计告诉我们正面概率最合理的估计就是正面出现的频率。直觉和数学在这里完美合上了——你用频率估计概率这本身就是在做极大似然估计。很多人学统计学时知道用频率估计概率这条经验法则但不知道它背后有如此严谨的推导。现在你知道了。2.3 为什么要取对数连乘变连加的秘密上面推导里我直接取了ln很多初学者会问凭什么可以取对数取了对数之后最优解会不会变不会因为ln是严格单调递增函数一个点如果是ln f(x)的极大值点那它一定也是f(x)的极大值点。打个比方你按身高排序和按年龄排序可能得到不同顺序但按身高排序和按身高的对数排序顺序完全一样——因为对数不改变大小关系。那取对数的实际好处是什么第一数值稳定性。似然函数是很多个概率的连乘概率都在0到1之间几十个乘下来数字就小得离谱计算机浮点数直接下溢成零。取对数后变成求和数值范围友好得多。第二求导方便。乘积的导数法则复杂求和的对数导数就清爽多了。第三很多常见的概率分布比如高斯分布、伯努利分布取对数后形式会变得很规整容易和损失函数对上号。这个取对数的习惯会贯穿你整个机器学习生涯。后面看任何损失函数的推导都可以先问一句这是不是某个似然函数取了负对数如果是那这个损失函数就不是拍脑袋定的而是有概率意义上的合理性。3. 线性回归与极大似然估计教科书没明说的那层关系线性回归是最简单的监督学习模型但很多人不知道它的损失函数MSE均方误差并不是拍脑袋定的而是从极大似然估计推导出来的。把这个推导吃透你对为什么损失函数这么设计的理解会完全不同。3.1 从高斯分布假设到最小二乘法先做一个建模假设数据是这样生成的——真实关系是x和y之间存在线性关系 y wx b但观测时叠加了一个随机噪声ε即 y wx b ε。假设噪声ε服从均值为0的高斯分布正态分布方差为σ²。这个假设在大量实际问题里是合理的测量误差、随机波动往往近似服从正态分布。那么给定xy的条件概率就是一个以wxb为中心的高斯分布P(y|x; w, b, σ²) (1 / sqrt(2πσ²)) * exp(-(y - wx - b)² / (2σ²))注意这个中心在预测值上的高斯分布是理解线性回归的关键。模型预测的wxb不是y的确定值而是y最可能出现的那个位置——分布的均值。离均值越近概率密度越大离得越远概率密度越小。这个视角下线性回归不是在画一条穿过所有点的线而是在找一个让已有数据出现概率最大的高斯分布中心位置。3.2 完整推导过程让为什么损失函数是MSE不再神秘现在有m个样本 (x_i, y_i)假设相互独立。整批数据的似然函数就是每个样本概率密度的乘积L(w, b) ∏ P(y_i | x_i; w, b, σ²)取对数后ln L Σ ln P(y_i | x_i; w, b, σ²) Σ [ -0.5*ln(2πσ²) - (y_i - wx_i - b)² / (2σ²) ]展开一下第一项 -0.5*ln(2πσ²) 是常数和w、b无关最大化时可以扔掉。剩下的核心项就是 -Σ (y_i - wx_i - b)² / (2σ²)。由于σ²是正常数最大化ln L等价于最小化J(w, b) Σ (y_i - wx_i - b)²这正是最小二乘法的目标函数也就是MSE损失差个常数倍数1/m。看见没有你天天写的loss mean((y_pred - y_true)**2)本质上就是在做极大似然估计——在高斯噪声假设下让数据出现概率最大的那条线。这个推导的震撼之处在于它告诉我们损失函数不是任意的。你用MSE就等于隐式假设了噪声服从高斯分布如果你的实际问题中噪声不是高斯分布比如有重尾、有异常值那MSE就可能不是最优选择。这也是为什么遇到异常值较多的回归任务时有人会换MAE或者Huber损失——那可以理解为换了噪声的分布假设。3.3 这个推导对实际建模的启发我在实际项目中用过一次这个知识。有个传感器数据回归任务数据里经常出现异常尖峰直接用MSE训练出来的模型被少数几个异常点带偏效果很差。当时我先用MSE训练然后看残差分布——发现残差并不是正态的而是有明显的长尾。这让我意识到噪声假设不成立于是改用Huber损失中间是MSE两端是线性相当于给重尾一个更宽松的惩罚效果提升非常明显。如果你不理解损失函数和噪声分布的这层关系遇到这种情况大概率只能无脑调学习率调半天也找不到根因。顺带说一句线性回归的解析解正规方程也可以用极大似然估计推导出来把上面J(w,b)对w求导令为零解出的w就是最小二乘解。这从另一个角度验证了最小二乘max似然的关系。建议你自己动手推一遍这个过程能帮你把微积分、线性代数和概率论三块知识串起来。4. 深度学习里的极大似然估计交叉熵的前世今生如果说线性回归里的MSE让大家觉得原来如此那分类任务里的交叉熵损失会让人更震撼——因为它太常用了以至于很少有人问它怎么来的。但实际上交叉熵损失的整个推导过程就是极大似然估计在分类问题上的标准应用。4.1 分类问题如何套进似然框架分类任务的本质是给定输入x预测它属于哪一类。我们用一个模型输出每个类别的概率。假设有C个类别模型对第i类的预测概率是 f_i(x; θ)那对单个样本模型给出的概率分布就是 (f_1, f_2, ..., f_C)。在训练时我们已知这个样本的真实标签是y假设是第c类。套用似然的思想这个样本被观测到意味着它属于第c类这件事发生了。所以这个样本的似然就是模型预测的 f_c(x; θ)——真实类别的预测概率。这个思路和抛硬币一脉相承观测已经发生我们想让模型给真实发生的事件一个尽可能高的概率。4.2 softmax与交叉熵的推导关系多分类问题里模型最后一层输出的logits未归一化的分数需要转成概率。最常用的转换函数是softmaxf_i exp(z_i) / Σ_j exp(z_j)其中z_i是第i类的logit。softmax把任意实数向量变成和为1的概率分布而且保持了相对大小关系。为什么要用exp因为exp的非负性和单调性保证了输出是合法概率而且梯度计算方便。现在把似然写出来。对一批N个样本似然函数是每个样本真实类别概率的连乘L(θ) ∏ f_{y_i}(x_i; θ)取负对数注意是负的因为机器学习习惯最小化损失Loss -Σ ln f_{y_i}(x_i; θ)把softmax代进去Loss -Σ [ z_{y_i} - ln(Σ_j exp(z_j)) ]这个式子就是softmax交叉熵损失的完整形式。展开看第一项z_{y_i}是真实类别的logit鼓励模型让真实类别的分数越高越好第二项是全局归一化项抑制所有类别的分数同时膨胀。两个力量平衡模型学到的logits就有了合理的相对关系。很多人用PyTorch时会发现nn.CrossEntropyLoss这个类内部已经把softmax和交叉熵合并了你给它logits就行不需要自己先softmax。理解了上面的推导你就能明白为什么文档里特意强调这一点——因为合并实现有数值稳定性的优势后面讲log-sum-exp时再细说。4.3 为什么说深度学习训练本质上是最大化似然一旦建立了损失函数负对数似然的观念再看整个深度学习训练流程就豁然开朗了。你用的优化器SGD、Adam在做的就是最大化这批训练数据的似然等价于最小化负对数似然。无论是分类的交叉熵、回归的MSE还是其他自定义损失只要它是对数似然的负数形式训练过程就有了严格的概率解释。这个概念对理解大模型也很有用。拿语言模型来说预训练目标就是给定前文预测下一个token这个目标本质上就是最大化整个语料库的似然——让模型在真实文本上的概率最高。所以你看到的GPT类模型的训练损失perplexity困惑度其实就是负对数似然的指数形式。困惑度越低说明模型给真实文本的概率越高也就是似然越大。这么一串极大似然估计就从数学课本通到了最前沿的大模型这也是我当初学这块时收获最大的一点。理解了它你再去看各种AI模型架构和损失函数设计时就不容易被人忽悠了。5. 实战中的典型问题与排查实录理论讲完了说点实操中会踩的坑。这些问题我基本都遇到过整理成一份排查清单希望能帮你少走弯路。5.1 数值下溢log-sum-exp技巧似然函数是连乘前面说过取对数可以缓解下溢但softmax里的指数运算本身也会出问题。如果某个logit很大比如1000exp(1000)在浮点数里直接溢出成inf如果都很大exp的值除以它们的和分子分母都可能是inf结果是NaN。解决办法是log-sum-exp技巧把每个logit减去这批logits的最大值m再做softmax。因为softmax(z_i) exp(z_i) / Σexp(z_j) exp(z_i - m) / Σexp(z_j - m)减去最大值后指数里的最大值变成0其余都是负数exp不会溢出。这个技巧在数值计算库比如SciPy的logsumexp函数里是标配PyTorch的CrossEntropyLoss内部也做了类似处理。如果你自己实现softmax或者手工写损失函数一定要记得这一步否则复杂模型训练到后期logits变大时NaN会莫名其妙冒出来。我见过太多人遇到NaN先去调学习率结果发现是自己实现的softmax没做数值稳定处理。5.2 似然函数多峰与局部最优极大似然估计求的是全局最优但在神经网络这种高度非凸的问题里似然函数或负对数似然是坑坑洼洼的梯度下降只能找到局部最优。这一点和数学课本里求导令零解出全局最优的理想情况差别很大。实操中我的建议是别太纠结理论上的全局最优。深度学习的实践中找到一个足够好的局部最优训练损失收敛、验证集表现稳定就够用了。而且经验表明高维空间里局部最优和全局最优的差距往往没有想象中大鞍点反而更常见。当你发现模型loss卡住不动时先别怀疑MLE框架有问题先查学习率、批次大小、初始化方式这些对最终收敛位置的影响往往更大。5.3 过拟合与正则化的似然视角从似然角度看过拟合就是模型在训练集上的似然太高了高到把训练集里的噪声也当成规律学进去了。怎么治两个方向一是收集更多数据让真实规律更突出二是引入正则化。正则化可以理解为给参数加先验。贝叶斯视角下最大后验估计MAP等于极大似然 参数先验。L2正则化对应高斯先验——它认为参数不会离0太远L1正则化对应拉普拉斯先验——它倾向于把不重要的参数直接压到0所以L1能产生稀疏解。了解了这层关系你在选择正则化方法时就有了判断依据而不是L1能稀疏就用L1的模糊印象。5.4 实操避坑清单最后整理一份清单都是我在实际代码中遇到过的坑自己实现softmax时一定要做max减除否则训练后期logits变大后会输出NaN。写损失函数时优先用框架自带实现。PyTorch的CrossEntropyLoss已经包含softmax和数值稳定的处理你自己写一遍看似灵活实际上很容易在数值稳定性上出问题。线性回归用MSE时先检查一下残差分布是否接近正态。如果残差有明显趋势或长尾考虑换损失函数或者做数据变换别死磕MSE。二分类的BCEWithLogitsLoss也是合并了sigmoid和BCE的实现输入logits即可不要再手动sigmoid不然数值稳定性会有隐患。训练过程中偶发NaN不要只盯着学习率先检查是否出现了exp溢出或者除零尤其是自定义损失函数时这种bug特别隐蔽。除了这些我还想补充一点做实验时养成记录损失曲线形状的习惯。正常的交叉熵损失曲线是单调下降然后趋于平稳如果看到损失曲线突然跳变或者长时间不降往往是数据问题标签错误、样本不均衡而不是数学框架的问题。这个排查思路比盯着公式想半天更实用。6. 我的一点学习建议与扩展方向写到这里核心内容基本都覆盖了。最后分享点个人经验。我当年学极大似然估计走了不少弯路最大的弯路就是只看公式推导、不动手算例子。建议你也找几个最简单的模型亲手推一遍抛硬币的伯努利分布、线性回归的高斯噪声假设、逻辑回归的伯努利似然。每个都从写出似然函数开始取对数求导令零解参数。整个过程用纸笔走一遍比看十遍博客都管用。如果还想深入几个值得继续啃的方向最大后验估计MAPMLE的贝叶斯扩展、EM算法带隐变量时的极大似然估计、变分推断复杂模型下无法直接优化似然时的近似方法。这几个方向都能在极大似然估计的框架下展开学起来会有连贯感。MLE这个知识点就像一个锚点把概率论、损失函数、优化算法、正则化这些散落的概念串成了一条线。搞懂了它你对人工智能整体的理解会上一个台阶而不是停留在会调包的层面。哪怕你以后做的项目不再碰数学推导这种能把直觉和公式对应起来的能力也会在关键时刻帮你做出更靠谱的技术决策。