一.问题描述

1.1文本建模相关

统计文本建模的目的其实很简单:就是估算一组参数,这组参数使得整个语料库出现的概率最大。这是很简单的极大似然的思想了,就是认为观测到的样本的概率是最大的。
建模的目标也是这样,下面就用数学来表示吧。
一开始来说,先要注意假设了一些隐变量z,也就是topic。每个文档都符合一个topic的分布,另外是每个topic里面的词也是符合一个分布的,这个似然是以文档为单位的。极大似然式子全部写出来是下面的样子的

其中的M表示文档个数。其中的α,就是每个文档符合的那个topic分布的参数,注意这个家伙是一个向量,后面会再描述;其中的β,就是每个topic里面的词符合的那个分布的参数,注意这个也是一个向量。
本来到这里看起来挺简单的,就是一个普通的极大似然估计,估计好参数α和β,就大功告成了。
如果是传统的极大似然估计,好办了,求个梯度,梯度为0的地方就是解了,这里这个东西偏偏多了个隐变量,就是每个词属于哪个topic的?还有每个文档属于哪个topic的?比如,每个文档的topic是怎么分布的(意思就是,每个文档是按概率属于各个topic的,当然,各个topic的词的分布情况是不一样的,比如有金融,电商两种topic,文档有可能是0.3的概率属于金融,0.7的概率属于电商),还有文档里面每个词有来自哪种类型的词的分布的(意思就是,每个词来自哪个topic的,每个topic里面的词分布不一致的,如金融topic里面“人民币”这个词的概率是0.7,“商品”这个词的概率是0.3;电商topic里面“人民币”这个词的概率是0.4,“商品”这个词的概率是0.6)。
这个玩笑就开大了,直接求解就玩不动了,只好用其他算法了。
候选的比较大众的求解有隐变量的算法有EM。
下面先把似然函数用全概率表示出来再做讨论吧。
假设一个文档w_m的topic分布(doc-topic分布)已知,用向量θ_m表示(这个向量的每一项的和为1,总体可以表示一个概率分布),每个词来自哪个topic已知,用z_(m,n)表示,每个topic的词分布用矩阵中的一行(topic-word分布)表示(这是一个K*V的矩阵,其中V表示语料库中的词的数量,第一行表示第一个topic里面的词分布)。
在已知上面的这些条件的情况下,计算一个文档的整个联合complete-data的联合分布(意思就是所以变量都已知的情况下)的式子如下
    (3)
中括号里面的是生成词的过程,大括号里面是生成文档的过程,最右边的那个概率就是∅的后验概率。注意z_m是一个向量,维度为Nm。
这么一堆东西,还是很复杂的,中间有这么多的奇怪的变量,计算起来的复杂读可想而知了,为了跟似然函数联系起来,通过对θ_m(doc-topic分布)和Φ(topic-word分布)积分,以及对z_(m,n)求和,得到只有w_m的边缘分布

(4)
那个累加号被去掉的原因是:在参数θ_m和φ_(z_(m,n) )都已知的情况下,一个词t被产生的概率是

(5)
这下好了,每个文档的似然概率有了,可惜没啥用,实际上这个边缘分布是求不出来的,因为z_(m,n)是隐藏变量,每个词都跟θ_m和Φ都跟z_(m,n)有关,那个连乘又是非常难用积分得到的,这个就是耦合现象。要注意联合分布和边缘分布对z乘积与加和的区别。另外,有些文献上是没有Φ相关的项的,这个看起来各种费劲,以后想清楚后回来解释。

1.1.1 概率公式相关讨论

对于公式(3),要多讨论点,这个是LDA模型的重要的东西,这里说为啥公式是长这个样子的。
先直接抄《LDA数学八卦》的例子,就是文档怎么生成的,直接截图如下

再不懂装懂,搞个概率图模型来看看。

