引言
很早以前就接触了EM算法,但是发觉自己好像有理解不正确的地方,于是自己推导了一遍。才疏学浅,有错误之处还请各位大佬指正。
EM算法的通俗解释
Expectation Maximization 的算法的本质,就是对一组数据
![]()
,假设他们满足某种分布
![]()
, 求出这个最优的
![]()
, 使得
![]()
的值最大。在不存在隐变量的情况下,也就是说,
![]()
,则这个问题就是个简单的求函数极值的问题,也就是最普通的参数估计问题,相信大家概率论的课上都学过了。
但是在实际情况下,除去分布的参数
![]()
, 还有一些隐变量
![]()
,也决定了
![]()
的分布。一个简单的例子就是对于很多数据点
![]()
, 其中的任一个点都是两个正态分布
![]()
中的其中一个。那么每一个
![]()
属于哪一个正态分布,产生的标签
![]()
就是隐变量。
但是我们是不是也可以把隐变量当做分布的参数呢?也就是说从两个正态分布里面取样产生的新的分布的参数包含
![]()
,搜索整个参数空间,理论上也可以找到一组最佳的参数,使得
![]()
最大。
但是这样就和我们的目标有所违背:我们的目标是找到
![]()
的最大值,并不是
![]()
的最大值。而且一般
![]()
的函数也十分复杂,很可能无法求出极值。
通过贝叶斯法则,我们有:
![]()
,但是这个值和
![]()
有关,所以很难直接对这个公式下手。EM算法提供了一种巧妙的方法:
对上面的等式求对数,得到:
![]()
, 同时又有
![]()
, 因此把这个对 $h$ 加权求和的算符作用在左右两边,很显然有
![]()
, 出现了很熟悉的
![]()
的形式!貌似可以利用信息论里面的那些不等式求极值了!
记住左边求和项
![]()
,对于任何
![]()
都成立。因为等式左边不含
![]()
, 于是我们可以把上式改成
![]()
。观察等号左边的第二项,
![]()
就是在条件
![]()
下
![]()
的信息熵。信息论告诉我们信息熵是最短编码长度。那么如果变量的分布发生改变,但编码方式不变(也就是说左边的
![]()
变化了),必然会增加平均码长。也就是说
![]()
。当然其实这本质就是“相对熵必然为正”的 Gibbs不等式。
这告诉我们,把
![]()
右边的
![]()
换成
![]()
,有
![]()
, 等号右边的第二项是一定增加的,所以我们只要保证
![]()
增加就行。
这就是EM算法的精髓,通过对于当前的
![]()
,找到一个
![]()
, 使得
![]()
取到最大值,不断迭代,最终找到最优的
![]()
。
一个简单的例子
就用上文的两个正态分布的例子,对于数据点
![]()
,他们属于两个正态分布之一,参数分别为
![]()
,数据的标签为
![]()
。
![]()
表示
![]()
表示
![]()
。这时候我们把数据的标签作为隐变量。
假设目前已经进行到 t 步,即当前的参数分别为
![]()
, 此时有我们要求出优化目标
![]()
求和号里面的左边部分
![]()
。
这个式子依然难以计算,但是注意到
![]()
, 左边的
![]()
一般都是有函数表达式的,右边的
![]()
,在这里我们认为隐变量 $h$ 和参数
![]()
是无关的,并且认为
![]()
的分布由另一组参数
![]()
决定,即:
![]()
。在这里,我们很容易认为单个数据的标签满足伯努利分布,即:有
![]()
的概率标签为 1,表示该数据点属于第一个正态分布;反之则属于第二个。所以
![]()
也要加入参数中,参数集合变为:
于是我们有:
![]()
,
对于任何一个数据点
![]()
,对于隐变量
![]()
, 只需要考虑
![]()
的值,因为别的数据点处于哪一个分布对
![]()
没有影响。因此可以把隐变量的集合
![]()
拆成
![]()
两个集合。这样我们就可以把公式拆成:
显然有:
最后我们需要考虑的是,上面的讨论仅仅是最大化某一个样本的 $log p(x|theta)$ 的值的,考虑到我们有大量的样本,实际的优化目标
![]()
,取对数后相加即可。因此在上式的左侧还要加上
于是最终的式子为:
其中,
考虑到上式的右端
![]()
中的
![]()
与
![]()
无关,因此可以忽略之。再看这个式子,是不是很像
![]()
的形式?因为这是对数形式,我们还原出其原始式子:
![]()
很显然这就是一个概率值,可以理解为
![]()
样本出现了
![]()
次数的概率。注意到不同的
![]()
对应的
![]()
属于不同的正态分布,所以我们要把关于
![]()
的那个求和的两项分别拿出来求极值。
拿出
![]()
这一项,
![]()
。因此这就是个正态分布的加权最大似然估计(Weighted MLE for Normal Distribution),很容易可以得到:
其中,
当然同时,我们还要注意到
![]()
也是一个参数,因此也需要对此进行更新。此时可以把
![]()
中的
![]()
里的
![]()
看做常数。此时形式变成了
![]()
或者是
![]()
很显然这就是一个二项分布的概率表达式,相当于从一堆红球和黑球中选了若干次,总共有
![]()
次红球,
![]()
次黑球,因此其最大似然估计是
这里
![]()
,而且可以注意到
所以有
一些理解
从上面的例子中,我们可以看到某个数据点属于哪一个分布,这是一组隐变量,且这组隐变量中的每一个值满足伯努利分布。隐变量自身也包含了参数。因此我们可以画出如下的关系图:
![]()
,
![]()
,而且
![]()
是我们能观测到的数据。EM算法做的事情就是在把
![]()
表示成关于
![]()
的函数时,找出其最大值。
一个简单的实验
根据图片可以看出,即便我们一开始非常胡乱地设置了初始的参数
![]()
,在几轮迭代之后,EM算法都能很好地找到
![]()
的最大似然估计。