一、LDA主题模型简介
LDA(Latent Dirichlet Allocation)中文翻译为:潜在狄利克雷分布。LDA主题模型是一种文档生成模型,是一种非监督机器学习技术。它认为一篇文档是有多个主题的,而每个主题又对应着不同的词。一篇文档的构造过程,首先是以一定的概率选择某个主题,然后再在这个主题下以一定的概率选出某一个词,这样就生成了这篇文档的第一个词。不断重复这个过程,就生成了整篇文章(当然这里假定词与词之间是没有顺序的,即所有词无序的堆放在一个大袋子中,称之为词袋,这种方式可以使算法相对简化一些)。
LDA的使用是上述文档生成过程的逆过程,即根据一篇得到的文档,去寻找出这篇文档的主题,以及这些主题所对应的词。
白话解释:比如document1的内容为:[自从乔布斯去世之后,iPhone再难以产生革命性的创新了]
通过上述的方法,document1将对应两个主题topic1,topic2,进而,主题topic1会对应一些词:[苹果创始人][苹果手机],主题topic2会对应一些词:[重大革新][技术突破]。于是LDA模型的好处显而易见,就是可以挖掘文档中的潜在词或者找到两篇没有相同词的文档之间的联系。
二、算法流程
我们以文档集合D中的文档d为例,文档d中包含单词序列<w1,w2,⋅⋅⋅wn>< w_{1},w_{2},\cdot \cdot \cdot w_{n}><w1,w2,⋅⋅⋅wn>,wiw_{i}wi表示第iii个单词,设d中有nnn个单词;文档集合D中出现的全部词组成Vocabulary;
首先将文档d作为算法的输入,并输入主题数K,此时d对应到各个主题的概率为θd=(pt1,pt2,⋅⋅⋅ptk)θd=(p_{t1},p_{t2},\cdot \cdot \cdot p_{tk})θd=(pt1,pt2,⋅⋅⋅ptk),ptip_{ti}pti为d对应第iii个主题的概率;
此时输入到算法中的只有文档d和主题数K,那么pt1,pt2⋅⋅⋅ptkp_{t1},p_{t2}\cdot \cdot \cdot p_{tk}pt1,pt2⋅⋅⋅ptk的数值从何而来?
我们首先人为设置文档d中对应主题t1,t2,⋅⋅⋅tkt_{1},t_{2},\cdot\cdot\cdot t_{k}t1,t2,⋅⋅⋅tk的词的个数,比如文档d中5个词对应主题t1t_{1}t1,7个词对应主题t2t_{2}t2,…,4个词对应主题tkt_{k}tk,那么此时,我们就人为确定了一个参数向量(5,7,…4),将这个向量记作α⃗\vec{\alpha }α,这个我们人为设置的参数向量称为超参数。
那么如何将超参数α⃗\vec{\alpha }α转化为概率分布θd=(pt1,pt2,⋅⋅⋅ptk)θ_{d}=(p_{t1},p_{t2},\cdot \cdot \cdot p_{tk})θd=(pt1,pt2,⋅⋅⋅ptk)呢?
这里我们引入狄利克雷分布函数:
Dirichlet(p1,p2,p3∣α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)p1α1−1p2α2−2p3α3−3Dirichlet(p_{1},p_{2},p_{3}|\alpha_{1},\alpha_{2},\alpha_{3})=\frac{\Gamma (\alpha_{1}+\alpha_{2}+\alpha_{3})}{\Gamma (\alpha_{1}) \Gamma (\alpha_{2}) \Gamma (\alpha_{3})} p_{1}^{\alpha_{1}-1} p_{2}^{\alpha_{2}-2} p_{3}^{\alpha_{3}-3}Dirichlet(p1,p2,p3∣α1,α2,α3)=Γ(α1)Γ(α2)Γ(α3)Γ(α1+α2+α3)p1α1−1p2α2−2p3α3−3
它所表达的含义简单来说就是,已知α1,α2,α3\alpha_{1},\alpha_{2},\alpha_{3}α1,α2,α3的条件下,概率p1,p2,p3p_{1},p_{2},p_{3}p1,p2,p3的概率分布,也就是概率的概率,分布的分布。再直观点说就是:比如在已知α1,α2,α3\alpha_{1},\alpha_{2},\alpha_{3}α1,α2,α3为(5,7,4)的条件下,样本点p1,p2,p3p_{1},p_{2},p_{3}p1,p2,p3为(0.4,0.5,0.1)的概率是多少。
那么我们将上述的三维DirichletDirichletDirichlet函数扩展为K维,即在已知α⃗\vec{\alpha }α的条件下,得到p⃗\vec{p }p的分布(α⃗\vec{\alpha }α,p⃗\vec{p }p分别为K维向量)。K维DirichletDirichletDirichlet公式如下:
Dirichlet(p⃗∣α⃗)=Γ(∑k=1Kαk)∏k=1KΓ(αk)∏k=1Kpkαk−1Dirichlet(\vec{p}|\vec{\alpha})=\frac{\Gamma (\sum_{k=1}^{K} \alpha k )}{\prod _{k=1}^{K}\Gamma (\alpha k)}\prod_{k=1}^{K}p_{k}^{\alpha_{k}-1}Dirichlet(p∣α)=∏k=1KΓ(αk)Γ(∑k=1Kαk)∏k=1Kpkαk−1
至此,我们通过输入超参数α⃗ 得到了文档d的关于K个主题的狄利克雷分布:
θd=Dirichlet(α⃗)θ_{d}=Dirichlet(\vec{\alpha})θd=Dirichlet(α)
其含义显然,DirichletDirichletDirichlet的输入参数为α⃗\vec{\alpha}α,得到的输出为可以理解为一个矩阵:
(pt1,pt2,⋅⋅⋅ptk)(p_{t1},p_{t2},\cdot \cdot \cdot p_{tk})(pt1,pt2,⋅⋅⋅ptk)
⋅⋅⋅⋅⋅⋅\cdot \cdot \cdot\cdot \cdot \cdot⋅⋅⋅⋅⋅⋅
⋅⋅⋅⋅⋅⋅\cdot \cdot \cdot\cdot \cdot \cdot⋅⋅⋅⋅⋅⋅
(pt1,pt2,⋅⋅⋅ptk)(p_{t1},p_{t2},\cdot \cdot \cdot p_{tk})(pt1,pt2,⋅⋅⋅ptk)
即文档d对应各个主题tkt_{k}tk的概率分布的分布。
同理,我们可以将任一主题tkt_{k}tk产生各个词的概率表示出来。人为设置主题tkt_{k}tk产生的各个词的数量,即设置超参数,用向量η⃗\vec{\eta}η来表示。同上所述,将η⃗\vec{\eta}η作为DirichletDirichletDirichlet函数的输入参数,得到主题tkt_{k}tk产生各个词的狄利克雷分布:
βk=Dirichlet(η⃗)\beta_{k}=Dirichlet(\vec{\eta})βk=Dirichlet(η)
此时我们已经得到了文档d对应各个主题的概率分布的分布(即狄利克雷分布)θdθ_{d}θd,以及文档tkt_{k}tk产生各个词的概率分布的分布βk\beta_{k}βk,那么接下来,我们要从文档d中取出第iii个词,求这个词对应各个主题的分布;
换句大家熟悉的话来说就是:已知第iii个词wiw_{i}wi在文档d中出现nnn次,且已知它对应各个主题的概率(这里每个词对应各个主题的概率就是文档d对应各个主题的概率,二者同分布),求该词被各个主题产生的次数;
这就等同于我们熟知的一共有nnn个球,且已知红球、黄球、绿球的概率分别为p1,p2,p3p_{1},p_{2},p_{3}p1,p2,p3,求这nnn个求当中红球、黄球、绿球的个数。
那么如何通过文档d对应各个主题的分布θdθ_{d}θd得到文档中的每个词被各个主题产生的次数,进而重新得到文档d中对应各个主题的词的个数呢?
首先我们引入十分熟悉的多项式分布:
multi(m1,m2,m3∣n,p1,p2,p3)=n!m1!m2!m3!p1m1p2m2p3m3multi(m_{1},m_{2},m_{3}|n,p_{1},p_{2},p_{3})=\frac{n!}{m_{1}!m_{2}!m_{3}!}p_{1}^{m_{1}} p_{2}^{m_{2}} p_{3}^{m_{3}}multi(m1,m2,m3∣n,p1,p2,p3)=m1!m2!m3!n!p1m1p2m2p3m3
这个公式的意义总所周知:已知一共nnn个球,且知道每种颜色球的概率,就可以得到有m1m_{1}m1个红球,m2m_{2}m2个黄球,m3m_{3}m3个绿球的概率。
那么同样将其扩展为K维,将θdθ_{d}θd作为参数,就可以得到文档d中第iii个词wiw_{i}wi对应的各个主题的多项式分布zdn=multi(θd)z_{dn}=multi(θ_{d})zdn=multi(θd)
于是,非常值得庆幸,我们通过文档d对应各个主题的概率θdθ_{d}θd,进而得知文档d中各个词对应各个主题的概率,且知道这个词在文档d中的出现次数,于是求得这个词被各个主题的产生次数,遍历文档d中的每一个词,就可以得到新的文档d中对应各个主题的词的个数。
白话举例:文档d对应主题t1,t2t_{1},t_{2}t1,t2的概率分别为pt1,pt2p_{t1},p_{t2}pt1,pt2,于是文档d中词w1w_{1}w1对应的主题t1,t2t_{1},t_{2}t1,t2,的概率也分别为pt1,pt2p_{t1},p_{t2}pt1,pt2,又得知词w1w_{1}w1在文档d中出现了15次,于是得到词w1w_{1}w1由主题t1,t2t_{1},t_{2}t1,t2产生的次数分别为10次、5次(这个是假设的);
对文档d中的每个词都执行此操作,(假设文档中只有两个词)词w2w_{2}w2由主题t1,t2t_{1},t_{2}t1,t2产生的次数分别为13次、2次,于是就能重新得到文档d中对应各个主题的词的数量,即对应主题t1,t2t_{1},t_{2}t1,t2的词的数量分别为2个、0个(初始的d中对应各个主题的词的数量是人为设定的超参数α⃗\vec{\alpha}α)。
于是,我们最终得到了文档d对应各个主题的词的个数的更新值:记作向量n⃗\vec{n}n,我们将更新后的向量n⃗\vec{n}n再次作为狄利克雷分布的输入向量,即Dirichlet(θd∣n⃗)Dirichlet(θ_{d}|\vec{n})Dirichlet(θd∣n),就会又会得到文档d对应各个主题的概率的更新值,即更新的θdθ_{d}θd,如此反复迭代,最终得到收敛的θdθ_{d}θd,即为我们要的结果。
有了以上的经验,主题tkt_{k}tk产生各个词的概率βkβ_{k}βk可以同样处理,对于产生文档d中的第ii个词wiw_{i}wi的各个主题的分布为:
multi(βi)multi(β_{i})multi(βi),于是用同上面相同的方法,可以得到更新后的各个主题产生各个单词的数量:记作向量m⃗\vec{m}m,将向量m⃗\vec{m}m作为新的参数再次带入狄利克雷分布Dirichlet(βk∣m⃗)Dirichlet(β_{k}|\vec{m})Dirichlet(βk∣m),就又会得到每个主题产生各个词的概率,即更新的βkβ_{k}βk,如此反复迭代,最终得到收敛的βkβ_{k}βk,即所求结果。
得到了收敛的θdθ_{d}θd和βkβ_{k}βk,算法就大功告成了,这时,该算法就会根据输入的文档d,找到潜在主题下的相关词啦!!!!