基于隐狄利克雷分配(LDA)的文档主题生成模型详解
题目描述
想象你有一个包含成千上万篇文档的文集(语料库),每篇文档包含多个词语。你的任务是:在不依赖任何先验标签的情况下,自动发现这个文集背后隐藏的“主题”,并且能够量化每篇文档涉及哪些主题、每个主题由哪些词语构成。例如,一个新闻语料库可能隐藏着“体育”、“金融”、“科技”等主题。隐狄利克雷分配(Latent Dirichlet Allocation, LDA)就是一种解决此类任务的经典无监督概率生成模型。它通过引入“主题”这一隐变量,来解释文档中词语的生成过程。
解题过程
LDA的核心思想是:将每篇文档视为一个关于主题的概率分布,而每个主题又视为一个关于词语的概率分布。文档中每个词语的生成,都是通过“以一定概率选择某个主题,再从这个主题中以一定概率选择一个词语”这两步过程来完成的。
第一步:理解基础概念与模型假设
- 文档(Document):文集中的一篇文章,看作一个词语序列。
- 词语(Word):文集中最基本的离散单元,来自一个大小为V的词典。
- 主题(Topic):一个隐藏的、抽象的概念。在数学上,一个主题被表示为一个在词典所有词语上的多项概率分布。例如,一个“体育”主题中,“篮球”、“足球”、“比赛”等词的概率会很高。
- 核心假设:
- 每篇文档都包含多个主题,但每个主题的权重(比例)不同。一篇文档可以看作是多个主题按不同比例混合而成。
- 文档中的每个词语都是由文档的某个主题“发射”出来的。
第二步:构建生成过程(上帝视角)
LDA是一个生成模型,它首先定义了一套文档是如何被“生成”出来的假想过程。理解这个生成过程是理解整个算法的关键。
假设我们有M篇文档,词典大小为V,我们想要发现K个主题。生成一篇文档的步骤如下:
-
为每个主题k(k从1到K)生成一个词语分布φ_k:
- 从狄利克雷分布Dir(β)中采样,得到一个V维向量φ_k。其中β是一个超参数。φ_k表示主题k下生成各个词语的概率,即P(词语 | 主题=k)。
-
为第m篇文档生成一个主题分布θ_m:
- 从另一个狄利克雷分布Dir(α)中采样,得到一个K维向量θ_m。其中α是一个超参数。θ_m表示文档m中各个主题出现的概率,即P(主题 | 文档=m)。
-
生成文档m中的第n个词语w_{m,n}:
a. 选择主题:从文档m的主题分布θ_m中,采样一个具体的主题z_{m,n}。z_{m,n}是一个介于1到K之间的整数,代表生成当前词语的那个主题。
b. 选择词语:从上一步选出的主题z_{m,n}对应的词语分布φ_{z_{m,n}}中,采样一个具体的词语w_{m,n}。
重复步骤3,直到生成文档m的所有N_m个词语。对所有M篇文档重复步骤2和3。
第三步:定义推断问题(我们的视角)
在现实中,我们看不到上帝视角的生成过程。我们能观察到的只有文档集合(即所有的w_{m,n}),而主题分配z_{m,n}、文档-主题分布θ_m和主题-词语分布φ_k全都是隐藏的(Latent)。
因此,我们的任务(推断问题)是:根据观察到的所有文档中的词语(数据),反过来去估计那些隐藏的变量。具体来说,我们最关心的是:
- 文档的主题分布:对于每篇文档m,求出它的主题比例θ_m。
- 主题的词语分布:对于每个主题k,求出它的代表性词语分布φ_k。
第四步:求解方法——吉布斯采样(Gibbs Sampling)
精确计算后验概率在LDA中是非常困难的。因此,我们采用近似推断方法,吉布斯采样是其中最流行的一种。它是一种马尔可夫链蒙特卡洛(MCMC)方法,通过迭代采样来逼近真实的后验分布。
-
初始化:随机地为文集中的每一个词语w_{m,n}分配一个随机的主题标签z_{m,n}(例如,在1到K之间随机选一个)。
-
迭代采样:对于文集中的每一个词语w_{m,n}(一次迭代中遍历所有词语):
a. 减计数:假设当前词语w_{m,n}被分配的主题是k。我们首先将它从计数中移除。具体来说:
* 将文档m中分配给主题k的词语数量减1。
* 将主题k下词语w_{m,n}出现的次数减1。
* 将主题k的总词频数减1。b. 计算条件概率:根据其他所有词语的当前主题分配情况,计算当前词语w_{m,n}被分配到每一个可能主题t(t从1到K)的概率。
* P(z_{m,n} = t | z{-(m,n)}, w, α, β) ∝ (n{m,-n}^{(t)} + α) * (n_{t,-n}^{(v)} + β) / (n_{t,-n}^{(.)} + Vβ)
* 公式解读:
*n_{m,-n}^{(t)}:在文档m中,排除当前词语后,被分配给主题t的词语数量。这个项反映了文档m对主题t的“偏好”。加上超参数α是狄利克雷分布的性质。
*n_{t,-n}^{(v)}:在整个文集中,排除当前词语后,词语w_{m,n}(即词典中的第v个词)被分配给主题t的次数。这个项反映了主题t“生成”当前词语的倾向。
*n_{t,-n}^{(.)}:在整个文集中,排除当前词语后,被分配给主题t的所有词语的总数。加上Vβ是为了归一化。
* 这个公式的本质是平衡两点:1)当前文档的主题分布(文档层面);2)当前词语在各个主题下的分布(文集层面)。c. 重新采样:将上一步计算出的对于K个主题的概率值归一化,使其和为1,形成一个多项分布。然后,从这个新的多项分布中重新采样一个主题,作为词语w_{m,n}的新主题标签z_{m,n}。
d. 加计数:根据新采样的主题k',更新计数。
* 将文档m中分配给主题k'的词语数量加1。
* 将主题k'下词语w_{m,n}出现的次数加1。
* 将主题k'的总词频数加1。 -
循环:重复步骤2很多次(例如1000次迭代)。在经历了足够多的迭代后,马尔可夫链会收敛到一个平稳分布,此时采样的主题分配z可以看作是来自真实后验分布的样本。
-
估计参数:当吉布斯采样过程收敛后(通常我们会忽略前面一定次数的“燃烧期”样本),我们可以利用最后若干次迭代采样结果的平均值来估计我们最终需要的参数φ和θ。
- 主题-词语分布φ_{k,v}:P(词语v | 主题k) ≈ (n_k^{(v)} + β) / (n_k^{(.)} + Vβ)
- 文档-主题分布θ_{m,k}:P(主题k | 文档m) ≈ (n_m^{(k)} + α) / (N_m + Kα)
总结
LDA通过一个优雅的概率生成框架,将文档建模为主题的概率混合。求解(推断)过程,即吉布斯采样,通过不断迭代地为每个词语重新分配其最可能的主题,同时考虑文档和文集层面的统计规律,最终同时学习到文档的主题构成和主题的词语构成。这使得我们能够以一种完全无监督的方式,探索大规模文档集合的隐藏语义结构。