LDA是主题模型(Topic Model)中较简单的一种,由David Blei在2003年提出[1]。作为一种生成模型(Generative Model),它将文档视为多个Topic的混合,每个Topic可由语料库中词的分布来表示。与另一种类似模型pLSA,最大的不同是LDA假设Topic的分布存在有一个Dirichlet先验分布。作者在论文中提出LDA也遵从Bag-of-Words的假设,但也是可能推广至n-grams。关于LDA更多的细节可以参见作者的原文[1].
在实现LDA模型时,通常选用的是Gibbs sampling和Variational inference。我们在使用时选择的是前者,因为其在理解和实现时花费的代价较低。现假定有一文档集合W,每个文档是T个主题的mixture,而每个主题则是大小为V的词汇表上的多项式分布。θd 表示文档d关于Topic的多项式分布,φw|t 表示词w在主题t里的概率,大小为V*T的矩阵Φ保存的是topic-word的概率,Dirichlet的先验分布的参数为α和β。
为了估计θd以及Φ,在collapsed Gibbs sampling中,为文档中的每个词采样得到主题z,需要计算如下概率:

为了从该分布中进行采样,首先从U(0, sum(p(z)))中随机采样得到u,则采样得到的t满足以下公式,但是过程中需要计算每个可能的t值:
将上式稍作处理,可得到:

则计算sum(p(z))时,可以将整个采样的概率空间分为三个部分:

根据全概率公式,将整个概率空间划分为三个部分,u ∼ U(0, s + r + q) :s只与topic有关系,r与doc-topic有关,只有q的值与word有关。在初始化过程完成后,可分别计算出当前s,r和q的值。如u < s,则从s对应的概率空间内采样,仅需改变对应t的值,遍历所有的t值,直至找到满足条件的t值;如s < u < s+r,则从r中采样,只需遍历nt|d>0的t值,而通常只占很小的一部分;如u > s+r,只需遍历nw|t>0的t值,同样也只占很小的一部分。改变w对应的z值时,更新s只需重新计算新老z值对应的n.|t分量;由于r只对应到文档,只需要缓存下每个doc的值,仅在新老z值上重新计算对应的分量值,在常数时间内可以完成;而更新q的值时相对复杂,可以将求和的分量分为两部分,nw|t对应每个word在主题t内的总数,而乘积的另一半与word无关,利用doc缓存下对应的值,只需在nw|t>0的对应t值上有一次乘法计算。
从以上过程可以看出,gibbs更新的时候,r和q仅在少量t值上有非零值,因此仅需保存非零值对应的分量,以上过程也称为SparseLDA[2]。它带来的好处有两点:一是训练样本的速度会变快;更大的好处是可以节约大量内存,这为训练大样本数据提供了可能性,从下图可以看出随着主题数增大的同时,内存占用和采样时间均无显著变化。

参考文献:
[1].Blei, David M.; Ng, Andrew Y.; Jordan, Michael I. Latent Dirichlet allocation. Journal of Machine Learning Research 3 (4–5): pp. 993–1022.
[2].Limin Yao, David Mimno, and Andrew McCallum. Efficient Methods for Topic Model Inference on Streaming Document Collections.KDD’09.
浙公网安备 33010602011771号