最大似然、梯度下降、EM与坐标上升:一次讲透机器学习参数估计的四个角色
最大似然估计、梯度下降、EM算法、坐标上升这四个名词几乎出现在每一本机器学习教材的前半部分。很多新手把它们当成四门独立课程来学背完定义、看完公式转头又分不清谁是谁。其实这四个概念根本不是同一层面的东西它们更像一条完整流水线上的不同角色最大似然估计是我们要构建的目标梯度下降和EM是两条不同的求解路径坐标上升则是藏在EM这台机器里的一个齿轮。这篇文章我就把它们放同一张桌子上把谁服务谁、谁在什么时候出场一次讲透。1. 四个名词放同一张桌先厘清它们的位置1.1 一个能记住的类比找钥匙和不同的找法想象你是一个管家目标是从一栋大楼里找到某间房间的钥匙。最大似然估计解决的是“目标定义”问题它告诉你我们想找的这把钥匙要能让已经发生的事情在模型里出现的概率尽可能大。这是一个高标准的目标不是具体找法。梯度下降则是你站在半山腰闭着眼睛用脚探坡度每一步都沿着最陡的方向摸过去。它很通用只要你能算出“坡度”梯度就能一步步往下走。EM算法适合的是更复杂的情况钥匙被锁在一个保险柜里而保险柜里还有一层暗格你只看得见外层的部分线索。这时候你需要先猜一猜暗格里有什么再基于猜测重新检查外层反复交替逐步逼近真相。这个过程就是“先补全信息再优化”。坐标上升则是一个更朴素的技巧桌子上有五个旋钮你一次只扭一个扭到不动了再换下一个循环往复。它的思路简单到很多人不把它当正式算法但在EM内部、在变分推断里它出镜率高得惊人。1.2 四者定位对照表为了把关系钉死我用一张表把它们各自的角色、典型场景和缺点列出来概念在流程中的角色典型使用场景最常见的缺点最大似然估计目标函数 / 建模原则一切概率模型的参数估计对模型假设敏感容易过拟合梯度下降通用数值优化器神经网络、线性模型等可微目标学习率难调可能落入局部最优EM算法隐变量模型专用优化框架高斯混合模型、隐马尔可夫、缺失数据初值敏感可能收敛慢坐标上升分块优化技巧EM中M步无法直接求解、主题模型可能震荡部分问题收敛没有保证这里要先说一个很多教程没点破的事实EM和梯度下降并不是互相替代的关系。EM内部的M步经常还要依赖数值优化算法去完成而坐标上升就是M步里被大量使用的一种数值优化方法。所以这四个名字不是四个并列选项而是你写代码时一层套一层的四个零件。2. 最大似然估计几乎一切损失函数的“母体”2.1 形式化推导我们到底在最大化什么假设我们有一组独立同分布的观测数据 $x_1, x_2, ..., x_N$它们来自一个带参数 $\theta$ 的概率分布 $p(x|\theta)$。最大似然估计的思想非常直白既然这些样本已经真实发生了那我们就去找一个参数让“这些样本一起出现的概率”最大。联合概率写出来是连乘形式$$L(\theta) \prod_{i1}^{N} p(x_i|\theta)$$但工程里没人直接最大化这个连乘。原因很简单样本量稍微大一点连乘结果就会小到浮点下溢直接变0。于是我们取对数把连乘变成连加$$\ell(\theta) \sum_{i1}^{N} \log p(x_i|\theta)$$对数不改变单调性所以最大化 $\log L(\theta)$ 等价于最大化 $L(\theta)$。但好处是巨大的加法比乘法数值稳定得多而且求导时每一项可以独立处理。实际建模中大家更习惯把负对数似然当作损失函数来最小化因为这符合“损失越小越好”的直觉。2.2 从MLE到我们熟悉的交叉熵和均方误差很多人不知道平时用的交叉熵、均方误差其实源头都是最大似然估计。先看最简单的伯努利分布。假设观测值是0或1参数 $\theta$ 表示结果为1的概率那么单个样本的对数似然是$$\log p(x|\theta) x \log\theta (1-x)\log(1-\theta)$$把所有样本加起来求导令其为0你会得到$$\hat{\theta} \frac{1}{N}\sum_{i1}^{N} x_i$$也就是说样本均值就是伯努利分布的MLE。这就是“频率就是概率”这个朴素直觉的数学来源。再看分类问题里的交叉熵损失。对于多分类模型输出的是一个类别分布真实标签是独热向量这时候负对数似然展开以后正好就是交叉熵。之前很多同学问我“为什么分类必须用交叉熵不能随便用一个距离损失”答案就在这里交叉熵不是凭空发明的它就是对多项分布做最大似然估计的自然结果。回归里的均方误差也一样。如果你假设误差服从高斯分布写出负对数似然化简后剩下的核心项恰恰就是 $\sum (y_i - \hat{y}_i)^2$。所以每当我看到一个新的损失函数我会习惯性问一句它背后对应的分布假设是什么想明白这件事调loss就不再玄学了。2.3 MLE实操中的两个容易踩的坑第一个坑是样本的独立同分布假设。MLE的整个推导都建立在样本独立同分布之上但实际采集的数据往往有相关性。比如时间序列数据今天的数据和昨天的数据高度相关这时候直接套MLE会得到过于自信的估计置信区间会偏窄。处理方式要么是显式建模相关性要么对样本做重采样、分块等处理。第二个坑是数值稳定性。虽然取了对数但模型在某些参数下给出的概率可能非常接近0$\log p$ 可能会变成负的几千。尤其在混合模型里要算“多个分量概率的加权和”再取对数时更安全的做法是使用log-sum-exp技巧先把所有项取对数再统一做指数和加和避免中间过程溢出。3. 梯度下降求解MLE最通用的一把扳手3.1 下山式直觉与更新公式如果说最大似然估计是把靶子立起来那梯度下降就是大多数人手里那把最顺手的枪。它的思想就是沿着目标函数下降最快的方向走一小步反复迭代。对应到训练场景我们通常要最小化负对数似然更新的形式就是$$\theta_{t1} \theta_t - \eta abla L(\theta_t)$$这里的 $\eta$ 是学习率。步子太大参数会在最优值附近来回震荡甚至发散步子太小要走很久才到得了头。我见过太多新手上来就把学习率设成0.1结果loss曲线像心电图一样完全看不出收敛趋势。实际操作中我会先设一个较小的值比如0.001观察loss曲线再逐步调整。3.2 批量、随机、小批量的选择梯度下降不是一个单独算法而是一族算法。核心区别就在于每一步用多少数据来估计梯度。全批量梯度下降用全部训练数据计算一次梯度方向稳定但数据量一大就慢得没法用。随机梯度下降SGD每次只拿一个样本算梯度迭代快但噪声很大这股噪声在优化后期看起来是缺点有时反而能帮助它从浅的局部极值点里逃出来。小批量梯度下降是两者之间的折中也是目前深度学习训练的事实标准每次取几十到几百个样本兼顾了稳定性和计算效率。在工程实践里我一般不会费太多精力去纠结“到底用全批量还是纯SGD”因为在小批量场景下稍微调一下批大小、学习率和动量效果就比纠结“哪个算法更正统”重要得多。3.3 反向传播能解决梯度下降的局部最小值问题吗这个热搜问题我几乎每隔一段时间就会看到一次值得单独展开。先说结论不能。反向传播和梯度下降是两个层面的工具。反向传播解决的是“梯度怎么高效算出来”的问题它只是利用链式法则把损失函数对每个参数的导数快速求出来。它不决定下一步往哪走更不负责跳出局部最小值。目标函数是不是非凸、初始化在哪、学习率怎么调整这些问题反向传播一概不参与。那为什么深度学习在实际训练里好像很少真的卡死在糟糕的局部最小值这是多个因素叠加的结果。第一高维非凸损失函数中真正的“糟糕局部极小值”比想象中少更多的是鞍点而梯度下降在鞍点附近通常能靠噪声或动量慢慢离开。第二我们用的随机梯度下降自带噪声每次估算的梯度都不是精确的这种不确定性反而像一种隐式的随机扰动帮助参数逃离浅坑。第三初始化策略、批归一化、残差连接这些手段都在减少极端非凸地形带来的影响。所以准确的说法是反向传播解决不了局部最小值问题但现代深度学习的工程组合拳能在实践中很大程度上缓解它。3.4 梯度下降实战的几个关键习惯第一特征归一化。如果各个特征取值范围差异很大比如一个在0~1一个在0~10000那目标函数的等高线会被拉成狭长的椭圆梯度下降来回震荡收敛极慢。归一化之后路径会直很多。第二学习率调度。固定学习率往往不是最优策略训练初期可以大一点快速下降后期减小学习率进行精细调节。比如阶梯式衰减、余弦退火都是很常用的方案。第三监控完整训练曲线。不要只看最后的loss要看训练过程中曲线是否光滑。如果loss曲线像锯齿一样剧烈抖动且不下降基本可以判断学习率大了或者batch size太小了。4. EM算法当最大似然遇到“看不见的变量”4.1 为什么需要EM对数里面藏了个求和有些模型里有一个麻烦的东西叫“隐变量”。所谓隐变量就是影响观测数据、但你又没直接看到的变量。以高斯混合模型为例假设数据来自K个高斯分布每个样本先选一个分量再从分量里生成数据。我们能观测到每个样本的取值但看不到它来自哪个分量。这时候写出完整数据的似然对数里会出现一个对隐变量的求和$$\log \sum_{k1}^{K} \pi_k \mathcal{N}(x_i | \mu_k, \Sigma_k)$$log里面套了求和这导致对整个参数向量求导极其复杂往往得不到闭式解。直接硬刚这个式子靠梯度下降硬优化也可以但EM提供了一个更优雅的框架先猜隐变量再优化参数反复交替。4.2 E步和M步到底在做什么EM算法的每一步其实就两件事。E步Expectation基于当前参数计算每个隐变量的后验分布。用高斯混合模型来说就是计算每个样本属于每个分量的“软概率”相当于给每个样本打上一组软标签。M步Maximization用这些软标签作为权重去最大化“完整数据对数似然”的期望。因为隐变量的分布已经固定住了这一步通常能解出一个闭式解比如重新估计高斯分量的均值、方差和混合系数。迭代这两个步骤直到参数变化小于阈值。从数学上看EM通过Jensen不等式构造了边际对数似然的一个下界M步一步步抬高这个下界最终会让边际似然收敛到一个局部极大值。这句话值得划重点EM只保证收敛到局部最优不保证全局最优。4.3 一个极简的硬币例子手把手走一遍我习惯用两枚硬币的例子给学生讲EM因为不需要任何额外的数学背景。假设一枚硬币A和一枚硬币B分别有正面概率 $\theta_A$ 和 $\theta_B$。我做了若干轮实验每轮先随机选一枚硬币再用它抛10次记录正面次数。问题在于我不知道每一轮到底用的是A还是B。现在我只知道每一轮正面朝上的次数能不能估计出 $\theta_A$ 和 $\theta_B$如果知道每轮用的是哪枚硬币估计很简单对A正面总次数除以A总抛掷次数即可。但现在“每轮用哪枚硬币”就是隐变量。E步用当前猜的 $\theta_A$ 和 $\theta_B$计算每一轮“这轮用的是A”的后验概率。比如某轮抛出7次正面当前A和B的正面概率差异很大那这轮大概率是A。M步用这些后验概率当权重重新估计 $\theta_A$ 和 $\theta_B$。每个硬币的正面率变成了“正面次数的加权和”除以“总抛掷次数的加权和”。重复两轮你会发现参数逐渐稳定。我第一次自己实现这个例子时偷懒用了硬标签——每轮直接归属到后验概率更大的那个硬币结果估计值偏得厉害换成软权重之后立刻收敛到合理范围。所以强调一下“软”是EM的灵魂别把E步做成聚类。4.4 EM算法主要用在哪我来列一份清单除了高斯混合模型和经典硬币实验EM最常见的应用有这么几类隐马尔可夫模型中的Baum-Welch算法本质上就是EM在序列隐变量上的应用。缺失数据补全。数据矩阵里有一部分值缺失EM可以先估计缺失值再重新估计模型参数。主题模型LDA的变分推断名字里没有EM但训练过程中E步和M步交替的结构一模一样。一些点击率预估、基因分型、医疗诊断模型里只要隐含了“样本属于哪个组”这种不可见结构EM都是第一候选。我自己的经验是只要发现似然函数里出现了“对数套求和”而且这个求和来自你没观测到的变量EM就应该跳到你的脑子里。4.5 EM的坑位图收敛慢、初值敏感、下溢EM最大的毛病之一是初值敏感。同一个模型用不同的初始化跑可能收敛到完全不同的结果。应对方法很朴素多初始化几次比如随机跑10轮保留似然值最高的那组参数。第二个问题是收敛慢。尤其到了后期loss下降会变得非常缓慢。这时候可以考虑设置一个合理的迭代上限或者用“软件收敛”当连续几轮参数变化小于阈值时就提前停止。如果在EM的M步里遇到困难还可以把M步交给梯度上升这就是后面要说的“广义EM”。数值稳定性同样不能忽略。E步里处理的是后验概率计算时经常要先把概率取对数再统一做归一化。这个过程中使用log-sum-exp能避免很多数值下溢的问题。5. 坐标上升寄生在EM里的那位低调高手5.1 一次只扭一个旋钮坐标上升的思路朴素得可爱同时优化所有参数很难那我就每次只优化其中一组参数其他参数固定不动。循环更新每一组直到整体收敛。如果是最小化问题就叫坐标下降思路完全对称。对比梯度下降两者的区别很关键。梯度下降需要计算目标函数关于所有参数的梯度然后同步更新所有参数。坐标上升则不需要全局梯度它只需要每次解一个低维子问题甚至很多时候这个子问题有解析解。这个特点让它在某些场景下非常香当参数维度极高、但各个维度之间耦合不强时坐标上升往往比梯度下降更稳定、更快。当然如果维度之间强耦合它可能收敛很慢甚至原地打转。5.2 坐标上升和EM怎么配合很多初学者不知道坐标上升其实是EM内部的常用引擎。EM的M步未必总有闭式解。当参数比较多、互相纠缠时一次把所有参数更新到位很困难。这时候可以把参数拆成几块在M步内部用坐标上升轮流最大化目标函数。比如主题模型的变分推断里文档-主题分布和主题-词分布是互相依赖的很难一次性求出联合最优实际操作就是反复交替更新两组参数这正是坐标上升的标准形态。给一个最简单形式的伪代码initialize theta while not converged: for each block j in parameter blocks: fix other blocks, update theta_j to maximize objective写这段代码最需要留心的就是“固定其他块”这一步。如果你在更新某个块的时候不小心把别的块也一起动了整个迭代就会乱套。我以前在实现时犯过这个错输出看起来在收敛实际上是在乱跳。所以每次更新前最好显式拷贝一份当前参数作为固定值。5.3 使用坐标上升的注意事项坐标更新的顺序会影响收敛速度。经验法则优先更新那些对目标函数影响最大的坐标可能会明显加速收敛。如果每个坐标块大小不均先把大块更新了往往比小块更划算。另一个问题是收敛判断。坐标上升迭代到后期可能出现参数小幅抖动但目标值几乎不变的情况这时候首先检查收敛容差设置是否太小再检查有没有两个坐标块之间存在循环依赖导致互相拉扯。如果这类问题出现了试试把两个耦合较强的块合并成一块做联合更新。6. 从问题出发的组合拳怎么选、怎么用6.1 一张速查表判断该上哪个方法我在实际项目中基本按这个逻辑来选工具问题形态推荐方法目标函数可微、没有隐变量梯度下降 / 拟牛顿法目标函数里有“对数套求和”求和来自隐变量EM框架EM的M步没有解析解在M步里套数值优化常用坐标上升参数空间巨大但维度相对独立坐标上升比整体梯度下降更省事深度神经网络梯度下降反向传播不会用EM这张表从下往上看正好就是“越往上越偏统计建模、越往下越偏工程训练”的一条线。6.2 实际项目里我习惯的组合流程我现在拿到一个问题一般不会直奔某个算法而是先徒手把目标函数写出来。具体流程是先把问题写成概率形式明确观测变量、隐变量、参数各是什么然后写出对数似然函数接着看它能不能对全部参数直接求导。如果求导很顺直接上梯度下降类方法如果对数里面套了求和且这个求和来自隐变量就上EM框架EM的M步如果解不出来再把参数拆块在M步内部用坐标上升。这套流水线式的判断方法我做过点击率预估、缺失数据补全、主题模型初版都适用。6.3 一点个人体会这四个概念我在不同阶段分别接触过。最早学的时候也觉得它们是四个独立算法后来变成“MLE是目标GD是工具EM是带隐变量的专用工具坐标上升是更细的工具”整个框架一下就通了。我给实习生讲的时候也常说参数估计的本质就是在数据和假设之间做平衡MLE负责告诉你方向梯度下降负责带你去EM负责处理你没看见的东西坐标上升负责在复杂局面里化整为零。真要我说一个最大的坑那就是不要试图走到哪都用同一个工具。拿到问题先把数据里的观测变量、隐变量、目标函数写清楚哪怕只是在纸上画一个粗框都能帮你避开一半以上的弯路。