文本主题模型之LDA(一) LDA基础 朴素贝叶斯算法原理小结

 
       LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层 贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。  [1] 
        LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。

1LDA生成过程

对于语料库中的每篇文档,LDA定义了如下生成过程(generativeprocess):
1.对每一篇文档,从主题分布中抽取一个主题;
2.从上述被抽到的主题所对应的单词分布中抽取一个单词;
3.重复上述过程直至遍历文档中的每一个单词。
语料库中的每一篇文档与T(通过反复试验等方法事先给定)个主题的一个多项分布 (multinomialdistribution)相对应,将该多项分布记为θ。每个主题又与词汇表(vocabulary)中的V个单词的一个多项分布相对应,将这个多项分布记为φ。  [1] 

2LDA整体流程

先定义一些字母的含义:文档集合D,主题(topic)集合T
D中每个文档d看作一个单词序列<w1,w2,...,wn>,wi表示第i个单词,设d有n个单词。(LDA里面称之为wordbag,实际上每个单词的出现位置对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中的topict,生成不同单词的概率φt<pw1,...,pwm>,其中,pwi表示t生成VOC中第i个单词的概率。计算方法同样很直观,pwi=Nwi/N,其中Nwi表示对应到topict的VOC中第i个单词的数目,N表示所有对应到topict的单词总数。
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。  [2] 

3LDA学习过程(方法之一)

LDA算法开始时,先随机地给θd和φt赋值(对所有的d和t)。然后上述过程不断重复,最终收敛到的结果就是LDA的输出。再详细说一下这个迭代的学习过程:
1.针对一个特定的文档ds中的第i单词wi,如果令该单词对应的topic为tj,可以把上述公式改写为:
pj(wi|ds)=p(wi|tj)*p(tj|ds)
2.现在我们可以枚举T中的topic,得到所有的pj(wi|ds),其中j取值1~k。然后可以根据这些概率值结果为ds中的第i个单词wi选择一个topic。最简单的想法是取令pj(wi|ds)最大的tj(注意,这个式子里只有j是变量),即argmax[j]pj(wi|ds)
3.然后,如果ds中的第i个单词wi在这里选择了一个与原先不同的topic,就会对θd和φt有影响了(根据前面提到过的这两个向量的计算公式可以很容易知道)。它们的影响又会反过来影响对上面提到的p(w|d)的计算。对D中所有的d中的所有w进行一次p(w|d)的计算并重新选择topic看作一次迭代。这样进行n次循环迭代之后,就会收敛到LDA所需要的结果了。  [2] 
 

1. LDA贝叶斯模型

    LDA是基于贝叶斯模型的,涉及到贝叶斯模型离不开“先验分布”,“数据(似然)”和"后验分布"三块。在朴素贝叶斯算法原理小结中我们也已经讲到了这套贝叶斯理论。在贝叶斯学派这里:

先验分布 + 数据(似然)= 后验分布

    这点其实很好理解,因为这符合我们人的思维方式,比如你对好人和坏人的认知,先验分布为:100个好人和100个的坏人,即你认为好人坏人各占一半,现在你被2个好人(数据)帮助了和1个坏人骗了,于是你得到了新的后验分布为:102个好人和101个的坏人。现在你的后验分布里面认为好人比坏人多了。这个后验分布接着又变成你的新的先验分布,当你被1个好人(数据)帮助了和3个坏人(数据)骗了后,你又更新了你的后验分布为:103个好人和104个的坏人。依次继续更新下去。

2. 二项分布与Beta分布

    对于上一节的贝叶斯模型和认知过程,假如用数学和概率的方式该如何表达呢?

    对于我们的数据(似然),这个好办,用一个二项分布就可以搞定,即对于二项分布:

Binom(k|n,p)=(nk)pk(1p)nkBinom(k|n,p)=(nk)pk(1−p)n−k

    其中p我们可以理解为好人的概率,k为好人的个数,n为好人坏人的总数。

    虽然数据(似然)很好理解,但是对于先验分布,我们就要费一番脑筋了,为什么呢?因为我们希望这个先验分布和数据(似然)对应的二项分布集合后,得到的后验分布在后面还可以作为先验分布!就像上面例子里的“102个好人和101个的坏人”,它是前面一次贝叶斯推荐的后验分布,又是后一次贝叶斯推荐的先验分布。也即是说,我们希望先验分布和后验分布的形式应该是一样的,这样的分布我们一般叫共轭分布。在我们的例子里,我们希望找到和二项分布共轭的分布。

    和二项分布共轭的分布其实就是Beta分布。Beta分布的表达式为:

Beta(p|α,β)=Γ(α+β)Γ(α)Γ(β)pα1(1p)β1Beta(p|α,β)=Γ(α+β)Γ(α)Γ(β)pα−1(1−p)β−1

    其中ΓΓ是Gamma函数,满足Γ(x)=(x1)!Γ(x)=(x−1)!

    仔细观察Beta分布和二项分布,可以发现两者的密度函数很相似,区别仅仅在前面的归一化的阶乘项。那么它如何做到先验分布和后验分布的形式一样呢?后验分布P(p|n,k,α,β)P(p|n,k,α,β)推导如下:

P(p|n,k,α,β)P(k|n,p)P(p|α,β)=P(k|n,p)P(p|α,β)=Binom(k|n,p)Beta(p|α,β)=(nk)pk(1p)nk×Γ(α+β)Γ(α)Γ(β)pα1(1p)β1pk+α1(1p)nk+β1 (1)(2)(3)(4)(5)(1)P(p|n,k,α,β)∝P(k|n,p)P(p|α,β)(2)=P(k|n,p)P(p|α,β)(3)=Binom(k|n,p)Beta(p|α,β)(4)=(nk)pk(1−p)n−k×Γ(α+β)Γ(α)Γ(β)pα−1(1−p)β−1(5)∝pk+α−1(1−p)n−k+β−1 

    将上面最后的式子归一化以后,得到我们的后验概率为:

P(p|n,k,α,β)=Γ(α+β+n)Γ(α+k)Γ(β+nk)pk+α1(1p)nk+β1P(p|n,k,α,β)=Γ(α+β+n)Γ(α+k)Γ(β+n−k)pk+α−1(1−p)n−k+β−1

    可见我们的后验分布的确是Beta分布,而且我们发现:

Beta(p|α,β)+BinomCount(k,nk)=Beta(p|α+k,β+nk)Beta(p|α,β)+BinomCount(k,n−k)=Beta(p|α+k,β+n−k)

    这个式子完全符合我们在上一节好人坏人例子里的情况,我们的认知会把数据里的好人坏人数分别加到我们的先验分布上,得到后验分布。 

    我们在来看看Beta分布Beta(p|α,β)Beta(p|α,β)的期望:

E(Beta(p|α,β))=10tBeta(p|α,β)dt=10tΓ(α+β)Γ(α)Γ(β)tα1(1t)β1dt=10Γ(α+β)Γ(α)Γ(β)tα(1t)β1dt(6)(7)(8)(6)E(Beta(p|α,β))=∫01tBeta(p|α,β)dt(7)=∫01tΓ(α+β)Γ(α)Γ(β)tα−1(1−t)β−1dt(8)=∫01Γ(α+β)Γ(α)Γ(β)tα(1−t)β−1dt

    由于上式最右边的乘积对应Beta分布Beta(p|α+1,β)Beta(p|α+1,β),因此有:

10Γ(α+β+1)Γ(α+1)Γ(β)pα(1p)β1=1∫01Γ(α+β+1)Γ(α+1)Γ(β)pα(1−p)β−1=1

    这样我们的期望可以表达为:

E(Beta(p|α,β))=Γ(α+β)Γ(α)Γ(β)Γ(α+1)Γ(β)Γ(α+β+1)=αα+βE(Beta(p|α,β))=Γ(α+β)Γ(α)Γ(β)Γ(α+1)Γ(β)Γ(α+β+1)=αα+β

    这个结果也很符合我们的思维方式。

3. 多项分布与Dirichlet 分布

    现在我们回到上面好人坏人的问题,假如我们发现有第三类人,不好不坏的人,这时候我们如何用贝叶斯来表达这个模型分布呢?之前我们是二维分布,现在是三维分布。由于二维我们使用了Beta分布和二项分布来表达这个模型,则在三维时,以此类推,我们可以用三维的Beta分布来表达先验后验分布,三项的多项分布来表达数据(似然)。

    三项的多项分布好表达,我们假设数据中的第一类有m1m1个好人,第二类有m2m2个坏人,第三类为m3=nm1m2m3=n−m1−m2个不好不坏的人,对应的概率分别为p1,p2,p3=1p1p2p1,p2,p3=1−p1−p2,则对应的多项分布为:

multi(m1,m2,m3|n,p1,p2,p3)=n!m1!m2!m3!pm11pm22pm33multi(m1,m2,m3|n,p1,p2,p3)=n!m1!m2!m3!p1m1p2m2p3m3

    那三维的Beta分布呢?超过二维的Beta分布我们一般称之为狄利克雷(以下称为Dirichlet )分布。也可以说Beta分布是Dirichlet 分布在二维时的特殊形式。从二维的Beta分布表达式,我们很容易写出三维的Dirichlet分布如下:

Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)pα111(p2)α21(p3)α31Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)p1α1−1(p2)α2−1(p3)α3−1

    同样的方法,我们可以写出4维,5维,。。。以及更高维的Dirichlet 分布的概率密度函数。为了简化表达式,我们用向量来表示概率和计数,这样多项分布可以表示为:Dirichlet(p⃗ |α⃗ )Dirichlet(p→|α→),而多项分布可以表示为:multi(m⃗ |n,p⃗ )multi(m→|n,p→)。

    一般意义上的K维Dirichlet 分布表达式为:

