前阵子帮一位转行做算法的朋友做技术面模拟,连续追问了他几个问题:为什么分类任务几乎都用交叉熵损失,而回归任务几乎都用均方误差?这两个损失函数是怎么来的?他公式背得很熟,代码也能跑通,但被问到"这两个东西的源头其实是同一个数学工具"时,明显卡住了。
这个工具就是极大似然估计(Maximum Likelihood Estimation,MLE)。它绝不只是概率论课本里的抛硬币习题,而是从线性回归、逻辑回归到深度神经网络的共同地基。你在PyTorch里写的nn.CrossEntropyLoss()、nn.MSELoss(),追根溯源都是某个概率假设下的负对数似然。这篇文章我想用一线开发者的视角,把这个地基从直觉到推导、从推导到工程实践中的坑,一次性讲透。不管你是刚入门机器学习,还是已经写了段时间模型但总觉得数学底子发虚,这篇文章都值得你静下心看完。
1. 抛硬币背后的数学直觉:MLE到底在求什么
要理解极大似然估计,最简单的入口就是抛硬币。假设我们手里有一枚材质未知的硬币,想估计它正面朝上的概率θ。我们连续抛了10次,结果有7次正面、3次反面。直觉告诉我们,θ的估计值应该是0.7。这个直觉当然没错,但我想让你回答一个更深的问题:为什么是0.7?为什么不是0.65,不是0.75?这时候,极大似然估计给出了一个看起来很绕、但逻辑上无懈可击的答案:在所有可能的θ取值中,我们选择那个"让已经发生的结果以最大概率出现"的数值。
也就是说,我们把"结果已经发生"这件事当成给定事实,反过来质问:到底是什么样的θ,让这次结果最可能发生?这个"反过来质问"的过程,就是"似然"(likelihood)二字的本质。
1.1 一个朴素但核心的提问方式
先把10次抛硬币的结果写成一个简单的事件:7次正面、3次反面。如果已知正面概率是θ,那么出现这个结果的概率是:
$$P(\text{7正3反} \mid \theta) = C_{10}^{7} \theta^{7} (1-\theta)^{3}$$
这里的$C_{10}^{7}$是从10次中选出哪7次为正面的组合数,它只依赖于抛掷次数,跟θ无关。现在,我们把θ当作自变量,把这个概率看成θ的函数,于是定义似然函数:
$$L(\theta) = C_{10}^{7} \theta^{7} (1-\theta)^{3}$$
极大似然估计要做的,就是找到让$L(\theta)$最大的那个θ。如果你还记得高数里的求极值步骤,对这个函数取对数再求导,令导数等于0,就能解出来。但先别急着算,我想先强调一个认知上的关键转变:**概率和似然,用的是完全相同的公式,但自变量和因变量互换了位置。**概率是已知θ,预测数据;似然是已知数据,反推θ。同一个公式,视角一转,意义完全不同。
1.2 似然与概率:同一种公式的两个视角
这个"视角互换"恰恰是很多初学者过不去的坎。具体来说:
- 概率:给定模型参数θ,计算某个事件发生的可能性。这里θ是固定的,事件是变化的。
- 似然:给定已经观测到的事件结果,评估不同θ值对这个结果的支持程度。这里事件是固定的,θ是变化的。
一个特别容易踩的坑是:$L(\theta)$这个函数对θ的积分并不等于1,所以它不是θ的概率分布。别把似然函数误会成"θ的概率密度"。在频率学派的视角下,θ是一个未知的固定值,没有概率分布可言,只有"哪个值看起来更合理"的问题。这一点想通了,后面理解贝叶斯方法时就不会打架。
1.3 为什么一个"细节"被丢掉了:C(n,k)的去留
回到刚才的式子。你会发现,在求"让L(θ)最大"的过程中,$C_{10}^{7}$这个组合数其实不重要。它是一个正的常数,不随θ变化,所以在求导时直接消失。这在数学上叫"常数因子不影响最大化问题的解"。但这个问题背后有一个更实用的工程隐喻:在真实AI项目里,数据量是百万、千万级别的,如果你把每个样本的组合权重都写进似然里,不仅毫无必要,还会让代码变得特别蠢。MLE真正在乎的,是数据中每种模式出现的相对频率,而不是这些模式在历史上具体的排列方式。这个道理,在你后面看语言模型、看自监督学习的损失函数时,会反复遇到。
我再留一个悬念供你思考:上面这个例子中,我们假设"正面出现概率是θ且每次独立",这个假设本身对不对?每次抛硬币真的相互独立吗?现实项目中几乎没有完全独立的数据,但MLE的先验假设仍然构成了几乎所有浅层模型的基础。这个假设何时成立、何时不成立,到第5章我会专门展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 似然函数的两种形态:离散与连续
讲完单个例子的直觉,我们把问题推广到一般情况。假设我们有一组独立同分布(i.i.d.)的观测样本$x_1, x_2, \dots, x_N$,它们服从某个带参数θ的概率分布。联合概率可以写成每个样本概率的乘积:
$$L(
