期望最大(EM)算法的大名想必大家都听过,说来惭愧,大概两年前就学过用过这个算法,但是到后来只记得EM这个名字,把算法的原理都给忘光光了,这几天重新捡起来,总结一下,也希望对想了解这个算法的人有点启发。

对我EM算法我总结为三点:为什么是什么怎么用

为什么要用EM算法?

会看到这篇博客的大家想必都知道,EM算法是用来估计参数的,并且是以迭代的方式进行。看到估计参数这个字眼,你脑子里首先会想到什么方法?毫无疑问就是极大似然法吧,再帮大家回忆一下极大似然法的思想:什么参数对应的事件发生的概率最大,我们就认为这个参数就是未知参数的估计值。通俗一点讲就是你知道了事件的观测值 $y_1,…,y_N$,然后要寻找能够让事件发生的可能性 $p(y_1,…,y_N|\theta)$ 最大的参数 $\hat{\theta}$,也就是

$$ \hat{\theta}=\arg\max_{\theta} p(y_1,...,y_N|\theta) $$

或者通常为了计算方便采用对数的形式

$$ \hat{\theta}=\arg\max_{\theta} \log p(y_1,...,y_N|\theta) $$

其中 $\log p(y_1,…,y_N|\theta)$ 就称为对数似然函数,常常假设事件之间相互独立,那也就能进一步把联合概率写成独立概率乘积的形式:

$$ \hat{\theta}=\arg\max_{\theta} \log \prod_{i=1}^N p(y_i|\theta) $$

这样一个无约束的优化问题利用极值条件(导数为0)也就能得到待估计参数的解析解了。

回到我们的问题为什么要用EM算法,那肯定是因为极大似然法不管用了呗,也就是当有隐变量(latent variable)存在的时候,原来的对数似然函数变为

$$ \log p(Y|\theta) = \log \sum_{Z} p(Y|Z,\theta)p(Z,\theta) $$

相当于求完全数据 $Y,Z$ 的联合分布 $p(Y,Z|\theta)$ (把隐变量积分掉)的和,但是由于里面包含隐变量,直接用极大似然求解是不行滴。但是如果能够估计出隐变量 $Z$,那这个问题又回到了原来的极大似然估计。这样也就自然地与EM算法的思想挂上勾了:估计隐变量(E步),再估计参数(M步),不断迭代

现在可以回答第一个问题了:为什么要用EM算法?EM算法是用来解决含有隐变量的参数估计问题的。

什么是EM算法?

那么这个所谓的迭代算法是怎么迭代的呢?我们还是先回到对数似然函数,可以将其表示为

$$ \begin{aligned} \log p(Y|\theta) &= \log p(Y,Z|\theta) - \log p(Z|Y,\theta)\\ &=\log \frac{p(Y,Z|\theta)}{q(Z)}-\log \frac{p(Z|Y,\theta)}{q(Z)} \end{aligned} $$

第一行公式(完整数据减去后验)根据条件概率公式可得,第二行公式相当于减去一个 $\log q(Z)$ 再加上一个 $\log q(Z)$ 恒等变换。这里假设 $q(Z)$ 是 $Z$ 的一个概率分布 ($\int_Z q(Z) dZ = 1$)。

然后同时对两侧对$q(Z)$求期望

左边积分还是它本身:

$$ \int_Z q(Z) \log p(Y|\theta) dZ = \log p(Y|\theta) \int_Z q(Z) dZ = \log p(Y|\theta) $$

右边积分则是

$$ \int_z q(Z) \log \frac{p(Y,Z|\theta)}{q(Z)} dZ - \int_Z q(Z) \log \frac{p(Z|Y,\theta)}{q(Z)} $$

左边等于右边即

$$ \log p(Y|\theta) = \text{ELBO} + \text{KL}(q(Z)||p(Z|Y,\theta)) $$

KL divergence的概念

$$ D_{\mathrm{KL}}(P \| Q)=-\sum_{i} P(i) \ln \frac{Q(i)}{P(i)} \ge 0 $$

