在第一篇文本主题模型LDA(一)之基础知识一文中已经详细讲解了LDA模型的基本原理过程,本小节将继续讲解LDA模型的基于Gibbs采样的参数求解过程,不了解Gibbs采样过程的可先阅读一下之前写的蒙特卡洛之Gibbs采样。
Gibbs采样算法求解LDA的思路
首先,回顾LDA的模型图如下
在Gibbs采样算法求解LDA的方法中,我们的
α
,
β
\alpha,\beta
α,β是已知的先验输入,我们的目标是得到各个
z
d
n
,
w
k
n
z_{dn},w_{kn}
zdn,wkn对应的整体
z
⃗
,
w
⃗
\vec{z},\vec{w}
z,w 的概率分布,即文档主题的分布和主题词的分布。由于我们是采用Gibbs采样法,则对于要求的目标分布,我们需要得到对应分布各个特征维度的条件概率分布。
具体到我们的问题,我们的所有文档联合起来形成的词向量 w ⃗ \vec{w} w 是已知的数据,不知道的是语料库主题 z ⃗ \vec{z} z 的分布。假如我们可以先求出 w , z w,z w,z的联合分布 p ( w ⃗ , z ⃗ ) p(\vec{w},\vec{z}) p(w,z),进而可以求出某一个词 w i w_i wi对应主题特征 z i z_i zi的条件概率分布 p ( z i = k ∣ w ⃗ , z ⃗ ¬ i ) p(z_i=k| \vec w,\vec z_{\neg i}) p(zi=k∣w,z¬i),其中, z ⃗ ¬ i \vec z_{\neg i} z¬i代表去掉下标为 i i i的词后的主题分布。有了条件概率分布 p ( z i = k ∣ w ⃗ , z ⃗ ¬ i ) p(z_i=k| \vec w,\vec z_{\neg i}) p(zi=k∣w,z¬i),我们就可以进行Gibbs采样,最终在Gibbs采样收敛后得到第i个词的主题。
如果我们通过采样得到了所有词的主题,那么通过统计所有词的主题计数,就可以得到各个主题的词分布。接着统计各个文档对应词的主题计数,就可以得到各个文档的主题分布。
以上就是Gibbs采样算法求解LDA的思路。
主题和词的联合分布与条件分布的求解
从上一节可以发现,要使用Gibbs采样求解LDA,关键是得到条件概率
p
(
z
i
=
k
∣
w
⃗
,
z
⃗
¬
i
)
p(z_i=k| \vec w,\vec z_{\neg i})
p(zi=k∣w,z¬i)的表达式。那么这一节我们的目标就是求出这个表达式供Gibbs采样使用。
首先我们简化下Dirichlet分布的表达式,其中
△
(
α
)
\triangle(\alpha)
△(α)是归一化参数:
D
i
r
i
c
h
l
e
t
(
p
⃗
∣
α
⃗
)
=
Γ
(
∑
k
=
1
K
α
k
)
∏
k
=
1
K
Γ
(
α
k
)
∏
k
=
1
K
p
k
α
k
−
1
=
1
△
(
α
⃗
)
∏
k
=
1
K
p
k
α
k
−
1
Dirichlet(\vec p| \vec \alpha) = \frac{\Gamma(\sum\limits_{k=1}^K\alpha_k)}{\prod_{k=1}^K\Gamma(\alpha_k)}\prod_{k=1}^Kp_k^{\alpha_k-1} = \frac{1}{\triangle( \vec \alpha)}\prod_{k=1}^Kp_k^{\alpha_k-1}
Dirichlet(p∣α)=∏k=1KΓ(αk)Γ(k=1∑Kαk)k=1∏Kpkαk−1=△(α)1k=1∏Kpkαk−1由于这是一个分布,所以概率积分结果为1:
∫
Γ
(
∑
k
=
1
K
α
k
)
∏
k
=
1
K
Γ
(
α
k
)
∏
k
=
1
K
p
k
α
k
−
1
d
p
=
1
\int\frac{\Gamma(\sum\limits_{k=1}^K\alpha_k)}{\prod_{k=1}^K\Gamma(\alpha_k)}\prod_{k=1}^Kp_k^{\alpha_k-1} dp=1
∫∏k=1KΓ(αk)Γ(k=1∑Kαk)k=1∏Kpkαk−1dp=1那么可以得到:
∫
∏
k
=
1
K
p
k
α
k
−
1
d
p
=
∏
k
=
1
K
Γ
(
α
k
)
Γ
(
∑
k
=
1
K
α
k
)
=
△
(
α
⃗
)
\int\prod_{k=1}^Kp_k^{\alpha_k-1} dp= \frac{\prod_{k=1}^K\Gamma(\alpha_k)}{\Gamma(\sum\limits_{k=1}^K\alpha_k)} = \triangle( \vec \alpha)
∫k=1∏Kpkαk−1dp=Γ(k=1∑Kαk)∏k=1KΓ(αk)=△(α)
现在我们先计算下第d个文档的主题的条件分布
p
(
z
⃗
d
∣
α
)
p(\vec z_d|\alpha)
p(zd∣α)。在上一篇中我们知道,
α
→
θ
d
→
z
⃗
d
\alpha \to \theta_d \to \vec z_d
α→θd→zd表示生成第d篇文档中所有词对应的topics,显然
α
→
θ
d
\alpha \to \theta_d
α→θd对应Dirichlet分布,
θ
d
→
z
⃗
d
\theta_d \to \vec z_d
θd→zd对应Multinormial分布,所有整体是一个Dirichlet-Multinormial共轭分布,利用这组共轭分布可以计算出
p
(
z
⃗
d
∣
α
⃗
)
p(\vec z_d| \vec \alpha)
p(zd∣α)如下:
p
(
z
⃗
d
∣
α
⃗
)
=
∫
p
(
z
⃗
d
∣
θ
⃗
d
)
p
(
θ
d
∣
α
⃗
)
d
θ
⃗
d
=
∫
∏
k
=
1
K
p
k
n
d
(
k
)
D
i
r
i
c
h
l
e
t
(
α
⃗
)
d
θ
⃗
d
=
∫
∏
k
=
1
K
p
k
n
d
(
k
)
1
△
(
α
⃗
)
∏
k
=
1
K
p
k
α
k
−
1
d
θ
⃗
d
=
1
△
(
α
⃗
)
∫
∏
k
=
1
K
p
k
n
d
(
k
)
+
α
k
−
1
d
θ
⃗
d
=
△
(
n
⃗
d
+
α
⃗
)
△
(
α
⃗
)
\begin{aligned} p(\vec z_d| \vec \alpha) & = \int p(\vec z_d | \vec \theta_d) p(\theta_d | \vec \alpha) d \vec \theta_d \\ & = \int \prod_{k=1}^Kp_k^{n_d^{(k)}} Dirichlet(\vec \alpha) d \vec \theta_d \\ & = \int \prod_{k=1}^Kp_k^{n_d^{(k)}} \frac{1}{\triangle( \vec \alpha)}\prod_{k=1}^Kp_k^{\alpha_k-1}d \vec \theta_d \\ & = \frac{1}{\triangle( \vec \alpha)} \int \prod_{k=1}^Kp_k^{n_d^{(k)} + \alpha_k-1}d \vec \theta_d \\ & = \frac{\triangle(\vec n_d + \vec \alpha)}{\triangle( \vec \alpha)} \end{aligned}
p(zd∣α)=∫p(zd∣θd)p(θd∣α)dθd=∫k=1∏Kpknd(k)Dirichlet(α)dθd=∫k=1∏Kpknd(k)△(α)1k=1∏Kpkαk−1dθd=△(α)1∫k=1∏Kpknd(k)+αk−1dθd=△(α)△(nd+α)其中,在第d个文档中,第k个主题的词的个数表示为:
n
d
(
k
)
n_d^{(k)}
nd(k), 对应的多项分布的计数可以表示为:
n
⃗
d
=
(
n
d
(
1
)
,
n
d
(
2
)
,
.
.
.
n
d
(
K
)
)
\vec n_d = (n_d^{(1)}, n_d^{(2)},...n_d^{(K)})
nd=(nd(1),nd(2),...nd(K))有了单一一个文档的主题条件分布,则可以得到所有文档的主题条件分布为:
p
(
z
⃗
∣
α
⃗
)
=
∏
d
=
1
M
p
(
z
⃗
d
∣
α
⃗
)
=
∏
d
=
1
M
△
(
n
⃗
d
+
α
⃗
)
△
(
α
⃗
)
p(\vec z|\vec \alpha) = \prod_{d=1}^Mp(\vec z_d|\vec \alpha) = \prod_{d=1}^M \frac{\triangle(\vec n_d + \vec \alpha)}{\triangle( \vec \alpha)}
p(z∣α)=d=1∏Mp(zd∣α)=d=1∏M△(α)△(nd+α)同样的方法,可以得到,第k个主题对应的词的条件分布
p
(
w
⃗
∣
z
⃗
,
η
⃗
)
p(\vec w|\vec z, \vec \eta)
p(w∣z,η)为:
p
(
w
⃗
∣
z
⃗
,
η
⃗
)
=
∏
k
=
1
K
p
(
w
⃗
k
∣
z
⃗
,
η
⃗
)
=
∏
k
=
1
K
△
(
n
⃗
k
+
η
⃗
)
△
(
η
⃗
)
p(\vec w|\vec z, \vec \eta) =\prod_{k=1}^Kp(\vec w_k|\vec z, \vec \eta) =\prod_{k=1}^K \frac{\triangle(\vec n_k + \vec \eta)}{\triangle( \vec \eta)}
p(w∣z,η)=k=1∏Kp(wk∣z,η)=k=1∏K△(η)△(nk+η)其中,第k个主题中,第v个词的个数表示为:
n
k
(
v
)
n_k^{(v)}
nk(v), 对应的多项分布的计数可以表示为:
n
⃗
k
=
(
n
k
(
1
)
,
n
k
(
2
)
,
.
.
.
n
k
(
V
)
)
\vec n_k = (n_k^{(1)}, n_k^{(2)},...n_k^{(V)})
nk=(nk(1),nk(2),...nk(V))最终我们得到主题和词的联合分布
p
(
w
⃗
,
z
⃗
∣
α
⃗
,
η
⃗
)
p(\vec w, \vec z| \vec \alpha, \vec \eta)
p(w,z∣α,η)如下:
p
(
w
⃗
,
z
⃗
)
∝
p
(
w
⃗
,
z
⃗
∣
α
⃗
,
η
⃗
)
=
p
(
z
⃗
∣
α
⃗
)
p
(
w
⃗
∣
z
⃗
,
η
⃗
)
=
∏
d
=
1
M
△
(
n
⃗
d
+
α
⃗
)
△
(
α
⃗
)
∏
k
=
1
K
△
(
n
⃗
k
+
η
⃗
)
△
(
η
⃗
)
p(\vec w, \vec z) \propto p(\vec w, \vec z| \vec \alpha, \vec \eta) = p(\vec z|\vec \alpha) p(\vec w|\vec z, \vec \eta) = \prod_{d=1}^M \frac{\triangle(\vec n_d + \vec \alpha)}{\triangle( \vec \alpha)}\prod_{k=1}^K \frac{\triangle(\vec n_k + \vec \eta)}{\triangle( \vec \eta)}
p(w,z)∝p(w,z∣α,η)=p(z∣α)p(w∣z,η)=d=1∏M△(α)△(nd+α)k=1∏K△(η)△(nk+η)有了联合分布,现在我们就可以求Gibbs采样需要的条件分布
p
(
z
i
=
k
∣
w
⃗
,
z
⃗
¬
i
)
p(z_i=k| \vec w,\vec z_{\neg i})
p(zi=k∣w,z¬i)了。需要注意的是这里的i是一个二维下标,对应第d篇文档的第n个词。
对于下标
i
i
i,由于它对应的词
w
i
w_i
wi是可以观察到的,因此我们有:
p
(
z
i
=
k
∣
w
⃗
,
z
⃗
¬
i
)
∝
p
(
z
i
=
k
,
w
i
=
t
∣
w
⃗
¬
i
,
z
⃗
¬
i
)
p(z_i=k| \vec w,\vec z_{\neg i}) \propto p(z_i=k, w_i =t| \vec w_{\neg i},\vec z_{\neg i})
p(zi=k∣w,z¬i)∝p(zi=k,wi=t∣w¬i,z¬i)对于
z
i
=
k
,
w
i
=
t
z_i=k,w_i=t
zi=k,wi=t,它只涉及到第d篇文档和第k个主题两个Dirichlet-multi共轭,即:
α
⃗
→
θ
⃗
d
→
z
⃗
d
\vec \alpha \to \vec \theta_d \to \vec z_d
α→θd→zd
η
⃗
→
β
⃗
k
→
w
⃗
(
k
)
\vec \eta \to \vec \beta_k \to \vec w_{(k)}
η→βk→w(k)其余的
M
+
K
−
2
M+K−2
M+K−2个Dirichlet-multi共轭和它们这两个共轭是独立的。如果我们在语料库中去掉
z
i
,
w
i
z_i,w_i
zi,wi,并不会改变之前的
M
+
K
M+K
M+K个Dirichlet-multi共轭结构,只是向量的某些位置的计数会减少,因此对于
θ
⃗
d
,
β
⃗
k
\vec \theta_d, \vec \beta_k
θd,βk对应的后验分布为:
p
(
θ
⃗
d
∣
w
⃗
¬
i
,
z
⃗
¬
i
)
=
D
i
r
i
c
h
l
e
t
(
θ
⃗
d
∣
n
⃗
d
,
¬
i
+
α
⃗
)
p(\vec \theta_d | \vec w_{\neg i},\vec z_{\neg i}) = Dirichlet(\vec \theta_d | \vec n_{d, \neg i} + \vec \alpha)
p(θd∣w¬i,z¬i)=Dirichlet(θd∣nd,¬i+α)
p
(
β
⃗
k
∣
w
⃗
¬
i
,
z
⃗
¬
i
)
=
D
i
r
i
c
h
l
e
t
(
β
⃗
k
∣
n
⃗
k
,
¬
i
+
η
⃗
)
p(\vec \beta_k | \vec w_{\neg i},\vec z_{\neg i}) = Dirichlet(\vec \beta_k | \vec n_{k, \neg i} + \vec \eta)
p(βk∣w¬i,z¬i)=Dirichlet(βk∣nk,¬i+η)现在开始计算Gibbs采样需要的条件概率:
p
(
z
i
=
k
∣
w
⃗
,
z
⃗
¬
i
)
∝
p
(
z
i
=
k
,
w
i
=
t
∣
w
⃗
¬
i
,
z
⃗
¬
i
)
=
∫
p
(
z
i
=
k
,
w
i
=
t
,
θ
⃗
d
,
β
⃗
k
∣
w
⃗
¬
i
,
z
⃗
¬
i
)
d
θ
⃗
d
d
β
⃗
k
=
∫
p
(
z
i
=
k
,
θ
⃗
d
∣
w
⃗
¬
i
,
z
⃗
¬
i
)
p
(
w
i
=
t
,
β
⃗
k
∣
w
⃗
¬
i
,
z
⃗
¬
i
)
d
θ
⃗
d
d
β
⃗
k
=
∫
p
(
z
i
=
k
∣
θ
⃗
d
)
p
(
θ
⃗
d
∣
w
⃗
¬
i
,
z
⃗
¬
i
)
p
(
w
i
=
t
∣
β
⃗
k
)
p
(
β
⃗
k
∣
w
⃗
¬
i
,
z
⃗
¬
i
)
d
θ
⃗
d
d
β
⃗
k
=
∫
p
(
z
i
=
k
∣
θ
⃗
d
)
D
i
r
i
c
h
l
e
t
(
θ
⃗
d
∣
n
⃗
d
,
¬
i
+
α
⃗
)
d
θ
⃗
d
∗
∫
p
(
w
i
=
t
∣
β
⃗
k
)
D
i
r
i
c
h
l
e
t
(
β
⃗
k
∣
n
⃗
k
,
¬
i
+
η
⃗
)
d
β
⃗
k
=
∫
θ
d
k
D
i
r
i
c
h
l
e
t
(
θ
⃗
d
∣
n
⃗
d
,
¬
i
+
α
⃗
)
d
θ
⃗
d
∫
β
k
t
D
i
r
i
c
h
l
e
t
(
β
⃗
k
∣
n
⃗
k
,
¬
i
+
η
⃗
)
d
β
⃗
k
=
E
D
i
r
i
c
h
l
e
t
(
θ
d
)
(
θ
d
k
)
E
D
i
r
i
c
h
l
e
t
(
β
k
)
(
β
k
t
)
\begin{aligned} p(z_i=k| \vec w,\vec z_{\neg i}) & \propto p(z_i=k, w_i =t| \vec w_{\neg i},\vec z_{\neg i}) \\ & = \int p(z_i=k, w_i =t, \vec \theta_d , \vec \beta_k| \vec w_{\neg i},\vec z_{\neg i}) d\vec \theta_d d\vec \beta_k \\ & = \int p(z_i=k, \vec \theta_d | \vec w_{\neg i},\vec z_{\neg i})p(w_i=t, \vec \beta_k | \vec w_{\neg i},\vec z_{\neg i}) d\vec \theta_d d\vec \beta_k \\ & = \int p(z_i=k|\vec \theta_d )p( \vec \theta_d | \vec w_{\neg i},\vec z_{\neg i})p(w_i=t|\vec \beta_k)p(\vec \beta_k | \vec w_{\neg i},\vec z_{\neg i}) d\vec \theta_d d\vec \beta_k \\ & = \int p(z_i=k|\vec \theta_d ) Dirichlet(\vec \theta_d | \vec n_{d, \neg i} + \vec \alpha) d\vec \theta_d \\ & * \int p(w_i=t|\vec \beta_k) Dirichlet(\vec \beta_k | \vec n_{k, \neg i} + \vec \eta) d\vec \beta_k \\ & = \int \theta_{dk} Dirichlet(\vec \theta_d | \vec n_{d, \neg i} + \vec \alpha) d\vec \theta_d \int \beta_{kt} Dirichlet(\vec \beta_k | \vec n_{k, \neg i} + \vec \eta) d\vec \beta_k \\ & = E_{Dirichlet(\theta_d)}(\theta_{dk})E_{Dirichlet(\beta_k)}(\beta_{kt})\end{aligned}
p(zi=k∣w,z¬i)∝p(zi=k,wi=t∣w¬i,z¬i)=∫p(zi=k,wi=t,θd,βk∣w¬i,z¬i)dθddβk=∫p(zi=k,θd∣w¬i,z¬i)p(wi=t,βk∣w¬i,z¬i)dθddβk=∫p(zi=k∣θd)p(θd∣w¬i,z¬i)p(wi=t∣βk)p(βk∣w¬i,z¬i)dθddβk=∫p(zi=k∣θd)Dirichlet(θd∣nd,¬i+α)dθd∗∫p(wi=t∣βk)Dirichlet(βk∣nk,¬i+η)dβk=∫θdkDirichlet(θd∣nd,¬i+α)dθd∫βktDirichlet(βk∣nk,¬i+η)dβk=EDirichlet(θd)(θdk)EDirichlet(βk)(βkt)在贝叶斯的框架下,如果我们得到了参数的后验分布,那么应该如何估计参数呢?合理的方式是使用后验分布的极大值点,或者是参数在后验分布下的均值,在这里我们取平均值作为参数的估计值。
在上一篇LDA基础里我们讲到了Dirichlet分布的期望公式,因此我们有:
E
D
i
r
i
c
h
l
e
t
(
θ
d
)
(
θ
d
k
)
=
n
d
,
¬
i
k
+
α
k
∑
s
=
1
K
n
d
,
¬
i
s
+
α
s
E_{Dirichlet(\theta_d)}(\theta_{dk}) = \frac{n_{d, \neg i}^{k} + \alpha_k}{\sum\limits_{s=1}^Kn_{d, \neg i}^{s} + \alpha_s}
EDirichlet(θd)(θdk)=s=1∑Knd,¬is+αsnd,¬ik+αk
E
D
i
r
i
c
h
l
e
t
(
β
k
)
(
β
k
t
)
=
n
k
,
¬
i
t
+
η
t
∑
f
=
1
V
n
k
,
¬
i
f
+
η
f
E_{Dirichlet(\beta_k)}(\beta_{kt})= \frac{n_{k, \neg i}^{t} + \eta_t}{\sum\limits_{f=1}^Vn_{k, \neg i}^{f} + \eta_f}
EDirichlet(βk)(βkt)=f=1∑Vnk,¬if+ηfnk,¬it+ηt考虑到
α
\alpha
α在Dirichlet分布中的物理意义是事件的先验的伪计数,这个估计式子的含义是很直观的:每个参数的估计值是其对应事件的先验的伪计数和数据中的计数的和在整体计数中的比例。
最终我们得到每个词对应主题的Gibbs采样的条件概率公式为: p ( z i = k ∣ w ⃗ , z ⃗ ¬ i ) = n d , ¬ i k + α k ∑ s = 1 K n d , ¬ i s + α s n k , ¬ i t + η t ∑ f = 1 V n k , ¬ i f + η f p(z_i=k| \vec w,\vec z_{\neg i}) = \frac{n_{d, \neg i}^{k} + \alpha_k}{\sum\limits_{s=1}^Kn_{d, \neg i}^{s} + \alpha_s} \frac{n_{k, \neg i}^{t} + \eta_t}{\sum\limits_{f=1}^Vn_{k, \neg i}^{f} + \eta_f} p(zi=k∣w,z¬i)=s=1∑Knd,¬is+αsnd,¬ik+αkf=1∑Vnk,¬if+ηfnk,¬it+ηt有了这个公式,我们就可以用Gibbs采样去采样所有词的主题,当Gibbs采样收敛后,即得到所有词的采样主题。利用所有采样得到的词和主题的对应关系,我们就可以得到每个文档词主题的分布 θ d \theta_d θd和每个主题中所有词的分布 β k \beta_k βk。
LDA Gibbs采样算法流程总结
(1)选择合适的主题数
K
K
K, 选择合适的超参数向量
α
⃗
,
η
⃗
\vec \alpha,\vec \eta
α,η ;
(2)对应语料库中每一篇文档的每一个词,随机的赋予一个主题编号
z
z
z;
(3)重新扫描语料库,对于每一个词,利用Gibbs采样公式更新它的topic编号,并在语料库中进行更新;
(4)重复第3步的基于坐标轴轮换的Gibbs采样,直到Gibbs采样收敛;
(5)统计语料库中的各个文档各个词的主题,根据
(
θ
d
k
)
=
n
d
,
¬
i
k
+
α
k
∑
s
=
1
K
n
d
,
¬
i
s
+
α
s
(\theta_{dk}) = \frac{n_{d, \neg i}^{k} + \alpha_k}{\sum\limits_{s=1}^Kn_{d, \neg i}^{s} + \alpha_s}
(θdk)=s=1∑Knd,¬is+αsnd,¬ik+αk,得到文档主题分布
θ
d
\theta_d
θd,统计语料库中各个主题词的分布,根据
(
β
k
t
)
=
n
k
,
¬
i
t
+
η
t
∑
f
=
1
V
n
k
,
¬
i
f
+
η
f
(\beta_{kt})= \frac{n_{k, \neg i}^{t} + \eta_t}{\sum\limits_{f=1}^Vn_{k, \neg i}^{f} + \eta_f}
(βkt)=f=1∑Vnk,¬if+ηfnk,¬it+ηt,得到LDA的主题与词的分布
β
k
\beta_k
βk;
下面我们再来看看当新文档出现时,如何统计该文档的主题。此时我们的模型已定,也就是LDA的各个主题的词分布
β
k
\beta_k
βk已经确定,我们需要得到的是该文档的主题分布。因此在Gibbs采样时,我们的
E
D
i
r
i
c
h
l
e
t
(
β
k
)
(
β
k
t
)
E_{Dirichlet(\beta_k)}(\beta_{kt})
EDirichlet(βk)(βkt)已经固定,只需要对前半部分
E
D
i
r
i
c
h
l
e
t
(
θ
d
)
(
θ
d
k
)
E_{Dirichlet(\theta_d)}(\theta_{dk})
EDirichlet(θd)(θdk)进行采样计算即可。
现在我们总结下LDA Gibbs采样算法的预测流程:
(1)对当前文档的每一个词,随机的赋予一个主题编号
z
z
z;
(2)重新扫描当前文档,对于每一个词,利用Gibbs采样公式更新它的topic编号;
(3)重复第2步的基于坐标轴轮换的Gibbs采样,直到Gibbs采样收敛;
(4)统计文档中各个词的主题,得到该文档主题分布。