最上面的那个公式代表的就是步骤2——先弄K个topic-word骰子,为了符合贝叶斯学派的口味,这个K个骰子是有先验分布的,先验分布就是一个Dirichlet分布,参数是β,具体在公式(3)中的表现为p(Φ|β)。
步骤3中,“抽取一个doc-topic骰子”,就是图下面的那个第一个水平的箭头,具体在公式(3)中表现为p(θ_m |α)。“投掷这个doc-topic骰子,得到一个topic编号z”这句话说的就是图下方第二个水平的箭头,具体在公式(3)中表现为p(z_(m,n) |θ_m)。步骤3中的第二步“选择K个topic-word骰子中编号为z的那个,投掷这个骰子,得到一个词”这句话说的是图右上角那个垂直的箭头,在公式(3)中具体表现为p(w_(m,n) |φ_(z_(m,n) ))。
就是这个过程,导致了公式(3)长成了现在这个样子,够复杂,而且够棘手,直接去搞公式(4)来计算似然基本没戏的。

1.1.2 似然函数求解

上面小节说过了,计算似然函数是没戏的。
大众候选算法还有EM,其实也不能解这样的问题,因为EM算法依赖条件概率

其中的矩阵Θ,就是doc-topic分布矩阵,是一个M*K的矩阵,只是这也是一个隐变量对应的参数,就是文档的topic的先验分布。
如果非要用EM算法,这里就需要利用另一个分布去拟合这个条件概率,这个就是变分法。变分法的基本思想就是:因为条件概率不好求,但是联合概率是已知的,就可以使用一种类似EM的方法,使用另外的一个概率函数去拟合要求的这个条件概率。具体资料以后再整理。
还好的是LDA没有把参数α和β作为求解的最终目标,目标另有其人。
这个什么极大似然,什么语言模型是个幌子。就像word2vec里面,其实目标是那些词向量,也就是那些参数值。用LDA来解,就更离谱了,连参数α和β这两个参数值都不是目标,而是那些隐变量对应的参数比较重要。
不管用什么方法求解,这个LDA的目的是要做推理。
其实需要求的东西其实是下面的式子
       (6)
第一个等号后面的分母p(w_m│α,β)就是上面公式(4)的那个值,参数θ_m(doc-topic分布)和Φ(topic-word分布)不见了是因为这两个量已经用观察到的w_(m,n)和对应的z_(m,n)求积分得到了跟这两个量无关的值,(论文上这个方法叫collapsed Gibbs Sampling,即通过求积分去掉一些未知变量,使Gibbs Sampling的式子更加简单),其实意思就是,参数θ_m和Φ已经使用MCMC的方法估算到了相应的值,估算的时候使用的样本就是训练样本,这里是一个奇怪的地方,有精力回来解释得容易理解点。
就算是这样,哪怕都搞走了这么多参数,分母也不见得好求,一篇文章光求和的项就有K^(N_m )个。
到了这一步,其实大家应该明白了,为啥(6)要表示成那样给大家看看,因为真的只是看看而已,还可以写成其他表现形式,但都不重要了,最后都会给出一个结论的,这个分母没法求,只好用其他办法了。
公式(6)这个条件概率就是要拟合出来的分布。当然,在拟合这个分布过程中,产生了副产品——所有文档的在各个topic上的分布。一旦α和β确定了,每个文档在各个topic上的分布可以直接得到,这个副产品才是求解的目的。
现在问题明确了,贝叶斯推理需要公式(6)的分布,拟合这个分布中产生的副产品是LDA产出的结果,有这结果就能用来做推理。

二.问题求解

2.1 LDA模型求解目标

上面说清楚了,求解LDA就是拟合公式(6)的那个分布,中间要把doc-topic分布矩阵和topic-word分布矩阵求出来。
论文总提到的方法是Gibbs Sample方法,下面就开始介绍。

2.1.1 LDA Gibbs Sample方法简介

这里介绍论文中的Gibbs Sample方法怎么拟合的。
这个Gibbs Sample方法也不多介绍,因为具体没弄得特别理解。只知道这个方法的具体步骤:假设观测到的变量是x,隐变量是z(这两个都是向量),通常需要整出来的都是条件概率p(z|x),只是这个条件概率比较难求,只知道了联合概率p(z,x)(必须知道),Gibbs Sample方法的处理方式就是构造下面的条件概率

使用上面的条件抽取z的R个样本z_r,r∈[1,R],当样本数量足够多的时候,条件概率可以用下面的式子近似了

其中的δ函数形式是

也就是,如果u是个0向量,就是1,否则是0.
解决的方案有了,还有个条件需要具备,就是联合概率。

2.1.2求联合概率

联合概率表示如下

