隐式狄利克雷分布(LDA)的主题建模原理与推断过程
题目描述
隐式狄利克雷分布(Latent Dirichlet Allocation, LDA)是一种生成概率模型,用于从文档集合中自动发现潜在的主题结构。假设你有一个包含多篇文档的文集,每篇文档包含多个词语。LDA的目标是:1)识别出文集中存在的若干个主题(每个主题是词语上的一个概率分布,表示该主题下各个词语出现的可能性);2)确定每篇文档在这些主题上的比例(即文档-主题分布)。LDA认为文档是由“以一定概率选择某个主题,再从这个主题中以一定概率选择某个词语”这一过程重复生成的。题目要求理解LDA的生成过程、图模型表示以及如何通过吉布斯采样(Gibbs Sampling)进行参数推断。
解题过程
1. LDA的基本思想与生成过程
LDA将每篇文档视为一个“词袋”(忽略词语顺序),并假设文档的生成遵循以下步骤:
a. 为整个文集选择一个超参数α,它影响每篇文档中主题分布的集中程度(α值小,则文档可能只集中在少数几个主题;α值大,则主题分布更均匀)。
b. 为整个文集选择一个超参数β,它影响每个主题下词语分布的集中程度(β值小,则主题可能只由少数几个核心词构成;β值大,则词语分布更均匀)。
c. 对于文集中的每一个主题k(k从1到K,K是预设的主题数量),从参数为β的狄利克雷分布中生成一个主题-词语分布φ_k。φ_k是一个向量,表示在主题k下,每个词语被生成的概率。
d. 对于文集中的每一篇文档d(d从1到D):
i. 从参数为α的狄利克雷分布中生成一个文档-主题分布θ_d。θ_d是一个向量,表示在文档d中,每个主题出现的概率。
ii. 对于文档d中的每一个词语位置n(n从1到N_d,N_d是文档d的词语总数):
- 首先,从文档-主题分布θ_d中进行一次多项式抽样,为该词语分配一个主题编号z_{d,n}。z_{d,n}是一个隐变量,表示生成这个词语的主题。
- 然后,根据上一步抽到的主题z_{d,n},找到对应的主题-词语分布φ_{z_{d,n}},从这个分布中进行一次多项式抽样,生成我们最终观察到的词语w_{d,n}。
这个生成过程定义了文档中每个词语的来源。我们的观测数据是所有的w_{d,n},而隐变量是所有的z_{d,n},以及无法直接观测的参数θ_d和φ_k。LDA的核心任务就是根据观测到的词语w,来推断这些隐藏的主题分配z、文档主题分布θ和主题词语分布φ。
2. LDA的图模型表示
为了清晰地表示变量间的依赖关系,我们使用概率图模型:
- 观察变量(实心圈):词语w_{d,n}。
- 隐变量(空心圈):主题分配z_{d,n},文档-主题分布θ_d,主题-词语分布φ_k。
- 参数(方框):超参数α和β。
- 箭头表示依赖关系:
- θ_d 依赖于 α。
- z_{d,n} 依赖于 θ_d。
- w_{d,n} 依赖于 z_{d,n} 和所有的 φ_k(更准确地说,是依赖于φ_{z_{d,n}})。
- φ_k 依赖于 β。
- 板块表示(Plate Notation):文档d的板块(外框)重复D次,词语n的板块(内框)在每篇文档d内重复N_d次,主题k的板块重复K次。
这个图模型直观地展示了生成过程,并简化了后续联合概率分布的计算。
3. 联合概率分布与推断目标
根据图模型,所有变量的联合概率分布可以写成:
P(w, z, θ, φ | α, β) = [∏{k=1}^K P(φ_k | β)] * [∏{d=1}^D P(θ_d | α) ∏{n=1}^{N_d} P(z{d,n} | θ_d) P(w_{d,n} | z_{d,n}, φ)]
我们的推断目标是计算后验概率分布P(z, θ, φ | w, α, β),即在给定观测词语w和超参数下,隐变量和参数的概率分布。然而,这个后验分布的直接计算非常困难(计算复杂度高),因此我们通常采用近似推断方法。吉布斯采样(Gibbs Sampling)是其中一种常用的马尔可夫链蒙特卡洛(MCMC)方法。
4. 吉布斯采样推断过程
吉布斯采样的核心思想是:在已知其他所有变量的情况下,迭代地抽样每一个隐变量(这里是每个词语的主题分配z_{d,n})。通过多次迭代,采样结果会收敛到真实的后验分布。
a. 初始化:为文集中的每一个词语w_{d,n}随机分配一个主题编号z_{d,n}(从1到K中随机选一个)。
b. 迭代采样:重复以下步骤多次(例如1000次),直到链趋于稳定(收敛):
对于每一篇文档d中的每一个词语位置n:
i. 减计数:将当前词语w_{d,n}和它当前被分配的主题z_{d,n}从计数矩阵中移除。这会影响两个关键的计数:
- n_{d,k}:文档d中被分配给主题k的词语数量。(文档-主题计数)
- n_{k,t}:主题k中词语t(词语在词汇表中的编号)出现的次数。(主题-词语计数)
- n_k:被分配给主题k的所有词语的总数。
将对应的n_{d,z_{d,n}}和n_{z_{d,n}, t}(其中t是w_{d,n}对应的词语编号)都减1。
ii. **计算条件概率**:根据其他所有词语的当前主题分配,计算当前词语w_{d,n}被分配给每个可能主题k(k从1到K)的条件概率。
P(z_{d,n} = k | z_{-(d,n)}, w, α, β) ∝ (n_{d,k}^{-(d,n)} + α_k) * (n_{k, t}^{-(d,n)} + β_t) / (n_k^{-(d,n)} + β^T V)
其中:
- z_{-(d,n)} 表示除了当前词语w_{d,n}之外的所有其他词语的主题分配。
- n_{d,k}^{-(d,n)} 是排除当前词语后,文档d中分配给主题k的词语计数。
- n_{k, t}^{-(d,n)} 是排除当前词语后,主题k中词语t出现的次数。
- n_k^{-(d,n)} 是排除当前词语后,分配给主题k的所有词语的总数。
- V是整个词汇表的大小。
- α_k是向量α的第k个分量(通常假设对称,即所有α_k相等)。
- β_t是向量β的第t个分量(通常假设对称,即所有β_t相等),β^T V是β与词汇表大小V的乘积,即∑_{v=1}^V β_v。
这个公式的直观解释是:当前词语被分配给主题k的概率,正比于“文档d喜欢主题k的程度”(由n_{d,k} + α体现)乘以“主题k喜欢生成词语t的程度”(由(n_{k,t} + β)/(n_k + β^T V)体现)。
iii. **抽样新主题**:将上一步计算出的对于k=1到K的概率值归一化(使其和为1),形成一个多项式分布。然后从这个多项式分布中抽样,为当前词语w_{d,n}分配一个新的主题z_{d,n}^{new}。
iv. **加计数**:将新抽样的主题z_{d,n}^{new}更新到计数矩阵中。将n_{d,z_{d,n}^{new}}和n_{z_{d,n}^{new}, t}都加1。
c. 收敛后估计参数:在经过足够次数的迭代(如跳过初始的“燃烧期”后),采样链趋于稳定。此时,我们可以利用最后一批采样结果来估计我们关心的参数θ_d和φ_k。
- 文档-主题分布θ_d的估计:θ_dk = (n_{d,k} + α_k) / (∑{k'=1}^K n{d,k'} + α^T K),其中α^T K是α的各分量之和。这本质上是文档d中主题k的计数加上平滑项α后的归一化。
- 主题-词语分布φ_k的估计:φ_kt = (n_{k,t} + β_t) / (n_k + β^T V)。这本质上是主题k中词语t的计数加上平滑项β后的归一化。
通过以上步骤,我们就完成了对LDA模型中隐变量和参数的推断,得到了每篇文档的主题分布(θ_d)和每个主题下的词语分布(φ_k),从而实现了主题建模的目标。