LDA算是NLP中相对比较难的一个,涉及到诸多统计方面的理论。虽然从开始准备到这篇文章发布,断断续续准备了近一个月,还是只能把其中主干拎出来,很多细节还需要慢慢沉淀,今天先把这篇粗糙的文章发出来,以示对过去一个月零碎时间的交代。
LDA(Latent Dirichlet Allocation)是主题模型的一种,它基于词袋模型BOW(Bag of words), 与BOW相对的是n-gram模型,前者不考虑词的先后顺序,而后者考虑。因此,我们最终得到的模型——topic-word共现矩阵没有序列的信息。
同其他主题模型一样,LDA模型描述的也是“文章-主题-词”之间的关系。LDA算法复杂的原因之一,则是在算法中用到多个分布和采样收敛。其算法如下:
- 根据先验概率p,选择到一个文章d的概率
- 在文章d的前提下,生成主题
(1)根据Dirichlet分布α,生成文章d的主题分词分布θ(θ为多项式分布)
(2)在主题分布θ的前提下,Gibbs采样得到主题词z - 在主题词z的前提下,生成词汇
(1)根据Dirichlet分布β,生成主题词z的词汇分布γ(γ为多项式分布)
(2)在词汇分布γ的前提下,Gibbs采样得到词汇w
写到这里,我们就需要解释两个问题:
- Dirichlet分布和多项式分布的关联? Dirichlet分布是先验分布,多项式分布则是其似然共轭分布。而后验分布则为加入多样式分布的Dirichlet分布,因为共轭特性可以使得先验分布和后验分布的形式相同。 先验和后验的关系,可参考贝叶斯公式:
- Gibbs采样的过程如下
看完算法之后,我们的疑惑点又来了,在实际项目中,LDA首先要解决的问题是:如何生成主题模型?然而以上算法并不能直接获取主题模型。其实,通过以上算法,我们不难得到其目标函数,有了目标函数就可以像其他算法一样进行迭代计算了(这里没有列出目标函数,笔者并不能自己推导出公式,所以想看目标函数的可以去网上查下即可)。
那么LDA的训练过程如下:
- 设置主题个数k,这个就是经验值了
- 遍历语料库中每个文档d中的每个词w,为w随机选择一个topic编号z
- 重新遍历每个词w,利用Gibbs采样,对topic编号进行更新
- 重复第2步,直至Gibbs采样收敛
- 统计语料库中topic-word的共现频率矩阵,这就是LDA的模型
在LDA中,主题的数目算是一个超参,需要在训练模型时,事先设置主题数。这个超参往往需要对业务和数据有一定的了解,或者针对业务特定的一些需要,设置一个值。主题的取值范围可以从1到语料库的所有词总数(无重复词),所以无法得到主题数目的一个最优解,在训练过程中需要手动调参,优化主题数目,进而优化模型效果。