带隐藏变量的模型没法直接训练,这是 EM 算法要解决的问题,也是 AI 里统计学习一脉的经典课题。典型场景来自传统机器学习:手头有一批数据点,怀疑来自两个不同的群体,但每个点属于哪边是看不见的。知道归属就能算出两边的参数,知道参数就能判断归属,两者互为前提,像先有鸡还是先有蛋。EM 的思路是打破循环:先凑合着猜参数,再按猜的结果修正,反复迭代。这是统计学里的经典方法,处理的是高斯混合、隐马尔可夫这类模型,和今天大模型的预训练属于不同的技术脉络,别把两者混为一谈。
进来什么,出去什么
输入是两样东西:观测到的数据,以及对模型形式的假设,比如假设数据来自两个高斯分布。输出是模型参数,比如两个分布各自的均值、方差和混合比例。中间卡住的就是隐藏变量——每个点属于哪个分布。E 步用当前参数估计每个点属于各群体的可能性,这个可能性术语叫责任,输出的是一组概率而非硬性判定;M 步把这组概率当成已知权重,重新计算参数,让数据在带权意义下贴合得更好。两步交替执行,参数逐步改善。
用一个具体形态说:高斯混合模型下,E 步算出某个点以 0.7 的概率属于甲分布、0.3 属于乙分布;M 步按 0.7 和 0.3 加权,重新估计甲乙各自的均值。下一轮 E 步再用新参数重算归属概率,如此往复,直到参数变化小到可以停下。
为什么迭代会收敛
EM 的每一步都在提升数据出现的可能性,也就是似然:E 步给当前参数下的似然构造一个下界,M 步找到让这个下界取到更高的新参数。于是似然值单调不降,迭代一定会停下来——但停在哪并不受控。数学上能确认的只有"每步不变差",确认不了"停的地方是全局最优"。这一点和 warmup 之类的训练技巧不同,warmup 是让训练更稳的工程手段,EM 是处理隐变量的推断框架,解决的是不同层面的问题。
典型应用与边界
典型应用有三类。聚类:高斯混合模型就是 EM 的经典用例,软归属本身还有额外用途,比如按概率分流而非一刀切。含隐变量的模型:隐马尔可夫模型的训练常用它,早年的语音识别和序列标注方法里到处是它的身影。缺失数据处理:把缺失值当作隐藏变量来估计,比直接删行或填均值更有依据。
边界同样清楚。它收敛到的可能是局部较优解,初始值选得不好,结果会明显变差,实践中常用的应对是多跑几组不同初始值,按似然值挑结果更好的那组。混合分量多、数据维度高时,每轮迭代的浮点运算量不小,开销可以用 FLOPS 这个算力计量单位粗估。另外它默认你对模型形式做了正确假设——数据其实来自三个群体而你按两个拟合,收敛也只会收敛到一个错的位置。
要用它,怎么落地
| 场景 | 做法 | 判断标准 |
|---|---|---|
| 数据明显分群但归属未知 | 用高斯混合加 EM 做软聚类,设多组初始值分别跑 | 不同初始值给出的归属结果基本一致才算稳;似然曲线趋平即可停 |
| 观测数据有缺失 | 把缺失字段当隐变量纳入模型估计 | 对缺失比例敏感,比例高时结果要抽样人工核对 |
| 序列数据带隐藏状态 | 隐马尔可夫类模型用 EM 的变体训练 | 状态数是人为设定的,换几个状态数各跑一遍再定 |
盯迭代过程有个简单办法:把每一轮的似然值画成曲线,本质上是给训练加了一层可观测性。正常形态是先陡后缓、最后拉平;几十轮后还在大幅波动,多半是模型假设有问题或数据里混了离群点。另外,EM 每轮的计算都花在「算归属」和「算参数」上,数据量上万、维度上百时,依然要提前掂量计算预算。EM 能确保的只是每一步不变差,停下的位置好不好,要靠人来判断。
顺带回应一个常见误解:今天说「训练大模型」,主要指在 GPU 上做梯度下降,和 EM 是两条路线。有些大模型工程里能见到软分配、软路由的思想痕迹,但那只是思想借用,EM 本身不是大模型的训练算法。把概念放回它原本的语境,查资料、读论文时才不会串。对想在传统数据上动手的人,scikit-learn 这类工具里高斯混合模型开箱即用,多组初始值和分量数都留了参数,跑通一遍比读十篇介绍有用。
EM 算法速查
- 适用前提:模型里有看不见的隐藏变量
- E 步估归属概率,M 步按归属更新参数,交替执行
- 似然单调不降,必收敛,但可能停在局部较优
- 对初始值敏感,多跑几组按似然挑


