主题模型TopicModel:隐含狄利克雷分布LDA
http://blog.csdn.net/pipisorry/article/details/42649657
主题模型LDA简介
隐含狄利克雷分布简称LDA(Latent Dirichlet allocation),是一种主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出。
同时它是一种无监督学习算法,在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量k即可。此外LDA的另一个优点则是,对于每一个主题均可找出一些词语来描述它。
LDA首先由Blei, David M.、吴恩达和Jordan, Michael I于2003年提出,目前在文本挖掘领域包括文本主题识别、文本分类以及文本相似度计算方面都有应用。
LDA的数学模型
LDA的概率图表示
[LDA automatically assigns topics to text documents]
Note:
1 阴影圆圈表示可观测的变量,非阴影圆圈表示隐变量,箭头表示两变量间的条件依赖性conditional dependency,方框表示重复抽样,方框右下角的数字代表重复抽样的次数。
2 对于图2,单圆圈表示隐变量;双圆圈表示观察到的变量;把节点用方框(plate)圈起来,表示其中的节点有多种选择。所以这种表示方法也叫做plate notation,参考PRML 8.0 Graphical Models。
对应到图2,只有
3 φ(topic-word分布) and θ(doc-topic分布) are Dirichlet distributions, z(赋给词w的主题) and w(当前词) aremultinomials. θ指向z是从doc-topic分布中采样一个主题赋给w,φ指向w是φ的topic-word分布依赖于w。
LDA生成模型
LDA是一种典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序以及先后的关系。一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。
当我们看到一篇文章后,往往喜欢推测这篇文章是如何生成的,我们可能会认为作者先确定这篇文章的几个主题,然后围绕这几个主题遣词造句,表达成文。LDA就是要根据给定的一篇文档,推测其主题分布。
因此正如LDA?贝叶斯网络结构中所描述的,在LDA模型中一篇文档生成的方式如下:
- 从狄利克雷分布中取样生成文档i的主题分布
- 从主题的多项式分布中取样生成文档i第j个词的主题
- 从狄利克雷分布中取样生成主题的词语分布
- 从词语的多项式分布中采样最终生成词语
LDA模型参数求解概述
因此整个模型中所有可见变量以及隐藏变量的联合分布是
最终一篇文档的单词分布的最大似然估计可以通过将上式的以及进行积分和对进行求和得到
根据的最大似然估计,最终可以通过吉布斯采样等方法估计出模型中的参数。
LDA参数的估计(吉布斯采样)
在LDA最初提出的时候,人们使用EM算法进行求解,后来人们普遍开始使用较为简单的Gibbs Sampling,具体过程如下:
- 首先对所有文档中的所有词遍历一遍,为其都随机分配一个主题,即zm,n=k~Mult(1/K),其中m表示第m篇文档,n表示文档中的第n个词,k表示主题,K表示主题的总数,之后将对应的n(k)m+1, nm+1, n(t)k+1, nk+1, 他们分别表示在m文档中k主题出现的次数,m文档中主题数量的和,k主题对应的t词的次数,k主题对应的总词数(n(k)m等等初始化为0)。
- 之后对下述操作进行重复迭代。
- 对所有文档中的所有词进行遍历,假如当前文档m的词t对应主题为k,则n(k)m-1, nm-1, n(t)k-1, nk-1, 即先拿出当前词,之后根据LDA中topic sample的概率分布sample出新的主题,在对应的n(k)m, nm, n(t)k, nk上分别+1。
∝(topic sample的概率分布)
- 迭代完成后输出主题-词参数矩阵φ和文档-主题矩阵θ
主题k中词t的概率分布
文档m中主题k的概率分布
[http://zh.wikipedia.org/wiki/隐含狄利克雷分布]
LDA中的数学基础
- beta分布是二项式分布的共轭先验概率分布:“对于非负实数和,我们有如下关系
其中对应的是二项分布的计数。针对于这种观测到的数据符合二项分布,参数的先验分布和后验分布都是Beta分布的情况,就是Beta-Binomial 共轭。”
- 狄利克雷分布(Dirichlet分布)是多项式分布的共轭先验概率分布:
- “ 把从整数集合延拓到实数集合,从而得到更一般的表达式如下:
针对于这种观测到的数据符合多项分布,参数的先验分布和后验分布都是Dirichlet 分布的情况,就是 Dirichlet-Multinomial 共轭。 ”
正如Beta分布是二项式分布的共轭先验概率分布,狄利克雷分布作为多项式分布的共轭先验概率分布。
- 贝叶斯派思考问题的固定模式:
- 先验分布 + 样本信息 后验分布
上述思考模式意味着,新观察到的样本信息将修正人们以前对事物的认知。换言之,在得到新的样本信息之前,人们对的认知是先验分布,在得到新的样本信息后,人们对的认知为。 - 频率派与贝叶斯派各自不同的思考方式:
- 频率派把需要推断的参数θ看做是固定的未知常数,即概率虽然未知,但是是确定的一个值,同时样本X 是随机的,所以频率派重点研究样本空间,大部分的概率计算都是针对样本X 的分布;
- 而贝叶斯派的观点则截然相反,他们认为待估计的参数是随机变量,服从一定的分布,而样本X 是固定的,由于样本是固定的,所以他们重点研究的是参数的分布。
主题模型LDA文档生成模式
从LDA与pLSA的区别和联系角度出发
LDA就是在pLSA的基础上加层贝叶斯框架。pLSA样本随机,参数虽未知但固定,属于频率派思想;而LDA样本固定,参数未知但不固定,是个随机变量,服从一定的分布,LDA属于贝叶斯派思想。
{lda基础模型可参见TopicModel - Unigram、LSA、PLSA算法详解}
pLSA与LDA生成文档方式的对比
pLSA模型按照如下的步骤生成“文档-词项”:
- 按照概率选择一篇文档
- 选定文档后,确定文章的主题分布
- 从主题分布中按照概率选择一个隐含的主题类别
- 选定后,确定主题下的词分布
- 从词分布中按照概率选择一个词
LDA模型中一篇文档生成的方式:
- 按照先验概率选择一篇文档
- 从狄利克雷分布中取样生成文档的主题分布,换言之,主题分布由超参数为的Dirichlet分布生成
- 从主题的多项式分布中取样生成文档第 j 个词的主题
- 从狄利克雷分布(即Dirichlet分布)中取样生成主题对应的词语分布,换言之,词语分布由参数为的Dirichlet分布生成
- 从词语的多项式分布中采样最终生成词语
[沈博PPT]
从上面两个过程可以看出,LDA在PLSA的基础上,为主题分布和词分布分别加了两个Dirichlet先验(也就是主题分布的分布和词分布的分布)。
pLSA与LDA的概率图对比
对应到上面右图的LDA,只有W / w是观察到的变量,其他都是隐变量或者参数,其中,Φ表示词分布,Θ表示主题分布, 是主题分布Θ的先验分布(即Dirichlet 分布)的参数,是词分布Φ的先验分布的参数,N表示文档的单词总数,M表示文档的总数。
- 假定语料库中共有M篇文章,每篇文章下的Topic的主题分布是一个从参数为的Dirichlet先验分布中采样得到的Multinomial分布,每个Topic下的词分布是一个从参数为的Dirichlet先验分布中采样得到的Multinomial分布。
- 对于某篇文章中的第n个词,首先从该文章中出现的每个主题的Multinomial分布(主题分布)中选择或采样一个主题,然后再在这个主题对应的词的Multinomial分布(词分布)中选择或采样一个词。不断重复这个随机生成过程,直到M篇文章全部生成完成。
- 其中,→θ→z 表示生成文档中的所有词对应的主题,显然 →θ 对应的是Dirichlet 分布,θ→z 对应的是 Multinomial 分布,所以整体是一个 Dirichlet-Multinomial 共轭结构,如下图所示:
- 类似的,→φ→w,容易看出, 此时β→φ对应的是 Dirichlet 分布, φ→w 对应的是 Multinomial 分布, 所以整体也是一个Dirichlet-Multinomial 共轭结构,如下图所示:
pLSA与LDA参数估计方法的对比
- pLSA中,我们使用EM算法去估计“主题-词项”矩阵Φ和“文档-主题”矩阵Θ,而且这两参数都是个未知的固定的值,使用的思想其实就是极大似然估计MLE。
- LDA中,估计Φ、Θ这两未知参数可以用变分(Variational inference)-EM算法,也可以用gibbs采样,前者的思想是最大后验估计MAP(MAP与MLE类似,都把未知参数当作固定的值),后者的思想是贝叶斯估计。贝叶斯估计是对MAP的扩展,但它与MAP有着本质的不同,即贝叶斯估计把待估计的参数看作是服从某种先验分布的随机变量。
PLSA与LDA的本质区别详解及实例*
- PLSA中,主题分布和词分布是唯一确定的,能明确的指出主题分布可能就是{教育:0.5,经济:0.3,交通:0.2},词分布可能就是{大学:0.5,老师:0.3,课程:0.2}。
- LDA中,主题分布和词分布不再唯一确定不变,即无法确切给出。例如主题分布可能是{教育:0.5,经济:0.3,交通:0.2},也可能是{教育:0.6,经济:0.2,交通:0.2},到底是哪个我们不再确定,因为它是随机的可变化的。但再怎么变化,也依然服从一定的分布,即主题分布跟词分布由Dirichlet先验随机确定。面对多个主题或词,各个主题或词被抽中的概率不一样,所以抽取主题或词是随机抽取。主题分布和词分布本身也都是不确定的,正因为LDA是PLSA的贝叶斯版本,所以主题分布跟词分布本身由先验知识随机给定。
- pLSA中,主题分布和词分布确定后,以一定的概率(、)分别选取具体的主题和词项,生成好文档。而后根据生成好的文档反推其主题分布、词分布时,最终用EM算法(极大似然估计思想)求解出了两个未知但固定的参数的值:()和()
- 举个文档d产生主题z的例子。给定一篇文档d,主题分布是一定的,比如{ P(zi|d), i = 1,2,3 }={0.4,0.5,0.1},表示z1、z2、z3,这3个主题被文档d选中的概率都是个固定的值:P(z1|d) = 0.4、P(z2|d) = 0.5、P(z3|d) = 0.1。
- 贝叶斯框架下的LDA中,我们不再认为主题分布和词分布是唯一确定的(而是随机变量),而是有很多种可能。LDA为它们弄了两个Dirichlet先验参数,为某篇文档随机抽取出某个主题分布和词分布。
- 文档d产生主题z(准确的说,其实是Dirichlet先验为文档d生成主题分布Θ,然后根据主题分布Θ产生主题z)的概率,主题z产生单词w的概率都不再是某两个确定的值,而是随机变量。
- 例子:给定一篇文档d,现在有多个主题z1、z2、z3,它们的主题分布{ P(zi|d), i = 1,2,3 }可能是{0.4,0.5,0.1},也可能是{0.2,0.2,0.6},即这些主题被d选中的概率都不再认为是确定的值,而主题分布到底是哪个取值集合我们不确定(这就是贝叶斯派的核心思想,把未知参数当作是随机变量,不再认为是某一个确定的值),但其先验分布是dirichlet 分布,所以可以从无穷多个主题分布中按照dirichlet 先验随机抽取出某个主题分布出来。
- 文档d产生主题z(准确的说,其实是Dirichlet先验为文档d生成主题分布Θ,然后根据主题分布Θ产生主题z)的概率,主题z产生单词w的概率都不再是某两个确定的值,而是随机变量。
LDA是pLSA的generalization:一方面LDA的hyperparameter设为特定值的时候,就specialize成pLSA了。从工程应用价值的角度看,这个数学方法的generalization,允许我们用一个训练好的模型解释任何一段文本中的语义。而pLSA只能理解训练文本中的语义。(虽然也有ad hoc的方法让pLSA理解新文本的语义,但是大都效率低,并且并不符合pLSA的数学定义。)
LDA生成文档过程的进一步理解
Dirichlet先验是如何“随机”抽取主题分布的
在这个三维坐标轴所划分的空间里,每一个坐标点(p1,p2,p3)就对应着一个主题分布,且某一个点(p1,p2,p3)的大小表示3个主题z1、z2、z3出现的概率大小(因为各个主题出现的概率和为1,所以p1+p2+p3 = 1 {三角平面},且p1、p2、p3这3个点最大取值为1)。比如(p1,p2,p3) = (0.4,0.5,0.1)便对应着主题分布{ P(zi), i =1,2,3 } = {0.4,0.5,0.1},空间里有很多这样的点(p1,p2,p3),意味着有很多的主题分布可供选择,那dirichlet分布如何选择主题分布呢?把上面的斜三角形放倒,映射到底面的平面上,便得到如下所示的一些彩图(3个彩图中,每一个点对应一个主题分布,高度代表某个主题分布被dirichlet分布选中的概率,且选不同的,dirichlet 分布会偏向不同的主题分布):
Note: 也就是说alpha越大,选出的主题分布是均匀的可能性越大?
LDA参数估计:Gibbs采样
类似于pLSA,LDA的原始论文中是用的变分-EM算法估计未知参数,但不太好理解,并且EM算法可能推导出局部最优解。后来发现另一种估计LDA未知参数的方法更好,Heinrich使用了Gibbs抽样法。Gibbs抽样是马尔可夫链蒙特卡尔理论(MCMC)中用来获取一系列近似等于指定多维概率分布(比如2个或者多个随机变量的联合概率分布)观察样本的算法。
LDA Gibbs Sampler
为了构造LDA Gibbs抽样器,我们需要使用隐变量的Gibbs抽样器公式(Note: 分母只是分子对zi的一个积分而已,重点在联合分布p(z,w)公式的推导上,只要有了联合分布p(z,w)公式就可以通过隐变量gibbs采样公式进行采样了)。
在LDA模型中,隐变量为
),它和联合分布成正比 {
这里省略了超参数},这个分布涉及很多离散随机变量,并且分母是
LDA所有变量的联合分布
联合概率分布
Note:等价上文中定义的,等价于上文中定义的,等价于上文中定义的,Θm等价于上文中定义的。
因为产生主题分布θ,主题分布θ确定具体主题,且产生词分布φ、词分布φ确定具体词,所以上述式子等价于下述式子所表达的所有变量的联合概率分布:
由于此公式第一部分独立于 ,第二部分独立于
联合分布因子1
第一个因子,可以根据确定的主题和从先验分布取样得到的词分布Φ产生:
由于样本中的词服从参数为主题的独立多项分布,这意味着可以把上面对词的乘积分解成分别对主题和对词的两层乘积:
其中是词 t 在主题 k 中出现的次数,可以从初始化和迭代中计算出;phi(k, t)是词分布也就是主题k下词t的采样概率,就是LDA模型要求的未知参数。
Note:
1 每个主题下包含所有词,所有词都要考虑,只是概率不一样而已。并且这里的w和z上面都有箭头,都是向量。
2 初始时每个词w随机分配主题k,这样每个主题下的词也就随机分配了,也就得到初始值并不断修正,具体参考后面的【Gibbs sampling具体算法】
回到第一个因子上来。目标分布需要对词分布Φ积分,且结合在LDA中的数学模型定义的Dirichlet 分布的归一化系数的公式
可得联合分布因子1:
(68)
这个结果可以看作K个Dirichlet-Multinomial模型的乘积。
Note:
1 上式第一步推导:
2 上式第二步推导:
联合分布因子2
类似于的步骤,先写出条件分布,然后分解成两部分的乘积:
其中, 表示的单词 i 所属的文档,是主题 k 在文章 m 中出现的次数。
对主题分布Θ积分可得联合分布因子2:
(72)
Note: 上式推导:
综合第一个因子和第二个因子的结果,得到的联合分布结果为:
LDA词的主题采样
通过联合分布来计算在给定可观测变量 w 下的隐变量 z 的条件分布(后验分布),再进行贝叶斯分析。换言之,有了这个联合分布后,要求解第m篇文档中的第n个词(下标为的词)的全部条件概率就好求了。公式(80)
1 也就是求当前词i的主题zi=k的采样概率;i:当前词;
-i除去当前词i相关的不考虑where n?i is the count excluding the current assignment of z i , i.e., z ?i .; n?i denotes a quantity excluding the current instance.
w:数据集Dt中所有词;m文档;k主题; t:当前词实例wi = t?。
n(k)m,-i表示其它主题(非主题k?)被赋予文档m中词(不包括当前词i,也就是如果当前词i对应的主题为k,则-1?)的次数; n d,k denotes the number of times that topic k is assigned to terms in document d.
n(t)k,-i表示词t从主题k中生成来的次数。主题k中当前词i对应词项t(不是当前词,但是词的内容是t)出现的总数(相当于n(t)k-1?)。n k,w refers to the number of times that term w appears under topic k. n z,w refers to the number of times that word w is generated from topic z.
2 右式如果加上分母:当前词所在文档抽取出主题k的概率(当前文档中的其它词(-i,n-1个词)被赋予主题k的概率越大,那么当前文档的当前词i被赋予主题k的概率就越大);
左式:主题k抽取出当前词wi对应词项t的概率。(主题k下词项t越多,当前词wi被采样为主题k的概率就越大)
这就是罐子模型!richer get richer!
3 上式推导:
4 另外如果不省略上式右部分母,又可以得到下面的正比等式:
Note:不必使用这个公式进行采样,这个公式只是下面解释LDA吉布斯采样图解过程时比较方便。
主题分布参数Θ和词分布参数Φ的计算
最后一步,根据Markov链的状态获取主题分布的参数Θ和词分布的参数Φ(知道了每篇文档下每个词对应的主题,那么文档下的主题分布和主题的词分布就好求了)。根据贝叶斯法则和Dirichlet先验,以及上文中得到的和各自被分解成两部分乘积的结果,可以计算得到每个文档上Topic的后验分布和每个Topic下的词的后验分布分别如下(据上文可知:其后验分布跟它们的先验分布一样,也都是Dirichlet 分布):
最终求解的Dirichlet 分布期望为:
其中,是构成文档m的主题数向量,是构成主题k的词项数向量。
LDA吉布斯采样概率公式图解
如果将和的结果代入之前得到的{公式(81)}的结果中,可得:LDA Gibbs sampling算法实现
- 算法:
LdaGibbs({w,α,β,K}) - 输入:单词向量
w ,超参数α 和β ,主题数K - 全局变量:统计量
{n(k)m} 、{n(t)k} ,以及它们的总数{nm} 、{nk} ,全部条件概率数组p(zi|?) - 输出:主题向量
{z} ,多项分布参数Φ 和Θ ,超参数估计量α 和β - [初始化] 设置全局变量
n(k)m 、n(t)k 、nm 、nk 为零 对所有文档
m∈[1,M] :- 对文档
m 中的所有单词n∈[1,Nm] :- 采样每个单词对应的主题
zm,n=k~Mult(1/K) - 增加“文档-主题”计数:
n(k)m+=1 - 增加“文档-主题”总数:
nm+=1 - 增加“主题-词项”计数:
n(t)k+=1 - 增加“主题-词项”总数:
nk+=1
- 采样每个单词对应的主题
- 对文档
迭代burn-in和sampling步骤:
- [burn-in] 对所有文档
m∈[1,M] :- 对文档
m 中的所有单词n∈[1,Nm] :- 减少计数:
n(k)m?=1;nm?=1;n(t)k?=1;nk?=1; - 根据公式p(zi=k|z?i,w) = ...{公式(80)}采样主题:
k~~p(zi|z?i,w) - 增加计数:
n(k~)m+=1;nm+=1;n(t)k~+=1;nk~+=1;
- 减少计数:
- 对文档
- [sampling] 如果Markov链收敛:
- 根据公式φk,t生成参数
Φ - 根据公式?m,k生成参数
Θ
- 根据公式φk,t生成参数
- [burn-in] 对所有文档
[参数估计方法Gregor Heinrich.Parameter estimation for text analysis* - 5.5 The collapsed LDA Gibbs sampler]
后验分布的更新实践[AMC]
在burn in phase结束后再在每个sample lag进行posterior distributions更新。
数据量很小时(e.g., 100 reviews)我们只保留Markov chain最后的状态 (i.e., sampleLag = -1). The reason is that it avoids the topics being dominated by the most frequent words.
数据量不是很小时(e.g., 1000 reviews),我们可以设置sampleLag为20。
from:http://blog.csdn.net/pipisorry/article/details/42649657
ref:Blei, David; Ng, Andrew;Latent Dirichlet allocation.Journal of Machine Learning Research*
David M. Blei《Introduction to Probabilistic Topic Models》译文:概率主题模型简介 Introduction to Probabilistic Topic Models
LDA学习笔记---来自《Parameter estimation for text analysis》