浅析LDA-主题模型

简介

关于LDA有两种含义,一种是线性判别分析(Linear Discriminant Analysis),一种是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA),本文讲后者。

主题模型

什么是主题模型?

以下我从维基百科上得到的一些信息:

主题模型(Topic Model)在机器学习和自然语言处理等领域是用来在一系列文档中发现抽象主题的一种统计模型。直观来讲,如果一篇文章有一个中心思想,那么一些特定词语会更频繁的出现。比方说,如果一篇文章是在讲狗的,那“狗”和“骨头”等词出现的频率会高些。如果一篇文章是在讲猫的,那“猫”和“鱼”等词出现的频率会高些。而有些词例如“这个”、“和”大概在两篇文章中出现的频率会大致相等。但真实的情况是,一篇文章通常包含多种主题,而且每个主题所占比例各不相同。因此,如果一篇文章10%和猫有关,90%和狗有关,那么和狗相关的关键字出现的次数大概会是和猫相关的关键字出现次数的9倍。一个主题模型试图用数学框架来体现文档的这种特点。主题模型自动分析每个文档,统计文档内的词语,根据统计的信息来断定当前文档含有哪些主题,以及每个主题所占的比例各为多少。
主题模型最初是运用于自然语言处理相关方向,但目前以及延伸至例如生物信息学的其它领域。

LDA解析

LDA的作用

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

    举个例子,有两个句子分别如下:

            “乔布斯离我们而去了。”

            “苹果价格会不会降?”

可以看到上面这两个句子没有共同出现的单词,但这两个句子是相似的,如果按传统的方法判断这两个句子肯定不相似,所以在判断文档相关性的时候需要考虑到文档的语义,而语义挖掘的利器是主题模型,LDA就是其中一种比较有效的模型。

在主题模型中,主题表示一个概念、一个方面,表现为一系列相关的单词,是这些单词的条件概率。形象来说,主题就是一个桶,里面装了出现概率较高的单词,这些单词与这个主题有很强的相关性。

怎样才能生成主题?对文章的主题应该怎么分析?这是主题模型要解决的问题。

首先,可以用生成模型来看文档和主题这两件事。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到的。那么,如果我们要生成一篇文档,它里面的每个词语出现的概率为:
这里写图片描述

这个概率公式可以用矩阵表示:
这里写图片描述

其中”文档-词语”矩阵表示每个文档中每个单词的词频,即出现的概率;”主题-词语”矩阵表示每个主题中每个单词的出现概率;”文档-主题”矩阵表示每个文档中每个主题出现的概率。

给定一系列文档,通过对文档进行分词,计算各个文档中每个单词的词频就可以得到左边这边”文档-词语”矩阵。主题模型就是通过左边这个矩阵进行训练,学习出右边两个矩阵。

主题模型有两种:pLSA(ProbabilisticLatent Semantic Analysis)和LDA(Latent Dirichlet Allocation),下面主要介绍LDA。

LDA-主题模型

按照wiki上的介绍,LDA由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出,是一种主题模型,它可以将文档集 中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题(分布)出来后,便可以根据主题(分布)进行主题聚类或文本分类。同时,它是一种典型的词袋模型,即一篇文档是由一组词构成,词与词之间没有先后顺序的关系。
此外,一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。
人类是怎么生成文档的呢?LDA的这三位作者在原始论文中给了一个简单的例子。比如假设事先给定了这几个主题:Arts、Budgets、Children、Education,然后通过学习训练,获取每个主题Topic对应的词语。如下图所示:
这里写图片描述
然后以一定的概率选取上述某个主题,再以一定的概率选取那个主题下的某个单词,不断的重复这两步,最终生成如下图所示的一篇文章(其中不同颜色的词语分别对应上图中不同主题下的词):
这里写图片描述