由吉布斯不等式可知,当且仅当 $P = Q$ 时 $D_{KL}(P||Q)$为零。

因为相对熵大于等于0的性质,所以 ELBO 为 $\log p(Y|\theta)$ 提供了下界,所以EM算法的想法就是想让ELBO不断变大从而让对数似然变大,并且只有当 $q(Z) = p(Z|Y,\theta^{(t)})$ 时ELBO等于对数似然, 即

$$ \begin{aligned} \theta^{(t+1)} = \hat{\theta} &= \arg \max_{\theta} \text{ELBO}\\ &= \arg \max_{\theta} \int_Z q(Z) \log \frac{p(Y,Z|\theta)}{q(Z)} dZ\\ &= \arg \max_{\theta} \int_Z p(Z|Y,\theta^{(t)}) \log \frac{p(Y,Z|\theta)}{p(Z|Y,\theta^{(t)})} dZ\\ &= \arg \max_{\theta} \int_Z p(Z|Y,\theta^{(t)}) [\log p(Y,Z|\theta) - \log p(Z|Y,\theta^{(t)})] dZ\\ &= \arg \max_{\theta} \int_Z p(Z|Y,\theta^{(t)}) \log p(Y,Z|\theta) dZ \end{aligned} $$

这也就解释了EM算法是怎么来的啦,当 $q(Z)$ 等于后验 $p(Z|Y,\theta^{{t}})$ 时,ELBO 等于log likelihood,先固定 $\theta^{(t)}$ 得到后验,然后求 ELBO (关于后验的期望),滑动 $\theta$ 得到期望的最大值,最大期望对应的 $\theta$ 就是 $\theta^{(t+1)}$

从思路上是能说通了,你可能会疑惑为什么这么迭代求解就能得到最优解呢?或者说 $\theta_{t}$ 到最后会收敛吗?我们回到最初的目标最大化对数似然 $\log p(Y|\theta)$,那如果我们每次迭代求解都能使得对应的对数似然函数的值增加,最后是不是也就说明能向似然函数的最大值靠近了呢,也就是我们希望看到的结果是

$$ \log p(Y|\theta^{(t)}) \le \log p(Y|\theta^{(t+1)}) $$

事实也说明了这是成立的,我们再回到对数似然函数的表达式

$$ \log p(Y|\theta) = \log p(Y,Z|\theta) - \log p(Z|Y,\theta) $$

两边求关于后验 $p(Z|Y,\theta^{(t)})$ 的期望,也就是求积分

左边积分还是它本身:

$$ \int_Z p(Z|Y,\theta^{(t)}) \log p(Y|\theta) dZ = \log p(Y|\theta) \int_Z p(Z|Y,\theta^{(t)}) dZ=\log p(Y|\theta) $$

右边积分则是:

$$ Q(\theta,\theta^{(t)}) - H(\theta,\theta^{(t)}) $$

其中,$Q(\theta,\theta^{(t)}) = \int_Z p(Z|Y,\theta^{(t)}) \log p(Y,Z|\theta) dZ, H(\theta,\theta^{(t)}) = \int_Z p(Z|Y,\theta^{(t)}) \log p(Z|Y,\theta) dZ$

那要使得迭代收敛需要满足的条件就变为了

$$ Q(\theta^{(t)},\theta^{(t)}) - H(\theta^{(t)},\theta^{(t)}) \le Q(\theta^{(t+1)},\theta^{(t)}) - H(\theta^{(t+1)},\theta^{(t)}) $$

因为 $Q(\theta,\theta^{(t)})$ 对应的就是EM的迭代公式,那根据最大化问题可以得到 $Q(\theta,\theta^{(t)}) \le Q(\theta^{(t+1)}\theta^{(t)})$,那也就有 $Q(\theta^{(t)},\theta^{(t)}) \le Q(\theta^{(t+1)}\theta^{(t)})$,那再根据放缩的思想,只要我们能证明 $H(\theta^{(t)},\theta^{(t)}) \ge H(\theta^{(t+1)},\theta^{(t)})$,那一切就都顺理成章了。

