PLSA详解
pLSA的原理理解
首先,我们直接来看一下pLSA是一个什么东西,从简单入手。不去管参数计算的问题,先弄明白pLSA的目的再说。
pLSA其实不过是提出了一种关于人在写文章时的假设,一篇文章是由单词组成的,那么这些单词的产生过程是什么样的呢?pLSA认为就是人在写文章的时候会首先想到几个主题,那么这篇文章就是由这几种主题组成的。 比如:家,买东西,回忆,人生等等。当然,这几种主题在这篇文章中不可能是平均分配的,互相所占的比例不一样。
人在想到了这些主题以后就开始写出具体的单词,而在每种主题的影响下,每个单词出现的概率是不同的。例如在“家”这个主题下,“妈妈”,“爸爸”,等单词的出现概率肯定是大的,而“买东西”这个主题下,“价格”,“超市”等单词出现的概率就比较大。我们假设“家”,“买东西”,“回忆”,“人生”这四个主题在一篇文章中所占的比例分别为10%,20%,30%,40%。而“妈妈”这个单词在四个主题下出现的概率分别为:30%,1%,20%,10%的话,那么在整篇文章中,“妈妈”这个词出现的概率应该大致为:
10%*30% + 20%*1% + 30%*20% + 40%*10% = 13.2%
这就是pLSA所提出的模型最本质的东西,怎么样很简单吧。
还没有完事,说了这么多,我们到底是要做什么呢?我们到底想要得到一个什么结果呢?一定要记住,pLSA中关心的就是每篇文章中的每个主题的分布,和每个主题下单词的分布。我们已经假设这两个分布为多项分布了,我们可以利用这两个分布做很多事情,比如文章分类,热词提取等等,这就是pLSA的应用了。我们后面会结合程序和实验结果做详细的介绍的。那么我们现在任务就是怎么样才能求出来这两个概率分布。在此之前,为了计算方便,我们要把上面所说的用数学的形式表示出来。对数学语言的熟悉程度决定了一个人在学术上的高度。
在这之前先说一些废话,这里是我当时的一些疑惑的解释,希望能够对大家有帮助吧,有人可能会想到,文章的意思或者说是思路是有前后顺序的,可能文章开篇讲的是家,后来说了回忆,在回忆中的一小段讲了买东西,最后说了说人生,像pLSA这样把整个文章混成一起,难道正确吗?那么这里就要提出pLSA中最根本的一个假设,就是我们忽略文章的顺序问题,因为我们最终想要的是单词出现的概率,也忽略了其出现的顺序。这里我做一个比喻来解释就是,把一篇文章想象成一杯鸡尾酒,这杯鸡尾酒是由几种不同的酒混合而成的,而这几种不同的酒的配方是不同的,比如有的酒糖分(也就是某个单词)的含量高(就是出现的概率高),这些酒中的酒精,水,一些杂质等等的含量都不同。但是,我们最终得到的是这杯鸡尾酒,我们在乎的其实就是这杯鸡尾酒中不同成分(单词)的含量(频率)。无论你先加哪种酒,后加哪种酒,只要每种酒所占的比例是一样的,那么最终的这杯鸡尾酒中的各种成分的比例酒也是一样的。
pLSA的数学模型表示
那么下面我们就正式把pLSA模型用数学语言表示出来,为了大家方便,我这里所用的符号全部和《unsupervised learning by probabilistic latent semantic analysis》中的一致。先介绍一下要用到的变量吧:
总共用到了M个单词:
手里有N个文章:
总共涉及到了K个主题,z 代表主题:
下面是一些概率表达式及其意义:
表示第 i 篇文章中,第 k 个主题出现的概率
表示第 k 个主题下,第 j 个单词出现的概率
表示第 i 篇文章中,第 j 个单词出现的概率
并且存在这个关系:
这个就是最开始我们计算“妈妈”这个单词在一篇文章中出现的频率的计算过程的数学表示了
在一些文章中,比如《Unsupervised Learning by Probabilistic Latent Semantic Analysis》中还给出了这个概率:
表示选择一篇文章的概率,也是多项分布(这是我们的假设没有为什么),并且概率分布就是正比于文章的长度。比如总共有三篇文章,它们的长度分别为5,6,7那么选择第一篇文章的概率就是5/18,第二篇就是6/18,第三篇就是7/18。这个概率为什么会正比与文章的长度是可以证明出来的,因为只有这样的时候才能够使最大似然度达到最大。但我认为这个概率是没什么用的,理解起来也比较抽象,什么叫选择一篇文章的概率啊?我们为什么要随机选择一篇文章啊?我认为它唯一的用处就是在构造最大似然函数的时候,提供了一种数学上的完美的表达式,而我这里直接不用到这个概率来构造最大似然函数。所以就用不到这个概率了。
最大似然度求解和
关于最大似然原理我就不详细解释了,直接应用到这里的例子就是:和是有很多种可能的,如果我们找出来一种可能,能够使每一篇文章中的每一个单词的概率相乘后的结果比任何其他的可能都大的话,那么我们认为此时的和 的这种可能是最合理的。用数学的形式表达出来就是:
其中表示第 j 个单词在第 i 篇文章中出现的次数。那好,我们现在的目的就是找出一种和的解,使上面的这个式子的值最大。那么一般的做法就是先取对数,得到下面的形式:
比较直接的做法就是对每一个变量求偏导,使它们都等于0,然后联立方程组求解。但仔细观察这个式子会发现,这之中有一个和的对数,如果直接对某一个变量求偏导会使最后的结果里带有其他变量(在分母部分)而且形式很复杂,更不要提还有要联立求解了。(这相当于对一个非线性的多元方程的求解问题,这个问题不知道在数学上有没有求解的方法啊?)在这里我们用EM算法来解决这个问题。在这里我想额外说一下,因为可能会有人想到为什么不能用梯度下降的方法来解决这个问题呢?我的想法是,是可以的,其实我们现在的问题就是求一个多元函数的最大值吗,每个变量的偏导的形式又是可以得到的,当然是可以用梯度下降的方法来求。但为什么所有的pLSA都用的是EM算法而不用梯度下降呢?因为EM算法更加快速,而用梯度下降的话,偏导的计算量太大了。这只是根据我的理解做的推论,我并没有做实验来验证用EM算法求得的解和用梯度下降求得的解是否相同。
EM算法
EM算法已经被说过无数遍了,我刚开始有点看不懂这个方法,就是不知道EM算法的目的到底是什么。EM的目的就是为了找出这种具有隐式变量的最大似然度的解。(原文为:In such a setting, the EM algorithm gives an efficient method for maximum likelihood estimation.)完整的介绍在这里http://cs229.stanford.edu/notes/cs229-notes8.pdf,我这里只不过是把原文翻译过来,当然在翻译的过程中加入了自己的理解和想法。但还是希望大家可以去看看原文再回来读我的理解。一是,有的地方如果我想错了,会误导大家;二是,原文说的很精炼,而我说的很多其实是废话,是为了更加详细的解释。所以如果基础好的人看原文不仅会快,而且理解的会更深。
我们先抛开pLSA这个问题,找一个简单的问题来理解EM算法,然后再回来解决pLSA的问题。我在查找EM算法的过程中看到一个最常被提及的例子就是男女身高的问题,我这里就用数学的形式来表示这个问题。
首先先看一下没有隐式变量时问题是怎么样的:总共有200个学生,其中我们知道每个人的身高以及性别,现在我们又知道所有男生的身高符合一个高斯分布,所有的女生身高符合另一个高斯分布。那么求这两个高斯分布最有可能的形式(也就是分别的最有可能是什么了)。针对这个问题,我们其实可以分别针对男生和女生求解。那么首先我们把所有的男生都挑出来,假设正好有50个男生。我们用来表示每个男生的身高,i = 1,2,3……50。因为男生的身高是服从一个正态分布的,那么就有:
根据最大似然度原理,我们想要找出一组使得相应的最大似然函数最大(这个最大似然函数的形式就不给了,打公式好麻烦。。。)。如何能找到这组解呢?很简单,对两个变量求偏导,分别令其偏导函数等于0。联立求解,如果你真的算一下的话你会发现由于最后的最大似然函数是一个对数的和的形式。又因为有一个指数形式,最后的结果会变得非常简单,(简单写了一下,没有检查,如果我没算错的话最后的结果为:)
求得女生的方法,和这个是一样的。
弄明白这个问题以后,我们来看一下有隐式变量的时候问题会变成什么样,这个时候就用到EM算法了。这个隐式变量就是性别,我们用 z 来表示,显然z是一个二值变量(是男或是女),我们用 1 表示男,用 0 表示女。如果我们把性别从已知条件中删去后,怎么求得上面的呢?这个时候我们随便抽出一个人他的身高为的概率是多少呢?那我们首先应该判断我们抽到的是男生还是女生,如果是男生按男生的正态分布计算,如果是女生按女生的正态分布算,然后把这两个结果再根据不同的隐式变量 z 的概率分布进行加权平均:
这里的 z 是一个二项分布,如果它是一个多项分布的话就不仅仅是两个项相加了而是多个项相加。如果 z 的概率分布是连续的而不是离散的,那么就不是一个相加的形式而是一个积分的形式了。再回来,这个 z 的二项分布是我们新加入的,我们假设它的参数是:0<=<=1也就是说我们又有了一个未知量:
我们把上面的式子改写为一个离散条件下的一般形式:
每一个不同的 z 决定了x 属于不同的概率分布,z在这里像是作为标签一样的存在。这个式子就相当于上面的 x_i 的正态概率函数一样。和上面一样我们需要把所有的(200个)情况下的概率都相乘再取对数,来得到最大似然函数。这函数的最终形式是这样的:
注意这里出现了和的对数,这是很麻烦的。如果还是按照原来的做法对每个变量求偏导令其等于 0 以后再联立求解的话,这时的偏导数是十分麻烦的。那么我们需要另一种方法来求得这个式子的最大值,请大家一定一定不要忘记我们最根本的目的就是要求得一组使得上面这个式子的值达到最大。下面所要介绍的就是EM算法中最终要的对上面这个式子的变形和迭代更新算法,这其中会用到jessen不等式,我不会再去细说关于jessen不等式的东西了,但这个不等式是这里最核心的东西,如果没有这个不等式,这个算式的变形就毫无意义可言,迭代更新中也不能够证明能够最终获得最大值。所以如果对jessen不等式不熟悉的人还是去了解一下(很简单的)。
首先我们希望能够消除和的对数这种形式,那么可以有以下变形:
其中(1)能够变形到(2),还需要加上下面的条件:
通过这个两个条件而做的这个变形,其实就是Jessen不等式的等式成立时的条件。在这里其实即使不知道Jessen不等式,根据Q和P之间的正比关系,只要把P = C*Q,其中C是一个常数,带入回去就能看到两个式子是等价的了。而这里的 这时候其实是没有用的,它的用处在后面,这里大家先有个印象。可以看到现在和的对数变成了对数的和了。这里Q的意义为第 i 个人是男生/女生的概率,这里要注意一下Q与φ的区分,Q是指在知道是第 i 个人了以后,猜测他性别的概率,而φ是指随便抽出一个人猜测他性别的概率,那么很显然Q与φ之间是有关系的,其实φ就等于所有的Q加起来的平均,在后面的推导中我们也证明了这一点。这里关于Q还要再多说一点,就是对于Q的猜测可以是 soft guess 或者是 hard guess,soft guess 的意思就是每一个Q可以取到[0,1]区间内的任意一个值,也就是说我们可以认为一个人有0.6的概率是男生,0.4的概率是女生,而hard guess 就是我们只能从{0,1}中选择一个值,也就是说我们只能说一个人是男生还是女生,如果大家还记得K-means归类算法的话,就比较好理解hard guess的过程了。我们这里还是采用soft guess,这样在数学表达上比较方便,当然soft guess和hard guess在最后的结果上会有不同,不过当样本量很大的时候这种差别也就被忽略了。由(1)到(2)的这两个限制条件,我们可以求得Q与P(x,z)的具体关系:
这里的条件就被利用到了,而且现在我也可以说Q的意义就是在知道的第 i 个人的身高后,他是男生/女生的概率,注意这句话并不是废话,我们刚刚开始引入Q的时候,它的定义只是第 i 个人的性别的概率函数,与身高是无关的,而由于我们为了保证等号的成立,加上了Q与P成正比这一限制条件,才会最终得出这个结论的。
小小的总结一下我们的变形过程,就是引入一个变量Q,对Q做了一些约束,然后式子就可以等价的从和的对数的形式转变为对数的和的形式。再由这个对Q的约束条件,我们计算出了Q与P(x,z)的关系。当然如果你很厉害,在变形的第一步就直接能够看出来,如果在P(x,z)的上下同时乘一个P(z|x)的话就能变形为(2)的形式,那么也可以╮(╯_╰)╭。
那么我们现在的任务就是如何求(2)的最大值了,我们很高兴的看到现在算式的形式是对数的和,那么好,求偏导令它们等于0求解。很简单这样的思路行不通,因为要看到(2)和(1)是等价的,也就是说最后的偏导的形式也是等价的,我们已经知道(1)的偏导形式很复杂了,所以是行不通的,不信你可以求求看,如果有人真的去求过的话,可能会在Q对μ,σ,φ的求偏导的过程中有问题,那么这里我也先把Q的由这三个变量的具体计算公式写出来:
其中P_boy和P_girl 就是两个正态分布了,就不再展开了。看看就觉得复杂,怎么求偏导啊。。。。
所以我们采用下面的这个方法来求(2)的最大值,先不要质疑这种方法的正确性,后面我会证明的:
- 固定Q的值不变,最开始Q并没有值,那么我们就随便猜一下(也就是E 过程),换句话说就是为每个人随便定一个性别。而我们这里又是soft guess 所以其实我们是为每一个人确定了一种性别的可能性,例如每个人都0.5的可能性是男,0.5的可能性是女,也就是所有的Q(总共200*2个)都等于0.5。把这些常数代回到(2)中再对(2)对每个变量求偏导,使它们都等于0,再求解。这里只给出最后的运算结果(只有男生的,女生是一样的),不给过程了,大概的技巧就是先求 φ 的偏导,然后求 μ 的偏导,最后在求σ 得偏导,在求偏导之前先把常数项都挑出来,因为求偏导以后就为0了,先挑出来会比较容易计算。还有一点需要补充就是在对φ 求偏导的时候,需要保证其归一性,也就是0<=φ <=1,我们需要加上一个拉格朗日余项和一个拉格朗日系数,这个过程我会在pLSA的求解过程中给出的,这里就不细说了。(M 过程)
-
-
- 根据计算出来的φ,μ,σ 来重新计算Q的值,计算的公式已经在上面给出来了。(E 过程)
-
重复这两步,一直到(2)的值不再变大为止(也就是说收敛了),那么我们就认为找到了(2)的最大值,实际上这只不过是一个极值,也就是一个局部最大值,不一定是全局最大值,这也是EM算法的一个缺点,但是在这个问题中我们可以知道这是一个凸问题,也就是说只有一个极值,这个极值就是最大值,所以不用担心。但是在其他的情况下,如果用EM算法求解的话,多试几个起始点,然后去最大的那一种情况的解是一种有效的手段。
下面证明这种方法的有效性,证明思路是这样的,我们只需要证明在每连续两次的迭代过程中,(2)的值是单调递增的,如果在一次迭代的过程中发现(2)的值不再增加或者减小了,也就说明我们“路过”了最大值,这时可以近似的把最近一次迭代的值当做是最大值。下面证明单调性,为了表示方便,再引入几个符号:
表示第 t 次迭代后,(2)式的值
表示第 t 次迭代后,Q的值
表示第 t 次迭代后,P的值
这里(3)到(4)的不等关系是因为在迭代算法的第一步就是保持Q不变,改变P以至于使L最大,所以有这个不等关系。而(4)到(5)的不等关系是因为Jessen不等式的性质,具体来说就是因为Q(t)与P(t+1)不存在正比的关系,所以会有这个不等关系,具体的推导过程可以参见Jessen不等式的,再后面的变形能够成立是因为Q(t+1)与P(t+1)存在正比关系,因为我们在更新Q的时候就保证了这一点。最后证明了单调性。
小总结一下,我们通过一种迭代更新的方法不断的去使(2)的值越来越大,当某一次迭代过程中发现(2)的值不再变大,或者变小的时候我们就认为找到了一个(2)的极值,并且我们就认为这个极值就是最值(就这个问题而言就是这样的,然而换一个问题就不一定了)。在取到这个极值的时候,我们还能保证Q与P成正比关系,(否则的话(2)的值就可以再增加,为什么就不解释了,前面已经说过了其实)也就是说(2)式还是能够等价的变回(1)式。也就是说我们解决了最最开始想要解决的那个问题,就是找到(1)的最大值。
求得的也就是我们想要的最终结果。
解决pLSA的EM算法问题
终于把EM算法解释完了,现在就是把相同的算法应用在pLSA上了。多余的不说了,这里我只把几个关键的公式的推导过程写上来:
首先是从和的对数到对数的和的变形,以及Q的形式:
然后是Q确定后,求导公式,由于红线部分的是常数项,可以省略掉,所以真正需要求导的算式就变成了最后的形式。
在对每个P(w|z)和P(z|d)变量求导前,我们还同时需要保证P(w|z)和P(z|d)的概率归一性,也就是需要加上两个拉格朗日余项,关于拉格朗日余项的作用,这里不做具体的解释了。去看一下概率方面的书,很简单的。那么最后的形式应该是:
我们用L来代表这个式子。然后分别对P(w|z),P(z|d)求导,求导过程很简单,如果不知道怎么做,你不妨先试一下对P(w1|z1)求导,除了k=1,j=1时,其他情况下对其求导的结果都是0。最后的我这里只列出对P(w|z)求导的结果,P(z|d)是类似的。
令其等于0以后得到:
把α代回到(6)中,就可以解出来P(w|z)了:
把最后的P(z|d)的形式也给出来:
其中n(di)表示的是第 i 篇文章的长度。
迭代更新每一个P(wj|zk),P(zk|di)(总共N*K+M*K个)和Q,就可以得到最开始我们说的认为最合理的一组P(wj|zk),P(zk|di)的解。至此关于pLSA的所有的理论推导完全结束。(打公式好累)