而当我们看到一篇文章后,往往喜欢推测这篇文章是如何生成的,我们可能会认为作者先确定这篇文章的几个主题,然后围绕这几个主题遣词造句,表达成文。LDA就是要干这事:根据给定的一篇文档,推测其主题分布。
通俗来说,可以假定认为人类是根据上述文档生成过程写成了各种各样的文章,现在某小撮人想让计算机利用LDA干一件事:你计算机给我推测分析网络上各篇文章分别都写了些啥主题,且各篇文章中各个主题出现的概率大小(主题分布)是啥。然而,就是这么一个看似普通的LDA,一度吓退了不少想深入探究其内部原理的初学者。难在哪呢,难就难在LDA内部涉及到的数学知识点太多了。
在LDA模型中,一篇文档生成的方式如下:

从狄利克雷分布 这里写图片描述 中取样生成文档 i 的主题分布 这里写图片描述
从主题的多项式分布 这里写图片描述 中取样生成文档i第 j 个词的主题 这里写图片描述
从狄利克雷分布 这里写图片描述 中取样生成主题 这里写图片描述 对应的词语分布 这里写图片描述
从词语的多项式分布 这里写图片描述 中采样最终生成词语 这里写图片描述

其中,类似Beta分布是二项式分布的共轭先验概率分布,而狄利克雷分布(Dirichlet分布)是多项式分布的共轭先验概率分布。
此外,LDA生成模型如下图所示(类似贝叶斯网络结构):
这里写图片描述
对于LDA生成模型的理解: 假定我们需要写一篇文档, 那么这个文章可能包含多个主题, 也就是说我们先要决定我们的文档由哪些主题构成, 这些主题所占的比例如何。 有了主题分布, 也就对应于这里写图片描述(每篇文档的主题分布), 有了主题分布, 我们就开始写文档, 在决定写一个单词的时候, 根据上图的模型, 先要由主题分布决定这个单词所属的topic, 然后有了这个单词的topic, 在根据每个topic下面的term的分布选择应该采用哪个单词。 这样重复这个过程就可以获得一篇有N个单词的文档。重复M次实验就会有M篇文档。
以上的简短的概括了LDA的主题思想,截下来介绍一下上面中所涉及到的几个分布。
二项分布、多项分布、beta分布、Dirichlet 分布

如果想要查看更详细的内容可以参照一下大师的博客详解以上的内容采用大师的详解:
http://blog.csdn.net/v_july_v/article/details/41209515#t34

常见的一个上帝扔骰子的例子:
《LDA数学八卦》一文中,对文档的生成过程有个很形象的描述:
这里写图片描述
图中一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。3 过程重复N次生成一篇含有N个词的文档,然后重复M游戏生成M篇文档。

    来看一个简单的例子**潜在狄立克雷分配**(Latent Dirichlet Allocation,LDA)主题模型是最简单的主题模型,它描述的是一篇文章是如何产生的。如图所示: 

这里写图片描述
从左往右看,一个主题是由一些词语的分布定义的,比如蓝色主题是由2%几率的data,2%的number……构成的。一篇文章则是由一些主题构成的,比如右边的直方图。具体产生过程是,从主题集合中按概率分布选取一些主题,从该主题中按概率分布选取一些词语,这些词语构成了最终的文档(LDA模型中,词语的无序集合构成文档,也就是说词语的顺序没有关系)。
如果我们能将上述两个概率分布计算清楚,那么我们就得到了一个模型,该模型可以根据某篇文档推断出它的主题分布,即分类。由文档推断主题是文档生成过程的逆过程。

LDA算法模型

unigram model

该模型使用下面方法生成1个文档:

 For each ofthe N words w_n: 
                Choose a word w_n ~ p(w);

其中N表示要生成的文档的单词的个数,w_n表示生成的第n个单词w,p(w)表示单词w的分布,可以通过语料进行统计学习得到,比如给一本书,统计各个单词在书中出现的概率。

这种方法通过训练语料获得一个单词的概率分布函数,然后根据这个概率分布函数每次生成一个单词,使用这个方法M次生成M个文档。其图模型如下图所示:
这里写图片描述
但是unigram model的方法的缺点就是生成的文本没有主题且过于简单!所以有了第二种方法。

Mixture of unigram

由于unigram model方法缺点是生成的文本没有文本主题,过于简单,mixture of unigram对其进行了改进,该模型使用下面方法生成一个文档:

choose a topic z ~ p(z);
for each of the N words w_n;
    choose a word w_n ~ p(w|z)