直接对这两项作差

$$ H(\theta^{(t+1)},\theta^{(t)}) - H(\theta^{(t)},\theta^{(t)}) = \int_Z p(Z|Y,\theta^{(t)}) \log \frac{p(Z|Y,\theta^{(t+1)})}{p(Z|Y,\theta^{(t)})} dZ $$

看出点什么没有,不然再回到上面 KL 散度的定义看看,这结果不就是 $-D_{\text{KL}}(p(Z|Y,\theta^{(t)})||p(Z|Y,\theta^{(t+1)}))$,根据散度大于等于0的性质,可以得到 $H(\theta^{(t+1)},\theta^{(t)}) - H(\theta^{(t)},\theta^{(t)}) \le 0$,这也就得证了EM迭代求解每次得到的似然函数值总是非减的( $\theta^{(t)}$ 会逐渐收敛),那最终也就会取到最大似然咯,需要注意这并不能保证找到全局最优解的。

怎么用EM算法?

看到这里的话想必你对算法的原理也有了大概的认识,但是大家最关心的应该是在认识原理后如何去应用,这里根据李航老师的《统计学习方法》里的例子介绍一下算法的应用和实现。

三硬币模型:有A,B,C三枚硬币,它们正面向上的概率分别为 $a,b,c$,进行如下试验:先掷硬币 A,如果正面则再掷 B,如果反面则掷 C,掷硬币的结果正面记为1反面为0,独立重复10次试验,结果为1,1,0,1,0,0,1,0,1,1。我们只知道最终掷硬币的结果并不能观测掷硬币的过程,那么如何估计三枚硬币正面向上的概率呢?

这个例子里观测变量 $y_i$ 也就是掷硬币的结果0或1,要估计的参数为概率 $\theta=(a,b,c)$,由于我们不知道掷A的结果导致这一问题不能直接采用极大似然来估计,因此我们引入隐变量 $z$ 来表示掷 A的结果。

观测数据 $y_1,…,y_N$ 由以下模型生成

$$ p(y|\theta) = ab^{y}(1-b)^{(1-{y})} + (1-a)c^{y}(1-c)^{(1-{y})} $$

隐变量 $z_i = 1$ 表示第 $i$ 个观测来自掷硬币B的结果,$z_i = 0$ 表示第 $i$ 个观测来自掷硬币C的结果。

于是可以写出完全数据的似然函数:

$$ \begin{aligned} p(Y,Z|\theta) &= \prod_{i=1}^N p(y_i,z_i |\theta)\\ &=\prod_{i=1}^N [ab^{y_i}(1-b)^{(1-{y_i})}]^{z_i} \cdot [(1-a)c^{y_i}(1-c)^{(1-{y_i})}]^{1-z_i} \end{aligned} $$

那么,完全数据的对数似然函数为

$$ \log p(Y,Z|\theta) = \sum_{i=1}^N z_i (\log a + y_i \log b + (1-y_i) \log(1-b)) + (1-z_i) (\log(1-a) + y_i \log c + (1-y_i) \log(1-c)) $$

按照我上面说的先固定 $\theta^{(t)}$ 计算后验:

$$ \begin{aligned} p(z_i=1|y_i,\theta^{(t)}) &= \frac{p(z=1,y_i|\theta^{(t)})}{p(z_i=1,y_i|\theta^{(t)}) + p(z_i=0,y_i|\theta^{(t)})}\\ &=\frac{p(y_i|z=1,\theta^{(t)}) p(z=1|\theta^{(t)})}{p(y_i|z=1,\theta^{(t)}) p(z=1|\theta^{(t)}) + p(y_i|z=0,\theta^{(t)}) p(z=0|\theta^{(t)})}\\ &=\frac{a^{(t)}(b^{(t)})^{y_i}(1-b^{(t)})^{(1-y_i)}}{a^{(t)}(b^{(t)})^{y_i}(1-b^{(t)})^{(1-y_i)} + (1-a^{(t)})(c^{(t)})^{y_i}(1-c^{(t)})^{(1-y_i)}}\\ p(z_i=0|y_i,\theta^{(t)}) &= 1- p(z_i=1|y_i,\theta^{(t)}) \end{aligned} $$

