LDA话题模型与推荐系统

Neil Zhu,简书ID Not_GOD,University AI 创始人 & Chief Scientist,致力于推进世界人工智能化进程。制定并实施 UAI 中长期增长战略和目标,带领团队快速成长为人工智能领域最专业的力量。
作为行业领导者,他和UAI一起在2014年创建了TASA(中国最早的人工智能社团), DL Center(深度学习知识中心全球价值网络),AI growth(行业智库培训)等,为中国的人工智能人才建设输送了大量的血液和养分。此外,他还参与或者举办过各类国际性的人工智能峰会和活动,产生了巨大的影响力,书写了60万字的人工智能精品技术内容,生产翻译了全球第一本深度学习入门书《神经网络与深度学习》,生产的内容被大量的专业垂直公众号和媒体转载与连载。曾经受邀为国内顶尖大学制定人工智能学习规划和教授人工智能前沿课程,均受学生和老师好评。

前段时间学习Netflix的推荐系统的slides,学到一句话:“The Age of Search has come to an end. Long live the recommendation!”

仔细想想确实很有道理,随着人们对移动设备的依赖增强,更多的时候最靠近的设备就是手机了。在手机这样一个非常小的容器内(尤其是屏幕小),很多之前在电脑上能够获得曝光的信息被完全抛弃。所以推荐扮演着取代者的角色这个论断,我是相当信服的。不信,你可以自己观察一下使用智能设备的习惯,我想大多数人都会有同样的感受。

那么这和文章标题中提到的话题模型又有什么关系呢?稍安勿躁,待我慢慢说来。

推荐中一个关键的问题,就是找到用户的兴趣点。实际上可以看成是一个个的关键词,构成了一个喜好的关键词向量。每个人都拥有一个属于自己的向量v。那么我们去给这个用户推荐物品的时候,就应该遵循一个原则——尽可能地找到与这个用户的喜好向量相似的那些物品,然后推荐给这个人。在大规模的应用场景下,数亿的商品和数亿的用户有着千奇百怪的喜好向量,就产生了一个棘手的问题。

一般来说,我们会采用各种降维的方法来获得数据的压缩,抛去那些影响甚微的特征,留下主要的影响因子。这样可以有效滴解决数据的稀疏问题,并可以获得可以接受处理速度。

什么是话题模型(topic model)?

话题模型就是用来发现大量文档集合的主题的算法。借助这些算法我们可以对文档集合进行归类。适用于大规模数据场景。目前甚至可以做到分析流数据。需要指出的是,话题模型不仅仅限于对文档的应用,可以应用在其他的应用场景中,例如基因数据、图像处理和社交网络。这是一种新的帮助人类组织、检索和理解信息的计算工具。
通过这类算法获得的那些主题都可以比喻成望远镜不同的放大倍数。我们可以根据特定的情形设置可以看到的关注对象的精度;并且可以研究主题随着时间变化产生的相关变化。这样的思考方式对于很多场景都是有效的,例如在搜索时,我们可以把单纯使用关键词的相关性推进到结合主题的结果整合从而给用户更好的使用体验。

Latent Dirichlet Allocation

这是最简单的话题模型。LDA的直觉上认为文档有多个话题生成。这个过程也是LDA给出的文档生成过程。首先我们所做的事情都在词典的限定下,就是文档中出现的词都不会超出词典给出的范围。比如说,话题“基因”中以很高的概率包含若干关于基因的词,而话题“进化生物学”则会以很高概率包含进化生物学的相关词。我们假设这些话题在数据产生前已经确定了。现在在文档集合中的每个文档,我们来生成其中的文字。步骤如下:

  1. 随机选择话题之上的分布
  2. 对文档中的每个词
    2.1 从步骤1中产生的分布中随机选择一个话题
    2.2 从词典上的对应分布中随机选择一个词
    这个统计模型反应出文档拥有不同比例的话题(步骤1);每个文档中的每个词都是从众多话题之一中抽取出来的(步骤2.2),而被选择的话题是从针对每个文档的话题上的分布中产生的(步骤2.1)