这个联合分布是公式(3)利用积分去掉了参数θ_m(doc-topic分布)和Φ(topic-word分布)得到的,可以看到右边的式子,第一个概率跟α,第二个概率跟β无关。这样这两个概率就可以单独处理了。
先看第一个分布p(w|z,β),如果给定了一组topic-word分布Φ,这个概率可以从观测到的词中生成:

其中zi表示语料库中的第i个词的topic,wi表示语料库中的第i个词,W表示语料库中的词数。
意思是,语料库中的W个词是根据主题zi观察到的独立多项分布(我们把每个词看做独立的多项分布产生的结果,忽略顺序因素,所以没有多项分布的系数),就是一个多项式分布。注意φ_(z_i,w_i )是矩阵Φ中的第zi行第i列的元素,顺便提醒一下这个矩阵Φ其实就是LDA要学习的一个东西,是K*V的矩阵,K是topic数,V是词汇数;另一个LDA要学习的东西就是矩阵Θ,也就是doc-topic分布矩阵,是一个M*K的矩阵,矩阵的第一行表示第一个文档的topic分布。
把这个概率拆分到矩阵Φ的每一行和每一列去,得到下面的式子

其中n_(z,t)表示词t在topic z中出现的次数。
那么要求的第一个分布p(w|z,β),就可以通过对Φ的积分来求得

其中是一个V维向量,表示在topic z中,各个词出现的次数。
从这里看来,整个语料库就可以认为文档是K个独立的多项式分布生成的。
同样的,第二个分布p(z|α)也可以这么计算,给定了如果给定了一组doc-topic分布Θ,这个概率可以从语料库中的每个词的topic来得到

其中di表示第i个词来自哪个文档,n_(m,z)表示文档m中topic z出现的次数。
把这个概率根据矩阵Θ进行积分,就得到第二个分布表示了

其中是一个K维向量,表示在第m个文档中,各个topic出现的次数。
联合分布就变成了
     (7)

2.1.3求完全条件分布

根据上面的公式(7)就能得到Gibbs Sample方法所需要的条件分布
     (8)

其中第一个“=”号的分母,是因为根据(1.2.1)中,一个联合概率对zi做了积分得到的结果就是没有这个zi的边缘分布。表示这个向量没有第i列,t表示第t个词。
1、最后一步那个正比符号出现是因为右下角那一项对所有的zi都一样,无论有一个词分配到了那个topic, 都是一样的,而在Gibbs Sample方法中,同等放大是可以的,所以很多的程序实现都只计算这三项。
2、对于第m篇文档中的第n个词假设刚好就是语料库中的第t类词,它的topic是z,有两个性质可以使用。另外
利用这个式子,抽样就可以进行了。
要注意的是,i是要遍历整个topic空间的,即i从1到K,需要计算K个概率的。
这里的步骤就是不断迭代的,每次迭代都为每个词抽样一个新的topic,然后再根据每个词对应的topic情况估算doc-topic分布Θ和topic-word分布Φ。

2.1.4抽样后更新参数

抽样后怎么更新两个分布矩阵中的元素呢?
来点推导,对于语料库中的第i个词w_i=t,其topic为z_i=k,同时令i=(m,n),意义为该词为第m个文档的第n个词。
回到(1.1.1)中的概率图,

这个概率图分成两个物理过程来看:
,这个过程表示在生成第m 篇文档的时候,先从第一个坛子中抽了一个doc-topic骰子θ_m,然后投掷这个骰子生成了文档中第n个词的topic编号z_(m,n)=k。
,这个过程表示用如下动作生成语料中第m篇文档的第n个词:在上帝手头的K个topic-word 骰子Φ中,挑选编号为z_(m,n)=k的那个骰子φ_k进行投掷,然后生成词w_(m,n)=t。
对于第一个过程来说,α→θ_m→z_m这个过程会生成第m篇文档的所有tipic。《LDA数学八卦》说过,取先验分布为Dirichlet分布,所以前半部分对应于Dirichlet分布,θ_m→z_m就对应于Multinomial 分布。这样就构成了一个Dirichlet-Multinomial 共轭结构,如下图

利用这个共轭结构,可以得到参数θ_m的后验概率是,M个文档就有M个这样的共轭结构,其中n_m是一个K维向量,表示第m个文档中各个topic产生的词数。
由于LDA是一个bag-of-words结构,各个词之间都是可以自由交换的。比如说,在第一步中,可以先把所有文档的所有词的topic先全部生成,再把词一个个生成。这样的话,第二步也可以所有相同的topic放在一起,把相应的词生成。这样的话,对于topic k中的所有词来说,这一步就变成了,这样再看,前半部分对应于Dirichlet分布,后半部分对应于Multinomial 分布,整体构成一个Dirichlet-Multinomial 共轭结构,如下图