Dirichlet(p⃗ |α⃗ )=Γ(k=1Kαk)Kk=1Γ(αk)k=1Kpαk1kDirichlet(p→|α→)=Γ(∑k=1Kαk)∏k=1KΓ(αk)∏k=1Kpkαk−1

    而多项分布和Dirichlet 分布也满足共轭关系,这样我们可以得到和上一节类似的结论:

Dirichlet(p⃗ |α⃗ )+MultiCount(m⃗ )=Dirichlet(p⃗ |α⃗ +m⃗ )Dirichlet(p→|α→)+MultiCount(m→)=Dirichlet(p→|α→+m→)

    对于Dirichlet 分布的期望,也有和Beta分布类似的性质:

E(Dirichlet(p⃗ |α⃗ ))=(α1k=1Kαk,α2k=1Kαk,...,αKk=1Kαk)E(Dirichlet(p→|α→))=(α1∑k=1Kαk,α2∑k=1Kαk,...,αK∑k=1Kαk)

4. LDA主题模型

    前面做了这么多的铺垫,我们终于可以开始LDA主题模型了。

    我们的问题是这样的,我们有MM篇文档,对应第d个文档中有有NdNd个词。即输入为如下图:

    我们的目标是找到每一篇文档的主题分布和每一个主题中词的分布。在LDA模型中,我们需要先假定一个主题数目KK,这样所有的分布就都基于KK个主题展开。那么具体LDA模型是怎么样的呢?具体如下图:

    LDA假设文档主题的先验分布是Dirichlet分布,即对于任一文档dd, 其主题分布θdθd为:

θd=Dirichlet(α⃗ )θd=Dirichlet(α→)

    其中,αα为分布的超参数,是一个KK维向量。

    LDA假设主题中词的先验分布是Dirichlet分布,即对于任一主题kk, 其词分布βkβk为:

βk=Dirichlet(η⃗ )βk=Dirichlet(η→)

    其中,ηη为分布的超参数,是一个VV维向量。VV代表词汇表里所有词的个数。

    对于数据中任一一篇文档dd中的第nn个词,我们可以从主题分布θdθd中得到它的主题编号zdnzdn的分布为:

zdn=multi(θd)zdn=multi(θd)

    而对于该主题编号,得到我们看到的词wdnwdn的概率分布为: 

wdn=multi(βzdn)wdn=multi(βzdn)

    理解LDA主题模型的主要任务就是理解上面的这个模型。这个模型里,我们有MM个文档主题的Dirichlet分布,而对应的数据有MM个主题编号的多项分布,这样(αθdz⃗ dα→θd→z→d)就组成了Dirichlet-multi共轭,可以使用前面提到的贝叶斯推断的方法得到基于Dirichlet分布的文档主题后验分布。

    如果在第d个文档中,第k个主题的词的个数为:n(k)dnd(k), 则对应的多项分布的计数可以表示为

n⃗ d=(n(1)d,n(2)d,...n(K)d)n→d=(nd(1),nd(2),...nd(K))

    利用Dirichlet-multi共轭,得到θdθd的后验分布为:

Dirichlet(θd|α⃗ +n⃗ d)Dirichlet(θd|α→+n→d)

    同样的道理,对于主题与词的分布,我们有KK个主题与词的Dirichlet分布,而对应的数据有KK个主题编号的多项分布,这样(ηβkw⃗ (k)η→βk→w→(k))就组成了Dirichlet-multi共轭,可以使用前面提到的贝叶斯推断的方法得到基于Dirichlet分布的主题词的后验分布。

    如果在第k个主题中,第v个词的个数为:n(v)knk(v), 则对应的多项分布的计数可以表示为

n⃗ k=(n(1)k,n(2)k,...n(V)k)n→k=(nk(1),nk(2),...nk(V))

    利用Dirichlet-multi共轭,得到βkβk的后验分布为:

Dirichlet(βk|η⃗ +n⃗ k)Dirichlet(βk|η→+n→k)

    由于主题产生词不依赖具体某一个文档,因此文档主题分布和主题词分布是独立的。理解了上面这M+KM+K组Dirichlet-multi共轭,就理解了LDA的基本原理了。

    现在的问题是,基于这个LDA模型如何求解我们想要的每一篇文档的主题分布和每一个主题中词的分布呢?

    一般有两种方法,第一种是基于Gibbs采样算法求解,第二种是基于变分推断EM算法求解。

    如果你只是想理解基本的LDA模型,到这里就可以了,如果想理解LDA模型的求解,可以继续关注系列里的另外两篇文章。

 

猜你喜欢

转载自www.cnblogs.com/yuluoxingkong/p/8982008.html