- 概述
LDA(Latent Dirichlet Allocation)中文为隐含狄利克雷分布,是一种概率主题模型。它可以将文档集中每篇文档的主题以概率分布的形式给出,即根据给定的一篇文档,推测其主题分布。
在LDA模型中,一篇文档生成的方式如下:
- 从狄利克雷分布α中取样生成文档i的主题分布θi
- 从主题的多项式分布θi中取样生成文档i第j个词的主题分布zi,j
- 从狄利克雷分布β中取样生成主题zi,j的对应词语分布Φzi,j
- 从词语的多项式分布Φzi,j中采样最终生成词语wi,j
LDA的图模型结构如下图所示:
- 前置概念
- Gamma函数
定义为
同时,Gamma函数可以看作阶乘在实数集上的延拓
- 二项分布
二项分布是从伯努利分布推进的。伯努利分布,又称两点分布或0-1分布,是一个离散型的随机分布,其中的随机变量只有两类取值(0,1)。而二项分布即重复n次的伯努利试验。
概率密度为
- 多项分布
多项分布是指单次试验中的随机变量的取值不再是0-1的,而是有多种离散值可能(1,2,3...,k),是二项分布扩展到多维的情况。
概率密度为
- Beta分布
对于问题1:
X(k)的分布即为一种Beta分布。
其概率密度为:
- Dirichlet分布
超过二维的Beta分布我们一般称之为狄利克雷(Dirichlet)分布。
其概率密度为:
- LDA贝叶斯模型
贝叶斯派思考问题的方式:
先验分布 + 样本信息 = 后验分布
- Beta-Binomial共轭
问题2:
解得此问题分布满足
问题2中第2点即样本信息,整个问题流程为
根据贝叶斯参数估计的基本流程,以上流程可写作:
- Dirichlet-Multinomial 共轭
是将Beta-Binomial共轭推广到多维形式。
例如问题2推广为问题3:
问题3第3点同样为样本信息,根据贝叶斯参数估计流程,上述问题同样可以表示为以下形式:
同样满足
先验分布 + 样本信息 = 后验分布
这种观测到的数据符合多项分布,参数的先验分布和后验分布都是Dirichlet 分布的情况,就是Dirichlet-Multinomial 共轭。换言之,至此已经证明了Dirichlet分布的确就是多项式分布的共轭先验概率分布。
- PLSA模型
- 文档生成
文档生成方式:
假设你要写M篇文档,由于一篇文档由各个不同的词组成,所以你需要确定每篇文档里每个位置上的词。
假定你一共有K个可选的主题,有V个可选的词,咱们来玩一个扔骰子的游戏。
- 假设你每写一篇文档会制作一颗K面的“文档-主题”骰子(扔此骰子能得到K个主题中的任意一个),和K个V面的“主题-词项” 骰子(每个骰子对应一个主题,K个骰子对应之前的K个主题,且骰子的每一面对应要选择的词项,V个面对应着V个可选的词)。
- 比如可令K=3,即制作1个含有3个主题的“文档-主题”骰子,这3个主题可以是:教育、经济、交通。然后令V = 3,制作3个有着3面的“主题-词项”骰子,其中,教育主题骰子的3个面上的词可以是:大学、老师、课程,经济主题骰子的3个面上的词可以是:市场、企业、金融,交通主题骰子的3个面上的词可以是:高铁、汽车、飞机。
- 每写一个词,先扔该“文档-主题”骰子选择主题,得到主题的结果后,使用和主题结果对应的那颗“主题-词项”骰子,扔该骰子选择要写的词。
- 先扔“文档-主题”的骰子,假设(以一定的概率)得到的主题是教育,所以下一步便是扔教育主题筛子,(以一定的概率)得到教育主题筛子对应的某个词:大学。
- 上面这个投骰子产生词的过程简化下便是:“先以一定的概率选取主题,再以一定的概率选取词”。事实上,一开始可供选择的主题有3个:教育、经济、交通,那为何偏偏选取教育这个主题呢?其实是随机选取的,只是这个随机遵循一定的概率分布。比如可能选取教育主题的概率是0.5,选取经济主题的概率是0.3,选取交通主题的概率是0.2,那么这3个主题的概率分布便是{教育:0.5,经济:0.3,交通:0.2},我们把各个主题z在文档d中出现的概率分布称之为主题分布,且是一个多项分布。
- 同样的,从主题分布中随机抽取出教育主题后,依然面对着3个词:大学、老师、课程,这3个词都可能被选中,但它们被选中的概率也是不一样的。比如大学这个词被选中的概率是0.5,老师这个词被选中的概率是0.3,课程被选中的概率是0.2,那么这3个词的概率分布便是{大学:0.5,老师:0.3,课程:0.2},我们把各个词语w在主题z下出现的概率分布称之为词分布,这个词分布也是一个多项分布。
- 所以,选主题和选词都是两个随机的过程,先从主题分布{教育:0.5,经济:0.3,交通:0.2}中抽取出主题:教育,然后从该主题对应的词分布{大学:0.5,老师:0.3,课程:0.2}中抽取出词:大学。
- 先扔“文档-主题”的骰子,假设(以一定的概率)得到的主题是教育,所以下一步便是扔教育主题筛子,(以一定的概率)得到教育主题筛子对应的某个词:大学。
- 最后,你不停的重复扔“文档-主题”骰子和”主题-词项“骰子,重复N次(产生N个词),完成一篇文档,重复这产生一篇文档的方法M次,则完成M篇文档。
pLSA是一种词袋模型,该模型假设一组共现(co-occurrence)词项关联着一个隐含的主题类别 。同时定义:
- 表示海量文档中某篇文档被选中的概率。
- 表示词 在给定文档 中出现的概率。
- 表示具体某个主题 在给定文档 下出现的概率。
- 表示具体某个词 在给定主题 下出现的概率,与主题关系越密切的词,其条件概率 越大。
利用上述的第1、3、4个概率,我们便可以按照如下的步骤得到“文档-词项”的生成模型:
- 按照概率 选择一篇文档
- 选定文档 后,从主题分布中按照概率 选择一个隐含的主题类别
- 选定 后,从词分布中按照概率 选择一个词
所以pLSA中生成文档的整个过程便是选定文档生成主题,确定主题生成词。
- 根据文档反推其主题分布
被涂色的d、w表示可观测变量,未被涂色的z表示未知的隐变量,N表示一篇文档中总共N个单词,M表示M篇文档
文档d和词w是我们得到的样本,可观测得到,所以对于任意一篇文档,其 是已知的。
从而可以根据大量已知的文档-词项信息 ,训练出文档-主题 和主题-词项 ,如下公式所示:
故得到文档中每个词的生成概率为:
由于 可事先计算求出,而 和 未知,所以 就是我们要估计的参数(值),通俗点说,就是要最大化这个 。
- 由于 和 未知,所以我们用EM算法去估计这个参数的值。
- 而后,用 表示词项 出现在主题 中的概率,即 ,用 表示主题 出现在文档 中的概率,即 ,从而把 转换成了“主题-词项”矩阵 (主题生成词),把转换成了“文档-主题”矩阵(文档生成主题)。
- 最终求解出 、 。
- LDA主题模型
- pLSA跟LDA的对比:生成文档与参数估计
在pLSA模型中,我们按照如下的步骤得到“文档-词项”的生成模型:
- 按照概率 选择一篇文档
- 选定文档 后,确定文章的主题分布
- 从主题分布中按照概率 选择一个隐含的主题类别
- 选定 后,确定主题 下的词分布
- 从词分布中按照概率选择一个词
对比下本文开头所述的LDA模型中一篇文档生成的方式:
- 按照先验概率 选择一篇文档
- 从狄利克雷分布(即Dirichlet分布) 中取样生成文档 的主题分布 ,换言之,主题分布 由超参数为 的Dirichlet分布生成
- 从主题的多项式分布 中取样生成文档 第j个词的主题
- 从狄利克雷分布(即Dirichlet分布) 中取样生成主题 对应的词语分布 ,换言之,词语分布 由参数为 的Dirichlet分布生成
- 从词语的多项式分布 中采样最终生成词语
从上面两个过程可以看出,LDA在PLSA的基础上,为主题分布和词分布分别加了两个Dirichlet先验。
继续拿之前讲解PLSA的例子进行具体说明。如前所述,在PLSA中,选主题和选词都是两个随机的过程,先从主题分布{教育:0.5,经济:0.3,交通:0.2}中抽取出主题:教育,然后从该主题对应的词分布{大学:0.5,老师:0.3,课程:0.2}中抽取出词:大学。
而在LDA中,选主题和选词依然都是两个随机的过程,依然可能是先从主题分布{教育:0.5,经济:0.3,交通:0.2}中抽取出主题:教育,然后再从该主题对应的词分布{大学:0.5,老师:0.3,课程:0.2}中抽取出词:大学。
那PLSA跟LDA的区别在于什么地方呢?区别就在于:
PLSA中,主题分布和词分布是唯一确定的,能明确的指出主题分布可能就是{教育:0.5,经济:0.3,交通:0.2},词分布可能就是{大学:0.5,老师:0.3,课程:0.2}。
但在LDA中,主题分布和词分布不再唯一确定不变,即无法确切给出。例如主题分布可能是{教育:0.5,经济:0.3,交通:0.2},也可能是{教育:0.6,经济:0.2,交通:0.2},到底是哪个我们不再确定(即不知道),因为它是随机的可变化的。但再怎么变化,也依然服从一定的分布,即主题分布跟词分布由Dirichlet先验随机确定。
进一步,可以发现:
pLSA中,主题分布和词分布确定后,以一定的概率( 、 )分别选取具体的主题和词项,生成好文档。而后根据生成好的文档反推其主题分布、词分布时,最终用EM算法(极大似然估计思想)求解出了两个未知但固定的参数的值: (由 转换而来)和 (由 转换而来)。
文档d产生主题z的概率,主题z产生单词w的概率都是两个固定的值。
举个文档d产生主题z的例子。给定一篇文档d,主题分布是一定的,比如{ P(zi|d), i = 1,2,3 }可能就是{0.4,0.5,0.1},表示z1、z2、z3,这3个主题被文档d选中的概率都是个固定的值:P(z1|d) = 0.4、P(z2|d) = 0.5、P(z3|d) = 0.1,如下图所示:
但在贝叶斯框架下的LDA中,我们不再认为主题分布(各个主题在文档中出现的概率分布)和词分布(各个词语在某个主题下出现的概率分布)是唯一确定的(而是随机变量),而是有很多种可能。但一篇文档总得对应一个主题分布和一个词分布吧,怎么办呢?LDA为它们弄了两个Dirichlet先验参数,这个Dirichlet先验为某篇文档随机抽取出某个主题分布和词分布。
文档d产生主题z(准确的说,其实是Dirichlet先验为文档d生成主题分布Θ,然后根据主题分布Θ产生主题z)的概率,主题z产生单词w的概率都不再是某两个确定的值,而是随机变量。
还是举文档d具体产生主题z的例子。给定一篇文档d,现在有多个主题z1、z2、z3,它们的主题分布{ P(zi|d), i = 1,2,3 }可能是{0.4,0.5,0.1},也可能是{0.2,0.2,0.6},即这些主题被d选中的概率都不再认为是确定的值,可能是P(z1|d) = 0.4、P(z2|d) = 0.5、P(z3|d) = 0.1,也有可能是P(z1|d) = 0.2、P(z2|d) = 0.2、P(z3|d) = 0.6等等,而主题分布到底是哪个取值集合我们不确定(为什么?这就是贝叶斯派的核心思想,把未知参数当作是随机变量,不再认为是某一个确定的值),但其先验分布是dirichlet 分布,所以可以从无穷多个主题分布中按照dirichlet 先验随机抽取出某个主题分布出来。如下图所示(图):
换言之,LDA在pLSA的基础上给这两参数( 、 )加了两个先验分布的参数(贝叶斯化):一个主题分布的先验分布Dirichlet分布 ,和一个词语分布的先验分布Dirichlet分布 。
综上,LDA真的只是pLSA的贝叶斯版本,文档生成后,两者都要根据文档去推断其主题分布和词语分布(即两者本质都是为了估计给定文档生成主题,给定主题生成词语的概率),只是用的参数推断方法不同,在pLSA中用极大似然估计的思想去推断两未知的固定参数,而LDA则把这两参数弄成随机变量,且加入dirichlet先验。
所以,pLSA跟LDA的本质区别就在于它们去估计未知参数所采用的思想不同,前者用的是频率派思想,后者用的是贝叶斯派思想。
好比,我去一朋友家:
按照频率派的思想,我估计他在家的概率是1/2,不在家的概率也是1/2,是个定值。
而按照贝叶斯派的思想,他在家不在家的概率不再认为是个定值1/2,而是随机变量。比如按照我们的经验(比如当天周末),猜测他在家的概率是0.6,但这个0.6不是说就是完全确定的,也有可能是0.7。如此,贝叶斯派没法确切给出参数的确定值(0.3,0.4,0.6,0.7,0.8,0.9都有可能),但至少明白在哪个范围或哪些取值(0.6,0.7,0.8,0.9)更有可能,哪个范围或哪些取值(0.3,0.4) 不太可能。进一步,贝叶斯估计中,参数的多个估计值服从一定的先验分布,而后根据实践获得的数据(例如周末不断跑他家),不断修正之前的参数估计,从先验分布慢慢过渡到后验分布。
- LDA文档生成
重复一下该模型生成文档的基本流程:
- 从狄利克雷分布α中取样生成文档i的主题分布θi
- 从主题的多项式分布θi中取样生成文档i第j个词的主题zi,j
- 从狄利克雷分布β中取样生成主题zi,j的对应词语分布Φzi,j
- 从词语的多项式分布Φzi,j中采样最终生成词语wi,j
该主题模型有以下特点:
主题分布(各个主题在文档中出现的概率分布)和词分布(各个词语在某个主题下出现的概率分布)是唯一确定的(而是随机变量),而是有很多种可能。
生成文档基本流程可解读为
- 对此模型,假定语料库中共有M篇文章,每篇文章下的Topic的主题分布是一个从参数为α的Dirichlet先验分布中采样得到的Multinomial分布,每个Topic下的词分布是一个从参数为β的Dirichlet先验分布中采样得到的Multinomial分布。
- 对于某篇文章中的第n个词,首先从该文章中出现的每个主题的Multinomial分布(主题分布)中选择或采样一个主题,然后再在这个主题对应的词的Multinomial分布(词分布)中选择或采样一个词。不断重复这个随机生成过程,直到M篇文章全部生成完成。
对照贝叶斯参数估计流程,可以将整个流程如下表示:
可看出生成主题,从主题生成单词的过程都是一种Dirichlet-Multinomial 共轭结构,由于LDA把要估计的主题分布和词分布看作是其先验分布是Dirichlet分布的随机变量,所以,在LDA这个估计主题分布、词分布的过程中,它们的先验分布(即Dirichlet分布)事先由人为给定,那么LDA就是要去求它们的后验分布。
- Gibbs采样算法求解LDA
LDA模型中,给定一个文档集合,词wi,j是可以观察到的已知变量,α和β是根据经验给定的先验参数,其他的变量主题zi,j,θ和φ都是未知的隐含变量,需要根据观察到的变量来学习估计的。
Gibbs采样算法的基本求解思路是:先求出wi,j,zi,j的联合分布,进而可以求出某一个词wi,j对应主题zi,j的条件概率分布。有了该条件概率分布,我们就可以进行Gibbs采样,最终在Gibbs采样收敛后得到第i个词的主题。如果我们通过采样得到了所有词的主题,那么通过统计所有词的主题计数,就可以得到各个主题的词分布。接着统计各个文档对应词的主题计数,就可以得到各个文档的主题分布。
根据概率论知识推导得主题和词的联合分布概率为:
某一个词wi,j对应主题zi,j的条件概率分布:
该公式右边就是
物理意义即在如下K条路径中(K个主题)采样:
训练流程(认为足够大样本下的频率等价于概率):
- 选择合适的主题数K, 选择合适的超参数向量α、β;
- 对应语料库中每一篇文档的每一个词,随机的赋予一个主题编号z;
- 重新扫描语料库,对于每一个词,利用Gibbs采样公式更新它的topic编号,并更新语料库中该词的编号。
- 重复第2步的基于坐标轴轮换的Gibbs采样,直到Gibbs采样收敛。
- 统计语料库中的各个文档各个词的主题,得到文档主题分布θi,统计语料库中各个主题词的分布,得到LDA的主题与词的分布Φzi,j。
当新文档出现时,为统计该文档的主题,此时我们的模型已定,也就是LDA的各个主题的词分布Φzi,j已经确定,我们需要得到的是该文档的主题分布θi。
算法流程如下:
- 对应语料库中每一篇文档的每一个词,随机的赋予一个主题编号z;
- 重新扫描语料库,对于每一个词,利用Gibbs采样公式更新它的topic编号;
- 重复第2步的基于坐标轴轮换的Gibbs采样,直到Gibbs采样收敛;
- 统计语料库中的各个文档各个词的主题,得到文档主题分布。