利用这个共轭结构,可以得到参数φ_k的后验概率是,K个topic就有K个这样的共轭结构,其中n_k是一个V维向量,表示第k个topic中的产生的各个词的数量。
具体为啥共轭机构会有这样的效果,具体参看《LDA数学八卦》,里面说得很清楚了。
根据论文《Parameter estimation for text analysis》中θ_(m,k) 和φ_(k,t) 的定义,计算参数矩阵这两个值的更新方式如下
    (9)
    (10)
这就得到了更新的式子,但是在实际代码中,往往需要在语料库去掉第i个词对应的(z_i,w_i),当然这不会改变分布的共轭结构,在去掉第i个词后,更新的式子变成如下的情况了。
    (11)
    (12)
公式(11),(12)还可以用来在Gibbs Sample方法中计算完全条件分布(如下
    (13)
这种方式就是《LDA数学八卦》选用的方式。
抽样的过程也要注意的,就是要把一个词属于每个topic的概率都计算完了,利用抛绣球的方式抽到了这个词的一个topic(抛绣球的方式就是:假如topic1的概率是0.2,topic2的概率是0.3,topic3的概率是0.5,那么就弄10个桶,1号和2号是topic1的,3到5号是topic2的,6到10号是topic3的,产生一个1到10的随机数(抛的过程),看落到哪个桶就是那个topic)。

2.2 LDA模型整体流程总结

经过上面的讨论,各个环节也算是整理了一遍,当然是选用了其他通用的方法,其实在拟合条件概率p(z│w,α,β)的方法也是有其他的,这里不打算多介绍了。
下面总结一下LDA模型的训练和推理过程,其实上面那么多的东西,要做的工作其实是能完成对一篇文档的topic分布的估算,无论是用判别模型来做,还是生成模型的方法来做,LDA其实就是解决了这么一个问题。而LDA是一个生成模型,要追溯样本当初来源的那个分布,这就导致了各种分布的拟合与假设,这个方面水比较深,有精力后回来再多解释。
对于目前文本建模的目标来说,是分两步的:
就是要根据当前语料库所有的文档,建立模型,模型建立和选最优往往是伴随着参数的获取得到的,就有了各种估计参数的方法;这一步可以称为训练过程。
有了最优的参数,模型也建立了,就需要对新来的文档,根据目前的参数,计算这个文档的topic分布,这一步可以成为预测过程,也就是推理过程。
借用《LDA数学八卦》的东西,这两步可以用下面的话描述:
估计模型中的两个参数:doc-topic分布矩阵Θ={θ_m }_(m=1)^M和topic-word分布矩阵Φ={φ_k }_(k=1)^K。
对于新来的一篇文档Dnew,能够计算这篇文档的topic分布θ_new。

2.2.1 LDA 训练过程

这个自己就不多写了,直接从《LDA数学八卦》截个图吧。

2.2.12LDA 推理过程

训练过程结束后,得到了参数doc-topic分布矩阵Θ={θ_m }_(m=1)^M和topic-word分布矩阵Φ={φ_k }_(k=1)^K。
第一个doc-topic分布矩阵对于推理来说并没有用处,在工程上一般不保存,但是,如果训练过程就是为了对已有文档进行处理,也可以保存下来就进行使用的。
第二个topic-word分布矩阵Φ={φ_k }_(k=1)^K在推理的时候需要用到。来了一个新文档后,根据Gibbs Sampling公式(13)(公式(8)也可以的)为每个词的topic进行抽样,最终稳定后就得到了这篇文档的topic分布θ_new,注意在利用公式(13)计算条件概率的时候,公式中的φ ̂_(k,t)保持不变。
直接从《LDA数学八卦》截个图吧。

到这,LDA模型基本的东西就完了。

三.未整理的符号说明

以上的符号很多,这里提供一个未整理的,只能大致应的,来自腾讯广告的博客“火光摇曳”。有精力后整理一个本文的吧。

原文:http://blog.csdn.net/mytestmy/article/details/39269105

文档主题生成模型(LDA)的更多相关文章

  1. LDA处理文档主题分布代码

    [python] LDA处理文档主题分布代码入门笔记  http://blog.csdn.net/eastmount/article/details/50824215

  2. spm使用之六安装别人写好的spm文档主题模板

    上回说到有个nico-one的文档主题模板, https://github.com/lepture/nico-one 把他可以下载了, 放到 C:\Documents and Settings\Adm ...

  3. spm使用之五修改spm自带文档主题模板

    spm自带的文档的主题模板, 其文件在C:\Documents and Settings\Administrator\.spm\themes 目录下, 有个叫做cmd 文件夹的. 其实 cmd这个文件 ...

  4. Confluence 6 文档主题合并问答

    在 Confluence 官方 前期发布的消息 中,文档主题在 Confluence 6.0 及其后续版本中已经不可用.我们知道你可能对这个有很多好好奇的问题,因此我们在这里设置了一个问答用于帮助你将 ...

  5. LDA(文档主题模型)

    LSA latent semantic analysis 映射词-文档到一个低维隐语义空间 比较词和文档在低纬空间的相似性 topic 是 Vocab 上的概率分布(符合多项式分布) 文档到主题的一个 ...

  6. NLP传统基础(2)---LDA主题模型---学习文档主题的概率分布(文本分类/聚类)

    一.简介 https://cloud.tencent.com/developer/article/1058777 1.LDA是一种主题模型 作用:可以将每篇文档的主题以概率分布的形式给出[给定一篇文档 ...

  7. vue框架muse-ui官网文档主题错误毕竟【01】

    在使用了element-ui后,总觉得不尽兴,再学一个响应式的muse-ui发现是个小众框架,但是我很喜欢. 指出官网文档里的主题使用描述错误. 首先,在vue-cli里安装raw-loader:np ...

  8. PowerDesigner(九)-模型文档编辑器(生成项目文档)(转)

    模型文档编辑器 PowerDesigner的模型文档(Model  Report)是基于模型的,面向项目的概览文档,提供了灵活,丰富的模型文档编辑界面,实现了设计,修改和输出模型文档的全过程. 模型文 ...

  9. 主题模型-LDA浅析

    (一)LDA作用 传统判断两个文档相似性的方法是通过查看两个文档共同出现的单词的多少,如TF-IDF等,这种方法没有考虑到文字背后的语义关联,可能在两个文档共同出现的单词很少甚至没有,但两个文档是相似 ...

随机推荐

  1. New Concept English three(21)

    27W 59 Boxing matches were very popular in England two hundred years ago. In those days, boxers foug ...

  2. TeamView

    1.TeamView TeamViewer是一个能在任何防火墙和NAT代理的后台用于远程控制,桌面共享和文件传输的简单且快速的解决方案.为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamV ...

  3. jfc在jsp页面画图,不将图片存在服务器端,只存入会话session(可用)

    jfc在jsp页面画图,不将图片存在服务器端,只存入会话session.其中主要用到jfc的一个servlet类. <%@ page contentType="text/html;ch ...

  4. 怎么解决安装SqlServer2008总是提示Restart computer as failed

    安装SqlServer2008总是提示Restart computer as failed,重启电脑依然报这个錯.解决办法是在cmd窗口中使用命令setup.exe /SkipRules=Reboot ...

  5. IE只是开始!

    Study is boring,but devotion make it is easy!

  6. 汇编语言---键盘KeyCode值列表

    键盘KeyCode值列表 收藏 keycode   0 =keycode   1 =keycode   2 =keycode   3 =keycode   4 =keycode   5 =keycod ...

  7. caffe学习4——net

    参考文献 1 The net jointly defines a function and its gradient by composition and auto-differentiation. ...

  8. 【排序】希尔排序,C++实现

    原创博文,转载请注明出处! 本文代码的github地址 # 基本思路       希尔排序是”直接插入排序“的改进版,也称为“缩小增量排序”.基本原理:先将待排序的数组元素分成多个序列,然后对每个子序 ...

  9. Java 多线程 2015/9/21

    http://lavasoft.blog.51cto.com/62575/27069   http://blog.csdn.net/aboy123/article/details/38307539   ...

  10. BZOJ4033 HAOI2015 树上染色 【树上背包】

    BZOJ4033 HAOI2015 树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白 ...