LDA(Latent Dirichlet Allocation)用到了很多数学知识,在这里只对重点的做介绍,其他的可以参见《LDA数学八卦》,文末将会给出下载地址。目前讲LDA很全面的文章且适合于初学者的教程还不是很多,我把我学习的过程中认为对我有帮助的文章都写在了REFERENCES中,如果你看我的文章有不明白的地方也可以阅读一下那些文章。

概要

LDA认为一篇文章由多个主题构成,一个主题又有多个词汇构成,因此写作的人手里有两个骰子,一个骰子是确定主题的,一个骰子是确定词汇的,当然这个和普通的骰子不大一样,这个骰子可能有1000个面,甚至每个面出现的概率都不相同,这样才能出现各式各样的文章。如果想了解LDA需要了解一下基础知识:

  • 贝叶斯框架
  • 二项分布
  • Beta分布
  • 多项式分布
  • Dirichlet分布
  • Gamma函数
  • 共轭先验
  • Gibbs采样

确实有点吓人,咱们一点点的来。

概率分布

对于贝叶斯框架推荐先看一下我之前的文章**[REFERENCES 5]**,看完了这篇文章我们大概了解了贝叶斯的思想其实就是×后验概率 \propto 似然估计 \times 先验概率,其中\propto是正比于,因为在原始公式中还有一个evidenceevidence,在这里我们直接忽略。

LDA可以理解为一个迭代的过程,因此需要将第ii轮的后验概率当做第i+1i+1轮的先验分布,所以就需要引入共轭先验概率,本质上它是一种先验概率,那几种分布的关系如下图所示。

二项分布

假设现在需要求你遇到的人是好人坏人的概率,二项分布就可以解决Binom(kn,p)=(nk)pk(1p)nkBinom(k|n,p) = {n \choose k}p^k(1-p)^{n-k},其中pp我们可以理解为好人的概率,kk为好人的个数,nn为好人坏人的总数,$ {n \choose k}\frac{n!}{k!(n-k)!}$,按照**[REFERENCES 5]**介绍的那样,遇到好人这个是果,概率是因。

Beta分布

在贝叶斯概率理论中,有这么一种定义,如果后验概率p(θx)p(\theta|x)和先验概率p(θ)p(\theta)满足同样的分布律,那么先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布。那么,我们就可以选择似然函数P(xθ)P(x|\theta)的共轭先验作为P(θ)P(\theta)的分布。

Beta分布的公式为Beta(pα,β)=Γ(α+β)Γ(α)Γ(β)pα1(1p)β1Beta(p|\alpha,\beta) = \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)}p^{\alpha-1}(1-p)^{{\beta-1}},其中Γ\Gamma是Gamma函数Γ(x)=(x1)!\Gamma(x) = (x-1)!,那么我们最终归一化的后验概率是P(pn,k,α,β)=Γ(α+β+n)Γ(α+k)Γ(β+nk)pk+α1(1p)nk+β1P(p|n,k,\alpha,\beta) = \frac{\Gamma(\alpha + \beta + n)}{\Gamma(\alpha + k)\Gamma(\beta + n - k)}p^{k+\alpha-1}(1-p)^{n-k + \beta -1},更相信的推导步骤请参见**[REFERENCES 1]**,在这里只是想说明最终计算出的后验概率又是之前的先验概率的样子。

多项式分布

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

这就是三项式分布,那我们假设有m1m_1个好人,m2m_2个坏人,m3m_3个不好不坏的人,n=m1+m2+m3n = m_1 + m_2 + m_3,对应的概率为p1,p2,p3p_1, p_2, p_3,其中p1+p2+p3=1p_1 + p_2 + p_3 = 1,则对应的多项式分布为multi(m1,m2,m3n,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}

Dirichlet分布

在上个例子中,Dirichlet分布的公式为Dirichlet(p1,p2,p3α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)p1α11(p2)α21(p3)α31Dirichlet(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-1}(p_3)^{\alpha_3-1},在这里αn\alpha_n是一个超参数(玄学),但是我们目前可以先不管他,这里我们也很容易在写出第四种、第五种等等,当数量特别多的时候我们就可以使用一个向量代替,所以最终我们的多项式分布表现方式就是multi(mn,p)multi(\vec m| n, \vec p),Dirichlet分布表现方式为Dirichlet(pα)Dirichlet(\vec p| \vec \alpha)

至此分布基本上就讲完了,如果想详细了解的话请参见[REFERENCES 1][REFERENCES 4]

LDA主题模型

在开始之前先来介绍一下在LDA中使用的一些符号:

  • VV: 字典中全部词汇的个数
  • KK: 主题的数量
  • MM: 文章的数量
  • θm\vec{\theta_m}是第mm个文档的主题的先验分布θm=Dirichlet(α)\theta_m = Dirichlet(\vec \alpha),其中α\alpha为超参数,是一个KK维向量
  • ϕk\vec{\phi_k}是第kk个主题的单词的先验分布ϕk=Dirichlet(β)\phi_k= Dirichlet(\vec \beta),其中η\vec \eta为超参数,是一个VV维向量
  • zmnz_{mn}是主题编号,是指第mm篇文档的第nn个词的主题,符合多项式分布zdn=multi(θm)z_{dn} = multi(\theta_m)
  • wmnw_{mn}是单词编号,是指第mm篇文档的第nn个词的单词,符合多项式分布wmn=multi(ϕzmn)w_{mn} = multi(\phi_{z_{mn}})

