1 what is LDA?
LDA: Latent Dirichlet Allocatio, 文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。
生成模型:我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。
采用了词袋(bag of words)方法:将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。
2 LDA构建流程?
2.1 LDA生成过程
对于语料库中的每篇文档,LDA定义了如下生成过程(generative process):
- 对每一篇文档,从主题分布中抽取一个主题;
- 从上述被抽到的主题所对应的单词分布中抽取一个单词;
- 重复上述过程直至遍历文档中的每一个单词。
语料库中的每一篇文档与T(通过反复试验等方法事先给定)个主题的一个多项分布 (multinomial distribution)相对应,将该多项分布记为θ。每个主题又与词汇表(vocabulary)中的V个单词的一个多项分布相对应,将这个多项分布记为φ。
2.2 LDA整体流程
2.2.1 字母定义
D: 文档集合;
d: D中文档;
将D中每个d看作一个单词序列
<
w
1
,
w
2
,
.
.
.
,
w
n
>
<w_1, w_2, ... , w_n>
<w1,w2,...,wn>(
w
i
w_i
wi:第i个单词,设d中有n个单词,LDA里面称之为word bag,每个单词的出现位置对LDA算法无影响)
vocabulary(VOC): D中所有不同单词所组成的集合
对每个D中的文档d, 对应到不同Topic的概率
θ
d
<
P
t
1
,
.
.
.
,
p
t
k
>
θ_d<P_{t_1},...,p_{t_k}>
θd<Pt1,...,ptk>,其中,
P
t
i
P_{t_i}
Pti表示d对应T中第i个topic的概率:
P
t
i
=
n
t
i
P_{t_i} = n_{t_i}
Pti=nti ,其中
n
t
i
n_{t_i}
nti 表示d中对应第i个topic的词的数目,n是d中所有词的总数。
对每个T中的topic t,生成不同单词的概率
φ
t
<
P
W
1
,
.
.
.
,
P
W
m
>
φ_t<PW_1, ... , PW_m>
φt<PW1,...,PWm>,其中,
P
W
i
PW_i
PWi表示t生成VOC中第i个单词的概率:
P
W
i
=
N
w
i
/
N
PW_i = N_{w_i} / N
PWi=Nwi/N ,其中
N
w
i
N_{w_i}
Nwi 表示对应到topict 的VOC中第i个单词的数目,N表示所有对应到topict的单词总数。
2.2.2 学习过程
LDA的核心公式:
P
(
w
∣
d
)
=
P
(
w
∣
t
)
∗
P
(
t
∣
d
)
P(w|d) = P(w|t) * P(t|d)
P(w∣d)=P(w∣t)∗P(t∣d)
直观的看这个公式,就是以Topic作为中间层,可以通过当前的
θ
d
θ_d
θd和
φ
t
φ_t
φt给出了文档d中出现单词w的概率。其中p(t|d)利用
θ
d
θ_d
θd计算得到,p(w|t)利用
φ
t
φ_t
φt计算得到。
实际上,利用当前的
θ
d
θ_d
θd和
φ
t
φ_t
φt,我们可以为一个文档中的一个单词计算它对应任意一个Topic时的p(w|d),然后根据这些结果来更新这个词应该对应的topic。然后,如果这个更新改变了这个单词所对应的Topic,就会反过来影响
θ
d
θ_d
θd和
φ
t
φ_t
φt。
LDA算法开始时,先随机地给 θ d θ_d θd和 φ t φ_t φt赋值(对所有的d和t)。然后上述过程不断重复,最终收敛到的结果就是LDA的输出。再详细说一下这个迭代的学习过程:
- 针对一个特定的文档ds中的第i单词wi,如果令该单词对应的topic为tj,可以把上述公式改写为:pj(wi|ds) = p(wi|tj) * p(tj|ds)
- 现在我们可以枚举T中的topic,得到所有的pj(wi|ds),其中j取值1~k。然后可以根据这些概率值结果为ds中的第i个单词wi选择一个topic。最简单的想法是取令pj(wi|ds)最大的tj(注意,这个式子里只有j是变量),即argmax[j]pj(wi|ds)
- 然后,如果ds中的第i个单词wi在这里选择了一个与原先不同的topic,就会对θd和φt有影响了(根据前面提到过的这两个向量的计算公式可以很容易知道)。它们的影响又会反过来影响对上面提到的p(w|d)的计算。对D中所有的d中的所有w进行一次p(w|d)的计算并重新选择topic看作一次迭代。这样进行n次循环迭代之后,就会收敛到LDA所需要的结果了