LDA(Latent Dirichlet Allocation)主题模型算法
2015-09-01 15:50
549 查看
LDA整体流程
先定义一些字母的含义:
文档集合D,topic集合TD中每个文档d看作一个单词序列< w1,w2,...,wn >,wi表示第i个单词,设d有n个单词。(LDA里面称之为word bag,实际上每个单词的出现位置对LDA算法无影响)
D中涉及的所有不同单词组成一个大集合VOCABULARY(简称VOC)
LDA以文档集合D作为输入(会有切词,去停用词,取词干等常见的预处理,略去不表),希望训练出的两个结果向量(设聚成k个Topic,VOC中共包含m个词):
对每个D中的文档d,对应到不同topic的概率θd <
pt1,..., ptk >,其中,pti表示d对应T中第i个topic的概率。计算方法是直观的,pti=nti/n,其中nti表示d中对应第i个topic的词的数目,n是d中所有词的总数。
对每个T中的topic t,生成不同单词的概率φt <
pw1,..., pwm >,其中,pwi表示t生成VOC中第i个单词的概率。计算方法同样很直观,pwi=Nwi/N,其中Nwi表示对应到topic
t的VOC中第i个单词的数目,N表示所有对应到topic t的单词总数。
LDA的核心公式如下:
p(w|d) = p(w|t)*p(t|d)
直观的看这个公式,就是以Topic作为中间层,可以通过当前的θd和φt给出了文档d中出现单词w的概率。其中p(t|d)利用θd计算得到,p(w|t)利用φt计算得到。
实际上,利用当前的θd和φt,我们可以为一个文档中的一个单词计算它对应任意一个Topic时的p(w|d),然后根据这些结果来更新这个词应该对应的topic。然后,如果这个更新改变了这个单词所对应的Topic,就会反过来影响θd和φt。
LDA学习过程
LDA算法开始时,先随机地给θd和φt赋值(对所有的d和t)。然后上述过程不断重复,最终收敛到的结果就是LDA的输出。再详细说一下这个迭代的学习过程:
1)针对一个特定的文档ds中的第i单词wi,如果令该单词对应的topic为tj,可以把上述公式改写为:
pj(wi|ds)
= p(wi|tj)*p(tj|ds)
先不管这个值怎么计算(可以先理解成直接从θds和φtj中取对应的项。实际没这么简单,但对理解整个LDA流程没什么影响,后文再说)。
2)现在我们可以枚举T中的topic,得到所有的pj(wi|ds),其中j取值1~k。然后可以根据这些概率值结果为ds中的第i个单词wi选择一个topic。最简单的想法是取令pj(wi|ds)最大的tj(注意,这个式子里只有j是变量),即
argmax[j]pj(wi|ds)
当然这只是一种方法(好像还不怎么常用),实际上这里怎么选择t在学术界有很多方法,我还没有好好去研究。
3)然后,如果ds中的第i个单词wi在这里选择了一个与原先不同的topic,就会对θd和φt有影响了(根据前面提到过的这两个向量的计算公式可以很容易知道)。它们的影响又会反过来影响对上面提到的p(w|d)的计算。对D中所有的d中的所有w进行一次p(w|d)的计算并重新选择topic看作一次迭代。这样进行n次循环迭代之后,就会收敛到LDA所需要的结果了。
也说说LDA(Latent Dirichlet Allocation)——理论篇
[本文链接:/article/7095332.html,转载请注明出处。]
LDA是个generative model,它首先从Dirichlet分布Dir(β)中抽取每个topic对应的参数![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/9a15ecb9bfe7d10de50302154ff0d000.png)
,然后语料集D中第j篇文档
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/e14d7433ec7ba9e9735ed1addc3e489a.png)
的产生方式如下:
1. 选择文档长度: N ~ Poission(ξ) ;
2. 选择文档参数: θ ~ Dir(α) ;
3. 按照以下方式选取文档中的每个词
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/e57f9ed92b4c8e344fc8276dba37f270.png)
:
(a) 选择一个topic:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/b74b0f869381cd32806cef7d8f1aba5f.png)
(b) 从W个词中选取出此词:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/02f5099cb8ed79da314fdf7e3f6d1f04.png)
LDA的图表示如下,其中z、θ和Φ为隐藏变量,α和β为超参数。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/5340498761e795f1b2a4a27bbd0dc785.png)
利用上面LDA的产生假设,可以得到x、z、θ和Φ的联合分布为:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/3a9eaa21deef01380807a2038b0801c6.png)
其中
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/a3112697e6ceb80ef6764034fe6448e2.png)
,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/3601d7517954b71afd5061a9a666de35.png)
和
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/ec9778a6561d1991c25f603a2cfac674.png)
。
为了最大化
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/049c0ecf0f96a9656236a137582a130f.png)
,常用的方法就是基于Variational
Bayes(简称VB,也叫Variational EM)的mean field近似方法,这也是LDA最初提出时作者使用的求解方法[1]。这种方法在Graphical models用的很多,不熟悉的同学可以参考我在学校时写的一个介绍pdf。记z、θ和Φ的后验分布的mean fields近似为:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/d6a0aa7577c163553b1907497a1ae9bf.png)
其中
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/eb7fc7bdd2ccfea32d388555f9007c3b.png)
为Multinomial分布,而
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/4d4fbb621f64322c4e66760cec236760.png)
都是Dirichlet分布。容易验证下面的不等式成立:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/0b998236d7626673120f7edd3bb52d4b.png)
其中
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/365f768f1a654282a3cc8033ad2bb11f.png)
。
VB通过最小化variational free energy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/acf96599e698e67e7cf6bd84d5fe7bc4.png)
来获得
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/da919fa686eb9d219eb0df467876eb51.png)
中对应的参数估计:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/afa8f03aeb3619484f99b117ee00858c.png)
其中
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/8d764ce162401714f19b37e917db0559.png)
为digamma函数。
上面最后面那个式子里有一个很重要的地方需要说明下。我们之前的产生模型里,在一个文档里,不同位置的相同词(i为第几个词的下标)是可能有不同的后验分布的,但从上面最后的公式中可以看出式子右边与i有关的只有
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/eb990c8ff96a27fe65609bc0e9edb8a5.png)
,也即只与第i个位置的具体词是什么有关。所以在使用VB求解时,我们只需要考虑与具体词相关的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/7c76c9e19efb7e67e0962c47e7b7aaf9.png)
,这样在一个文档中多次重复的词只需要算一遍就行了。 详细的推导可见[1]。
之后,又有很多工作提出了一些其他求解方法[2, 3, 4]。例如[2]中作者提出的Collapsed Gibbs Sampling (CGS) 算法中,首先把隐变量θ和Φ积掉,然后得到如下x和z的联合分布:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/37b746d781b6c76aca3497740b86bdb1.png)
然后在固定其他变量值的条件下,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/534242730d6a67ee816ddf0b96fd26e3.png)
的条件概率为:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/baec0080d05431c9efc9292fc6b32e21.png)
其中的¬ij表示在对应计算中删除
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/8a078346ba5e8cbc538e26f295a36ec3.png)
和
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/37bbedca2adcc409dee916b0f10f35fa.png)
带来的影响。通过这个条件概率式子,再利用Gibbs
Sampling方法进行迭代抽样,最终我们可以得到需要的参数估计值。 详细的推导可见[2, 9]。
Gibbs Sampling的问题是收敛比较慢,而且很难判断何时已达到收敛。[3]中作者建议使用VB代替[2]中的Gibbs Sampling进行求解(所以称为Collapsed VB,简称CVB),也即最小化:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/6bb7396b7b617e68801ac8c127a2433c.png)
对应的参数估计为:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/ff2eed22ea6f769d8e318255ea4f1438.png)
精确计算上式中的期望项计算量比较大。因为
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/b3cddb76e487e8b93a597c85287bc93f.png)
,所以可以把它看成是多个Bernoulli分布的和,进而用Gaussian分布就可以很好地近似它。其Gaussian近似的均值和方差分别为:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/68f7ce161879f201d6d1bb2d49723d9b.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/17346b37d30a3596366f0977b56b2233.png)
另一方面,对log(α+x)利用Taylor展开到第二项作为它的近似:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/e15f740340539a8fcd0fff865923ff7e.png)
融合这两个近似,得到如下近似:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/51e67751e3062eebf3cdd39722bebb19.png)
把这个近似带入到前面的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/7e9a7eaf87c2410771a1c46cc23eba8b.png)
表达式中,得到:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/a4a06b25cf352adf5e294cf69fca5b83.png)
[5]中作者建议在CVB中对log(α+x)进行近似时只使用一阶近似,也即:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/096b7c252f97cc3d9f8b07f340fe9b27.png)
从而推导出下面的参数公式:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/3382b34c120e52ea831cf7b4490550d7.png)
这个方法被称为CVB0。
在获得了
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/6d50dd7f8da0bcf117abc7e33667ff0f.png)
后,CVB和CVB0使用与VB中相同的表达式获得隐藏变量θ和Φ对应的后验分布。所以,测试集的概率可以使用下式计算得到:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201504/96071a606ec1379f999ba3737ab58ac6.png)
注意,上面第一个式子就是根据LDA的模型产生方式获得的,只是对应的分布换成了后验分布。详细的推导可见[3]。
[5]中作者对以上各种算法做了比较详细的比较,他们发现在超参数α和β选取得比较合适时,这些算法的效果差别并不大。较之其他算法,CVB0需要的内存量和计算量都占优,所以[5]中作者最终推荐实际应用中使用CVB0。最近几年又有些工作进一步探讨了不同情况下(如在线学习)如何高效地学习LDA,感兴趣的同学可见[6, 7]。
我们上面的讨论都一直未提及超参数的学习方法,只是简单假设它们是选定不变的。[5]中作者也实验了两种超参数调整的方法:
1. 使用[8]中建议的固定点迭代方法更新超参数,具体可见[5, 7, 8];
2. 利用测试集,使用网格搜索的方式找出最优的超参数取值。
另外,[1]中作者也建议使用Newton-Raphson方法来学习超参数的取值。
[References]
[1] Blei, D., Ng, A., and Jordan,M. (2003). Latent Dirichlet allocation. Journal of Machine Learning Research,
3:993–1022.
[2] T. L. Griffiths and M. Steyvers. Finding scientific topics. In PNAS, 2004.
[3] YeeWhye Teh, David Newman, and MaxWelling. A collapsed variational Bayesian inference algorithm for latent
Dirichlet allocation. In Advances in Neural Information Processing Systems 19, 2007.
[4] Thomas Minka and John Laffert. Expectation-Propagation for the Generative Aspect Model, 2002.
[5] A. Asuncion, M. Welling, P. Smyth, and Y. W. Teh. On smoothing and inference for topic models. In Proceedings of the
International Conference on Uncertainty in Artificial Intelligence, 2009.
[6] Matthew D. Hoffman, David M. Blei and Francis Bac. Online Learning for Latent Dirichlet Allocation,
2010.
[7] Issei Sato, Kenichi Kurihara and Hiroshi Nakagawa. Deterministic Single-Pass Algorithm for LDA, 2010.
[8] Thomas P. Minka. Estimating a dirichlet distribution. Technical report, Microsoft,
2000.
[9] Gregor Heinrich. Parameter estimation for text analysis. Technical
report, 2005.
相关文章推荐
- MongoDB之bson的介绍
- Objective-C学习笔记六:选择结构二
- java的indexOf(String.indexOf 方法)
- 实习之路--总结
- rtsp 服务器
- Objective-C学习笔记五:选择结构一
- jstl标签实现文字过长隐藏显示问题
- django获取url参数总结
- QRcode二维码 参数介绍
- TCP滑窗管理
- U3D 对象响应鼠标点击事件
- Linux下搭建Eclipse+Maven的Hbase开发环境
- Java线程池
- Hadoop学习资料整理收集----阿冬专栏
- Android Selector 与 Shape 基本用法
- forfiles命令批量删除N天前文件
- SendEmail java发送邮件
- Android 二维码框4个角&上下滚动条&闪光灯
- sqlplus连接远程Oralce数据库
- windows下mongodb安装与使用整理