LDA模型简介
LDA指两者算法,一种叫线性判别分析,一种叫文档主题生成模型,在NLP中我们当然指的是后者。
LDA是一种基于统计的生成模型,它可以根据语料库生成主题模型,并根据这个模型来预测一篇文章属于哪些主题。
算法理论
前提假设
不同于传统的词袋模型,LDA模型认为,一篇文章的生成,是首先随机地决定一些主题,再从每个主题中随机地选择一些词语,这些词语构成了一篇文章。LDA并不考虑词语在文章中的顺序。
LDA的模型,实际上由一个个主题组成,每个主题下有不同的词语,每个主题下的词语对应一个概率值,表明在给定该主题时该词出现的条件概率,即p(w|t)。
而文章的主题预测,即根据文章中出现的词语以及各词语出现的次数,来判断这篇文章最符合哪些主题中词语的概率分布,从而判定文章由哪些词语构成。
LDA的主题模型
贝叶斯学派的人认为,万物皆随机。那么,在LDA模型中上文中提到的条件概率的分布也被认为是随机的。这可以说是LDA模型与PLSA模型最大的不同。
所以在LDA中一篇文章的产生,实际上是随机生成了K个词语-主题的概率分布(K表示假设的主题数量),又随机生成了一个主题-文档的概率分布,根据这个主题-文档分布的结果去在K个词语-主题分布中找到符合要求的那个分布,根据这个分布生成了文档中的一个词语,重复此过程最终生成了一篇文档。主题与主题之间相互独立,词语与词语之间也相互独立,所以上文中两个概率分布生成都是多项式分布,即
p ( w ⃗ ) = ∏ i = 1 n p i α i p(\vec w) = \prod_{i=1}^n p_i^{\alpha_i} p(w)=i=1∏npiαi,其中 α i \alpha_i αi表示第i个值的样本的个数。
这样每生成一个词就要做两次随机过程,由于词与词之间是独立的,那么干脆先进行2N次随机过程,把每个词的主题以及相应的概率分布确定了,再去逐个生成词语。
主题-文档的概率分布与词语-主题的概率分布,显然不会是真的随机,而是某种概率。那生成某个概率分布的概率到底是怎样的呢?Dirichlet分布便是可以表示概率的概率的一种分布,它根据一个人为设定的先验参数生成样本,再根据生成结果来更新自己得到后验概率。关于Dirichlet分布可以见下文,这里仅说明,公式 Δ ( n ⃗ + α ⃗ ) Δ ( α ) \frac{\Delta(\vec n+\vec \alpha)}{\Delta(\alpha)} Δ(α)Δ(n+α)用来表示在根据先验分布 α ⃗ \vec \alpha α得到的概率分布下生成样本分布为 n ⃗ \vec n n的概率, n ⃗ \vec n n即 ( n 1 , . . . , n k ) (n_1,...,n_k) (n1,...,nk)。
那么,语料库主题生成的概率,便可以表示为 p ( z ⃗ ∣ α ⃗ ) = ∏ i = 1 m p ( z ⃗ m ∣ α ⃗ ) = ∏ i = 1 m Δ ( n ⃗ m + α ⃗ ) Δ ( α ) p(\vec z|\vec \alpha) = \prod_{i=1}^m p(\vec z_m|\vec \alpha) = \prod_{i=1}^m \frac{\Delta(\vec n_m+\vec \alpha)}{\Delta(\alpha)} p(z∣α)=i=1∏mp(zm∣α)=i=1∏mΔ(α)Δ(nm+α),其中m为语料库中的文本数。同样的,给定主题分布后,语料库中词的生成概率也可以表示为
p ( w ⃗ ∣ z ⃗ , β ⃗ ) = ∏ i = 1 k p ( w ⃗ k ∣ z ⃗ k , β ⃗ ) = ∏ i = 1 k Δ ( n ⃗ k + α ⃗ ) Δ ( α ) p(\vec w| \vec z, \vec \beta) = \prod_{i=1}^k p(\vec w_k| \vec z_k, \vec \beta) = \prod_{i=1}^k \frac{\Delta(\vec n_k+\vec \alpha)}{\Delta(\alpha)} p(w∣z,β)=i=1∏kp(wk∣zk,β)=i=1∏kΔ(α)Δ(nk+α),其中k表示语料库中的主题数量。这里虽然两个公式都用了n来表示分布,但它们并不表示同一个变量的分布。综上,我们可以得到语料库的主题-词语联合概率分布 p ( w ⃗ , z ⃗ ∣ α ⃗ , β ⃗ ) = p ( w ⃗ ∣ z ⃗ , β ⃗ ) p ( z ⃗ ∣ α ⃗ ) p(\vec w, \vec z|\vec \alpha, \vec \beta) = p(\vec w| \vec z, \vec \beta)p(\vec z|\vec \alpha) p(w,z∣α,β)=p(w∣z,β)p(z∣α)
数据采样
(这里的数据采样是LDA算法中最重要的一个步骤,所以单独拎出来进行说明。)
上面的公式只是表现了语料库的生成过程,但现在我们实际上已经有了语料库,我们希望得到的是几个概率分布的值。由于语料库已知的情况下 w ⃗ \vec w w是已知的,故我们真正需要计算的便是 p ( z ⃗ ∣ w ⃗ ) p(\vec z|\vec w) p(