潜在狄利克雷分布(LDA)主题模型的吉布斯采样推断过程
题目描述
潜在狄利克雷分布(Latent Dirichlet Allocation, LDA)是一种生成式概率模型,用于发现文档集合中的隐藏主题结构。给定一个包含多篇文档的语料库,每篇文档表现为一个词序列,LDA的目标是推断出两个核心隐藏结构:1)每篇文档的主题分布(即文档-主题矩阵);2)每个主题下的词语分布(即主题-词语矩阵)。由于模型包含复杂的隐变量(每个词对应的主题标签),精确推断其后验分布是难以处理的。因此,我们通常使用近似推断方法,如吉布斯采样(Gibbs Sampling)。本题要求详细讲解如何使用吉布斯采样算法来估计LDA模型的参数。
解题过程
第一步:理解LDA的生成过程与模型设定
LDA认为文档的生成遵循以下过程:
- 对于每个主题 \(k\)(从1到 \(K\)),从狄利克雷分布 \(\text{Dir}(\beta)\) 中采样一个主题-词语分布 \(\phi_k\)。
- 对于每一篇文档 \(d\)(从1到 \(D\)):
a. 从狄利克雷分布 \(\text{Dir}(\alpha)\) 中采样一个文档-主题分布 \(\theta_d\)。
b. 对于文档 \(d\) 中的每一个词的位置 \(n\)(从1到 \(N_d\)):
i. 从多项式分布 \(\text{Mult}(\theta_d)\) 中采样一个主题标签 \(z_{d,n}\)。
ii. 从多项式分布 \(\text{Mult}(\phi_{z_{d,n}})\) 中采样一个词 \(w_{d,n}\)。
其中,\(\alpha\) 和 \(\beta\) 是模型的超参数。
在吉布斯采样中,我们关注的是所有词的主题标签 \(\mathbf{z}\) 的联合后验分布 \(P(\mathbf{z} | \mathbf{w}, \alpha, \beta)\),其中 \(\mathbf{w}\) 是所有观测到的词。我们的目标是采样得到这个分布。
第二步:建立吉布斯采样的核心计数矩阵
由于 \(\theta\) 和 \(\phi\) 是隐变量,吉布斯采样通过积分将它们“消去”(Collapsed Gibbs Sampling),从而直接对主题标签 \(z_i\) 进行采样。为此,我们需要维护两个关键的计数矩阵:
- 文档-主题计数矩阵 \(n_{d,k}\):表示文档 \(d\) 中被分配给主题 \(k\) 的词的个数。矩阵大小为 \(D \times K\)。
- 主题-词语计数矩阵 \(n_{k,t}\):表示在整个语料库中,词语 \(t\)(词语表索引)被分配给主题 \(k\) 的个数。矩阵大小为 \(K \times V\),其中 \(V\) 是词语表的大小。
此外,我们还需要它们的行和:
- \(n_d = \sum_{k=1}^K n_{d,k}\):文档 \(d\) 中的总词数。
- \(n_k = \sum_{t=1}^V n_{k,t}\):被分配给主题 \(k\) 的总词数。
第三步:推导单个主题标签的条件概率分布
吉布斯采样的核心是依次对每个词 \(w_i\) 的主题标签 \(z_i\) 进行采样,其采样概率依赖于其他所有词的主题标签 \(\mathbf{z}_{-i}\)。这个条件概率公式为:
\[P(z_i = k | \mathbf{z}_{-i}, \mathbf{w}, \alpha, \beta) \propto \frac{n_{k, t}^{-i} + \beta}{n_k^{-i} + V\beta} \cdot \frac{n_{d, k}^{-i} + \alpha}{n_d^{-i} + K\alpha} \]
让我们来详细拆解这个公式:
- \(z_i = k\):我们正在考虑将当前词 \(w_i\) 分配给主题 \(k\)。
- \(\mathbf{z}_{-i}\):除了当前词 \(w_i\) 之外,所有其他词的主题标签。
- \(w_i = t\):当前词是词语表中的第 \(t\) 个词。
- \(n_{k, t}^{-i}\):在主题-词语计数矩阵中,除去当前词 \(w_i\) 后,主题 \(k\) 下词语 \(t\) 出现的次数。
- \(n_k^{-i}\):在主题-词语计数矩阵中,除去当前词 \(w_i\) 后,被分配给主题 \(k\) 的总词数。
- \(n_{d, k}^{-i}\):在文档-主题计数矩阵中,除去当前词 \(w_i\) 后,文档 \(d\) 中被分配给主题 \(k\) 的词数。
- \(n_d^{-i}\):文档 \(d\) 的总词数(减去1,因为排除了当前词)。
- \(\alpha, \beta\):超参数。
- \(K, V\):主题数和词语表大小。
公式的直观解释:
- 第一部分 \(\frac{n_{k, t}^{-i} + \beta}{n_k^{-i} + V\beta}\):这近似于给定主题 \(k\) 时,观察到词语 \(t\) 的概率,即 \(P(w_i = t | z_i = k, \mathbf{z}_{-i}, \mathbf{w}_{-i}, \beta)\)。它衡量的是主题 \(k\) “喜欢”词语 \(t\) 的程度。
- 第二部分 \(\frac{n_{d, k}^{-i} + \alpha}{n_d^{-i} + K\alpha}\):这近似于文档 \(d\) 属于主题 \(k\) 的概率,即 \(P(z_i = k | \mathbf{z}_{-i}, \alpha)\)。它衡量的是文档 \(d\) “喜欢”主题 \(k\) 的程度。
- 两者相乘:根据贝叶斯规则,一个词被分配到某个主题的概率,正比于该主题在文档中的比重乘以该主题生成该词的概率。
第四步:执行吉布斯采样算法
算法步骤如下:
-
初始化:
- 随机为语料库中的每一个词 \(w_i\) 分配一个随机的主题标签 \(z_i\)(从1到 \(K\) 中均匀随机选择)。
- 根据初始的主题分配,初始化两个计数矩阵 \(n_{d,k}\) 和 \(n_{k,t}\) 以及它们的行和 \(n_d\) 和 \(n_k\)。
-
迭代采样:
- 对语料库中的每一个词 \(w_i\)(属于文档 \(d\),词语索引为 \(t\))进行遍历:
a. 减计数:将当前词 \(w_i\) 从其旧主题 \(z_i^{\text{old}}\) 的计数中移除。
- \(n_{d, z_i^{\text{old}}} \leftarrow n_{d, z_i^{\text{old}}} - 1\)
- \(n_{z_i^{\text{old}}, t} \leftarrow n_{z_i^{\text{old}}, t} - 1\)
- \(n_d \leftarrow n_d - 1\)
- \(n_{z_i^{\text{old}}} \leftarrow n_{z_i^{\text{old}}} - 1\)
b. 计算条件概率:对于每个可能的主题 \(k\)(从1到 \(K\)),使用第三步中的公式计算概率 \(p_k\)。
c. 采样新主题:将计算出的 \(K\) 个概率值归一化,使其和为1,形成一个多项式分布。然后从这个分布中采样一个新的主题 \(z_i^{\text{new}}\)。
d. 加计数:将当前词 \(w_i\) 分配到新主题 \(z_i^{\text{new}}\) 中,更新计数矩阵。
- \(n_{d, z_i^{\text{new}}} \leftarrow n_{d, z_i^{\text{new}}} + 1\)
- \(n_{z_i^{\text{new}}, t} \leftarrow n_{z_i^{\text{new}}, t} + 1\)
- \(n_d \leftarrow n_d + 1\)
- \(n_{z_i^{\text{new}}} \leftarrow n_{z_i^{\text{new}}} + 1\) - 重复上述迭代过程,直到达到预设的迭代次数或模型收敛(即计数矩阵的变化很小)。
- 对语料库中的每一个词 \(w_i\)(属于文档 \(d\),词语索引为 \(t\))进行遍历:
第五步:从采样结果中估计模型参数
在吉布斯采样过程结束后(通常我们会丢弃最初的一些迭代,称为“燃烧期”),我们利用最后若干次迭代的平均计数来估计我们最终关心的两个参数矩阵:
- 估计文档-主题分布 \(\theta_d\):
\[ \hat{\theta}_{d,k} = \frac{n_{d,k} + \alpha}{n_d + K\alpha} \]
对于每篇文档 $ d $,其主题分布是一个 $ K $ 维向量。
- 估计主题-词语分布 \(\phi_k\):
\[ \hat{\phi}_{k,t} = \frac{n_{k,t} + \beta}{n_k + V\beta} \]
对于每个主题 $ k $,其词语分布是一个 $ V $ 维向量。
通过这个过程,我们就完成了对LDA模型中隐藏主题结构的推断。每个主题 \(k\) 可以由其 \(\phi_k\) 分布中概率最高的若干个词来表示其语义,而每篇文档 \(d\) 则可以由 \(\theta_d\) 分布来表示其主题构成。