LDA
是一种概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation
,简称LDA
)。LDA
是2003年提出的一种主题模型,它可以将文档集中每篇文档的主题以概率分布的形式给出。
通过分析一些文档,我们可以抽取出它们的主题(分布),根据主题(分布)进行主题聚类或文本分类。同时,它是一种典型的词袋模型,即一篇文档是由一组词构成,词与词之间没有先后顺序的关系。一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。
举一个简单的例子,比如假设事先给定了这几个主题:Arts、Budgets、Children、Education
,然后通过学习的方式,获取每个主题Topic
对应的词语,如下图所示:
然后以一定的概率选取上述某个主题,再以一定的概率选取那个主题下的某个单词,不断的重复这两步,最终生成如下图所示的一篇文章(不同颜色的词语分别表示不同主题)。
我们看到一篇文章后,往往会推测这篇文章是如何生成的,我们通常认为作者会先确定几个主题,然后围绕这几个主题遣词造句写成全文。LDA
要干的事情就是根据给定的文档,判断它的主题分别。在LDA
模型中,生成文档的过程有如下几步:
LDA
的图模型结构如下图所示:
LDA
会涉及很多数学知识,后面的章节我会首先介绍LDA
涉及的数学知识,然后在这些数学知识的基础上详细讲解LDA
的原理。
在高等数学中,有一个长相奇特的Gamma
函数
通过分部积分,可以推导gamma
函数有如下递归性质
通过该递归性质,我们可以很容易证明,gamma
函数可以被当成阶乘在实数集上的延拓,具有如下性质
如下函数被称为Digamma
函数,它是Gamma
函数对数的一阶导数
这是一个很重要的函数,在涉及Dirichlet
分布相关的参数的极大似然估计时,往往需要用到这个函数。Digamma
函数具有如下一个漂亮的性质
二项分布是由伯努利分布推出的。伯努利分布,又称两点分布或0-1
分布,是一个离散型的随机分布,其中的随机变量只有两类取值,即0或者1。二项分布是重复n
次的伯努利试验。简言之,只做一次实验,是伯努利分布,重复做了n次,是二项分布。二项分布的概率密度函数为:
对于k=1,2,...,n,其中C(n,k)
是二项式系数(这就是二项分布的名称的由来)
多项分布是二项分布扩展到多维的情况。多项分布是指单次试验中的随机变量的取值不再是0-1
,而是有多种离散值可能(1,2,3...,k)
。比如投掷6个面的骰子实验,N
次实验结果服从K=6
的多项分布。其中:
多项分布的概率密度函数为:
首先看下面的问题1(问题1到问题4都取自于文献【1】)。
问题1:
为解决这个问题,可以尝试计算落在区间[x,x+delta x]
的概率。首先,把[0,1]
区间分成三段[0,x)
,[x,x+delta x]
,(x+delta x,1]
,然后考虑下简单的情形:即假设n个数中只有1个落在了区间[x,x+delta x]
内,由于这个区间内的数X(k)
是第k大的,所以[0,x)
中应该有k−1个数,(x+delta x,1]
这个区间中应该有n−k个数。
如下图所示:
上述问题可以转换为下述事件E
:
对于上述事件E
,有:
其中,o(delta x)
表示delta x
的高阶无穷小。显然,由于不同的排列组合,即n个数中有一个落在[x,x+delta x]
区间的有n种取法,余下n−1个数中有k−1个落在[0,x)
的有C(n-1,k-1)
种组合。所以和事件E等价的事件一共有nC(n-1,k-1)
个。
文献【1】中证明,只要落在[x,x+delta x]
内的数字超过一个,则对应的事件的概率就是o(delta x)
。所以的概率密度函数为:
利用Gamma
函数,我们可以将f(x)
表示成如下形式:
在上式中,我们用alpha=k
,beta=n-k+1
替换,可以得到beta
分布的概率密度函数
什么是共轭呢?轭的意思是束缚、控制。共轭从字面上理解,则是共同约束,或互相约束。在贝叶斯概率理论中,如果后验概率P(z|x)
和先验概率p(z)
满足同样的分布,那么,先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布。
我们在问题1的基础上增加一些观测数据,变成问题2:
第2步的条件可以用另外一句话来表述,即“Yi
中有m1
个比X(k
)小,m2
个比X(k)
大”,所以X(k)
是中k+m1大的数。
根据1.5.1的介绍,我们知道事件p服从beta
分布,它的概率密度函数为:
按照贝叶斯推理的逻辑,把以上过程整理如下:
-
1、p是我们要猜测的参数,我们推导出
p
的分布为f(p)=Beta(p|k,n-k+1)
,称为p
的先验分布 -
2、根据
Yi
中有m1
个比p
小,有m2
个比p
大,Yi
相当是做了m
次伯努利实验,所以m1
服从二项分布B(m,p)
-
3、在给定了来自数据提供
(m1,m2)
知识后,p的后验分布变为f(p|m1,m2)=Beta(p|k+m1,n-k+1+m2)
贝叶斯估计的基本过程是:
先验分布 + 数据的知识 = 后验分布
以上贝叶斯分析过程的简单直观的表示就是:
Beta(p|k,n-k+1) + BinomCount(m1,m2) = Beta(p|k+m1,n-k+1+m2)
更一般的,对于非负实数alpha和beta,我们有如下关系
Beta(p|alpha,beta) + BinomCount(m1,m2) = Beta(p|alpha+m1,beta+m2)
针对于这种观测到的数据符合二项分布,参数的先验分布和后验分布都是Beta
分布的情况,就是Beta-Binomial
共轭。换言之,Beta
分布是二项式分布的共轭先验概率分布。二项分布和Beta分布是共轭分布意味着,如果我们为二项分布的参数p选取的先验分布是Beta
分布,那么以p为参数的二项分布用贝叶斯估计得到的后验分布仍然服从Beta
分布。
Dirichlet
分布,是beta
分布在高维度上的推广。Dirichlet
分布的的密度函数形式跟beta
分布的密度函数类似:
其中
至此,我们可以看到二项分布和多项分布很相似,Beta
分布和Dirichlet
分布很相似。并且Beta
分布是二项式分布的共轭先验概率分布。那么Dirichlet
分布呢?Dirichlet
分布是多项式分布的共轭先验概率分布。下文来论证这点。
在1.5.3章问题2的基础上,我们更进一步引入问题3:
类似于问题1的推导,我们可以容易推导联合分布。为了简化计算,我们取x3
满足x1+x2+x3=1
,x1
和x2
是变量。如下图所示。
概率计算如下:
于是我们得到联合分布为:
观察上述式子的最终结果,可以看出上面这个分布其实就是3维形式的Dirichlet
分布。令alpha1=k1,alpha2=k2,alpha3=n-k1-k2+1
,分布密度函数可以写为:
为了论证Dirichlet
分布是多项式分布的共轭先验概率分布,在上述问题3的基础上再进一步,提出问题4。
为了方便计算,我们记
根据问题中的信息,我们可以推理得到p1,p2
在X;Y
这m+n
个数中分别成为了第k1+m1,k1+k2+m1+m2
大的数。后验分布p应该为
同样的,按照贝叶斯推理的逻辑,可将上述过程整理如下:
-
1 我们要猜测参数
P=(p1,p2,p3)
,其先验分布为Dir(p|k)
; -
2 数据
Yi
落到三个区间[0,p1)
,[p1,p2]
,(p2,1]
的个数分别是m1,m2,m3
,所以m=(m1,m2,m3)
服从多项分布Mult(m|p)
; -
3 在给定了来自数据提供的知识
m
后,p
的后验分布变为Dir(P|k+m)
上述贝叶斯分析过程的直观表述为:
Dir(p|k) + Multcount(m) = Dir(p|k+m)
针对于这种观测到的数据符合多项分布,参数的先验分布和后验分布都是Dirichlet
分布的情况,就是Dirichlet-Multinomial
共轭。这意味着,如果我们为多项分布的参数p选取的先验分布是Dirichlet
分布,那么以p为参数的多项分布用贝叶斯估计得到的后验分布仍然服从Dirichlet
分布。
如果p=Beta(t|alpha,beta)
,那么
上式右边的积分对应到概率分布Beta(t|alpha+1,beta)
,对于这个分布,我们有
把上式带人E(p)
的计算式,可以得到:
这说明,对于Beta
分布的随机变量,其期望可以用上式来估计。Dirichlet
分布也有类似的结论。对于p=Dir(t|alpha)
,有
这个结论在后文的推导中会用到。
LDA
涉及的数学知识较多,需要认真体会,以上大部分的知识来源于文献【1,2,3】,如有不清楚的地方,参见这些文献以了解更多。
在介绍LDA之前,我们先介绍几个基础模型:Unigram model
、mixture of unigrams model
、pLSA model
。为了方便描述,首先定义一些变量:
其图模型为(图中被涂色的w
表示可观测变量,N
表示一篇文档中总共N
个单词,M
表示M
篇文档):
该模型的生成过程是:给某个文档先选择一个主题Z
,再根据该主题生成文档,该文档中的所有词都来自一个主题。生成文档的概率为:
其图模型为(图中被涂色的w
表示可观测变量,未被涂色的z
表示未知的隐变量,N
表示一篇文档中总共N
个单词,M
表示M
篇文档):
在混合一元模型中,假定一篇文档只由一个主题生成,可实际中,一篇文章往往有多个主题,只是这多个主题各自在文档中出现的概率大小不一样。在pLSA
中,假设文档由多个主题生成。下面通过一个投色子的游戏(取自文献【2】的例子)说明pLSA
生成文档的过程。
首先,假定你一共有K
个可选的主题,有V
个可选的词。假设你每写一篇文档会制作一颗K
面的“文档-主题”骰子(扔此骰子能得到K
个主题中的任意一个),和K
个V
面的“主题-词项”骰子(每个骰子对应一个主题,K
个骰子对应之前的K
个主题,且骰子的每一面对应要选择的词项,V
个面对应着V
个可选的词)。
比如可令K=3
,即制作1个含有3个主题的“文档-主题”骰子,这3个主题可以是:教育、经济、交通。然后令V = 3
,制作3个有着3面的“主题-词项”骰子,其中,教育主题骰子的3个面上的词可以是:大学、老师、课程,经济主题骰子的3个面上的词可以是:市场、企业、金融,交通主题骰子的3个面上的词可以是:高铁、汽车、飞机。
其次,每写一个词,先扔该“文档-主题”骰子选择主题,得到主题的结果后,使用和主题结果对应的那颗“主题-词项”骰子,扔该骰子选择要写的词。先扔“文档-主题”的骰子,假设以一定的概率得到的主题是:教育,所以下一步便是扔教育主题筛子,以一定的概率得到教育主题筛子对应的某个词大学。
-
上面这个投骰子产生词的过程简化一下便是:“先以一定的概率选取主题,再以一定的概率选取词”。事实上,一开始可供选择的主题有3个:教育、经济、交通,那为何偏偏选取教育这个主题呢?其实是随机选取的,只是这个随机遵循一定的概率分布。比如可能选取教育主题的概率是0.5,选取经济主题的概率是0.3,选取交通主题的概率是0.2,那么这3个主题的概率分布便是
{教育:0.5,经济:0.3,交通:0.2}
,我们把各个主题z
在文档d
中出现的概率分布称之为主题分布,且是一个多项分布。 -
同样的,从主题分布中随机抽取出教育主题后,依然面对着3个词:大学、老师、课程,这3个词都可能被选中,但它们被选中的概率也是不一样的。比如大学这个词被选中的概率是0.5,老师这个词被选中的概率是0.3,课程被选中的概率是0.2,那么这3个词的概率分布便是
{大学:0.5,老师:0.3,课程:0.2}
,我们把各个词语w在主题z下出现的概率分布称之为词分布,这个词分布也是一个多项分布。 -
所以,选主题和选词都是两个随机的过程,先从主题分布
{教育:0.5,经济:0.3,交通:0.2}
中抽取出主题:教育,然后从该主题对应的词分布{大学:0.5,老师:0.3,课程:0.2}
中抽取出词:大学。
最后,你不停的重复扔“文档-主题”骰子和”主题-词项“骰子,重复N
次(产生N
个词),完成一篇文档,重复这产生一篇文档的方法M
次,则完成M
篇文档。
上述过程抽象出来即是pLSA
的文档生成模型。在这个过程中,我们并未关注词和词之间的出现顺序,所以pLSA
是一种词袋模型。定义如下变量:
我们可以按照如下的步骤得到“文档-词项”的生成模型:
利用看到的文档推断其隐藏的主题(分布)的过程,就是主题建模的目的:自动地发现文档集中的主题(分布)。文档d
和单词w
是可被观察到的,但主题z
却是隐藏的。如下图所示(图中被涂色的d、w
表示可观测变量,未被涂色的z
表示未知的隐变量,N
表示一篇文档中总共N
个单词,M
表示M
篇文档)。
上图中,文档d
和词w
是我们得到的样本,可观测得到,所以对于任意一篇文档,其是已知的。根据这个概率可以训练得到文档-主题
概率以及主题-词项
概率。即:
故得到文档中每个词的生成概率为:
可以直接得出,而和未知,所以
就是我们要估计的参数,我们要最大化这个参数。因为该待估计的参数中含有隐变量z
,所以我们可以用EM
算法来估计这个参数。
LDA
就是在pLSA
的基础上加层贝叶斯框架,即LDA
就是pLSA
的贝叶斯版本,正因为LDA
被贝叶斯化了,所以才会加的两个先验参数。LDA
模型中一篇文档生成的方式如下所示:
从上面的过程可以看出,LDA
在pLSA
的基础上,为主题分布和词分布分别加了两个Dirichlet
先验。
拿之前讲解pLSA
的例子进行具体说明。如前所述,在pLSA
中,选主题和选词都是两个随机的过程,先从主题分布{教育:0.5,经济:0.3,交通:0.2}
中抽取出主题:教育,然后从该主题对应的词分布{大学:0.5,老师:0.3,课程:0.2}
中抽取出词:大学。
在LDA
中,选主题和选词依然都是两个随机的过程。但在LDA
中,主题分布和词分布不再唯一确定不变,即无法确切给出。例如主题分布可能是{教育:0.5,经济:0.3,交通:0.2}
,也可能是{教育:0.6,经济:0.2,交通:0.2}
,到底是哪个我们不能确定,因为它是随机的可变化的。
但再怎么变化,也依然服从一定的分布,主题分布和词分布由Dirichlet
先验确定。
举个文档d
产生主题z
的例子。
在pLSA
中,给定一篇文档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
先验参数,Dirichlet
先验为某篇文档随机抽取出主题分布和词分布。
给定一篇文档d
,现在有多个主题z1、z2、z3
,它们的主题分布{ P(zi|d), i = 1,2,3 }
可能是{0.4,0.5,0.1}
,也可能是{0.2,0.2,0.6}
,即这些主题被d
选中的概率都不再是确定的值,可能是P(z1|d) = 0.4、P(z2|d) = 0.5、P(z3|d) = 0.1
,也有可能是P(z1|d) = 0.2、P(z2|d) = 0.2、P(z3|d) = 0.6
,而主题分布到底是哪个取值集合我们不确定,但其先验分布是dirichlet
分布,所以可以从无穷多个主题分布中按照dirichlet
先验随机抽取出某个主题分布出来。如下图所示
LDA
在pLSA
的基础上给两参数和加了两个先验分布的参数。这两个分布都是Dirichlet
分布。
下面是LDA
的图模型结构:
在spark
中,提供了两种方法来估计参数,分别是变分EM
(期望最大)算法(见文献【3】【4】)和在线学习算法(见文献【5】)。下面将分别介绍这两种算法以及其源码实现。
在上文中,我们知道LDA
将变量theta
和phi
(为了方便起见,我们将上文LDA图模型中的beta
改为了phi
)看做随机变量,并且为theta
添加一个超参数为alpha
的Dirichlet
先验,为phi
添加一个超参数为eta
的Dirichlet
先验来估计theta
和beta
的最大后验估计(MAP
)。
可以通过最优化最大后验估计来估计参数。我们首先来定义几个变量:
- 下式的
gamma
表示词为w
,文档为j
时,主题为k
的概率;
根据文献【4】中2.2
章节的介绍,我们知道了有如下更新公式,其中alpha
和eta
均大于1:
收敛之后,最大后验估计可以得到:
【1】LDA数学八卦
【2】通俗理解LDA主题模型
【3】[Latent Dirichlet Allocation](docs/Latent Dirichlet Allocation.pdf)
【4】[On Smoothing and Inference for Topic Models](docs/On Smoothing and Inference for Topic Models.pdf)
【5】[Online Learning for Latent Dirichlet Allocation](docs/Online Learning for Latent Dirichlet Allocation.pdf)