5. LDA 文本建模框架
5.1 游戏规则机器学习
对于上述的 PLSA 模型,贝叶斯学派显然是有意见的,doc-topic 骰子θ→m和 topic-word 骰子φ→k都是模型中的参数,参数都是随机变量,怎么能没有先验分布呢?因而,相似于对 Unigram Model 的贝叶斯改造, 咱们也能够以下在两个骰子参数前加上先验分布从而把 PLSA 对应的游戏过程改造为一个贝叶斯的游戏过程。因为 φ→k和θ→m都对应到多项分布,因此先验分布的一个好的选择就是Drichlet 分布,因而咱们就获得了 LDA(Latent Dirichlet Allocation)模型。ide
在 LDA 模型中, 上帝是按照以下的规则玩文档生成的游戏的学习
假设语料库中有 M 篇文档,全部的的word和对应的 topic 以下表示
优化
其中, w→m 表示第 m 篇文档中的词, z→m 表示这些词对应的 topic 编号。
5.2 物理过程分解atom
使用几率图模型表示, LDA 模型的游戏过程如图所示。url
这个几率图能够分解为两个主要的物理过程:
- α→→θ→m→zm,n, 这个过程表示在生成第m 篇文档的时候,先从第一个坛子中抽了一个doc-topic 骰子 θ→m, 而后投掷这个骰子生成了文档中第 n 个词的topic编号zm,n;
- β→→φ→k→wm,n|k=zm,n, 这个过程表示用以下动做生成语料中第m篇文档的第 n个词:在上帝手头的K 个topic-word 骰子 φ→k 中,挑选编号为 k=zm,n的那个骰子进行投掷,而后生成 word wm,n;
理解 LDA最重要的就是理解这两个物理过程。 LDA 模型在基于 K 个 topic 生成语料中的 M 篇文档的过程当中, 因为是 bag-of-words 模型,有一些物理过程是相互独立可交换的。由此, LDA 生成模型中, M 篇文档会对应于 M 个独立的 Dirichlet-Multinomial 共轭结构; K 个 topic 会对应于 K 个独立的 Dirichlet-Multinomial 共轭结构。因此理解 LDA 所须要的全部数学就是理解 Dirichlet-Multiomail 共轭,其它都就是理解物理过程。如今咱们进入细节, 来看看 LDA 模型是如何被分解为 M+K 个Dirichlet-Multinomial 共轭结构的。
由第一个物理过程,咱们知道 α→→θ→m→z→m 表示生成第 m 篇文档中的全部词对应的topics,显然 α→→θ→m 对应于 Dirichlet 分布, θ→m→z→m 对应于 Multinomial 分布, 因此总体是一个 Dirichlet-Multinomial 共轭结构;
前文介绍 Bayesian Unigram Model 的小节中咱们对 Dirichlet-Multinomial 共轭结构作了一些计算。借助于该小节中的结论,咱们能够获得
其中 n→m=(n(1)m,⋯,n(K)m), n(k)m 表示第 m篇文档中第 k 个topic 产生的词的个数。进一步,利用 Dirichlet-Multiomial 共轭结构,咱们获得参数 θ→m 的后验分布刚好是
因为语料中 M篇文档的 topics 生成过程相互独立,因此咱们获得 M 个相互独立的 Dirichlet-Multinomial 共轭结构,从而咱们能够获得整个语料中 topics 生成几率
目前为止,咱们由M篇文档获得了 M 个 Dirichlet-Multinomial 共轭结构,还有额外K 个 Dirichlet-Multinomial 共轭结构在哪儿呢?在上帝按照以前的规则玩 LDA 游戏的时候,上帝是先彻底处理完成一篇文档,再处理下一篇文档。文档中每一个词的生成都要抛两次骰子,第一次抛一个doc-topic骰子获得 topic, 第二次抛一个topic-word骰子获得 word,每次生成每篇文档中的一个词的时候这两次抛骰子的动做是紧邻轮换进行的。若是语料中一共有 N 个词,则上帝一共要抛 2N次骰子,轮换的抛doc-topic骰子和 topic-word骰子。但实际上有一些抛骰子的顺序是能够交换的,咱们能够等价的调整2N次抛骰子的次序:前N次只抛doc-topic骰子获得语料中全部词的 topics,而后基于获得的每一个词的 topic 编号,后N次只抛topic-word骰子生成 N 个word。因而上帝在玩 LDA 游戏的时候,能够等价的按照以下过程进行:
以上游戏是先生成了语料中全部词的 topic, 而后对每一个词在给定 topic 的条件下生成 word。在语料中全部词的 topic 已经生成的条件下,任何两个 word 的生成动做都是可交换的。因而咱们把语料中的词进行交换,把具备相同 topic 的词放在一块儿
其中, w→(k) 表示这些词都是由第 k 个 topic 生成的, z→(k) 对应于这些词的 topic 编号,因此 z→(k)中的份量都是 k。
对应于几率图中的第二个物理过程 β→→φ→k→wm,n|k=zm,n,在 k=zm,n 的限制下,语料中任何两个由 topic k 生成的词都是可交换的,即使他们再也不同一个文档中,因此咱们此处再也不考虑文档的概念,转而考虑由同一个 topic 生成的词。考虑以下过程 β→→φ→k→w→(k) ,容易看出, 此时 β→→φ→k 对应于 Dirichlet 分布, φ→k→w→(k) 对应于 Multinomial 分布, 因此总体也仍是一个 Dirichlet-Multinomial 共轭结构;
其中 n→k=(n(1)k,⋯,n(V)k), n(t)k 表示第 k 个topic 产生的词中 word t的个数。进一步,利用 Dirichlet-Multiomial 共轭结构,咱们获得参数 φ→k 的后验分布刚好是
而语料中 K个 topics 生成words 的过程相互独立,因此咱们获得 K 个相互独立的 Dirichlet-Multinomial 共轭结构,从而咱们能够获得整个语料中词生成几率
结合 (*) 和 (**) 因而咱们获得
此处的符号表示稍微不够严谨, 向量 n→k, n→m 都用 n 表示, 主要经过下标进行区分, k 下标为 topic 编号, m 下标为文档编号。
5.3 Gibbs Sampling
有了联合分布 p(w→,z→), 万能的 MCMC 算法就能够发挥做用了!因而咱们能够考虑使用 Gibbs Sampling 算法对这个分布进行采样。固然因为 w→ 是观测到的已知数据,只有 z→是隐含的变量,因此咱们真正须要采样的是分布 p(z→|w→)。在 Gregor Heinrich 那篇颇有名的LDA 模型科普文章 Parameter estimation for text analysis 中,是基于 (***) 式推导 Gibbs Sampling 公式的。此小节中咱们使用不一样的方式,主要是基于 Dirichlet-Multinomial 共轭来推导 Gibbs Sampling 公式,这样对于理解采样中的几率物理过程有帮助。
语料库z→ 中的第i个词咱们记为zi, 其中i=(m,n)是一个二维下标,对应于第m篇文档的第 n个词,咱们用 ¬i 表示去除下标为i的词。那么按照 Gibbs Sampling 算法的要求,咱们要求得任一个坐标轴 i 对应的条件分布 p(zi=k|z→¬i,w→) 。假设已经观测到的词 wi=t, 则由贝叶斯法则,咱们容易获得
因为 zi=k,wi=t 只涉及到第 m 篇文档和第 k个 topic,因此上式的条件几率计算中, 实际上也只会涉及到以下两个Dirichlet-Multinomial 共轭结构
- α→→θ→m→z→m
- β→→φ→k→w→(k)
其它的 M+K−2 个 Dirichlet-Multinomial 共轭结构和zi=k,wi=t是独立的。
因为在语料去掉第i 个词对应的 (zi,wi),并不改变咱们以前讨论的 M+K 个 Dirichlet-Multinomial 共轭结构,只是某些地方的计数会减小。因此θ→m,φ→k 的后验分布都是 Dirichlet:
使用上面两个式子,把以上想法综合一下,咱们就获得了以下的 Gibbs Sampling 公式的推导
=
=
=
=
=
=
=
以上推导估计是整篇文章中最复杂的数学了,表面上看上去复杂,可是推导过程当中的几率物理意义是简单明了的:zi=k,wi=t的几率只和两个 Dirichlet-Multinomial 共轭结构关联。而最终获得的 θ^mk,φ^kt 就是对应的两个 Dirichlet 后验分布在贝叶斯框架下的参数估计。借助于前面介绍的Dirichlet 参数估计的公式 ,咱们有
因而,咱们最终获得了 LDA 模型的 Gibbs Sampling 公式
这个公式是很漂亮的, 右边其实就是 p(topic|doc)⋅p(word|topic),这个几率实际上是 doc→topic→word 的路径几率,因为topic 有K 个,因此 Gibbs Sampling 公式的物理意义其实就是在这K 条路径中进行采样。
5.4 Training and Inference
有了 LDA 模型,固然咱们的目标有两个
- 估计模型中的参数 φ→1,⋯,φ→K 和 θ→1,⋯,θ→M;
- 对于新来的一篇文档docnew,咱们可以计算这篇文档的 topic 分布θ→new。
有了 Gibbs Sampling 公式, 咱们就能够基于语料训练 LDA 模型,并应用训练获得的模型对新的文档进行 topic 语义分析。训练的过程就是获取语料中的 (z,w) 的样本,而模型中的全部的参数均可以基于最终采样获得的样本进行估计。训练的流程很简单:
对于 Gibbs Sampling 算法实现的细节,请参考 Gregor Heinrich 的 Parameter estimation for text analysis 中对算法的描述,以及 PLDA(http://code.google.com/p/plda) 的代码实现,此处再也不赘述。
由这个topic-word 频率矩阵咱们能够计算每个p(word|topic)几率,从而算出模型参数φ→1,⋯,φ→K, 这就是上帝用的 K 个 topic-word 骰子。固然,语料中的文档对应的骰子参数 θ→1,⋯,θ→M 在以上训练过程当中也是能够计算出来的,只要在 Gibbs Sampling 收敛以后,统计每篇文档中的 topic 的频率分布,咱们就能够计算每个 p(topic|doc) 几率,因而就能够计算出每个θ→m。因为参数θ→m 是和训练语料中的每篇文档相关的,对于咱们理解新的文档并没有用处,因此工程上最终存储 LDA 模型时候通常没有必要保留。一般,在 LDA 模型训练的过程当中,咱们是取 Gibbs Sampling 收敛以后的 n 个迭代的结果进行平均来作参数估计,这样模型质量更高。
有了 LDA 的模型,对于新来的文档 docnew, 咱们如何作该文档的 topic 语义分布的计算呢?基本上 inference 的过程和 training 的过程彻底相似。对于新的文档, 咱们只要认为 Gibbs Sampling 公式中的 φ^kt 部分是稳定不变的,是由训练语料获得的模型提供的,因此采样过程当中咱们只要估计该文档的 topic 分布θ→new就行了。
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