在LDA中,所有的文档共有同样的话题集,但是每个文档以不同的比例展示对应的话题。LDA的主要目标是自动发现一个文档集合中的话题。这些文档本身是可以观测到的,而话题的结构——话题、每个文档的话题分布和每个文档的每个词的话题赋值——是隐藏的(可称为hidden structure)。话题建模的核心计算问题就是使用观测到的文档来推断隐藏话题结构。这也可以看作是生成(generative)过程的逆过程——什么样的隐藏结构可以产生观测到的文档集合?

借助LDA算法可以得到话题的结构,需要指出的是,算法本身并不需要用到这些话题的信息,文档本身也没有使用话题或者关键字进行标注。这个隐藏结构最有可能产生现在可以观测到的文档集合。

话题模型方便的地方就是可以通过推断的隐藏结构来组成文档的主题结构。这样的信息对于信息检索,分类和语料研究提供了有力的支撑。所以可以这样说,话题模型给出了一种管理、组织和标注文本的大量集合的算法解答。

LDA的定义和分析

LDA和其他一些话题模型从属于概率建模领域之下。生成概率建模中,我们的数据可以从一个包含了隐藏变量的生成过程中得到。这个生成过程定义了一个在已观测随机变量和隐藏随机变量之上的联合概率分布。我们通过使用联合概率分布来计算给定观测变量值下的隐藏变量的条件分布。这种条件分布也被叫做后验分布
LDA正好属于这个框架。已观测的变量就是那些文档中的词;隐藏变量就是话题模型;生成过程就是前面我们介绍的。而从文档来推断隐藏话题结构的问题就变成了计算后验分布的问题——计算给定文档后隐藏变量的条件分布。

现在我们可以形式化地描述LDA,话题是\beta_{1:K},其中每个\beta_k是在词典上的分布。第d个文档的话题比例是\theta_d,其中\theta_{d,k}是话题k在文档d中的比例。对第d个文档的话题赋值就是z_d,其中z_{d,n}是第d个文档的第n个词的话题赋值。最后,文档d观测到的词是w_d,其中w_{d,n}是在文档d中的第n个词,它是来自于我们给定的词典的。
使用这个表示方法,LDA生成过程对应于下面的隐藏变量和观测变量的联合分布:

p(\beta_{1:K},\theta_{1:D},z_{1:D},w_{1:D})
= \prod_{i=i}^k p(\beta_i) \prod_{d=1}^D p(\theta_d) (\prod_{n=1}^N p(z_{d,n}|\theta_d)p(w_{d,n}|\beta_{1:K},z_{d,n}))

这个分布给出一些依赖关系。例如,话题赋值z_{d,n}依赖于对每个文档的话题比例\theta_d和所有的话题\beta_{1:K}(从实施角度上看,这个项首先通过确定其代表的话题z_{d,n}而后在那个话题中查询w_{d,n}相应的概率)

正是这样依赖关系定义了LDA。他们由生成过程背后的统计假设给出,以一种联合分布的数学形式和针对LDA的概率图模型的方式确定了这些依赖关系。概率图模型提供了一个图形化的语言来描述概率分布的家族(family)。这些表示方法都可以描述LDA背后的概率假设。
后面我们会介绍一下LDA的推断算法。这里顺便提一下pLSI(probabilistic latent semantic analysis)。这个模型本身是LSA的概率版本,它揭示了SVD在文档-项矩阵上的作用。从矩阵分解的角度看,LDA同样可以看作是对于离散数据的PCA。

LDA的后验分布计算

现在就开始介绍LDA的后验分布的计算,也就是在给定观测文档下计算话题结构的条件分布。(这就是传说中的后验分布posterior)
其定义如下:

p(\beta_{1:K},\theta_{1:D},z_{1:D}|w_{1:D})
= p(\beta_{1:K},\theta_{1:D},z_{1:D}, w_{1:D}) / p(w_{1:D})

