漫谈 Clustering (番外篇): Expectation Maximization

转:http://blog.pluskid.org/?p=81

本文是“漫谈 Clustering 系列”中的第 5 篇,参见本系列的其他文章

Expectation Maximization (EM) 是一种以迭代的方式来解决一类特殊最大似然 (Maximum Likelihood) 问题的方法,这类问题通常是无法直接求得最优解,但是如果引入隐含变量,在已知隐含变量的值的情况下,就可以转化为简单的情况,直接求得最大似然解。

我们会看到,上一次说到的 Gaussian Mixture Model 的迭代求解方法可以算是 EM 算法最典型的应用,而最开始说的 K-means 其实也可以看作是 Gaussian Mixture Model 的一个变种(固定所有的 \Sigma_k = \epsilon\mathbf{I} ,并令 \epsilon \rightarrow 0 即可)。然而 EM 实际上是一种通用的算法(或者说是框架),可以用来解决很多类似的问题,我们最后将以一个中文分词的例子来说明这一点。

为了避免问题变得太抽象,我们还是先从上一次的 Gaussian Mixture Model 说起吧。回顾一下我们之前要解决的问题:求以下 Log-likelihood function 的最大值:

而 z 的概率,当 z 的第 k 个元素为 1 的时候,亦即第 k 个 Component 被选中的时候,这个概率为 \pi_k ,统一地写出来就是:

情况瞬间逆转,现在 \log 和求和符号换了个位置,直接作用在普通的高斯分布上了,一下子就变成了可以直接求解的问题。不过,事情之所以能发展得如此顺利,完全依赖于一个我们伪造的假设:隐含变量的值已知。然而实际上我们并不知道这个值。问题的结症在这里了,如果我们有了这个值,所有的问题都迎刃而解了。回想一下,在类似的地方,我们是如何处理这样的情况的呢?一个很类似的地方就是(比如,在数据挖掘中)处理缺失数据的情况,一般有几种办法:

  • 用取值范围类的随机值代替。
  • 用平均值代替。
  • 填 0 或者其他特殊值。

这里我们采取一种类似于平均值的办法:取期望。因为这里我们至少有 sample x 的值,因此我们可以把这个信息利用起来,针对后验概率 p(z|x) 来取期望。前面说过,z 的每一个元素只有 0 和 1 两种取值,因此按照期望的公式写出来就是:

其中 \text{KL}(q\|p) 是分布 q(\mathbf{Z}) 和 p(\mathbf{Z}|\mathbf{X}, \theta) 之间的 Kullback-Leibler divergence 。由于 Kullback-Leibler divergence 是非负的,并且只有当两个分布完全相同的时候才会取到 0 。因此我们可以得到关系 \mathcal{L}(q, \theta) \leqslant \log p(\mathbf{X}|\theta) ,亦即 \mathcal{L}(q, \theta) 是 \log p(\mathbf{X}|\theta) 的一个下界。

现在考虑 EM 的迭代过程,记上一次迭代得出的参数为 \theta^{\text{old}},现在我们要选取 q(\mathbf{Z}) 以令 \mathcal{L}(q, \theta^{\text{old}}) 最大,由于 \log p(\mathbf{X}|\theta^{\text{old}}) 并不依赖于 q(\mathbf{Z}) ,因此 \mathcal{L}(q, \theta^{\text{old}}) 的上限(在 \theta^{\text{old}} 固定的时候)是一个定值,它取到这个最大值的条件就是 Kullback-Leibler divergence 为零,亦即 q(\mathbf{Z}) 等于后验概率 p(\mathbf{Z}|\mathbf{X}, \theta^{\text{old}}) 。把它带入到 \mathcal{L}(q, \theta^{\text{old}}) 的表达式中可以得到

其中 p(s_i) 的值是从模型 \mathcal{M} 中已知的。但是现在我们不知道 S 的值,因此我们转而取其关于后验概率的期望:

<img src="http://blog.pluskid.org/latexrender/pictures/27b7f3733fbb8899ae20527bf4706422.png" _xhe_src="http://blog.pluskid.org/latexrender/pictures/27b7f3733fbb8899ae20527bf4706422.png" title="" \displaystyle"="" alt="" align="absmiddle" style="border: 0px; margin-left: auto; margin-right: auto;">

然后将这个期望针对 \theta 最大化即完成了 EM 的一次迭代。具体的做法通常是先把一个初始文本(比如所有的 C 的集合)按照 N-gram 分割(N-gram 在 讲 K-medoids 的那篇文章中介绍过)为 \{w_i\}_N,形成一个最初的辞典,而模型 \mathcal{M} 的参数 \theta 实际上就描述了各个 N-gram 的概率 p(w_i) ,初始值可以直接取为频率值。有了辞典之后对于任意的 C ,我们可以根据辞典枚举出所有可能的分割 S ,而每个分割的后验概率 p(S|C, \theta) 就是其中的单词的概率乘积。其他的就是标准的 EM 算法的迭代步骤了。

实际上在实际产品中我们会使用一些带了更多启发式规则的分词方法(比如 MMSEG),而这个方法更大的用处在于从一堆文本中“学习”出一个词典来(也就是 \mathcal{M} ),并且这个过程是全自动的,主要有两个优点:

  1. 不需要人参与手工分词、标记等。
  2. 能自动从文本中学习,换句话说,你给它一些某个领域的专业文章,它能从中学习到这个领域的专业词汇来。

不管怎样,以上两点看起来都非常诱人。不过理论离实际往往还是有不少差距的。我不知道实际分词系统中有没有在用这样的方法来做训练的。之前我曾经用 Wikipedia (繁体中文)上抓下来的一些数据跑过一下小规模的试验,结果还可以,但是也并不如想像中的完美。因为当时也并没有弄明白 EM 是怎么一回事,加上这个过程本身计算负荷还是非常大的,也就没有深入下去。也许以后有时间可以再尝试一下。

总之,EM 是一种应用广泛的算法,虽然讲了点理论也讲了例子,但是一没有贴代码二没有贴图片,似乎实在是不像我的作风,不过精力和篇幅有限,也只能到此为止了。 ;)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值