LDA最终的目的是求出主题分布和词分布[REFERENCES 8],也就是估计出来参数,下面我们将向这一目的进发:

PLSA模型

[REFERENCES 8]LDA模型可以认为是PLSA模型的加强版,PLSA模型用到的是极大似然估计,其核心思想就是让模型尽最大可能的拟合试验后出现的结果(样本),比如抛10次硬币发现7次正面,极大似然估计就认为正面概率为70%,你别跟我说什么你觉得应该是50%(这其实就是你的先验概率),极大似然估计是不信这一套的,所以才会有贝叶斯派(加入了先验概率作为惩罚项**[REFERENCES 5]**)。

生成文档

在下方PLSA模型与LDA模型对比中详细介绍

反推文档主题分布

人类根据文档生成模型写成了各类文章,然后丢给了计算机,相当于计算机看到的是一篇篇已经写好的文章。现在计算机需要根据一篇篇文章中看到的一系列词归纳出当篇文章的主题,进而得出各个主题各自不同的出现概率:主题分布。即文档dd和单词ww是可被观察到的,但主题zz却是隐藏的。

了解到这个我们就可以开始用这个描绘一下了(括号标注的是本文的符号),目前我们能观察到的是文章以及文章中的单词,**因此我们可以获得第mm篇文档中第jj个词出现的概率$p(w_j|d_m) = \sum^{K}{k=1} p(w_j|z_k)p(z_k|d_m) **,其中z{k}是第k主题,因为是无监督式学习所以主题我们无法观测,w_j$是指单词,最终我们要求的参数是:

  • ϕjk\phi_{jk}表示第kk个主题中单词wjw_j出现的概率,对应p(zkdi)p(z_k|d_i)
  • θmk\theta_{mk}表示第mm篇文章中第kk个主题出现的概率,对应p(wjzk)p(w_{j}|z_{k})

进而可以获得文档中每个词的生成概率p(dm,wj)=p(dm)p(wjdm)=p(dm)k=1Kp(wjzk)p(zkdm)p(d_m, w_j) = p(d_m)p(w_j|d_m) = p(d_m)\sum^{K}_{k=1} p(w_j|z_k)p(z_k|d_m),其中p(dm)p(d_m)我们可以事先求出,而我们要调整p(wjzk)p(w_j|z_k)p(zkdm)p(z_k|d_m)使得p(dm,wj)p(d_m, w_j)最大。

LDA模型

贝叶斯派主要是认为如果只做了少量试验来估计参数的话很有可能因为样本太少造成估计不准确的问题,因此在上面那个抛硬币的例子中才认为正面朝上的概率为70%,任何一个有经验的人都会认为它有错误,这是我们脑海中的先验分布(以前的经验)给我们提供了这种感觉。因此我们说PLSA在试验太少的情况下是有缺陷的,那么我们就动手改造一下。

上面这张图是截自**[REFERENCES 4]**,它描述了LDA模型的框架。在贝叶斯的加持下,这个绿色骰子(文档-主题)分布由p(θ)p(\theta)变为了p(θx)p(\theta|x),词分布也是如此,因为主题和词都是符合多项分布的,那么他们的参数也是符合多项分布的。

PLSA模型与LDA模型对比

说白了PLSA和LDA目的是一致的,但是派别不同自然完成目的的方式以及结果不同,下面就来详细的做一下对比,之所以使用对比是以为PLSA模型更容易理解,在理解PLSA之后我们就很容易继续理解LDA了**[REFERENCES 3]**。

PLSA模型:

  1. 按照概率p(di)p(d_i)随机选择一篇文档did_i
  2. 选择文档did_i后,确定文档主题分布
  3. 从主题分布中按照概率p(zkdi)p(z_k|d_i)选择一个隐含的主题类别zkz_k
  4. 选定zkz_k后吗,确定该主题下的词分布
  5. 从词分布按照概率p(wjzk)p(w_j|z_k)选定一个词wjw_j

LDA模型:

  1. p(di)p(d_i)随机选择一篇文档did_i
  2. 从狄利克雷分布(即Dirichlet分布)α\vec \alpha中取样生成文档did_i的主题分布θi\vec \theta_i,换言之,主题分布θi\vec \theta_i由超参数为α\vec \alpha的Dirichlet分布生成
  3. 从主题的多项式分布θi\theta_i取样第jj的主题zijz_{ij}
  4. 从狄利克雷分布(即Dirichlet分布)β\vec \beta中取样生成主题zijz_{ij}的主题分布ϕzij\vec \phi_{z_{ij}},换言之,主题分布由超参ϕzij\vec \phi_{z_{ij}}数为β\vec \beta的Dirichlet分布生成
  5. 从词语的多项式分布ϕzij\vec \phi_{z_{ij}}中最终生成词语wijw_{ij}