分子是所有变量的联合分布,这个可以从任何隐藏变量的设置下计算获得。分母则是观测值的边缘分布,这是在任何话题模型下看到观测到的语料概率。理论上可以通过对隐藏话题结构的每个可能的初始化求和来得到联合分布。
当然了,可能的话题结构是指数级大的,这个问题难解的(NP-hard)。正如很多现代概率模型那样,因为分母难以计算就使得我们很难计算出后验。所以现代概率模型研究的焦点之一就是设计出高效的近似方法。话题模型算法通常是通用近似后验分布方法的适配使用。
话题模型算法通过适配一种隐藏话题结构的分布来接近最终正确的后验。而主要的话题建模算法可以分成两种——基于采样的算法和变分算法。
基于采样的算法尝试从后验分布中搜集样本使用一个经验分布来近似它。最常用的采样算法是Markov chain——一个随机变量的序列,每个变量只依赖于前一个,其极限分布是我们需要的后验分布。Markov chain定义在对一个特定的语料的隐藏话题变量上,算法思想就是运行chain很长一段时间,从极限分布中搜集样本,接着使用搜集来的样本来近似分布。(常常,仅仅是一个有着最大概率的样本被搜集来作为近似的话题结构)。
变分方法是一个确定性的方式。变分方法没有去使用样本来近似后验,而是采用了一个在隐藏结构上的参数化的分布家族,接着找到家族中最靠近后验的那个成员。因此,推断问题就被转化为一个优化问题了。变分方法打开了一扇通向实用的概率建模的创新大门。
See Blei et al.8 for a coordinate ascent variational inference algorithm for LDA; see Hoffman et al.20 for a much faster online algorithm (and open-source software) that easily handles millions of documents and can accommodate streaming collections of text.

不严格地说,两种类型的算法都是在话题结构上的一种搜索。文档集合(模型中的观测到的随机变量)是确定的,并当作是一个搜索方向的指导。方法的优劣取决于所使用的特定的话题模型——除了我们前面一直讨论的LDA,还有其他的话题模型——这也是学术争论之源。

话题建模的研究

这个简单的LDA模型提供了一个强大的工具来发现和探索大量文档集合中的隐藏的主题结构。但是,在众多使用LDA建模的好处是,它可以嵌入到更加复杂的场景之中,从而达到更加复杂的目标。从LDA诞生起,它就被不断地扩展和适配。

松弛LDA的假设

LDA定义在统计假设上限定了语料。话题建模研究的一个活跃领域是如何松弛和扩展这些假设来揭示文档中的更加复杂的结构。
LDA作出的一个假设是词袋模型,在这种设定下,词的顺序是无关紧要的。当然我们自然的认知下,文档中的词之间存在着各种各样的规律,所以我们的目标是将这些特定的结构引入。对于更加复杂的目标——例如语言的生成——上述假设就很不合理了。现在也有一些建模方式把词的顺序设置为不可以调换的了。例如Wallach设计出一种话题模型可以在LDA和标准HMM模型之间进行转换。这些模型显著地扩展了参数空间,然而在语言建模性能上却有了一定的提升。
另一个假设是文档的顺序没有影响。这个假设在分析在较长一段时间内的文档集合时候就不是很合适了。在这样的文档集合下,我们可能希望假设话题随着时间而改变。针对这个问题的一个观点是动态话题模型——一个增加了对文档的顺序的影响因素,并给了一个比LDA更加丰富的后验话题结构
第三个假设是话题的数目已知并保持不变。Baysian无参数话题模型提供了一个漂亮的解法:话题的数目由在后验推断过程中的文档集合确定,并且新文档可展示出新的话题。Bayesian无参数话题模型已经被扩展到话题的层次中,这个模型可以找到一棵话题的树结构出来,从更加宽泛到更加具体的演进,这个结构是由数据推断出来的。
当然对于LDA还有其他的扩展方式,来松弛不同的模型做出的假设。相关的话题模型和pachinko allocation machine允许话题的出现展示关联(例如一篇关于地理的文档更加有可能与化学相关而不是体育);稀疏话题模型强化了话题分布上的未来结构;bursty话题模型给出了一个更加现实的词数。

Gibbs sampling (MCMC)

话题模型之于推荐系统

话题可以帮助用户发现新的内容。在推荐的过程中,引入话题作为影响推荐结果的因子之一。从而在某种程度上指导用户去选择感兴趣的话题,达到推荐最终的效果。


LDA.jpg

此图展示了隐藏空间的部分话题,他们是词典之上的分布,并且对每个文档来说都有这些话题的分布。左边的图是NYT中文档集合的50个话题的LDA模型的前3个话题。右边则是一个描述了关于7篇文档的在话题之上的分布的单纯形(simplex)。图中的空心点表示相应的文档处在话题空间中的具体的位置。

