转自:http://cos.name/2013/03/lda-math-lda-text-modeling/
5. LDA 文本建模
5.1 游戏规则
对于上述的 PLSA 模型,贝叶斯学派显然是有意见的,doc-topic 骰子m都对应到多项分布,所以先验分布的一个好的选择就是Drichlet 分布,于是我们就得到了 LDA(Latent Dirichlet Allocation)模型。
在 LDA 模型中, 上帝是按照如下的规则玩文档生成的游戏的
M 篇文档,所有的的word和对应的 topic 如下表示
其中, m 表示这些词对应的 topic 编号。
5.2 物理过程分解
使用概率图模型表示, LDA 模型的游戏过程如图所示。
这个概率图可以分解为两个主要的物理过程:
- n;
- n;
理解 LDA最重要的就是理解这两个物理过程。 LDA 模型在基于 K 个Dirichlet-Multinomial 共轭结构的。
由第一个物理过程,我们知道 m 对应于 Multinomial 分布, 所以整体是一个 Dirichlet-Multinomial 共轭结构;
前文介绍 Bayesian Unigram Model 的小节中我们对 Dirichlet-Multinomial 共轭结构做了一些计算。借助于该小节中的结论,我们可以得到
其中 .
由于语料中 M 个相互独立的 Dirichlet-Multinomial 共轭结构,从而我们可以得到整个语料中 topics 生成概率
目前为止,我们由K 个 Dirichlet-Multinomial 共轭结构在哪儿呢?在上帝按照之前的规则玩 LDA 游戏的时候,上帝是先完全处理完成一篇文档,再处理下一篇文档。文档中每个词的生成都要抛两次骰子,第一次抛一个doc-topic骰子得到 topic, 第二次抛一个topic-word骰子得到 word,每次生成每篇文档中的一个词的时候这两次抛骰子的动作是紧邻轮换进行的。如果语料中一共有 N 个word。于是上帝在玩 LDA 游戏的时候,可以等价的按照如下过程进行:
以上游戏是先生成了语料中所有词的 topic, 然后对每个词在给定 topic 的条件下生成 word。在语料中所有词的 topic 已经生成的条件下,任何两个 word 的生成动作都是可交换的。于是我们把语料中的词进行交换,把具有相同 topic 的词放在一起
其中,k。
对应于概率图中的第二个物理过程 ) 对应于 Multinomial 分布, 所以整体也还是一个 Dirichlet-Multinomial 共轭结构;
其中 .
而语料中 )
结合 (*) 和 (**) 于是我们得到
此处的符号表示稍微不够严谨, 向量 m 下标为文档编号。
5.3 Gibbs Sampling
有了联合分布 )。在 Gregor Heinrich 那篇很有名的LDA 模型科普文章 Parameter estimation for text analysis 中,是基于 (***) 式推导 Gibbs Sampling 公式的。此小节中我们使用不同的方式,主要是基于 Dirichlet-Multinomial 共轭来推导 Gibbs Sampling 公式,这样对于理解采样中的概率物理过程有帮助。
语料库t, 则由贝叶斯法则,我们容易得到
由于k个 topic,所以上式的条件概率计算中, 实际上也只会涉及到如下两个Dirichlet-Multinomial 共轭结构
- m
- )
其它的 t是独立的。
由于在语料去掉第k 的后验分布都是 Dirichlet:
使用上面两个式子,把以上想法综合一下,我们就得到了如下的 Gibbs Sampling 公式的推导
=
=
=
=
=
=
=
以上推导估计是整篇文章中最复杂的数学了,表面上看上去复杂,但是推导过程中的概率物理意义是简单明了的:t 就是对应的两个 Dirichlet 后验分布在贝叶斯框架下的参数估计。借助于前面介绍的Dirichlet 参数估计的公式 ,我们有
于是,我们最终得到了 LDA 模型的 Gibbs Sampling 公式
这个公式是很漂亮的, 右边其实就是 K 条路径中进行采样。
5.4 Training and Inference
有了 LDA 模型,当然我们的目标有两个
- 估计模型中的参数 M;
- 对于新来的一篇文档w。
有了 Gibbs Sampling 公式, 我们就可以基于语料训练 LDA 模型,并应用训练得到的模型对新的文档进行 topic 语义分析。训练的过程就是获取语料中的 ) 的样本,而模型中的所有的参数都可以基于最终采样得到的样本进行估计。训练的流程很简单:
对于 Gibbs Sampling 算法实现的细节,请参考 Gregor Heinrich 的 Parameter estimation for text analysis 中对算法的描述,以及 PLDA(http://code.google.com/p/plda) 的代码实现,此处不再赘述。
由这个topic-word 频率矩阵我们可以计算每一个n 个迭代的结果进行平均来做参数估计,这样模型质量更高。
有了 LDA 的模型,对于新来的文档 w就好了。
LDA 对于专业做机器学习的兄弟而言,只能算是一个简单的Topic Model。但是对于互联网中做数据挖掘、语义分析的工程师,LDA 的门槛并不低。 LDA 典型的属于这样一种机器学习模型:要想理解它,需要比较多的数学背景,要在工程上进行实现,却相对简单。 Gregor Heinrich 的LDA 模型科普文章 Parameter estimation for text analysis 写得非常的出色,这是学习 LDA 的必看文章。不过即便是这篇文章,对于工程师也是有门槛的。我写的这个科普最好对照 Gregor Heinrich 的这篇文章来看, 我用的数学符号也是尽可能和这篇文章保持一致。
这份LDA 科普是基于给组内兄弟做报告的 ppt
整理而成的,说是科普其实也不简单,涉及到的数学还是太多。在工业界也混了几年,经常感觉到工程师对于学术界的玩的模型有很强的学习和尝试的欲望,只是学
习成本往往太高。所以我写 LDA
的初衷就是写给工业界的工程师们看的,希望把学术界玩的一些模型用相对通俗的方式介绍给工程师;如果这个科普对于读研究生的一些兄弟姐妹也有所启发,只能
说那是一个 side effect 。
我个人很喜欢LDA ,它是在文本建模中一个非常优雅的模型,相比于很多其它的贝叶斯模型, LDA 在数学推导上简洁优美。学术界自 2003 年以来也输出了很多基于LDA 的 Topic Model 的变体,要想理解这些更加高级的 Topic Model, 首先需要很好的理解标准的 LDA 模型。在工业界, Topic Model 在 Google、Baidu 等大公司的产品的语义分析中都有着重要的应用;所以Topic Model 对于工程师而言,这是一个很有应用价值、值得学习的模型。我接触 Topic Model 的时间不长,主要是由于2年前和 PLDA 的作者 Wangyi 一起合作的过程中,从他身上学到了很多 Topic Model 方面的知识。关于 LDA 的相关知识,其实可以写的还有很多:如何提高 LDA Gibbs Sampling 的速度、如何优化超参数、如何做大规模并行化、LDA 的应用、LDA 的各种变体…… 不过我的主要目标还是科普如何理解标准的LDA 模型。
学习一个模型的时候我喜欢追根溯源,常常希望把模型中的每一个数学推导的细节搞明白,把公式的物理意义想清楚,不过数学推导本身并不是我想要的,把数学推导还原为物理过程才是我乐意做的事。最后引用一下物理学家费曼的名言结束 LDA 的数学科普:
What I cannot create, I do not understand.
— Richard Feynman