有了隐变量的后验分布后,在对完全数据的对数似然函数求最大期望

$$ \begin{aligned} \theta^{(t+1)} &= \arg \max_{\theta} Q(\theta)\\ &= \arg \max_{\theta} \sum_{Z} p(Z|Y,\theta^{(t)}) \log p(Y,Z|\theta)\\ &= \arg \max_{\theta} \sum_{i=1}^{10} p(z_i=1|y_i,\theta^{(t)}) \log p(y_i,z_i=1|\theta) + p(z_i=0|y_i,\theta^{(t)}) \log p(y_i,z_i=0|\theta)\\ &= \arg \max_{\theta} \sum_{i=1}^{10} p(z_i=1|y_i,\theta^{(t)}) [\log a + y_i \log b + (1-y_i)\log (1-b)] \\ & + p(z_i=0|y_i,\theta^{(t)})[ \log (1-a) + y_i \log c + (1-y_i) \log (1-c)] \end{aligned} $$

又回到这个极大似然的问题,现在相当于隐变量已知咯,那直接按照传统的套路利用极值条件求导获得待参数的解析解。

对于参数 $a$,令 $\partial Q(\theta)/ \partial a = 0$

$$ \frac{\partial L}{\partial a} = \sum_{i=1}^{10} p(z_i=1|y_i,\theta^{(t)}) \frac{1}{a} - p(z_i=0|y_i,\theta^{(t)}) (-\frac{1}{1-a})=0 $$

可得

$$ a^{(t+1)} = \frac{1}{N} \sum_{i=1}^{10} p(z_i=1|y_i,\theta^{(t)}) $$

同理可得

$$ b^{(t+1)} = \frac{\sum_{i=1}^{10}{p(z_i=1|y_i,\theta^{(t)}) y_i}}{\sum_{i=1}^{10}{p(z_i=1|y_i,\theta^{(t)}) }} $$
$$ c^{(t+1)} = \frac{\sum_{i=1}^{10}{p(z_i=0|y_i,\theta^{(t)}) y_i}}{\sum_{i=1}^{10}{p(z_i=0|y_i,\theta^{(t)}) }} $$

matlab 实现EM算法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
% 给定观测结果
y = [1;1;0;1;0;0;1;0;1;1];
N = length(y);
% 先随便假设个初始参数 
a_old = 0.4;
b_old = 0.6;
c_old = 0.7;
theta0 = [a_old;b_old;c_old];
% 隐变量z=1的后验概率的初始值
p_z  = zeros(N,1);
% 用于存储更新后的参数
a_new = 0.0;
b_new = 0.0;
c_new = 0.0;
theta = [a_new;b_new;c_new];
% 给EM算法的迭代设置个终止条件
epsilon = 0.01;
% 迭代更新参数
while norm(theta - theta0) > epsilon
% E步,计算隐变量的后验
	for i = 1:N
		p_z(i) = (a_old*b_old^y(i)*(1-b_old)^(1-y(i)))/((a_old*(b_old)^y(i)*(1-b_old)^(1-y(i))) + ((1-a_old)*c_old^y(i)*(1-c_old)^(1-y(i))));
	end
	theta0 = [a_old;b_old;c_old];
% M步,极大似然更新待估计参数 
	a_new = 1/N*sum(p_z);
	b_new = p_z'*y/sum(p_z);
	c_new = (1-p_z)'*y/sum(1-p_z);
	theta = [a_new;b_new;c_new];
	a_old = a_new;
	b_old = b_new;
	c_old = c_new;
end

本文小结

首先从为什么需要用EM算法说起:含有隐变量的参数估计问题,然后从最大化ELBO的角度推导了EM算法迭代公式的由来并证明了算法的收敛性,最后以三硬币模型为例介绍了EM算法的使用以及matlab实现。