背景
我们生活中总是产生大量的文本,分析这些观察到的语料库是如何生成的就需要对文本进行建模。常见的文本建模方法包括:Unigram、PLSA、LDA 、词向量模型(CBOW、Skip-gram)等。LDA模型是一种主题模型(topic model),属于词袋(不关心词与词之间的次序)模型。
模型描述
人类所产生的所有语料文本我们都可以看成是上帝抛骰子生成的。我们观察到的只是上帝玩这个游戏的结果——词序列构成的语料,而上帝玩这个游戏的过程对我们来说是个黑盒子。所以在统计文本建模中,我们希望猜测出上帝是如何玩这个游戏的。具体一点,最核心的问题是:
- 上帝都有什么样的骰子?
- 上帝是如何抛这些骰子的?
第一个问题就对应着模型包含哪些参数,第二个问题就对应着游戏的规则,上帝可以按照一定的规则抛骰子从而产生词序列。
LDA算法:

LDA过程图示:

LDA 概率图模型:

整个语料库共包含 M 篇 文档。其中第 m(m∈[1,M]) 篇文档中的第 n(n∈Nm) 个词记为 wm,n 。这个概率图模型可以分解成两个主要的过程:
-
α⃗ →θ⃗ m→zm,n,这个过程表示在生成第 m 篇文档的时候,先从第一个坛子中抽取一个 doc-topic 骰子 θ⃗ m ,然后抛这个骰子生成了第 m 篇文档中的第 n 个词的 topic 编号 zm,n;
-
β⃗ →φ⃗ k→wm,n|k=zm,n,目前上帝从第二个坛子中独立抽取了 K 个 top-word 骰子,这个过程表示采用如下过程生成语料中第 m 篇文档的第 n 个词。在上帝手中的 K 个topic-word 骰子 φ⃗ k(k∈[1,K]) 中,挑选编号为 k=zm,n (第1步得到的结果)的那个骰子进行投掷,然后生成 word wm,n 。
LDA 模型求解
LDA模型求解的目标主要包括以下两个方面
- 估计模型中的隐含变量 φ⃗ 1,…,φ⃗ K 和 θ⃗ 1,…,θ⃗ M;
- 对于新来的一篇文档 docnew,计算这篇文档的topic分布 θ⃗ new。
总体思路
隐含变量 Θ 和 Φ 后验概率分布难以精确求解,可以通过采样的方法来近似求解。从LDA概率图模型可以发现:
-
zm,n 服从 参数为 θ⃗ m 的 multinomial 分布,若能获得 zm,n 的观测值就很容易得到 θ⃗ m 的后验概率分布。
- 若 zm,n 可以被观测到,假定 zm,n=k ,则第 m 篇文档的第 n 个词 wm,n 服从参数为 φ⃗ k 的multinomial分布,就能很容易的估计 φ⃗ k 的后验概率分布。
但遗憾的是 z⃗ 也是隐含变量,不能被直接观测到。一种可行的方法是:我们首先计算 z⃗ 的后验概率分布 p(z⃗ |w⃗ ),然后对该后验概率分布进行采样。将得到的样本作为隐含变量 z⃗ 的观察值,这样就可以对 Θ 和 Φ 的后验概率分布进行估计。
计算 z⃗ 的后验概率分布 p(z⃗ |w⃗ )
(1) 这里首先介绍一个定理:
若随机变量 θ⃗ =(θ1,…,θK) 服从参数为 α⃗ =(α1,…,αK) 的Dirichlet分布。随机变量 x 服从参数为 θ⃗ 的 multinomial 分布(共 K 个类),重复进行 N 次试验,得到 x⃗ 。如下图所示:
α⃗ ⟶⏟Dirichletθ⃗ ⟶⏟Multinomialx⃗
n⃗ =(n1,…,nK) 表示
x⃗ 中各个类别出现的次数,即
n⃗ ∼Multi(θ⃗ ,N),有下式成立:
p(x⃗ |α⃗ )=Δ(α⃗ +n⃗ )Δ(α⃗ ) (∗)
证明如下:
p(x⃗ |α⃗ )=∫p(θ⃗ |α⃗ )⋅p(x⃗ |θ⃗ ) dθ⃗ =∫Dir(θ⃗ |α⃗ )⋅Multi(θ⃗ ,N) dθ⃗ =∫1Δ(α)∏k=1Kθαk−1k⋅∏k=1Kθnkk dθ⃗ =1Δ(α⃗ )∫∏k=1Kθαk+nk−1k dθ⃗ =Δ(α⃗ +n⃗ )Δ(α⃗ )
(2)在LDA概率图模型的第一个物理过程中,α⃗ →θ⃗ m→z⃗ m 表示生成第 m 篇文档中所有词对应的 topic。显然 α⃗ →θ⃗ m 对应于Dirichlet分布,θ⃗ m→z⃗ m 对应于 Multinomial 分布,所以整个过程是一个 Dirichlet-Multinomial 共轭结构。
α⃗ ⟶⏟Dirichletθ⃗ m⟶⏟Multinomialz⃗ m
根据定理
(∗) 有:
p(z⃗ m|α⃗ )=Δ(α⃗ +n⃗ m)Δ(α⃗ )
其中
n⃗ m=(n(1)m,…,n(K)m) 。
n(k)m 表示在第
m 篇文档中第
k 个topic 产生的词的个数。
由于语料中 M 篇文档的 topic 生成过程是相互独立的,所以我们得到 M 个相互独立的 Dirichlet-Multinomial 共轭结构。从而整个语料中 topic 生成的概率为:
p(z⃗ |α⃗ )=∏m=1Mp(z⃗ m|α⃗ )=∏m=1MΔ(α⃗ +n⃗ m)Δ(α⃗ )
(3)在LDA概率图模型的第二个物理过程中,β⃗ →φ⃗ k→w⃗ k 表示语料中由 topic k 生成词的过程。其中 w⃗ k 表示语料中由 topic k 生成的所有词。显然 β⃗ →φ⃗ k 对应于 Dirichlet 分布,而 φ⃗ k→w⃗ k 对应于 Multinomial 分布,所以整个过程是一个 Dirichlet-Multinomial 共轭结构。
β⃗ ⟶⏟Dirichletφ⃗ k⟶⏟Multinomialw⃗ k
根据定理
(∗) 有:
p(w⃗ k|z⃗ ,β⃗ )=Δ(β⃗ +n⃗ k)Δ(β⃗ )
其中
n⃗ k=(n(1)k,…,n(V)k) 。
V 表示词典中不重复的词的数目,
n(t)k 表示在语料中由第
k 个topic 产生的第
t 个词的数目。
因为语料中 K 个topic 生成词的过程是相互独立的,所以我们得到了 K 个相互独立的 Dirichlet-Multinomial 共轭结构,从而整个语料中词生成的概率为:
p(w⃗ |z⃗ ,β⃗ )=∏k=1Kp(w⃗ k|z⃗ ,β⃗ )=∏k=1KΔ(β⃗ +n⃗ k)Δ(β⃗ )
(4)综合步骤(2)和(3)可以得到联合分布函数:
p(z⃗ ,w⃗ |α⃗ ,β⃗ )=p(z⃗ |α⃗ )p(w⃗ |z⃗ ,β⃗ )=∏m=1MΔ(α⃗ +n⃗ m)Δ(α⃗ )∏k=1KΔ(β⃗ +n⃗ k)Δ(β⃗ )
这里向量
n⃗ m 和
n⃗ k 都用
n 表示,通过下标进行区分:
k 下标为 topic 编号,
m 下标为文档编号。
(5)下面采用Gibbs采样算法对 z⃗ 的后验概率分布 p(z⃗ |w⃗ |α⃗ ,β⃗ ) (不引起歧义的情况下,简记为 p(z⃗ |w⃗ )) 进行采样。Gibbs 采样算法关键在于条件概率分布的求解。
假定我们要求解第 m 篇文档中 第 n 个词 i=(m,n) 所对应主题 zi=k(k∈[1,K]) 的条件概率分布。假定 wi=t(t∈[1,V])。记 w⃗ ={wi=t,w⃗ ¬i} ,z⃗ ={zi=k,z⃗ ¬i},i=(m,n) 有下式成立:
p(zi=k|z⃗ ¬i,w⃗ )=p(w⃗ ,z⃗ )p(w⃗ ,z⃗ ¬i)=p(w⃗ |z⃗ )p(w⃗ ¬i|z⃗ ¬i)p(wi)⋅p(z⃗ )p(z⃗ ¬i)∝p(w⃗ |z⃗ )p(w⃗ ¬i|z⃗ ¬i)⋅p(z⃗ )p(z⃗ ¬i)=∏Kk=1Δ(β⃗ +n⃗ k)Δ(β⃗ )∏Kk=1Δ(β⃗ +n⃗ k,¬i)Δ(β⃗ )⋅∏Mm=1Δ(α⃗ +n⃗ m)Δ(α⃗ )∏Mm=1Δ(α⃗ +n⃗ m,¬i)Δ(α⃗ )=Δ(β⃗ +n⃗ k)Δ(β⃗ +n⃗ k,¬i)⋅Δ(α⃗ +n⃗ m)Δ(α⃗ +n⃗ m,¬i)=∏Vt=1Γ(βt+n(t)k)Γ(∑Vt=1(βt+n(t)k))∏Vt=1Γ(βt+n(t)k,¬i)Γ(∑Vt=1(βt+n(t)k,¬i))⋅∏Kk=1Γ(αk+n(k)m)Γ(∑Kk=1(αk+n(k)m))∏Kk=1Γ(αk+n(k)m,¬i)Γ(∑Kk=1(αk+n(k)m,¬i))=Γ(βt+n(t)k)Γ(∑Vt=1(βt+n(t)k,¬i))Γ(βt+n(t)k,¬i)Γ(∑Vt=1(βt+n(t)k))⋅Γ(αk+n(k)m)Γ(∑Kk=1(αk+n(k)m,¬i))Γ(αk+n(k)m,¬i)Γ(∑Kk=1(αk+n(k)m))=βt+n(t)k,¬i∑Vt=1(βt+n(t)k,¬i)⋅αk+n(k)m,¬i∑Kk=1(αk+n(k)m,¬i)
其中由倒数第二步推出倒数第一步使用了
Γ 函数的性质:
xΓ(x)=Γ(x+1)。
在不考虑位置 i=(m,n)位置的词时,根据Dirichlet参数的估计公式,αk+n(k)m,¬i∑Kk=1(αk+n(k)m,¬i) 刚好是对第 m 篇文档主题分布 θm 的第 k 个分量 θmk的估计。而 βt+n(t)k,¬i∑Vt=1(βt+n(t)k,¬i) 刚好是对第 k 个主题生成第 t 个词的概率 φkt 的估计。
θ̂ mk=αk+n(k)m,¬i∑Kk=1(αk+n(k)m,¬i)
φ̂ kt=βt+n(t)k,¬i∑Vt=1(βt+n(t)k,¬i)
我们最终得到了LDA模型Gibbs Sampling 公式:
p(zi=k|z⃗ ¬i,w⃗ )∝θ̂ mk⋅φ̂ kt
整个公式很漂亮就是 p(topic|doc)⋅p(word|topic) ,所以这个概率其实是 doc→topic→word 的路径概率,由于 topic 有 K 个,所以 Gibbs Sampling 公式的物理意义就是在这 K 条路径中进行采样。

有了Gibbs Sampling 采样公式,我们就可以基于语料训练LDA模型。LDA的训练过程如下所是:

(6)根据前面介绍的总体思路,当Gibbs采样过程收敛后就可以对参数 Θ 和 Φ 的后验概率分布进行估计。
θ̂ mk=n(k)m+αk∑Kk=1(n(k)m+αk) ∀m∈[1,M], ∀k∈[1,K]
φ̂ kt=n(t)k+βt∑Vt=1(n(t)k+βt) ∀k∈[1,K], ∀t∈[1,V]
(7)有了LDA模型,对于新来的文档 docnew ,我们如何做该文档的 topic 语义分布的计算呢?基本上inference和training 的过程完全类似。不同之处是:对于新的文档,我们只要认为 Gibbs Sampling 公式中 Φ 是已知的(由训练好的模型提供),所以采样过程我们只需要估计该文档的topic分布 θ⃗ new 就好了。过程如下所示:

参考文献
Gregor Heinrich, Parameter estimation for text analysis
靳志辉,LDA数学八卦,2013
邹博,主题模型LDA,2014