LDA(Latent Dirichlet Allocation)中文翻译为:潜在狄利克雷分布。LDA主题模型是一种文档生成模型,是一种非监督机器学习技术。它认为一篇文档是有多个主题的,而每个主题又对应着不同的词。一篇文档的构造过程,首先是以一定的概率选择某个主题,然后再在这个主题下以一定的概率选出某一个词,这样就生成了这篇文档的第一个词。不断重复这个过程,就生成了整篇文章(当然这里假定词与词之间是没有顺序的,即所有词无序的堆放在一个大袋子中,称之为词袋,这种方式可以使算法相对简化一些)。
LDA的使用是上述文档生成过程的逆过程,即根据一篇得到的文档,去寻找出这篇文档的主题,以及这些主题所对应的词。
白话解释:比如document1的内容为:[自从乔布斯去世之后,iPhone再难以产生革命性的创新了]
通过上述的方法,document1将对应两个主题topic1,topic2,进而,主题topic1会对应一些词:[苹果创始人][苹果手机],主题topic2会对应一些词:[重大革新][技术突破]。于是LDA模型的好处显而易见,就是可以挖掘文档中的潜在词或者找到两篇没有相同词的文档之间的联系。
(超详细,超通俗易懂,逻辑脉络超清晰)
我们以文档集合D中的文档d为例,文档d中包含单词序列
文档集合D中出现的全部词组成VocabularyVocabulary;
首先将文档d作为算法的输入,并输入主题数K,此时d对应到各个主题的概率为θd=(pt1,pt2,...ptk)θd=(pt1,pt2,...ptk),ptipti为d对应第ii个主题的概率;
此时输入到算法中的只有文档d和主题数K,那么pt1,pt2...ptkpt1,pt2...ptk的数值从何而来?
我们首先人为设置文档d中对应主题t1,t2,...tkt1,t2,...tk的词的个数,比如文档d中5个词对应主题t1t1,7个词对应主题t2t2,…,4个词对应主题tktk,那么此时,我们就人为确定了一个参数向量(5,7,…4),将这个向量记作α⃗ α→,这个我们人为设置的参数向量称为超参数。
那么如何将超参数α⃗ α→转化为概率分布θd=(pt1,pt2,...ptk)θd=(pt1,pt2,...ptk)呢?
这里我们引入狄利克雷分布函数:
Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)pα1−11pα2−22pα3−33Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)p1α1−1p2α2−2p3α3−3
它所表达的含义简单来说就是,已知α1,α2,α3α1,α2,α3的条件下,概率p1,p2,p3p1,p2,p3的概率分布,也就是概率的概率,分布的分布。再直观点说就是:比如在已知α1,α2,α3α1,α2,α3为(5,7,4)(5,7,4)的条件下,样本点p1,p2,p3p1,p2,p3为(0.4,0.5,0.1)(0.4,0.5,0.1)的概率是多少。
那么我们将上述的三维DirichletDirichlet函数扩展为KK维,即在已知α⃗ α→的条件下,得到p⃗ p→的分布(α⃗ ,p⃗ α→,p→分别为K维向量)。KK维DirichletDirichlet公式如下:
Dirichlet(p⃗ |α⃗ )=Γ(∑Kk=1αk)∏Kk=1Γ(αk)∏k=1Kpαk−1kDirichlet(p→|α→)=Γ(∑k=1Kαk)∏k=1KΓ(αk)∏k=1Kpkαk−1
至此,我们通过输入超参数α⃗ α→得到了文档d的关于K个主题的狄利克雷分布:
θd=Dirichlet(α⃗ )θd=Dirichlet(α→)
其含义显然,DirichletDirichlet的输入参数为α⃗ α→,得到的输出为可以理解为一个矩阵:
(pt1,pt2,...ptk)(pt1,pt2,...ptk)
............
............
(pt1,pt2,....ptk)(pt1,pt2,....ptk)
即文档d对应各个主题tktk的概率分布的分布。
同理,我们可以将任一主题tktk产生各个词的概率表示出来。人为设置主题tktk产生的各个词的数量,即设置超参数,用向量η⃗ η→来表示。同上所述,将η⃗ η→作为DirichletDirichlet函数的输入参数,得到主题tktk产生各个词的狄利克雷分布:
βk=Dirichlet(η⃗ )βk=Dirichlet(η→)
此时我们已经得到了文档d对应各个主题的概率分布的分布(即狄利克雷分布)θdθd,以及文档tktk产生各个词的概率分布的分布βkβk,那么接下来,我们要从文档d中取出第i个词,求这个词对应各个主题的分布;
换句大家熟悉的话来说就是:已知第i个词wiwi在文档d中出现n次,且已知它对应各个主题的概率(这里每个词对应各个主题的概率就是文档d对应各个主题的概率,二者同分布),求该词被各个主题产生的次数;
这就等同于我们熟知的一共有n个球,且已知红球、黄球、绿球的概率分别为p1,p2,p3p1,p2,p3,求这n个求当中红球、黄球、绿球的个数。
那么如何通过文档d对应各个主题的分布θdθd得到文档中的每个词被各个主题产生的次数,进而重新得到文档d中对应各个主题的词的个数呢?
首先我们引入十分熟悉的多项式分布:
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
这个公式的意义总所周知:已知一共n个球,且知道每种颜色球的概率,就可以得到有m1m1个红球,m2m2个黄球,m3m3个绿球的概率。
那么同样将其扩展为K维,将θdθd作为参数,就可以得到文档d中第i个词wiwi对应的各个主题的多项式分布zdn=multi(θd)zdn=multi(θd)
于是,非常值得庆幸,我们通过文档d对应各个主题的概率θdθd,进而得知文档d中各个词对应各个主题的概率,且知道这个词在文档d中的出现次数,于是求得这个词被各个主题的产生次数,遍历文档d中的每一个词,就可以得到新的文档d中对应各个主题的词的个数。
白话举例:文档d对应主题t1,t2t1,t2的概率分别为pt1,pt2,pt1,pt2,,于是文档d中词w1w1对应的主题t1,t2,t1,t2,的概率也分别为pt1,pt2pt1,pt2,又得知词w1w1在文档d中出现了15次,于是得到词w1w1由主题t1,t2t1,t2产生的次数分别为10次、5次(这个是假设的);
对文档d中的每个词都执行此操作,(假设文档中只有两个词)词w2w2由主题t1,t2t1,t2产生的次数分别为13次、2次,于是就能重新得到文档d中对应各个主题的词的数量,即对应主题t1,t2t1,t2的词的数量分别为2个、0个(初始的d中对应各个主题的词的数量是人为设定的超参数α⃗ α→)。
于是,我们最终得到了文档d对应各个主题的词的个数的更新值:记作向量n⃗ n→,我们将更新后的向量n⃗ n→再次作为狄利克雷分布的输入向量,即Dirichlet(θd|n⃗ )Dirichlet(θd|n→),就会又会得到文档d对应各个主题的概率的更新值,即更新的θdθd,如此反复迭代,最终得到收敛的θdθd,即为我们要的结果。
有了以上的经验,主题tktk产生各个词的概率βkβk可以同样处理,对于产生文档d中的第ii个词wiwi的各个主题的分布为:
multi(βi)multi(βi),于是用同上面相同的方法,可以得到更新后的各个主题产生各个单词的数量:记作向量m⃗ m→,将向量m⃗ m→作为新的参数再次带入狄利克雷分布Dirichlet(βk|m⃗ )Dirichlet(βk|m→),就又会得到每个主题产生各个词的概率,即更新的βkβk,如此反复迭代,最终得到收敛的βkβk,即所求结果。
得到了收敛的θdθd和βkβk,算法就大功告成了,这时,该算法就会根据输入的文档d,找到潜在主题下的相关词啦!!!!
++++++++++++++++++++++++++++++++++++++++
个人整理,水平有限,可能存在很多错误,希望大家一起探讨研究,还有关于为什么选用狄利克雷分布以及狄利克雷分布和多项式分布之间的关系、先验概率后验概率等内容并没有仔细探讨,作者现在已经生不如死了,先休息休息,过几天再补充吧!!
++++++++++++++++++++++++++++++++++++++++
2017-11-29 发布
10.2k 次阅读 · 读完需要 64 分钟
3
【本文作者】达观数据 夏琦
【作者简介】夏琦,达观数据NLP组实习生,就读于东南大学和 Monash University,自然语言处理方向二年级研究生,师从知识图谱专家漆桂林教授。曾获第五届“蓝桥杯”江苏省一等奖、国家二等奖。
本篇博文将详细讲解LDA主题模型,从最底层数学推导的角度来详细讲解,只想了解LDA的读者,可以只看第一小节简介即可。PLSA和LDA非常相似,PLSA也是主题模型方面非常重要的一个模型,本篇也会有的放矢的讲解此模型。如果读者阅读起来比较吃力,可以定义一个菲波那切数列,第 f(n) = f(n-1) + f(n-2) 天再阅读一次,直到这个知识点收敛。如果读者发现文章中的错误或者有改进之处,欢迎交流。
在机器学习领域,LDA是两个常用模型的简称:Linear Discriminant Analysis 和 Latent Dirichlet Allocation。本文的LDA仅指代Latent Dirichlet Allocation. LDA 在主题模型中占有非常重要的地位,常用来文本分类。
LDA由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出,用来推测文档的主题分布。它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题分布后,便可以根据主题分布进行主题聚类或文本分类。
LDA 模型涉及很多数学知识,这也许是LDA晦涩难懂的主要原因。本小节主要介绍LDA中涉及的数学知识。数学功底比较好的同学可以直接跳过本小节。
LDA涉及到的先验知识有:二项分布、Gamma函数、Beta分布、多项分布、Dirichlet分布、马尔科夫链、MCMC、Gibs Sampling、EM算法等。限于篇幅,本文仅会有的放矢的介绍部分概念,不会每个概念都仔细介绍,亦不会涉及到每个概念的数学公式推导。如果每个概念都详细介绍,估计都可以写一本百页的书了。如果你对LDA的理解能达到如数家珍、信手拈来的程度,那么恭喜你已经掌握了从事机器学习方面的扎实数学基础。想进一步了解底层的数学公式推导过程,可以参考《数学全书》等资料。
LDA 采用词袋模型。所谓词袋模型,是将一篇文档,我们仅考虑一个词汇是否出现,而不考虑其出现的顺序。在词袋模型中,“我喜欢你”和“你喜欢我”是等价的。与词袋模型相反的一个模型是n-gram,n-gram考虑了词汇出现的先后顺序。有兴趣的读者可以参考其他书籍。
二项分布是N重伯努利分布,即为X ~ B(n, p). 概率密度公式为:
P(K=k)=(nk)pk(1−p)n−k
多项分布,是二项分布扩展到多维的情况. 多项分布是指单次试验中的随机变量的取值不再是0-1的,而是有多种离散值可能(1,2,3...,k).概率密度函数为:
P(x1,x2,...,xk;n,p1,p2,...,pk)=n!x1!...xk!p1x1...pkxk
Gamma函数的定义:
Γ(x)=∫∞0tx−1e−tdt
分部积分后,可以发现Gamma函数如有这样的性质:
Γ(x+1)=xΓ(x)
Gamma函数可以看成是阶乘在实数集上的延拓,具有如下性质:
Γ(n)=(n−1)!
Beta分布的定义:对于参数alpha > 0, beta > 0, 取值范围为[0, 1]的随机变量x的概率密度函数为:
f(x;α,β)=1B(α,β)xα−1(1−x)β−1
其中,
1B(α,β)=Γ(α+β)Γ(α)Γ(β)
在贝叶斯概率理论中,如果后验概率P(θ|x)和先验概率p(θ)满足同样的分布律,那么,先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布。
P(θ|x)=P(θ,x)P(x)
Beta分布是二项式分布的共轭先验分布,而狄利克雷(Dirichlet)分布是多项式分布的共轭分布。
共轭的意思是,以Beta分布和二项式分布为例,数据符合二项分布的时候,参数的先验分布和后验分布都能保持Beta分布的形式,这种形式不变的好处是,我们能够在先验分布中赋予参数很明确的物理意义,这个物理意义可以延续到后续分布中进行解释,同时从先验变换到后验过程中从数据中补充的知识也容易有物理解释。
Dirichlet的概率密度函数为:
f(x1,x2,...,xk;α1,α2,...,αk)=1B(α)∏i=1kxiαi−1
其中,
B(α)=∏ki=1Γ(αi)Γ(∑ki=1αi),∑i=1kxi=1
根据Beta分布、二项分布、Dirichlet分布、多项式分布的公式,我们可以验证上一小节中的结论 -- Beta分布是二项式分布的共轭先验分布,而狄利克雷(Dirichlet)分布是多项式分布的共轭分布。
如果 p Beta(t|α,β),则
E(p)=∫10t∗Beta(t|α,β)dt=∫10t∗Γ(α+β)Γ(α)Γ(β)t(α−1)(1−t)β−1dt=Γ(α+β)Γ(α)Γ(β)∫10tα(1−t)β−1dt
上式右边的积分对应到概率分布Beta(t|α+1,β), 对于这个分布,有
∫10Γ(α+β+1)Γ(α+1)Γ(β)tα(1−t)β−1dt=1
把上式带入E(p)的计算式,得到
E(p)=Γ(α+β)Γ(α)Γ(β)⋅Γ(α+1)Γ(β)Γ(α+β+1)=Γ(α+β)Γ(α+β+1)⋅Γ(α+1)Γ(α)=αα+β
这说明,对于对于Beta分布的随机变量,其均值可以用αα+β来估计。Dirichlet分布也有类似的结论,如果p⃗ ∼Dir(t⃗ |α⃗ ), 同样可以证明:
E(p)=(α1∑Ki=1αi,α1∑Ki=2αi,⋯,αK∑Ki=1αi)
这两个结论非常重要,后面的LDA数学推导过程会使用这个结论。
在现实应用中,我们很多时候很难精确求出精确的概率分布,常常采用近似推断方法。近似推断方法大致可分为两大类:第一类是采样(Sampling), 通过使用随机化方法完成近似;第二类是使用确定性近似完成近似推断,典型代表为变分推断(variational inference).
在很多任务中,我们关心某些概率分布并非因为对这些概率分布本身感兴趣,而是要基于他们计算某些期望,并且还可能进一步基于这些期望做出决策。采样法正式基于这个思路。具体来说,嘉定我们的目标是计算函数f(x)在概率密度函数p(x)下的期望
Ep[f]=∫f(x)p(x)dx
则可根据p(x)抽取一组样本x1,x2,⋯,xN,然后计算f(x)在这些样本上的均值
f^=1N∑i=1Nf(xi)
以此来近似目标期望E[f]。若样本x1,x2,⋯,xN独立,基于大数定律,这种通过大量采样的办法就能获得较高的近似精度。可是,问题的关键是如何采样?对概率图模型来说,就是如何高效地基于图模型所描述的概率分布来获取样本。概率图模型中最常用的采样技术是马尔可夫链脸蒙特卡罗(Markov chain Monte Carlo, MCMC). 给定连续变量x∈X的概率密度函数p(x), x在区间A中的概率可计算为
P(A)=∫Ap(x)dx
若有函数f:X↦R, 则可计算f(x)的期望
P(f)=Ep[f(X)]=∫xf(x)p(x)dx
若x不是单变量而是一个高维多元变量x, 且服从一个非常复杂的分布,则对上式求积分通常很困难。为此,MCMC先构造出服从p分布的独立同分布随机变量x1,x2,⋯,xN, 再得到上式的无偏估计
p~(f)=1N∑i=1Nf(xi)
然而,若概率密度函数p(x)很复杂,则构造服从p分布的独立同分布样本也很困难。MCMC方法的关键在于通过构造“平稳分布为p的马尔可夫链”来产生样本:若马尔科夫链运行时间足够长,即收敛到平稳状态,则此时产出的样本X近似服从分布p.如何判断马尔科夫链到达平稳状态呢?假定平稳马尔科夫链T的状态转移概率(即从状态X转移到状态x′的概率)为T(x′∣x), t时刻状态的分布为p(x^t), 则若在某个时刻马尔科夫链满足平稳条件
p(xt)T(xt−1∣xt)=p(xt−1)T(xt∣xt−1)
则p(x)是马尔科夫链的平稳分布,且马尔科夫链在满足该条件时已收敛到平稳条件。也就是说,MCMC方法先设法构造一条马尔科夫链,使其收敛至平稳分布恰为待估计参数的后验分布,然后通过这条马尔科夫链来产生符合后验分布的样本,并基于这些样本来进行估计。这里马尔科夫链转移概率的构造至关重要,不同的构造方法将产生不同的MCMC算法。
Metropolis-Hastings(简称MH)算法是MCMC的重要代表。它基于“拒绝采样”(reject sampling)来逼近平稳分布p。算法如下:
A(x∗∣xt−1)=min(1,p(x∗Q(xt−1∣x∗))p(xt−1)Q(x∗∣xt−1))
吉布斯采样(Gibbs sampling)有时被视为MH算法的特例,它也使用马尔科夫链读取样本,而该马尔科夫链的平稳分布也是采用采样的目标分布p(x).具体来说,假定x=x1,x2,⋯,xN, 目标分布为p(x), 在初始化x的取值后,通过循环执行以下步骤来完成采样:
一篇文档,可以看成是一组有序的词的序列d=(ω1,ω2,⋯,ωn). 从统计学角度来看,文档的生成可以看成是上帝抛掷骰子生成的结果,每一次抛掷骰子都生成一个词汇,抛掷N词生成一篇文档。在统计文本建模中,我们希望猜测出上帝是如何玩这个游戏的,这会涉及到两个最核心的问题:
第一个问题就是表示模型中都有哪些参数,骰子的每一个面的概率都对应于模型中的参数;第二个问题就表示游戏规则是什么,上帝可能有各种不同类型的骰子,上帝可以按照一定的规则抛掷这些骰子从而产生词序列。
在Unigram Model中,我们采用词袋模型,假设了文档之间相互独立,文档中的词汇之间相互独立。假设我们的词典中一共有 V 个词 ν1,ν2,⋯,νV,那么最简单的 Unigram Model 就是认为上帝是按照如下的游戏规则产生文本的。
对于一个骰子,记各个面的概率为p⃗ =(p1,p2,⋯,pV), 每生成一个词汇都可以看做一次多项式分布,记为ω∼Mult(ω∣p⃗ )。一篇文档d=ω⃗ =(ω1,ω2,⋯,ωn), 其生成概率是
p(ω⃗ )=p(ω1,ω2,⋯,ωn)=p(ω1)p(ω2)⋯p(ωn)
文档之间,我们认为是独立的,对于一个语料库,其概率为:W=(ω⃗ 1,ω⃗ 2,⋯,ω⃗ m)。
假设语料中总的词频是N,记每个词ωi的频率为ni, 那么n⃗ =(n1,n2,⋯,nV), n⃗ 服从多项式分布
p(n⃗ )=Mult(n⃗ ∣p⃗ ,N)=(Nn⃗ )∏k=1Vpnkk
整个语料库的概率为
p(W)=p(ω⃗ 1)p(ω⃗ 2)⋯p(ω⃗ m)=∏k=1Vpnkk
此时,我们需要估计模型中的参数p⃗ ,也就是词汇骰子中每个面的概率是多大,按照频率派的观点,使用极大似然估计最大化p(W), 于是参数pi的估计值为
p^i=niN
对于以上模型,贝叶斯统计学派的统计学家会有不同意见,他们会很挑剔的批评只假设上帝拥有唯一一个固定的骰子是不合理的。在贝叶斯学派看来,一切参数都是随机变量,以上模型中的骰子 p⃗ 不是唯一固定的,它也是一个随机变量。所以按照贝叶斯学派的观点,上帝是按照以下的过程在玩游戏的:
坛子中的骰子无限多,有些类型的骰子数量多,有些少。从概率分布角度看,坛子里面的骰子p⃗ 服从一个概率分布p(p⃗ ), 这个分布称为参数p⃗ 的先验分布。在此视角下,我们并不知道到底用了哪个骰子p⃗ ,每个骰子都可能被使用,其概率由先验分布p(p⃗ )来决定。对每个具体的骰子,由该骰子产生语料库的概率为p(W∣p⃗ ), 故产生语料库的概率就是对每一个骰子p⃗ 上产生语料库进行积分求和
p(W)=∫p(W∣p⃗ )p(p⃗ )dp⃗
先验概率有很多选择,但我们注意到p(n⃗ )=Mult(n⃗ ∣p⃗ ,N). 我们知道多项式分布和狄利克雷分布是共轭分布,因此一个比较好的选择是采用狄利克雷分布
Dir(p⃗ ∣α⃗ )=1Δ(α⃗ )∏k=1Vpαk−1k,α⃗ =(α1,⋯,αV)
此处,Δ(α⃗ )就是归一化因子Dir(α⃗ ), 即
Δ(α⃗ )=∫∏k=1Vpαk−1kdp⃗
由多项式分布和狄利克雷分布是共轭分布,可得:
p(p⃗ |W,α⃗ )=Dir(p⃗ ∣n⃗ +α⃗ )=1Δ(n⃗ +α⃗ )∏k=1Vpnk+αk−1kdp⃗
此时,我们如何估计参数p⃗ 呢?根据上式,我们已经知道了其后验分布,所以合理的方式是使用后验分布的极大值点,或者是参数在后验分布下的平均值。这里,我们取平均值作为参数的估计值。根据第二小节Dirichlet分布中的内容,可以得到:
E(p⃗ )=(n1+α1∑Vi=1(ni+αi),n2+α2∑Vi=1(ni+αi),⋯,nV+αV∑Vi=1(ni+αi))
对于每一个pi, 我们使用下面的式子进行估计
p^i=ni+αi∑Vi=1(ni+αi)
αi在 Dirichlet 分布中的物理意义是事件的先验的伪计数,上式表达的是:每个参数的估计值是其对应事件的先验的伪计数和数据中的计数的和在整体计数中的比例。由此,我们可以计算出产生语料库的概率为:
p(W∣α)=∫p(W∣α)p(p⃗ ∣α)dp⃗ =∫∏k=1VpnkkDir(p⃗ ∣α⃗ )dp⃗ =∫∏k=1Vpnkk1Δ(α⃗ )∏k=1Vpαk−1kdp⃗ =1Δ(α⃗ )∫∏k=1Vpnkk∏k=1Vpnk+αk−1kdp⃗ =Δ(n⃗ +α⃗ )Δ(α⃗ )
Unigram Model模型中,没有考虑主题词这个概念。我们人写文章时,写的文章都是关于某一个主题的,不是满天胡乱的写,比如一个财经记者写一篇报道,那么这篇文章大部分都是关于财经主题的,当然,也有很少一部分词汇会涉及到其他主题。所以,PLSA认为生成一篇文档的生成过程如下:
PLSA中,也是采用词袋模型,文档和文档之间是独立可交换的,同一个文档内的词也是独立可交换的。K 个topic-word 骰子,记为ϕ⃗ 1,⋯,ϕ⃗ K; 对于包含M篇文档的语料 C=(d1,d2,⋯,dM)中的每篇文档dm,都会有一个特定的doc-topic骰子θ⃗ m,所有对应的骰子记为 θ⃗ 1,⋯,θ⃗ M。为了方便,我们假设每个词ω都有一个编号,对应到topic-word 骰子的面。于是在 PLSA 这个模型中,第m篇文档 dm 中的每个词的生成概率为
p(ω∣dm)=∑z=1Kp(ω∣z)p(z∣dm)=∑z=1Kϕzωθωz
一篇文档的生成概率为:
p(ω⃗ ∣dm)=∏i=1n∑z=1Kp(ω∣z)p(z∣dm)=∏i=1n∑z=1Kϕzωθωz
由于文档之间相互独立,很容易写出整个语料的生成概率。求解PLSA 可以使用著名的 EM 算法进行求得局部最优解,有兴趣的同学参考 Hoffman 的原始论文,或者李航的《统计学习方法》,此处略去不讲。
首先,我们来看看PLSA和LDA生成文档的方式。在PLSA中,生成文档的方式如下:
LDA 中,生成文档的过程如下:
可以看出,LDA 在 PLSA 的基础上,为主题分布和词分布分别加了两个 Dirichlet 先验。
我们来看一个例子,如图所示:
上图中有三个主题,在PLSA中,我们会以固定的概率来抽取一个主题词,比如0.5的概率抽取教育这个主题词,然后根据抽取出来的主题词,找其对应的词分布,再根据词分布,抽取一个词汇。由此,可以看出PLSA中,主题分布和词分布都是唯一确定的。但是,在LDA中,主题分布和词分布是不确定的,LDA的作者们采用的是贝叶斯派的思想,认为它们应该服从一个分布,主题分布和词分布都是多项式分布,因为多项式分布和狄利克雷分布是共轭结构,在LDA中主题分布和词分布使用了Dirichlet分布作为它们的共轭先验分布。所以,也就有了一句广为流传的话 -- LDA 就是 PLSA 的贝叶斯化版本。下面两张图片很好的体现了两者的区别:
在PLSA和LDA的两篇论文中,使用了下面的图片来解释模型,它们也很好的对比了PLSA和LDA的不同之处。
现在我们来详细讲解论文中的LDA模型,即上图。
α⃗ →θ⃗ m→ζm,n, 这个过程表示在生成第m篇文档的时候,先从抽取了一个doc-topic骰子θ⃗ m, 然后投掷这个骰子生成了文档中第n个词的topic编号ζm,n;
β⃗ →ϕ⃗ k→ωm,n∣=ζm,n, 这个过程表示,从K个topic-word骰子ϕ⃗ k中,挑选编号为k=ζm,n的骰子进行投掷,然后生成词汇ωm,n;
在LDA中,也是采用词袋模型,M篇文档会对应M个独立Dirichlet-Multinomial共轭结构;K个topic会对应K个独立的Dirichlet-Multinomial共轭结构。
上面的LDA的处理过程是一篇文档一篇文档的过程来处理,并不是实际的处理过程。文档中每个词的生成都要抛两次骰子,第一次抛一个doc-topic骰子得到 topic, 第二次抛一个topic-word骰子得到 word,每次生成每篇文档中的一个词的时候这两次抛骰子的动作是紧邻轮换进行的。如果语料中一共有 N 个词,则上帝一共要抛 2N次骰子,轮换的抛doc-topic骰子和 topic-word骰子。但实际上有一些抛骰子的顺序是可以交换的,我们可以等价的调整2N次抛骰子的次序:前N次只抛doc-topic骰子得到语料中所有词的 topics,然后基于得到的每个词的 topic 编号,后N次只抛topic-word骰子生成 N 个word。此时,可以得到:
p(w⃗ ,z⃗ ∣α⃗ ,β⃗ )=p(w⃗ ∣z⃗ ,β⃗ )p(z⃗ ∣α⃗ )=∏k=1KΔ(ϕ⃗ K+β⃗ )Δ(β⃗ )∏m=1MΔ(θ⃗ m+α⃗ )α⃗
根据上一小节中的联合概率分布p(ω⃗ ,z⃗ ), 我们可以使用Gibbs Sampling对其进行采样。
语料库z⃗ 中的第i个词我们记为zi, 其中i=(m,n)是一个二维下标,对应于第m篇文档的第n个词,用¬i 表示去除下标为i的词。根据第二小节中的Gibbs Sampling 算法,我们需要求任一个坐标轴 i 对应的条件分布 p(zi=k|z⃗ ¬i,ω⃗ ) 。假设已经观测到的词 ωi=t, 则由贝叶斯法则,我们容易得到:
p(zi=k∣z⃗ ¬i,ω⃗ )∝p(zi=k,ωi=t∣z⃗ ¬i,ω⃗ ¬i)
由于zi=k,wi=t 只涉及到第 m 篇文档和第k个 topic,所以上式的条件概率计算中, 实际上也只会涉及到与之相关的两个Dirichlet-Multinomial 共轭结构,其它的 M+K−2 个 Dirichlet-Multinomial 共轭结构和zi=k,wi=t是独立的。去掉一个词汇,并不会改变M + K 个Dirichlet-Multinomial共轭结构,只是某些地方的计数减少而已。于是有:
p(θ⃗ m∣z⃗ ¬i,ω⃗ ¬i)p(φ⃗ k∣z⃗ ¬i,ω⃗ ¬i)=Dir(θ⃗ m∣n⃗ m,¬i+α⃗ )=Dir(φ⃗ k∣n⃗ k,¬i+β⃗ )
下面进行本篇文章最终的核心数学公式推导:
p(zi=k∣z⃗ ¬i,ω⃗ )∝p(zi=k,ωi=t∣z⃗ ¬i,ω⃗ ¬i)=∫p(zi=k,ωi=t,θ⃗ m,φ⃗ k∣z⃗ ¬i,ω⃗ ¬i)dθ⃗ mdφ⃗ k=∫p(zi=k,θ⃗ m,∣z⃗ ¬i,ω⃗ ¬i)⋅p(ωi=t,φ⃗ k,∣z⃗ ¬i,ω⃗ ¬i)dθ⃗ mdφ⃗ k=∫p(zi=k∣θ⃗ m)p(θ⃗ m∣z⃗ ¬i,ω⃗ ¬i)⋅p(ωi=t∣φ⃗ k)p(φ⃗ k∣z⃗ ¬i,ω⃗ ¬i)dθ⃗ mdφ⃗ k=∫p(zi=k∣θ⃗ m)Dir(θ⃗ m∣n⃗ m,¬i+α⃗ )dθ⃗ m⋅p(ωi=t∣φ⃗ k)Dir(φ⃗ k∣n⃗ k,¬i+β⃗ )dφ⃗ k=∫θmkDir(θ⃗ m∣n⃗ m,¬i+α⃗ )dθ⃗ m⋅∫φktDir(φ⃗ k∣n⃗ k,¬i+β⃗ )dφ⃗ k=E(θmk)⋅E(φkt)=θ^mk⋅φ^kt
最终得到的 θ^mk⋅φ^kt 就是对应的两个 Dirichlet 后验分布在贝叶斯框架下的参数估计。借助于前面介绍的Dirichlet 参数估计的公式 ,有:
θ^mkφ^kt=n(k)m,¬i+αk∑Kk=1(n(k)m,¬i+αk)=n(t)k,¬i+βt∑Vt=1(n(t)k,¬i+βt)
最终,我们得到LDA 模型的 Gibbs Sampling 公式为:
p(zi=k|z⃗ ¬i,w⃗ )∝n(k)m,¬i+αk∑Kk=1(n(k)m,¬i+αk)⋅n(t)k,¬i+βt∑Vt=1(n(t)k,¬i+βt)
根据上一小节中的公式,我们的目标有两个:
训练的过程:
根据这个topic-word频率矩阵,我们可以计算每一个p(word|topic)概率,从而算出模型参数φ⃗ 1,⋯,φ⃗ K, 这就是那 K 个 topic-word 骰子。而语料库中的文档对应的骰子参数 θ1,⋯,θM 在以上训练过程中也是可以计算出来的,只要在 Gibbs Sampling 收敛之后,统计每篇文档中的 topic 的频率分布,我们就可以计算每一个 p(topic|doc) 概率,于是就可以计算出每一个θm。由于参数θm 是和训练语料中的每篇文档相关的,对于我们理解新的文档并无用处,所以工程上最终存储 LDA 模型时候一般没有必要保留。通常,在 LDA 模型训练的过程中,我们是取 Gibbs Sampling 收敛之后的 n 个迭代的结果进行平均来做参数估计,这样模型质量更高。
有了 LDA 的模型,对于新来的文档 doc, 我们只要认为 Gibbs Sampling 公式中的 φ⃗ kt 部分是稳定不变的,是由训练语料得到的模型提供的,所以采样过程中我们只要估计该文档的 topic 分布θ就好了. 具体算法如下:
懂 LDA 的面试官通常会询问求职者,LDA 中主题数目如何确定?
在 LDA 中,主题的数目没有一个固定的最优解。模型训练时,需要事先设置主题数,训练人员需要根据训练出来的结果,手动调参,有优化主题数目,进而优化文本分类结果。
LDA 有非常广泛的应用,深层次的懂 LDA 对模型的调优,乃至提出新的模型 以及AI技能的进阶有巨大帮助。只是了解 LDA 能用来干什么,只能忽悠小白。