Probabilistic latent semantic analysis (概率潜在语义分析,pLSA) 是一种 Topic model,在99年被 Thomas Hofmann 提出。它和随后提出的 LDA 使得 Topic Model 成为了研究热点,其后的模型大都是建立在二者的基础上的。
我们有时会希望在数量庞大的文档库中自动地发现某些结构。比如我们希望在文档库发现若干个“主题”,并将每个主题用关键词的形式表现出来。我们还希望知道每篇文章中各个主题占得比重如何,并据此判断两篇文章的相关程度。而 pLSA 就能完成这样的任务。
我之前取了 Wikinews 中的 1000 篇新闻,试着用 pLSA 在其中发现 K=15 个主题。比如一篇关于 Wikileaks 的阿萨奇被保释消息的新闻,算法以 100% 的概率把它分给了主题 9,其关键词为:
media phone hacking wikileaks assange
australian stated information investigation murdoch
可以看到这个主题的发现还是非常靠谱的。又比如这条中国人民的老朋友威胁要大打打核战争的新闻。算法把它以 97.7% 的概率分给了主题 3,2.3% 的概率分给了主题 7。主题 3 的关键词是:
south north court china military
death tornado service million storm
主题 7 的关键词是:
nuclear plant power japan million
carbon radiation china water minister
可以看到这条新闻和主题 3 中的“南北”、“军事”、“中国”、“死亡”这些信息联系在一起,和主题 7 中的“核”、“中国”联系在一起。应该是因为我的数据集中与北朝鲜核问题相关的新闻只有不到 10 条,而 10 个主题的划分并不够细致,所以关于“朝核问题”或者“核武器”的这样的主题并没能被分离出来。但可以看到即使是这样结果也是很 make sense 的。
那我们就来看看 pLSA 模型是怎么回事吧。和很多模型一样,pLSA 遵从 bag-of-words 假设,即只考虑一篇文档中单词出现的次数,忽略单词的先后次序关系,且每个单词的出现都是彼此独立的。这样一来,我们观察到的其实就是每个单词 w∈W 在每篇文档 d∈D 中出现的次数 n(w,d)。pLSA 还假设对于每对出现的 (d,w) 都对应着一个表示“主题”的隐藏变量 z∈Z。pLSA 是一个生成模型,它假设 d、w 和 z 之间的关系用贝叶斯网络表示是这样的(从 (Blei et al., 2003) 偷的图):
实心的节点 d 和 w 表示我们能观察到的文档和单词,空心的 z 表示我们观察不到的隐藏变量,用来表示隐含的主题。图中用了所谓的“盘子记法”,即用方框表示随机变量的重复。这里方框右下角的字母 M 和 N 分别表示有 M 篇文档,第 j 篇文档有 Nj 个单词。每条有向边表示随机变量间的依赖关系。也就是说,pLSA 假设每对 (d,w) 都是由下面的过程产生的:
- 以 P(d) 的先验概率选择一篇文档 d
- 选定 d 后,以 P(z|d) 的概率选中主题 z
- 选中主题 z 后,以 P(w|z) 的概率选中单词 w
而我们感兴趣的正是其中的 P(z|d) 和 P(w|z):利用前者我们可以知道每篇文章中各主题所占的比重,利用后者我们则能知道各单词在各主题中出现的概率,从而进一步找出各主题的“关键词”。记 θ=(P(z|d),P(w|z)),表示我们希望估计的模型参数。当然 θ 不仅仅代表两个数,而是对于每对 (w(j),z(k)) 和 (d(i),z(k)) ,我们都要希望知道 P(z(k)|d(i)) 和 P(w(j)|z(k)) 的值。也就是说,模型中共有 |Z|⋅|D|+|W|⋅|Z| 个参数。我们还知道:
根据最大log似然估计法,我们要求的就是
这里由于 ∑d,wn(d,w)logP(d) 这一项与 θ 无关,在 argmaxθ 中可以被直接扔掉。[1] 因此
这里出现了 log 套 ∑ 的形式,导致很难直接拿它做最大似然。但假如能观察到 z,问题就很简单了。于是我们想到根据 EM 算法(参见我的上篇笔记),可以用下式迭代逼近 argmaxθL(θ):
其中
在 E-step 中,我们需要求出 Qt(θ) 中除 θ 外的其它未知量,也就是说对于每组 (d(i),w(j),z(k)) 我们都需要求出 P(z(k)|d(i),w(j);θt)。根据贝叶斯定理,我们知道:
而 Pt(z|d) 和 Pt(w|z) 就是上轮迭代求出的 θt。这样就完成了 E-step。
接下来 M-step 就是要求 argmaxθQt(θ) 了。利用基本的微积分工具 [2],可以分别对每对 (w(j),z(k))和 (d(i),z(k)) 求出:
以上就是 pLSA 算法了。最后贴个我用 MATLAB 写的实现 [3]:
function [p_w_z, p_z_d, Lt] = pLSA(n_dw, n_z, iter_num) % PLSA Fit a pLSA model on given data % in which n_dw(d,w) is the number of occurrence of word w % in document d, d, n_z is the number of topics to be discovered % % pre-allocate space [n_d, n_w] = size(n_dw); % max indices of d and w p_z_d = rand(n_z, n_d); % p(z|d) p_w_z = rand(n_w, n_z); % p(w|z) n_p_z_dw = cell(n_z, 1); % n(d,w) * p(z|d,w) for z = 1:n_z n_p_z_dw{z} = sprand(n_dw); end p_dw = sprand(n_dw); % p(d,w) Lt = []; % log-likelihood for i = 1:iter_num %disp('E-step'); for d = 1:n_d for w = find(n_dw(d,:)) for z = 1:n_z n_p_z_dw{z}(d,w) = p_z_d(z,d) * p_w_z(w,z) * ... n_dw(d,w) / p_dw(d, w); end end end %disp('M-step'); %disp('update p(z|d)') concat = cat(2, n_p_z_dw{:}); % make n_p_z_dw{:}(d,:)) possible for d = 1:n_d for z = 1:n_z p_z_d(z,d) = sum(n_p_z_dw{z}(d,:)); end p_z_d(:,d) = p_z_d(:,d) / sum(concat(d,:)); end %disp('update p(w|z)') for z = 1:n_z for w = 1:n_w p_w_z(w,z) = sum(n_p_z_dw{z}(:,w)); end p_w_z(:,z) = p_w_z(:,z) / sum(n_p_z_dw{z}(:)); end % update p(d,w) and calculate likelihood L = 0; for d = 1:n_d for w = find(n_dw(d,:)) p_dw(d,w) = 0; for z = 1:n_z p_dw(d,w) = p_dw(d,w) + p_w_z(w,z) * p_z_d(z,d); end L = L + n_dw(d,w) * log(p_dw(d, w)); end end Lt = [Lt; L]; %plot(Lt); ylim([2*median(Lt)-L-0.1 L+(L-median(Lt))/2+0.1]); %drawnow; pause(0.1) end end
第一次拿 Mablab 写程序,比较丑……[4] 下图是 Log 似然度随迭代收敛的情况。可以看到收敛速度还是相对较快的。而且由于是 EM 算法的缘故,Log 似然度确实是单调上升的.
最后,pLSA 的问题是在文档的层面上没有一个概率模型,每篇文档的 P(d|z) 都是需要拟合的模型参数。这就导致参数的数目会随文档数目线性增长、不能处理训练集外的文档这样的问题。所以02年 David Blei、Andrew Ng(就是正在 ml-class.org 里上公开课的那位) 和 Michael Jordan 又提出了一个更为简洁的模型:LDA。有时间的话下次再写了。
参考文献
(Hofmann, 1999) Hofmann, T. 1999. Probabilistic latent semantic indexing. Proceedings of the 22nd annual international ACM SIGIR conference on Research and development in information retrieval SIGIR 99. pages, (1999), 50-57.
(Gildea & Hofmann, 1999) Gildea, D. and Hofmann, T. 1999. Topic-based language models using EM. Proceedings of the 6th European Conference on Speech (1999), 2167-2170.
(Brants, 2005) Brants, T. 2005. Test Data Likelihood for PLSA Models. Information Retrieval. (2005), 181-196.
(Blei et al., 2003) Blei, D.M. et al. 2003. Latent Dirichlet Allocation. Journal of Machine Learning Research. 3, 4-5 (2003), 993-1022.
脚注:
- [1] 这里 Hofmann 自己在 (Hofmann, 1999) 和 (Gildea & Hofmann, 1999) 中使用了不同的形式。本文和 (Gildea & Hofmann, 1999)、(Brants, 2005) 一样选择不去理会 P(d)。因为正如 (Brants, 2005) 中指出、(Blei et al., 2003) 及很多其它文献吐槽的那样,(Hofmann, 1999) 中的模型算出的 P(d) 实在坑爹,当 d 不在训练集中时 P(d) 就一律为0,没什么意义,还不如别估计它呢。另外,(Hofmann, 1999) 中额外引入了一个参数 β来“解决”过度拟合问题,但 (Brants, 2005) 中指出这一问题实际并不存在,因此本文也对此忽略不提。 ↩
- [2] 具体而言,这里要求的是 Qt(θ) 在 ∑wP(w|z)=1 和 ∑zP(z|d)=1 约束条件下的极值。根据拉格朗日乘数法,解:
∇θ(Q(θ)+∑zαz(∑wP(w|z)−1)+∑dβd(∑zP(z|d)−1))=0
- [3] 完整的程序和数据在这里。 ↩
- [4] 吐槽:用 Matlab 做简单字符串处理怎么都那么恶心!长度不同的字符串竟然算是不同类型的!Cell array 怎么那么难用! ↩
[学习笔记] Expectation-Maximization(EM) 算法
果然还是有必要保持记笔记的习惯呐。前两天实验室讲 pLSA 的推导,用到 EM 竟然完全记不清了,竟然还把 Jensen 不等式和 SVM 的 minmax=maxmin 什么的记混= = (这么一说 SVM 具体怎么回事也记不清了。。。)赶紧补一篇复习笔记。
Expectation-Maximization 算法是统计学中用来给带隐含变量的模型做最大似然(和最大后验概率)的一种方法。EM 的应用特别广泛,经典的比如做概率密度估计用的 Gaussian Mixture Model。这两天我或许还会写pLSA 的笔记放上来,也是 EM 应用的例子。
下面我会先解释 EM 算法要解决的问题,然后直接给出算法的过程,最后再说明算法的正确性。
问题
首先我们定义要解决的问题。给定一个训练集 X={x(1),…,x(m)},我们希望拟合包含隐含变量 z 的模型 P(x,z;θ) 中的参数 θ。根据模型的假设,每个我们观察到的 x(i) 还对应着一个我们观察不到的隐含变量z(i),我们记 Z={z(1),…,z(m)}。做最大对数似然就是要求 θ 的“最优值”:
想用这个log套∑的形式直接求解 θ 往往非常困难。而如果能观察到隐含变量 z ,求下面的似然函数的极大值会容易许多:
问题是实际上我们没法观察到 z 的值,只能在给定 θ 时求 z 的后验概率 P(z|x;θ) [1]。EM 算法就可以帮我们打破这样的困境。
算法
下面给出 EM 算法的过程。其中θt 是第 t-1 次迭代时算出的 θ 值;θ0 为任意初值。
Repeat until converge {
- (E-step) Calculate P(Z|X;θt), in order to get:
EZ∣∣X;θt[L(θ;X,Z)]:==EZ∣∣X;θt[logP(X,Z;θ)]∑ZP(Z|X;θt)logP(X,Z;θ)- (M-step)
θt+1:=argmaxθEZ∣∣X;θt[logP(X,Z;θ)]}
对,就这么短。所以我总觉得称之为 algorithm 不如称之为 method 更恰当。上面的过程在收敛后就得到了我们需要的 θ=argmaxθL(θ;X) [2]。
先简单说说这短短两步都做了些啥。EM 算法每次迭代都建立在上轮迭代对 θ 的最优值的估计 θt 上,利用它可以求出 Z 的后验概率 P(Z|X;θt),进而求出 L(θ;X,Z) 在分布 Z∼P(Z|X;θ) 上的期望 EZ∣∣X;θt[L(θ;X,Z)]。在第一节中我们提到 argmaxθL(θ;X,Z) 在未知 Z 的情况下难以直接计算,于是 EM 算法就转而通过最大化它的期望 EZ∣∣X;θt[L(θ;X,Z)] 来逼近 θ 的最优值,得到 θt+1 。注意由于 L(θ;X,Z) 的这个期望是在 Z 的一个分布上求的,这样得到的表达式就只剩下 θ 一个未知量,因而绕过了 z 未知的问题。而 θt+1 又可以作为下轮迭代的基础,继续向最优逼近。算法中 E-step 就是在利用 θt 求期望 EZ∣∣X;θt[L(θ;X,Z)],这就是所谓“Expectation”;M-step 就是通过寻找 θt+1 最大化这个期望来逼近 θ的最优值,这就叫“Maximization”。EM 算法因此得名。
另外,如果数据满足独立同分布的条件,分别枚举 z(i) 的值可能要比枚举整个 Z 方便些,可把 EZ∣∣X;θt[L(θ;X,Z)] 替换成:
原理
为什么这样 E一步,M一步,一步E,一步M,就能逼近极大似然?具体而言,为什么通过迭代计算 argmaxθEZ∣∣X;θt[L(θ;X,Z)] 可以逼近 θ 的最优值 argmaxθL(θ;X,Z)?我们稍后会看到,这是因为每次迭代得到的 θt+1 一定比 θt 更优,即算法是在对 θ 的最优值做单调逼近。
不过首先让我们先抛开最大似然,考虑一个更一般的问题。假设有一个凹函数 F(θ),我们想求 argmaxθF(θ),但直接求很困难。不过对于任意给定的 θt,假设我们都能找到 F(θ) 的一个下界函数 Gθt(θ),满足 F(θ)≥Gθt(θ) 且 F(θt)=Gθt(θt) ——我管 Gθt(θ) 这样的函数叫 F 的“在 θt 处相等的下界函数”。现在考虑 θt+1:=argmaxθGθt(θ),它一定会满足:
也就是说,θt+1 一定比 θt 更优。而接下来我们又可以用 θt+1 找到一个 Gθt+1(θ),再据此算出比 θt+1还优的 θt+2:=argmaxθGθt+1(θ) 。如此不断迭代,就能不断步步逼近 θ 的最优值了。由此可见,如果对任意 θt 都能找到 F 的“在 θt 处相等的下界函数”Gθt(θ),我们就得到了一个能单调逼近 θ 的最优值的算法:
Repeat until converge {
- 找到函数 F(θ) 的“在 θt 处相等的下界函数” Gθt(θ)
- θt+1:=argmaxθGθt(θ)
}
上面的算法看起来和 EM 算法的每步都分别对应——事实上也正如此。下面是从 PRML 中偷的一张图改的,展示了上述逼近的过程:
现在我们回到最大似然问题 θ=argmaxθL(θ;X) 。如果我们想套用上面的算法来逼近 θ 的这个最优解,就需要找到对于每个 θt,函数 L(θ;X) 的“在 θt 处相等的下界函数”。该怎么找呢?让我们从 L(θ) 的初始形式开始推导:
又卡在这个log套∑的形式上了……我们说过麻烦在于观察不到 Z 的值,那不妨给它任意引入一个概率分布 Q(Z) [3],利用分子分母同乘 Q(Z) 的小 trick,得到:
根据 Jensen 不等式 [4],对于任意分布 Q 都有:
且上面的不等式在 P(X,Z;θ)Q(Z) 为常数时取等号。
于是我们就得到了 L(θ;X) 的一个下界函数。我们要想套用上面的算法,还要让这个不等式在 θt 处取等号,这就这要求在 θ=θt 时 P(X,Z;θ)Q(Z) 为常数,即 Q(Z)∝P(X,Z;θt)。由于 Q(Z) 是一个概率分布,必须满足 ∑zQi(z)=1,所以这样的 Q(Z) 只能是 Q(Z)=P(X,Z;θt)∑ZP(X,Z;θt)=P(Z|X;θt)。那我们就把 Q(Z)=P(Z|X;θt) 代入上式,得到:
且该不等式在 θ=θt 时取到等号。那么……EZ∣∣X;θt[logP(X,Z;θ)P(Z∣∣X;θt)] 就是 L(θ;X) 的“在 θt 处相等的下界函数”——这不就是我们要找的么!于是把它塞进本节开始得到的算法里替换“Gθt(θ)”就可以用啦。也就是说,迭代计算 argmaxθEZ∣∣X;θt[logP(X,Z;θ)P(Z∣∣X;θt)] 就可以逼近 θ 的最优值了。而由于利用 Jensen 不等式的那一步搞掉了log套∑的形式,它算起来往往要比直接算 argmaxθL(θ;X) 容易不少。
我们还可以再做几步推导,得到一个更简单的形式:
其中倒数第二步是因为 −P(Z|X;θt)logP(Z|X;θt)] 这一项与 θ 无关,所以就直接扔掉了。这样就得到了本文第二节 EM 算法中的形式——它就是这么来的。
以上就是 EM 了。至于独立同分布的情况推导也类似。
顺带一提,argmaxθEZ∣∣X;θt[logP(X,Z;θ)] 有时也比较难算。这时我们其实可以退而求其次,不要求这个期望最大化了,只要它在 θt+1 处的值大于在 θt 处的值就行了。根据上面的推导,这样也能逼近 θ 的最优值,只是收敛速度较慢。这就是所谓 GEM (Generalized EM) 算法了。
p.s. MathJax 很神嘛。
p.p.s. 这篇笔记竟然断断续续写写改改了两天多,我对 EM 的认识也越来越清晰。“‘教’是最好的‘学’”真是一点没错。
更新历史:
2011.10.12 重写了“原理”部分,把利用函数的“在 θt 处相等的下界函数”逼近 θ 的最优值的算法单独提到前面说,这样似乎清楚很多。
2011.10.13 修正了对在利用 Jensen 不等式的那一步要取 Q(Z)=P(Z|X;θt) 的解释
脚注:
- [1] 一般可以利用贝叶斯定理:
P(z|x;θ)=P(x|z;θ)P(z;θ)∑zP(x|z;θ)P(z;θ)而 P(x|z;θ) 和 P(z;θ) 往往是模型假设的一部分。 ↩ - [2] 实际上在某些特殊情况下,θ 还可能收敛在局部最优点或鞍点上。这时可以多跑几次算法,每次随机不同的 θ0,最后取最好的结果。为简明起见,本文忽略这种情况。 ↩
- [3] Q(Z) 为概率分布,意即需满足 ∑ZQ(Z)=1 且 Q(Z)≥0 ↩
- [4] Jensen 不等式:
f 为凸函数,X 为随机变量。则E[f(X)]≥f(EX)若 f 是严格凸的,则上式取等号当前仅当 X 为常数。在这里 log 函数是严格凹的,所以要把上面的不等号方向调转。 ↩
留言列表