从本节开始,打算总结一下自己对LDA模型的理解过程,由于LDA模型涉及到的数学知识众多,所以在本小节会先介绍一些相关的数学知识,做好铺垫。
贝叶斯模型参数估计过程
LDA是基于贝叶斯模型的,涉及到贝叶斯模型自然离不开“先验分布”,“数据(似然)”和"后验分布"三块。贝叶斯模型参数估计过程一般是这样: 先 验 分 布 + 数 据 ( 似 然 ) = 后 验 分 布 先验分布 + 数据(似然)= 后验分布 先验分布+数据(似然)=后验分布这点其实很好理解,因为这符合我们人的思维方式,举个例子你就懂了,比如你对好人和坏人的认知,先验分布为:100个好人和100个的坏人,即你认为好人坏人各占一半,现在你被2个好人(数据)帮助了和1个坏人骗了,于是你得到了新的后验分布为:102个好人和101个的坏人。现在你的后验分布里面认为好人比坏人多了。这个后验分布接着又变成你的新的先验分布,当你被1个好人(数据)帮助了和3个坏人(数据)骗了后,你又更新了你的后验分布为:103个好人和104个的坏人。依次继续更新下去。
二项分布与Beta分布
对于上一节的贝叶斯模型和认知过程,假如用数学和概率的方式该如何表达呢?对于我们的数据(似然),这个好办,用一个二项分布就可以搞定,即对于二项分布:
B
i
n
o
m
(
k
∣
n
,
p
)
=
(
n
k
)
p
k
(
1
−
p
)
n
−
k
Binom(k|n,p) = {n \choose k}p^k(1-p)^{n-k}
Binom(k∣n,p)=(kn)pk(1−p)n−k其中p我们可以理解为好人的概率,k为好人的个数,n为好人坏人的总数。虽然数据(似然)很好理解,但是对于先验分布,我们就要费一番脑筋了,为什么呢?因为我们希望这个先验分布和数据(似然)对应的二项分布集合后,得到的后验分布在后面还可以作为先验分布!就像上面例子里的“102个好人和101个的坏人”,它是前面一次贝叶斯推荐的后验分布,又是后一次贝叶斯推荐的先验分布。也即是说,我们希望先验分布和后验分布的形式应该是一样的,这样的分布我们一般叫共轭分布。在我们的例子里,我们希望找到和二项分布共轭的分布。
和二项分布共轭的分布其实就是Beta分布。Beta分布的表达式为:
B
e
t
a
(
p
∣
α
,
β
)
=
Γ
(
α
+
β
)
Γ
(
α
)
Γ
(
β
)
p
α
−
1
(
1
−
p
)
β
−
1
Beta(p|\alpha,\beta) = \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)}p^{\alpha-1}(1-p)^{{\beta-1}}
Beta(p∣α,β)=Γ(α)Γ(β)Γ(α+β)pα−1(1−p)β−1其中,其中
Γ
\Gamma
Γ是Gamma函数,满足
Γ
(
x
)
=
(
x
−
1
)
!
\Gamma(x) = (x-1)!
Γ(x)=(x−1)!.
仔细观察Beta分布和二项分布,可以发现两者的密度函数很相似,区别仅仅在前面的归一化的阶乘项。那么它如何做到先验分布和后验分布的形式一样呢?后验分布
P
(
p
∣
n
,
k
,
α
,
β
)
P(p|n,k,\alpha,\beta)
P(p∣n,k,α,β)推导如下:
P
(
p
∣
n
,
k
,
α
,
β
)
∝
P
(
k
∣
n
,
p
)
P
(
p
∣
α
,
β
)
=
P
(
k
∣
n
,
p
)
P
(
p
∣
α
,
β
)
=
B
i
n
o
m
(
k
∣
n
,
p
)
B
e
t
a
(
p
∣
α
,
β
)
=
(
n
k
)
p
k
(
1
−
p
)
n
−
k
×
Γ
(
α
+
β
)
Γ
(
α
)
Γ
(
β
)
p
α
−
1
(
1
−
p
)
β
−
1
∝
p
k
+
α
−
1
(
1
−
p
)
n
−
k
+
β
−
1
\begin{aligned} P(p|n,k,\alpha,\beta) & \propto P(k|n,p)P(p|\alpha,\beta) \\ & = P(k|n,p)P(p|\alpha,\beta) \\& = Binom(k|n,p) Beta(p|\alpha,\beta) \\ &= {n \choose k}p^k(1-p)^{n-k} \times \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)}p^{\alpha-1}(1-p)^{{\beta-1}} \\& \propto p^{k+\alpha-1}(1-p)^{n-k + \beta -1} \end{aligned}
P(p∣n,k,α,β)∝P(k∣n,p)P(p∣α,β)=P(k∣n,p)P(p∣α,β)=Binom(k∣n,p)Beta(p∣α,β)=(kn)pk(1−p)n−k×Γ(α)Γ(β)Γ(α+β)pα−1(1−p)β−1∝pk+α−1(1−p)n−k+β−1 将上面最后的式子归一化以后,得到我们的后验概率为:
P
(
p
∣
n
,
k
,
α
,
β
)
=
Γ
(
α
+
β
+
n
)
Γ
(
α
+
k
)
Γ
(
β
+
n
−
k
)
p
k
+
α
−
1
(
1
−
p
)
n
−
k
+
β
−
1
P(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}
P(p∣n,k,α,β)=Γ(α+k)Γ(β+n−k)Γ(α+β+n)pk+α−1(1−p)n−k+β−1可见我们的后验分布的确是Beta分布,而且我们发现:
B
e
t
a
(
p
∣
α
,
β
)
+
B
i
n
o
m
C
o
u
n
t
(
k
,
n
−
k
)
=
B
e
t
a
(
p
∣
α
+
k
,
β
+
n
−
k
)
Beta(p|\alpha,\beta) + BinomCount(k,n-k) = Beta(p|\alpha + k,\beta +n-k)
Beta(p∣α,β)+BinomCount(k,n−k)=Beta(p∣α+k,β+n−k)这个式子完全符合我们在上一节好人坏人例子里的情况,我们的认知会把数据里的好人坏人数分别加到我们的先验分布上,得到后验分布。
上面这个式子实际上描述的就是Beta-Binomial共轭,此处共轭的意思就是,数据符合二项分布的时候,参数的先验分布和后验分布都能保持Beta分布的形式,这种形式不变的好处是,我们能够在先验分布中赋予参数很明确的物理意义,这个物理意义可以延续到后验分布中进行解释,同时从先验变换到后验过程中从数据中补充的知识也容易有物理解释。
我们再来看看Beta分布 B e t a ( p ∣ α , β ) Beta(p|\alpha,\beta) Beta(p∣α,β)的期望: E ( B e t a ( p ∣ α , β ) ) = ∫ 0 1 t B e t a ( p ∣ α , β ) d t = ∫ 0 1 t Γ ( α + β ) Γ ( α ) Γ ( β ) t α − 1 ( 1 − t ) β − 1 d t = Γ ( α + β ) Γ ( α ) Γ ( β ) ∫ 0 1 t α ( 1 − t ) β − 1 d t \begin{aligned} E(Beta(p|\alpha,\beta)) & = \int_{0}^{1}tBeta(p|\alpha,\beta)dt \\& = \int_{0}^{1}t \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)}t^{\alpha-1}(1-t)^{{\beta-1}}dt \\& = \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)}\int_{0}^{1}t^{\alpha}(1-t)^{{\beta-1}}dt \end{aligned} E(Beta(p∣α,β))=∫01tBeta(p∣α,β)dt=∫01tΓ(α)Γ(β)Γ(α+β)tα−1(1−t)β−1dt=Γ(α)Γ(β)Γ(α+β)∫01tα(1−t)β−1dt上式右边的积分对应到概率分布 B e t a ( p ∣ α + 1 , β ) Beta(p|\alpha+1,\beta) Beta(p∣α+1,β),对于这个分布,其在(0,1)上的积分为1,于是我们有: ∫ 0 1 Γ ( α + β + 1 ) Γ ( α + 1 ) Γ ( β ) p α ( 1 − p ) β − 1 d p = 1 \int_{0}^{1}\frac{\Gamma(\alpha + \beta+1)}{\Gamma(\alpha+1)\Gamma(\beta)}p^{\alpha}(1-p)^{{\beta-1}} dp=1 ∫01Γ(α+1)Γ(β)Γ(α+β+1)pα(1−p)β−1dp=1将上式代入到 E ( B e t a ( p ∣ α , β ) ) E(Beta(p|\alpha,\beta)) E(Beta(p∣α,β))的计算式中,可得: E ( B e t a ( p ∣ α , β ) ) = Γ ( α + β ) Γ ( α ) Γ ( β ) Γ ( α + 1 ) Γ ( β ) Γ ( α + β + 1 ) = α α + β E(Beta(p|\alpha,\beta)) = \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)}\frac{\Gamma(\alpha+1)\Gamma(\beta)}{\Gamma(\alpha + \beta+1)} = \frac{\alpha}{\alpha + \beta} E(Beta(p∣α,β))=Γ(α)Γ(β)Γ(α+β)Γ(α+β+1)Γ(α+1)Γ(β)=α+βα这说明,对于Beta分布的随机变量,其均值可以用 α α + β \frac{\alpha}{\alpha+\beta} α+βα来估计,这个结论很重要,后面的LDA的数学推导中需要用到这个结论。
多项分布与Dirichlet 分布
现在我们回到上面好人坏人的问题,假如我们发现有第三类人,不好不坏的人,这时候我们如何用贝叶斯来表达这个模型分布呢?之前我们是二维分布,现在是三维分布。由于二维我们使用了Beta分布和二项分布来表达这个模型,则在三维时,以此类推,我们可以用三维的Beta分布来表达先验后验分布,三项的多项分布来表达数据(似然)。
三项的多项分布好表达,我们假设数据中的第一类有
m
1
m_1
m1个好人,第二类有
m
2
m_2
m2个坏人,第三类为
m
3
=
n
−
m
1
−
m
2
m_3=n−m_1−m_2
m3=n−m1−m2个不好不坏的人,对应的概率分别为
p
1
,
p
2
,
p
3
=
1
−
p
1
−
p
2
p_1,p_2,p_3=1−p_1−p_2
p1,p2,p3=1−p1−p2,则对应的多项分布为:
m
u
l
t
i
(
m
1
,
m
2
,
m
3
∣
n
,
p
1
,
p
2
,
p
3
)
=
n
!
m
1
!
m
2
!
m
3
!
p
1
m
1
p
2
m
2
p
3
m
3
multi(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那三维的Beta分布呢?超过二维的Beta分布我们一般称之为狄利克雷(以下称为Dirichlet )分布。也可以说Beta分布是Dirichlet 分布在二维时的特殊形式。从二维的Beta分布表达式,我们很容易写出三维的Dirichlet分布如下:
D
i
r
i
c
h
l
e
t
(
p
1
,
p
2
,
p
3
∣
α
1
,
α
2
,
α
3
)
=
Γ
(
α
1
+
α
2
+
α
3
)
Γ
(
α
1
)
Γ
(
α
2
)
Γ
(
α
3
)
p
1
α
1
−
1
(
p
2
)
α
2
−
1
(
p
3
)
α
3
−
1
Dirichlet(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}
Dirichlet(p1,p2,p3∣α1,α2,α3)=Γ(α1)Γ(α2)Γ(α3)Γ(α1+α2+α3)p1α1−1(p2)α2−1(p3)α3−1同样的方法,我们可以写出4维,5维,。。。以及更高维的Dirichlet 分布的概率密度函数。为了简化表达式,我们用向量来表示概率和计数,这样多项分布可以表示为:
D
i
r
i
c
h
l
e
t
(
p
⃗
∣
α
⃗
)
Dirichlet(\vec p| \vec \alpha)
Dirichlet(p∣α),而多项分布可以表示为:
m
u
l
t
i
(
m
⃗
∣
n
,
p
⃗
)
multi(\vec m| n, \vec p)
multi(m∣n,p)。
一般意义上的K维Dirichlet 分布表达式为:
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
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}
Dirichlet(p∣α)=∏k=1KΓ(αk)Γ(k=1∑Kαk)k=1∏Kpkαk−1而多项分布和Dirichlet 分布也满足共轭关系,这样我们可以得到和上一节类似的结论:
D
i
r
i
c
h
l
e
t
(
p
⃗
∣
α
⃗
)
+
M
u
l
t
i
C
o
u
n
t
(
m
⃗
)
=
D
i
r
i
c
h
l
e
t
(
p
⃗
∣
α
⃗
+
m
⃗
)
Dirichlet(\vec p|\vec \alpha) + MultiCount(\vec m) = Dirichlet(\vec p|\vec \alpha + \vec m)
Dirichlet(p∣α)+MultiCount(m)=Dirichlet(p∣α+m)对于Dirichlet 分布的期望,也有和Beta分布类似的性质:
E
(
D
i
r
i
c
h
l
e
t
(
p
⃗
∣
α
⃗
)
)
=
(
α
1
∑
k
=
1
K
α
k
,
α
2
∑
k
=
1
K
α
k
,
.
.
.
,
α
K
∑
k
=
1
K
α
k
)
E(Dirichlet(\vec p|\vec \alpha)) = (\frac{\alpha_1}{\sum\limits_{k=1}^K\alpha_k}, \frac{\alpha_2}{\sum\limits_{k=1}^K\alpha_k},...,\frac{\alpha_K}{\sum\limits_{k=1}^K\alpha_k})
E(Dirichlet(p∣α))=(k=1∑Kαkα1,k=1∑Kαkα2,...,k=1∑KαkαK)这个结论也很重要,后面的LDA的数学推导中需要用到这个结论。
LDA主题模型
好,铺垫已经做的差不多了,现在正式开始讲解LDA模型。
问题场景是这样的:我们有m篇文档,对应第d个文档中有
n
d
n_d
nd个词,即输入为如下图:
LDA的目标是找到每一篇文档的主题分布和每一个主题中词的分布。在LDA模型中,我们需要先假定一个主题数目K,这样所有的分布就都基于K个主题展开。在LDA中,我们需要求解的参数就是文档-主题分布和主题-词分布,现在我们先不思考如何去求解这两个分布,而是去看看LDA模型是如何生成每一篇文档的。
上图中,第一个装着骰子的壶其实就表示文档-主题分布的狄利克雷先验分布,第二个装着骰子的壶表示主题-词分布的狄利克雷先验分布,文档生成的具体过程如下:
如果用概率图来表示这个过程,就如下图所示:
LDA假设文档主题的先验分布是Dirichlet分布,即对于任一文档d, 其主题分布
θ
d
\theta_d
θd为:
θ
d
=
D
i
r
i
c
h
l
e
t
(
α
⃗
)
\theta_d = Dirichlet(\vec \alpha)
θd=Dirichlet(α)其中,
α
\alpha
α为分布的超参数,是一个K维向量.。
LDA假设主题中词的先验分布是Dirichlet分布,即对于任一主题k, 其词分布
φ
k
\varphi_k
φk为:
φ
k
=
D
i
r
i
c
h
l
e
t
(
β
⃗
)
\varphi_k= Dirichlet(\vec \beta)
φk=Dirichlet(β)其中,
β
\beta
β为分布的超参数,是一个V维向量。V代表词汇表里所有词的个数。
对于数据中任一一篇文档d中的第n个词,我们可以从主题分布
θ
d
\theta_d
θd中得到它的主题编号
z
d
n
z_{dn}
zdn:
z
d
n
=
m
u
l
t
i
(
θ
d
)
z_{dn} = multi(\theta_d)
zdn=multi(θd)接着我们便可以得到该主题下各个词的概率分布:
w
d
n
=
m
u
l
t
i
(
φ
z
d
n
)
w_{dn} = multi(\varphi_{z_{dn}})
wdn=multi(φzdn)理解LDA主题模型的主要任务就是理解上面的这个模型。这个模型里,我们有M个文档主题的Dirichlet分布,而对应的数据有M个主题编号的多项分布,这样
α
→
φ
d
→
z
⃗
d
\alpha \to \varphi_d \to \vec z_{d}
α→φd→zd就组成了Dirichlet-multi共轭,可以使用前面提到的贝叶斯推断的方法得到基于Dirichlet分布的文档主题后验分布。
如果在第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))此时的
n
⃗
d
\vec n_d
nd就相当于文档-主题数据似然,利用Dirichlet-multi共轭,得到
θ
d
\theta_d
θd的后验分布为:
D
i
r
i
c
h
l
e
t
(
θ
d
∣
α
⃗
+
n
⃗
d
)
Dirichlet(\theta_d | \vec \alpha + \vec n_d)
Dirichlet(θd∣α+nd)同样的道理,对于主题与词的分布,我们有K个主题与词的Dirichlet分布,而对应的数据有K个主题编号的多项分布,这样
β
→
φ
k
→
w
⃗
(
k
)
\beta \to \varphi_k \to \vec w_{(k)}
β→φk→w(k)就组成了Dirichlet-multi共轭,可以使用前面提到的贝叶斯推断的方法得到基于Dirichlet分布的主题词的后验分布。
如果在第k个主题中,第v个词的个数为:
n
k
v
n_k^v
nkv 则对应的多项分布的计数可以表示为:
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))此时的
n
⃗
k
\vec n_k
nk就相当于主题-词的数据似然,利用Dirichlet-multi共轭,得到
φ
k
\varphi_k
φk的后验分布为:
D
i
r
i
c
h
l
e
t
(
φ
k
∣
β
⃗
+
n
⃗
k
)
Dirichlet(\varphi_k | \vec \beta+ \vec n_k)
Dirichlet(φk∣β+nk)由于主题产生词不依赖具体某一个文档,因此文档主题分布和主题词分布是独立的。理解了上面这M+K组Dirichlet-multi共轭,就理解了LDA的基本原理了。
现在的问题是,基于这个LDA模型如何求解我们想要的每一篇文档的主题分布和每一个主题中词的分布呢?我们将在下一节中详细讲解基于Gibbs采样的LDA求解方法。