LDA(Latent Dirichlet allocation)是一种主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出,也即根据给定的一篇文档,推测其主题分布。同时它是一种无监督学习算法,在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量k即可。此外LDA的另一个优点则是,对于每一个主题均可找出一些词语来描述它。本文主要介绍LDA涉及的数学知识以及Spark MLlib中基于Graphx的实现方式。
1.理论基础
这部分内容主要参考《LDA数学八卦》和《通俗理解LDA主题模型》,涉及到数学内容真是挺多的,网上大多数博文的阐述过程大多一上来就摆出一大堆理论基础,自己学习的过程中也会觉得一开始就很吃力,而且不能把众多理论和最终的模型联系起来,所以一直想找到一种易于理解的方式来阐述该模型。
1.1 LDA引入— Dirichlet先验分布
在NLP领域,文本的表现形式通常是有序的词序列,即 d=(ω1,ω2,...,ωn) 。文本建模的实质就是为文本对应的词序列建模。《LDA数学八卦》中以上帝掷骰子的游戏形象的阐述了各种模型生成文本的过程,这里简单概括下各种模型的本质,并假设m篇文本的总词数为N,词典中单词总数为V:
1.1.1 主题无关模型
- Unigram Model:投掷一个V面的骰子,重复N次生成词序列,则这N个随机变量(即生成的N个单词)是独立同分布的,该分布的概率函数即为骰子每一面出现的概率为 p⃗ ={
p1,p2,...pV} 。则词典中每个单词出现次数(记为 n⃗ =n1,n2,...,nV )的联合分布满足Multinomial分布(多项分布),其概率密度函数为:
p(n⃗ )=Mult(n⃗ |p⃗ ,N)=(Nn⃗ )∏k=1Vpnkk=N!n1!n2!...nV!pn11pn22...pnVV(1.1)
- 贝叶斯Unigram Model:在Unigram Model的基础上为 p⃗ 加入了先验分布,即需要先以一定的概率选出骰子。这里的先验分布选择了Multinomial式分布的共轭先验分布Dirichlet分布,Dirichlet分布的一般表现形式如下:
Dir(p⃗ |α⃗ )=Γ(∑Kk=1αk)∏Kk=1Γ(αk)∏k=1Kpnkk(1.2)
其中 Γ(x)=∫∞0tx−1e−tdt=(n−1)! 为gamma函数。
共轭先验分布的本质为:Dirichlet先验+Multinomial分布—>后验分布也为Dirichlet分布 即:Dir(p⃗ |α⃗ )+Mult(m⃗ )=Dir(p⃗ |α⃗ +m⃗ )(1.3)
关于gamma函数的更多性质以及Dirichlet先验和Multinomial分布的共轭关系的证明待有空专门整理。
1.1.2 主题相关模型
文本的生成过程过程依然是生成单词序列的过程,只不过引入主题后,需要先确定主题,再根据主题生成单词的过程,这也更符合人类平常的语言习惯。
- PLSA模型:先投掷一个K面的doc-topic骰子,确定主题编号z,再从K个V面的topic-word骰子中选择编号为z的骰子投掷,得到一个单词,重复该过程生成文档。假设文档