基础 · 10

EM 算法与隐变量模型

数据背后藏着看不见的变量。EM 算法用「猜-算-再猜」的循环把它们挖出来——从 GMM 到 VAE 的数学桥梁。

14 min read

看不见的变量

上一篇介绍了 GMM:给每个数据点一个「属于第 k 个高斯」的概率——软分配。但我们从来没观测到「这个点到底属于哪个高斯」这件事。

这种存在但观测不到的变量,统计学叫它隐变量(latent variable)。隐变量无处不在:

  • GMM 里每个点「属于哪个簇」是隐变量。
  • 主题模型里每个词「属于哪个主题」是隐变量。
  • HMM(隐马尔可夫模型)里系统的真实状态是隐变量——你只能看到观测值。
  • VAE 里图像的低维编码 z 是隐变量。

有隐变量的模型通常比没有的更灵活、更贴近真实世界。但训练它们比标准 MLE 难得多——因为你需要对看不见的东西做推断。

为什么直接 MLE 不行

假设我们有数据 XX,隐变量 ZZ,参数 θ\theta。完整数据的对数似然 logp(X,Zθ)\log p(X, Z \mid \theta) 通常很好算(对 GMM 就是加权高斯的 log 和)。

但我们只观测到 XX,不知道 ZZ。要算边际似然:

logp(Xθ)=logZp(X,Zθ)\log p(X \mid \theta) = \log \sum_Z p(X, Z \mid \theta)

这个 log 里面套着 sum。对 GMM 来说就是 logkπkN(xμk,Σk)\log \sum_k \pi_k \mathcal{N}(x \mid \mu_k, \Sigma_k)——log 和 sum 不能交换,没有解析解,也没办法直接对 θ\theta 求导等于零。

梯度下降当然可以做,但损失面非凸、容易卡住。EM 提供了一条更聪明的路。

EM 两步循环

EM 的核心想法出奇地简单:

既然隐变量看不见,那就先"猜"一个值;用猜的值当成观测来更新参数;然后用新参数重新猜。反复循环。

形式化地:

E 步(Expectation):用当前参数 θ(t)\theta^{(t)} 计算隐变量的后验分布

q(Z)=p(ZX,θ(t))q(Z) = p(Z \mid X, \theta^{(t)})

"如果参数是这样的,那每个点最可能属于哪个簇?" —— 这就是 E 步在回答的问题。

M 步(Maximization):把 E 步得到的 q(Z)q(Z) 当成已知,最大化完整数据对数似然的期望

θ(t+1)=argmaxθEq(Z)[logp(X,Zθ)]\theta^{(t+1)} = \arg\max_\theta \, \mathbb{E}_{q(Z)}\left[\log p(X, Z \mid \theta)\right]

M 步就是一个标准的 MLE,只不过隐变量被它的期望替代了——变成了一个加权 MLE。

这两步交替执行,参数一定会收敛到似然的一个局部最大值。为什么?下一节给出几何直觉。

ELBO:为什么 EM 一定收敛

EM 的收敛保证来自一个关键不等式。对任意分布 q(Z)q(Z)

logp(Xθ)=Eq[logp(X,Zθ)q(Z)]ELBO(θ,q)+KL(qp(ZX,θ))0\log p(X \mid \theta) = \underbrace{\mathbb{E}_q\left[\log \frac{p(X, Z \mid \theta)}{q(Z)}\right]}_{\text{ELBO}(\theta, q)} + \underbrace{\mathrm{KL}(q \| p(Z|X,\theta))}_{\geq 0}

因为 KL 散度永远非负,所以 ELBO 永远小于等于真实的 log-likelihood——它是一个下界(Evidence Lower BOund)。

EM 做的事:

  • E 步:固定 θ\theta,选 q=p(ZX,θ)q = p(Z|X,\theta),让 KL = 0。此时 ELBO = log-likelihood。
  • M 步:固定 qq,最大化 ELBO 关于 θ\theta。ELBO 上升 → log-likelihood 至少不下降。

每一步都让 ELBO 单调上升,而 log-likelihood 有上界(概率不能大于 1),所以 EM 必定收敛

12
log p(X) (log-likelihood)ELBO (下界)
-4-3-2-1迭代次数KL
EM 每步都让 ELBO 单调上升(蓝色虚线),同时逼近真实 log-likelihood(紫色实线)。两线之间的间隔是 KL 散度——E 步把它压到零,M 步把 ELBO 推高。

拖动滑条看收敛过程。紫色实线是真实 log-likelihood,蓝色虚线是 ELBO。两者之间的间距是 KL 散度——E 步把它压到零(ELBO 触碰 LL),M 步把整体推高。

GMM 的 EM 推导

把抽象的 EM 框架落到 上一篇 的 GMM 上:

模型KK 个高斯,权重 πk\pi_k,均值 μk\mu_k,协方差 Σk\Sigma_k。隐变量 zi{1,,K}z_i \in \{1, \dots, K\} 是点 ii 属于哪个高斯。

E 步——计算「责任值」γik\gamma_{ik}

γik=πkN(xiμk,Σk)j=1KπjN(xiμj,Σj)\gamma_{ik} = \frac{\pi_k \, \mathcal{N}(x_i \mid \mu_k, \Sigma_k)}{\sum_{j=1}^K \pi_j \, \mathcal{N}(x_i \mid \mu_j, \Sigma_j)}

就是 Bayes 定理:给定当前参数,点 ii 属于簇 kk 的后验概率。

M 步——用 γ\gamma 加权更新参数:

μknew=iγikxiiγik,Σknew=iγik(xiμknew)(xiμknew)iγik\mu_k^{\text{new}} = \frac{\sum_i \gamma_{ik} \, x_i}{\sum_i \gamma_{ik}}, \quad \Sigma_k^{\text{new}} = \frac{\sum_i \gamma_{ik} (x_i - \mu_k^{\text{new}})(x_i - \mu_k^{\text{new}})^\top}{\sum_i \gamma_{ik}} πknew=1Niγik\pi_k^{\text{new}} = \frac{1}{N} \sum_i \gamma_{ik}

直觉:每个点给每个簇一个"投票"(γik\gamma_{ik}),新的均值就是加权平均,新的协方差就是加权方差,新的权重就是平均责任。

下面的交互就是这套公式在跑——点击迭代看椭圆如何一步步贴合数据:

迭代 0
123
EM 迭代:E 步估计每个点属于各高斯的概率(软分配),M 步更新椭圆的中心和形状。与 k-means 的硬分配不同,GMM 能捕获椭球形、大小不一的簇。

注意前几步变化很大,后面几步几乎不动——这就是 ELBO 曲线快速收敛的几何对应。

这个想法在前沿里