尽管我们一直关注着概率话题模型,这个领域最早却是开始于LSA(Latent semantic analysis)。LSA,pLSI的基础,使用线性代数将语料转化至潜在的主题。因为LSA源自心理学社区,早期的评价方式集中在使用LSA复制人类的行为或者判断:在标准测试中匹配性能,比较感官差异,和匹配症状的直觉。在信息检索中个,LSA是以作为一个Latent semantic indexing的方式被大家知晓,它可以将查询与文档进行匹配,将专家与专家领域匹配,甚至在给定并行语料的时候可以跨语言推广。

扯扯是有必要的,至少会让人们觉得这些深刻的理论都是从最原始很trivial的状态一点点地发展出来的。昨天又下了几篇 Michael I. Jordan关于Bayesian Modeling and Inference的论述,就明白这些东西从来不是空穴来风,某个人的灵光一现。跟随大师给我们指出的发展道路,就可以更好地理解理论本身。

拉回正道,LDA对于推荐到底用处在哪里呢?
话题模型实际上是一种语义上的理解,相比较于一些语法分析模型(诸如NLP中的HMM模型)是一种更加宏观文档描述。因为语法模型只能描述单独句子中的元素之间的关系,这对于真正了解作者的目的是帮助不大的。有了LDA,我们可以获知用户的偏好是哪些主题,这些主题是关键词相关的,最简单的方式就是拿这些关键词去搜索文章,获得的文章作为推荐的种子,然后根据用户阅读的记录来过滤已经读过并喜欢的文章。(这里没有排除已经读过并没喜欢的文章是因为我们随着时间的变化对于第一次读过的文章会有不一样的感受——个人感觉)

那从文章的角度看,LDA的作用就是提供较好的分类方式,根据潜在的话题将文章分类,然后产生与用户相似的文章集合,这些集合可以作为推荐的种子。(相信这样的推荐会更加合理,当然口说无凭,后面会做相关实验来验证这个思路。)

最近看到一篇文章使用LDA来做社区发现,这就引发了我的进一步思考(因为我之前使用博弈论来建模社区发现这个问题)。其实这些模型都是现实世界的抽象,使用了不同的形式来给出一个合理简易的对问题本身的描述。不少理论或者工具追根溯源都能找到相合的地方,这对于学习者本身是一个巨大的福音。正是这样的一致性,我们的思想不会被各种细节的技术或者专业的理论所割裂,这是对于形成一个没有冲突的整体思维方式有很大帮助的。(这种统一的思维方式能够产生让人平静的力量。静能生慧,这是一个很好的体验。)

LDA只是一个模型,那么对于模型,我们需要计算相关的解。推断本身又走回到了计算的殿堂中,之前种种的数学(概率论,随机过程、图论、Bayesian推断)都需要计算来完成最后那一步了。因为我们需要解决问题就必须有一个构造性的解出现,而不仅仅是证明解的存在性。比如说,看着看着,Bayesian推断到Decision理论,最终走到博弈论,博弈论又会有求解纳什均衡的问题,所以很多现实问题都会归一到计算。因此研究理论计算机还是相当重要的。这是一个认识世界的基石。

再拉回正道,推荐本身。推荐在于主动地发现用户希望看到的东西。通过计算机来做,的确会让有些人感到不自在,因为他们往往希望自己不要被打扰(同时会有很自傲的那种神情看待推荐的结果)。所以需要拐个弯来完成这样的诱导。但就我个人来说, 各类推荐的结果还是有一定的帮助的,可以让人了解更多一些,毕竟不是所有人都有那份专业精神来探索这个世界。推荐本身,应该更多地扮演一个导师的角色,最好是能教会用户探索本身的技能。所以说,算法本身的可解释性是很重要的一个方面。借助于对于一些简要过程的解释,可以教会人们一种高效的发现感兴趣的事物的方法(计算机的很多算法实际上都是从现实的经验中抽象出来,并固化成软件或者硬件的,这些方法确实是最为高效的方式来认识问题本身)。

所以我们会告诉你为什么给你推荐这些文章,你学习了后就会成为一个高效的信息发现者。

[待续]

参考:

  1. http://www.cs.princeton.edu/~blei/papers/Blei2012.pdf
  2. http://www.slideshare.net/xamat/recommender-systems-machine-learning-summer-school-2014-cmu
  3. http://www.cs.berkeley.edu/~jordan/courses/260-spring10/lectures/lecture1.pdf

推荐阅读更多精彩内容