因为原文偶尔会出现访问不了的情况,所以特拷贝于此。
原文链接:http://www.wbrecom.com/?p=136
@吴宇WB
【前言】本篇文章中所涉及的大部分理论知识,都是由微博的推荐算法和广告算法团队共同收集,共同学习的,而现在这两个团队也合并成为一个更大的--推荐&广告算法团队。相信在未来我们会一起将推荐&广告算法做的更好,也欢迎更多机器学习狂热分子加入我们。
这个系列文章主要分为5章:
第1章介绍本文中涉及的基础算法和基础工具,包括EM,变分推断,Gibbs Sampling三个基本算法。两个用来训练LDA的工具:Vowpal Wabbit和LDA gibbs采样的源码。最后还有衡量LDA模型训练效果的PMI-score定义。
第2章介绍LDA相关的理论知识,包括LDA的基本思想,Inference过程和参数估计,以及速度更快的Online VBEM算法,最后详细介绍了如何用Gibbs Sampling来训练LDA。
第3章将解读ICML 2014的best paper,给我们的启示以及我们利用微博短文本做的相关实验,证明了Gibbs Sampling的效果要好于Online VBEM算法。
第4章重点介绍LDA目前在微博的内容推荐,用户推荐以及广告算法中的应用。
第5章介绍我了解的一些关于LDA在工业界和学术界的进展。
附:由于文章较长,我会分两期分享,第1期只有前3章的内容,第2期分享第4章和第5章。水平有限,如有错误,请及时指正。
目录
1. 一些基础算法和工具
1.1 EM算法
1.2 Variance Inference
1.3 Gibbs Sampling
1.4 Vowpal Wabbit
1.5 Gibbs Sampling源码
1.6 Point-Wise Mutual Information
2.LDA理论知识
2.1 Inference
2.2 Parameter estimation 参数估计
2.3 平滑
2.4 Online VBEM算法
2.5 Gibbs Sampling训练过程
3.利用微博短文本做的相关实验
3.1 Dirichlet分布的物理解释
3.2 ICML 2014 Best Paper解读
3.3 VBEM算法和Gibbs Sampling的实验结果对比
1. 一些基础算法和工具
LDA全称为Latent Dirichlet Allocation,在2003年由David M. Blei,Andrew Y. Ng和Michael I. Jordan三位大神提出来的【1】。在LDA的学习中发现涉及很多基础的算法,在本系列的第一章我会先简要的介绍这几种算法,包括EM,Variational inference,Gibbs Sampling,并介绍我们用来训练LDA的两个工具。
1.1 EM算法
EM全称为Expectation Maximization ,即期望最大化。用于含隐变量的极大似然估计。现定义符号如下:
观察到的数据集记为 X
隐变量记为 Z
待估计的参数记为 Θ
并令: Y =( X , Z )
在给定
X
的情况下,估计
Θ
的方法通常为极大似然估计,简称MLE:
但并不是每次都有解析解。当求解困难时就可以引入隐变量,利用EM算法来迭代求解,近似MLE过程。具体过程如下:
不断的重复,直到 Θ 收敛。那为什么EM算法能近似MLE过程呢?
令 L ( X | Θ ) =log P ( X | Θ ),
并利用Jensen's inequality: log(E[X]) ≥ E[log(X)] 。我们可以得到【3】:
即:
带入 L ( X | Θ ) =log P ( X | Θ ),可知:
也就是当我们step-by-step的增大 Q 更新 Θ ,实际上是在增大 L 的下界,从而实现了近似MLE的过程。如下图所示【2】:
可以看到EM算法只能得到一个局部的最优解。关于EM算法的进一步理解可以参考【2】的第9章,我也写过两篇相关的学习笔记【4】【5】。
1.2 Variance Inference
Variance Inference称为变分推断,它在LDA中主要用来近似后验概率分布。这里主要参考【6】,来解释一下变分推断的原理。除了在1.1节中定义的数学符号外,再定义分布 p 和分布 q ,两个分布之间的距离用 KL(q||p) 表示,根据KL距离的定义可知:
其中:
为了让观察到的数据集更好的拟合分布 p ,如果最大化 L(q) ,就会最小化 KL(q||p) (恒非负),其实就是令 q(Z) 最接近于 p(Z|X) ,从而实现了用分布 q 来近似隐变量后验概率分布的过程。如下图所示:
为了简化计算,假设变量之间互相独立,即:
将 L(q) 展开可知:
其中:
很显然令 L(q) 最大的方式,即令:
做一个归一化之后可知:
然后不断的迭代优化,直到收敛。
如果觉得公式理解有困难,可以把积分看成加和,即将连续变量看成离散变量,应该就比较容易能看懂了。
1.3 Gibbs Sampling
这个部分我主要参考的是腾讯的大牛@RickJin写的【7】,他和Yi Wang一起做了相当多的关于LDA的工作,也一直是走在前列的团队。我在这里简要的梳理一下Gibbs Sampling出现的来龙去脉,细节部分去看【7】就好了,写的非常好了。
对于给定的概率分布 p ,希望能生成符合该分布的样本,但有时该分布会因为高维而变得很复杂,并不好生成对应的样本。在1953年,Metropolis利用马氏链能收敛到平稳分布的性质,首次提出了基于Markov Chain Monte Carlo(马尔科夫蒙特卡洛,MCMC)的采样方法,简单的讲就是人为构造了细致平稳条件,假设 p 为分布, q 为转移矩阵, x,y 为样本,具体算法如下:
但有时,接收率
α
可能偏小,导致转移的概率变小,采样次数变多。为了增大接收率,就出现了Metropolis-Hastings算法,如下:
接收率还能再增大吗?Gibbs sampling 就是接收率为1的MCMC,这是高维分布的特性决定的。它的算法如下:
所以gibbs sampling的关键在于求得分布 p 。往往越强大的算法,可能是形式越简单。论文【8】给了Gibbs Sampling最直观的描述,就两步:
1.4 Vowpal Wabbit
简称为VW,作者为John Langford,是雅虎研发的开源机器学习系统。主要有三个模型:回归模型,矩阵分解模型,LDA模型。而且能兼容hadoop,做并行运算。
前些天在微博上也有一条讨论VW性能的微博,有兴趣的可以在我之前的大牛同事@haibo_mind的微博里面找到相关信息,里面也有他写的使用VW的一些文章:
源码下载:https://github.com/JohnLangford/vowpal_wabbit/wiki
VW中的LDA模型采用的是online VBEM算法实现。训练文本格式如下:
需要word的序号,以及word的词频,但显然这个词频可以用任意表示word重要性的实数值来代替。
1.5 Gibbs Sampling源码
这份代码是LDA Gibbs Sampling的c++版本实现,是Yi Wang写的,下载地址:http://code.google.com/p/ompi-lda/
支持单机多线程,也支持MPI。这份源码实现分布式的思想,可以参考Newman的论文【9】
训练数据的格式如下:
前面是序号,后面是词频。词频也可以换成表示词重要程度的整数值,如果取10,程序占用内存就会增大近10倍,所以这个值不宜过大。在我们的实验中,取1的效果就不错了。
搭建MPI也非常简单。找到几台可以互相ssh的机器,根据【10】中的步骤就能搭建好了。
1.6 Point-Wise Mutual Information
简称为PMI,是用来判断LDA模型训练效果的指标。当我们训练完LDA模型时,会得到主题下词的分布,如下图(歌手的主题):
取前10个词(也可取更多,这里只是一个示例),组成词对,共45对。用如下公式就能计算出当前主题在测试集中的PMI score【12】:
其中: P ( wi , wj )为词对( wi , wj )在测试文本中出现的概率, P ( wi )为 wi 在文本中出现的概率。当然在计算PMI-score时也可不取均值,而采用中值。
2.LDA理论知识
先定义几个记号:
一篇文档由N个词组成: w =( ω1 , ω2 ,..., ωN )
一个语料由M篇文档构成: D ={ w1 , w2 ,... wN }
词表的大小: V
LDA是给文档建模的一种方法,属于生成模型,它的基本思想是认为一篇文档是由很多隐藏的主题构成的。它假设一篇文档是按如下方式产生的:
step 1:选择词的个数N,其中N由一个泊松分布产生
step 2:从参数为 α 狄里克雷分布中产生一个样本 θ ,满足 θ ∼ Dir ( α )
step 3 : 对于一篇文档中的每个词:
(a)选择一个topic zn 服从参数为 θ 的多项式分布,满足 zn ∼ Multinomial ( θ )
(b)从分布 p ( ωn | zn , β )选择词 ωn
其中β是一个k*V的矩阵,k为指定的topic个数,行是主题,列是词。从一个图模型的角度来看更直观:
于是,可以用如下的公式来表示生成一篇文档的概率:
2.1 Inference
当一个新的文本输入到主题模型LDA中,我们希望得到这个文本的隐主题分布,这个过程就称为Inference。用如下公式来表示,其中 w 代表新输入的文本:
但是这个概率分布不好求解,这时候可以用1.2节中提到的变分推断来用分布 q ( θ , z | γ , ϕ )来近似 p ( θ , z | w , α , β ),其中 γ 是Dirichlet的参数。而为了简化计算,将 θ 和 z 独立开来,如下图所示:
那为什么 θ 会服从Dirichlet分布呢?有两种解释方法:
第一种解释:根据1.2节变分推断中最后的结论可知,只要满足 lnq ( θ )= Ez [ p ( θ , z | w , α , β )] +const 即可用分布 q 去近似 p ( θ , z | w , α , β ),这个式子展开可以得出 θ 会服从Dirichlet分布。
第二种解释:Dirichlet分布和多项式分布是共轭先验的,所以如果 θ 的先验分为Dirichlet分布,那么后验也是Dirichlet分布。这也是为什么假设先验为Dirichlet分布的原因,可以简化模型。
接下来根据变分推断的原理,通过最小化两个分布的距离,求得 γ , ϕ :
其中D()表示KL距离。
根据1.2节的介绍,我们知道最小化KL距离,其实在最大化:
求导可知:
不断的迭代就能求出
γ
了。完整的公式推导可参照【1】的附录部分。
2.2 Parameter estimation 参数估计
到目前为止就涉及到2个参数 α , β ,其它都是隐变量。将每个文档当作一个样本,似然函数显而易见:
在这里隐变量为 θ , z ,令 Θ =( α , β ),很容易写出E步和M步:
但是在E步的计算过程中,需要使用2.1节中提到的variation inference来计算 γ , ϕ 。所以整个算法又称为VBEM算法。
由于β是一个矩阵,而且每个词在映射到所有主题的概率之和为1,所以对于β的估计是有条件的优化,使用朗格朗日乘子可得目标函数:
对β求导等于0可知:
同理,对于α则有:
求得α的迭代式为:
2.3平滑
我们之前提到过β是一个矩阵,它默认所有语料的词都在这个矩阵里面。但很显然这是不可能做到的,一旦出现不存在于矩阵中的词,在计算时就会出现概率为0的情况,所以我们要做平滑。在论文【1】中的做法是将β也作为隐变量,用另一个Dirichlet分布来生成这个矩阵,也就是词表中词是以一定的概率出现的,对于未出现的词也是存在一个先验概率的。如下图所示:
这样变分推断的公式里面就需要再加入一个隐变量β:
那在参数估计的时候,就变成了估计 λ , α 。仍旧是根据VBEM算法,可知:
2.4 Online VBEM算法
对于VBEM来估计参数,显然是一个batch的过程。对于文档个数很多时,时间复杂度会很大,在论文【11】中提出了一种online的思路:
论文【11】在Nature(100,000条)和Wikipedia(352,549条)上都做了关于online 和batch的实验:
左图是Nature上的结果,右图是在Wikipedia上的结果。实验表明速度上online要比batch快很多,在模型拟合效果上左图是online和batch很接近,右图是online要比batch好。
在VW工具包里面online和batch的实现都有,在VW训练命令行--minibatch选项就是用来调节batch的个数。
2.5 Gibbs Sampling训练过程
前面几节主要介绍了LDA模型用VBEM训练的过程,但当前的主流更偏向Gibbs Sampling,本节主要介绍如何用Gibbs Sampling来训练出主题模型的【8】。
其实主题模型就是一个矩阵,主题和词的矩阵,即本章开头提到的β。文档和主题的矩阵是附带出来的。
step1:
直接读伪代码,很容易理解,这一步就是给每个词随机一个主题。文档--主题矩阵和主题--词矩阵对应处加1。
step2:
最核心的步骤:对每个词用Gibbs Sampling采样出一个主题,并且更新文档--主题矩阵和主题--词矩阵。直到参数收敛为止。
之前在1.3节中已经提到过,Gibbs Sampling的核心就在于分布的计算,在主题模型LDA中就是要计算下式:
因为主题是离散的,故而如果得到词w在每个主题下的概率,很容易采得主题的样本。
例如:有3个主题,根据上式计算出词在三个主题下的概率分别为(0.2,0.3,0.5),那就分成3个区间(0,0.2)(0.2,0.5),(0.5,1),然后随机个服从(0,1)均匀分布的变量,假设为0.75,落在第3个区间,就给这个词映射到第3个主题。
3.利用微博短文本做的相关实验
本章主要介绍用微博短文本来训练LDA模型的一些实验。我选用了1000W条左右的优质微博,使用VW训练工具来训练LDA模型。训练格式如1.4节所述,下面我来展示一下我们逐渐优化结果的过程。
第一个版本,我只使用了TF,主题下的词分布如下:
上图的效果并不十分理想,然后我用TF-IDF再加归一化,效果就好很多了,《我是歌手》相关的人都聚出来了:
3.1 Dirichlet分布的物理解释
一枚均匀的硬币抛出第一次正面需要抛的次数符合几何分布。独立重复实验中成功的次数符合二项式分布。那如何解释狄里克雷分布呢?
假设一个盒子里最初有K种颜色的球各α个,每一次,从盒中随机取出一个球,把球放回,并且再向盒子中放进一个同样颜色的球。进行同样的操作N次,当N趋于无穷时,盒子中不同颜色的球数分布(K项分布)就服从Dirichlet分布。
所以α越大,分布越均匀。α越小,分布越不均匀。
3.2 ICML 2014 Best Paper解读
ICML 是 International Conference on Machine Learning的缩写,即国际机器学习大会。是机器学习的顶级会议。2014年在北京举办,Best Paper给了PKU的Phd,Jian Tang【13】。下面是相关的微博:
这篇论文非常有价值的部分在于它用实验揭示了语料大小D,文档词的长度N,topic大小K,α和β是如来影响LDA训练效果的,它采用了PMI来衡量模型好坏。
我选用了他在twitter(与微博的语料会比较接近)上的实验结果,来分析各个参数的影响。下图:
启示1:当N值,即文档长度很小时效果很差。但当N值很大时,效果也不会一直增大。所以文档长度不能太短,但也不宜过长。
启示2:训练语料的大小不能太小。
启示3:α和β值的大小,会决定文本在主题上分布的集中程度,词在主题中的分布集中程度。最终对LDA模型训练的效果造成非常大的影响。
3.3 VBEM算法和Gibbs Sampling的实验结果对比
实验工具:VBEM算法由1.4节所述的VW来实现。Gibbs Sampling算法由1.5节Yi Wang大神开发的工具实现。
我在本章开头提到的微博语料基础上,变换α和β值,得到了如下的一组结果:
α,β | 主题个数 | PMI Score |
0.01 , 0.005 | 150 | 0.54 |
0.1 , 0.1 | 150 | 0.43 |
0.5 , 0.5 | 150 | 0.71 |
可以看到PMI值最好的比最差的要多出65%,所以对于VBEM算法来训练LDA模型,调节α和β值是非常必要的。
对于同样的主题个数,我们采用Gibbs Sampling得到的模型效果如下:
α,β | 主题个数 | PMI Score |
0.01 , 0.005 | 150 | 1.17 |
0.1 , 0.1 | 150 | 1.19 |
0.5 , 0.5 | 150 | 1.17 |
对比于以上两个表,我们能得到两个结论:
1. 对于VBEM算法,α和β值初始值的设置对于模型最后的效果影响较大。而对于Gibbs Sampling算法,α和β值初始值对于模型的效果影响不大。
2. Gibbs Sampling的PMI-score要远高于VBEM算法。
但VBEM算法有个最大的优点就是训练速度超快,如果不是对模型效果精益求精的项目,用VW实现性价比还是很高的。
(未完待续,本期只分享前三章,第4章和第5章将在下期分享)
参考资料:
[1] David M. Blei , Andrew Y. Ng and Michael I. Jordan.Latent Dirichlet Allocation.2003
[2] 李航 . 统计学习方法
[3] Maya R. Gupta and Yihua Chen.Theory and Use of the EM Algorithm.2011
[4] http://blog.sina.com.cn/s/blog_62508b050101fey7.html
[5] http://blog.sina.com.cn/s/blog_62508b050101fuhy.html
[6] Pattern Recognition and Machine Learning
[7] @Rickjin LDA数学八卦
[8] Parameter estimation for text analysis
[9] Scalable Parallel Topic Models
[10] http://wuyanzan60688.blog.163.com/blog/static/12777616320132452036223/
[11]Online Learning for Latent Dirichlet Allocation
[12]David Newman.Improving Topic Coherence with Regularized Topic Models
[13]Understanding the Limiting Factors of Topic Modeling via Posterior Contraction Analysis . 2014
原文链接: http://www.wbrecom.com/?p=136