LDA 和 PLSA

2014-07-03 10:34:05

主题模型是文本挖掘中一项重要的技术,它能够挖掘隐式主题,进而实现围绕主题的文本标注。
得到了这些主题相关的标注之后,后续的相关操作如文本组织、摘要、搜索都将大大简化。

LDA 是一种应用广泛的主题模型,物理意义直接,数学形式上也很优美,并且用的是贝叶斯学派的框架。
不过在谈 LDA 之前,我们首先需要了解 Probabilistic Latent Semantic Analysis (PLSA), 它是主题模型的基础。

PLSA

在 PLSA 的世界观中,一篇文档是个双层结构,第一层是主题,一篇文档里包含了若干个主题,第二层是词语,每个主题包含了若干个词语。
从文档 $d$ 生成词语 $w$ 的过程,就是先从文档生成主题 $z$,再从主题 $z$ 生成词语 $w$ 的过程。
假设这篇文档总共有 $N$ 个词, $K$ 个主题,并且词语都是独立的,那么用概率来描述这个生成模型的话:

$$ p(w|d) = \prod_{n=1}^N \sum_{k=1}^K p(w_n|z_k) p(z_k|d) $$

如果假设文档的独立性,我们也很容易写出整个语料的生成概率。PLSA 模型较简单,可以用 EM 算法来求解。

Dirichlet 分布

在讲 LDA 之前简单提一下 $\mbox{Dirichlet}$ 分布。
$\mbox{Dirichlet}$ 分布是贝叶斯统计里常用的一种先验分布,原因通常是因为它能够作为多项分布的共轭先验,
在贝叶斯推断中可以跳过很多复杂的计算,它的形式如下

$$ \theta =(\theta_1, \cdots, \theta_K), \qquad \theta_i \in (0,1), \qquad \sum_{i=1}^K \theta_i = 1 $$

$$ \alpha=(\alpha_1,\cdots,\alpha_K) $$

$$ p(\theta, \alpha) =
\frac{\Gamma(\sum_i \alpha_i)}{\prod_i \Gamma(\alpha_i)} \prod_i \theta_i^{\alpha_i - 1} $$

可以理解 $\mbox{Dirichlet}$ 是一个关于分布的分布,简单说来,从 $\mbox{Dirichlet}$ 抽样出来的多维向量 $\theta$ 仍然是一个随机向量,服从某个离散分布。
而 $\mbox{Dirichlet}$ 的参数 $\alpha$ 就是用来控制这个离散分布的概率密度的。
实际上在我之前的文章中谈到过 $\mbox{Beta}$ 分布,他是二项分布的先验,而 $\mbox{Dirichlet}$ 就是 $\mbox{Beta}$ 的进化版,它是多项分布的先验。

LDA

在 PLSA 模型中,每个词语按一定概率分布从某个主题中抽取,一篇文档按一定概率分布包含若干个主题,这些概率的参数都是固定的,然后用 EM 来求解。
而 LDA 呢,实际上就是把这个模型放到贝叶斯的框架下,把这些分布的参数也当成分布来看待,而参数的先验分布它选择了 $\mbox{Dirichlet}$,这给后来的计算带了许多的好处。

我们假设主题-文档的分布是一个 K 维的多项分布。具体地,一篇文章如果包含了 K 个主题,设每个主题占的比例为 $\theta_i$, 那么 $\sum_i \theta_i =1$,这个主题占的比例就是一个多项分布。
于此同时,我们假设主题本身是 V 维的$\mbox{Dirichlet}$ 分布。LDA 的模型如下图所示

其中

$z$ 表示词语-主题的分布, $\beta$ 是它的参数

$\theta$ 表示主题-文档的分布, $\alpha$ 是它的参数

$w$ 是我们观测到的文章中的词语

$N$ 是文章的词语数, $M$ 是词库中文章的个数。

这个模型可以这样来理解。 $\alpha$ 参数控制生成的主题-文档分布 $\theta$, 知道了这篇文档的主题分布后 $\theta$, 每次按多维高斯分布选择一个主题 $z_n$,然后从里面采样生成一个词语 $w_n$,采样的分布就是每个词语-主题分布 $z$,这样重复 $N$ 次,最终生成了我们所看到的包含 $N$ 个词的这篇文档 $w$。 写出来就是

$$ p(\theta, z, w | \alpha, \beta)
= p(\theta | \alpha) \prod_{n=1}^N p(z_n|\theta)p(w_n |z_n,\beta)$$

我们希望能够训练出模型的超参数 $\alpha,\beta$, 进而对于新的文档,我们能够估计出它的主题分布。
与 PLSA 不同,由于两个隐变量纠缠在一起,直接用 EM 求解是不太可能的。对于 LDA 的推断问题来讲,有两种主要的方法:

  1. Gibbs sampling

    初始化, 随机的给每个词 w 分配 $p(w|z, \beta)$

    在语料中用 Gibbs sampling 重采样, 更新 $p(w|z, \beta)$

    直到 Gibbs sampling 收敛, 计算 $\theta $

  2. Variational inference

    参考这里或者这里

Reference