其中z表示一个主题,p(z)表示主题的概率分布,z通过p(z)按概率产生;N和w_n同方法一;p(w|z)表示给定z时w的分布,可以看成是一个k×V的矩阵,k为主题个数,V为单词个数,每行表示这个主题对应的单词的概率分布,即主题z所包含的各个单词的词频,通过这个概率分布按一定概率生成每个单词。
这里写图片描述
从上图可以看出,z在w所在的长方形外面,表示z生成一份N个单词的文档时主题z只生成一次,即只允许一个文档只有一个主题,这不太符合常规情况,通常一个文档可能包含多个主题。所以还有第三个方法

LDA(Latent Dirichlet Allocation)

LDA方法使生成的文档可以包含多个主题,该模型使用下面方法生成1个文档:

Chooseparameter θ ~ p(θ); 

For each ofthe N words w_n: 

                Choose a topic z_n ~ p(z|θ); 

                Choose a word w_n ~ p(w|z); 

其中θ是一个主题向量,向量的每一列表示每个主题在文档出现的概率,该向量为非负归一化向量;p(θ)是θ的分布,具体为Dirichlet分布,即分布的分布;N和w_n同上;z_n表示选择的主题,p(z|θ)表示给定θ时主题z的概率分布,具体为θ的值,即p(z=i|θ)= θ_i;p(w|z)同上。

这种方法首先选定一个主题向量θ,确定每个主题被选择的概率。然后在生成每个单词的时候,从主题分布向量θ中选择一个主题z,按主题z的单词概率分布生成一个单词。其图模型如下图所示:
这里写图片描述
从上图可知LDA的联合概率为:
这里写图片描述
把上面的式子对应到图上,可以大致按下图理解:

这里写图片描述
从上图可以看出,LDA的三个表示层被三种颜色表示出来:

    1. corpus-level(红色):α和β表示语料级别的参数,也就是每个文档都一样,因此生成过程只采样一次。

    2.document-level(橙色):θ是文档级别的变量,每个文档对应一个θ,也就是每个文档产生各个主题z的概率是不同的,所有生成每个文档采样一次θ。

    3. word-level(绿色):z和w都是单词级别变量,z由θ生成,w由z和β共同生成,一个 单词w对应一个主题z。

    通过上面对LDA生成模型的讨论,可以知道LDA模型主要是从给定的输入语料中学习训练两个控制参数α和β,学习出了这两个控制参数就确定了模型,便可以用来生成文档。其中α和β分别对应以下各个信息:

    α:分布p(θ)需要一个向量参数,即Dirichlet分布的参数,用于生成一个主题θ向量;

    β:各个主题对应的单词概率分布矩阵p(w|z)。

把w当做观察变量,θ和z当做隐藏变量,就可以通过EM算法学习出α和β,求解过程中遇到后验概率p(θ,z|w)无法直接求解,需要找一个似然函数下界来近似求解,原文使用基于分解(factorization)假设的变分法(varialtional inference)进行计算,用到了EM算法。每次E-step输入α和β,计算似然函数,M-step最大化这个似然函数,算出α和β,不断迭代直到收敛。

LDA的EM推导:
http://www.cnblogs.com/hebin/archive/2013/04/25/3043575.html

EM算法原理详解:
http://blog.csdn.net/pipisorry/article/details/42550815
http://www.chengxuyuans.com/Linux/88638.html

参考

参考博客:
http://blog.csdn.net/v_july_v/article/details/41209515#t34
http://blog.csdn.net/chixujohnny/article/details/51604563
http://cos.name/author/rickjin/
http://blog.csdn.net/huagong_adu/article/details/7937616
维基百科主题模型以及gamma函数:
https://zh.wikipedia.org/wiki/%CE%93%E5%87%BD%E6%95%B0
https://zh.wikipedia.org/wiki/%E4%B8%BB%E9%A2%98%E6%A8%A1%E5%9E%8B
隐含狄利克雷分布:
https://zh.wikipedia.org/wiki/%E9%9A%90%E5%90%AB%E7%8B%84%E5%88%A9%E5%85%8B%E9%9B%B7%E5%88%86%E5%B8%83

猜你喜欢

转载自blog.csdn.net/u011557212/article/details/53413726