从步骤上来说PLSA和LDA都是5步,每一步的结果都是差不多的:选文章 > 确定主题分布 > 抽主题 > 确定词分布 > 抽单词,但是不同之处在于步骤2和步骤4,为主题分布和词分布分别加了两个Dirichlet先验。

在PLSA中,选主题和选词都是两个随机的过程(如上图所示),先从主题分布{教育:0.5,经济:0.3,交通:0.2}中抽取出主题:教育,然后从该主题对应的词分布{大学:0.5,老师:0.3,课程:0.2}中抽取出词:大学。

但是贝叶斯学派的人不这么认为,这个概率太绝对了,应该加入一点惩罚项(先验概率),结合进LDA中,就是这个概率需要通过那两个超参数α\vec \alphaβ\vec \beta获取,在这两个超参数被输出之前谁都不知道主题分布和词分布的概率是多少。

这也是频率派(PLSA)和贝叶斯派(LDA)最本质的不同之处。好比我去一个朋友家

  • 按照频率派的思想,我估计他在家的概率是12\frac{1}{2},不在家的概率也是12\frac{1}{2},这个数据是通过我几次观测而来的,这是一个定值

  • 而按照贝叶斯派的思想,他在家不在家的概率不再认为是个定值12\frac{1}{2},而是随机变量。比如按照我们的经验(比如当天周末),猜测他在家的概率是0.6,但这个0.6不是说就是完全确定的,也有可能是0.7。如此,贝叶斯派没法确切给出参数的确定值(0.3,0.4,0.6,0.7,0.8,0.9都有可能),但至少明白在哪个范围或哪些取值(0.6,0.7,0.8,0.9)更有可能,哪个范围或哪些取值(0.3,0.4) 不太可能。进一步,贝叶斯估计中,参数的多个估计值服从一定的先验分布,而后根据实践获得的数据(例如周末不断跑他家),不断修正之前的参数估计,从先验分布慢慢过渡到后验分布。

反推文档主题分布

而在LDA中,估计θ,ϕ\theta, \phi这两未知参数可以用变分(Variational inference)-EM算法,也可以用gibbs采样,前者的思想是最大后验估计MAP(MAP与MLE类似,都把未知参数当作固定的值),后者的思想是贝叶斯估计。

贝叶斯参数估计的过程:先验分布+数据的知识= 后验分布,对应的公式为Dirichlet(pα)+MultCount(m)=Dirichlet(pα+m)Dirichlet(\vec{p}|\vec{\alpha} )+MultCount(\vec{m})=Dirichlet(\vec{p}|\vec{\alpha} + \vec{m} ),其中MultCountMultCount是对应我们观测到的样本数据,对应到LDA中,文章-主题分布的MultCountMultCount每个主题的词的总数,主题-词对应的是词分布里每个单词的计数。这个按照之前好人坏人理解,就是我先验概率假设好人坏人各一半(各100人),那么当我碰到了3个好人,2个坏人后,我的样本就成了好人103个,坏人102个。

与PLSA相似,LDA的第mm篇文档中词出现的概率公式为:

p(zm,wm,θm,ϕα,β)=nNmp(wm,nϕzm,n)p(zm,nθm)p(θmα)p(ϕβ)p(\vec{z_m},\vec{w_m},\vec{\theta_m},\phi|\vec{\alpha},\vec{\beta})=\prod_n^{N_m}p(w_{m,n}|\vec{\phi_{z_{m,n}}})p(z_{m,n}|\vec{\theta_m})p(\vec{\theta_m}|\vec{\alpha})p(\phi|\vec{\beta})

其中NmN_m是第mm篇文章中总词数,α\alpha产生主题分布θ\theta,主题分布θ\theta确定具体主题,β\beta产生词分布,词分布ϕ\phi确定具体词。

上述公式还可以转化为:

p(w,zα,β)=p(wz,β)p(zα)p(\vec w, \vec z | \vec \alpha, \vec \beta) = p(\vec w | \vec z, \vec \beta)p(\vec z | \vec \alpha)

其中p(wz,β)p(\vec w | \vec z, \vec \beta)表示确定了主题z\vec z和先验分布参数β\vec \beta才样词的过程,p(zα)p(\vec z | \vec \alpha)是指根据先验分布参数α\vec \alpha采样主题的过程,这两个过程相互独立所以可以分解来看。

[此部分涉及公式太多且暂时没有用到,所以暂时不更新,有兴趣的可以参见REFERENCES 3]

REFERENCES

  1. 文本主题模型之LDA(一) LDA基础
  2. LDA主题模型学习心得
  3. 通俗理解LDA主题模型
  4. LDA数学八卦
  5. 什么是先验/后验分布和似然估计
  6. LDA(Latent Dirichlet Allocation)主题模型
  7. 概率分布之二项分布与多项分布
  8. 简述LDA主题模型
  9. 极大似然估计与贝叶斯估计