关于LDA, pLSA, SVD, Word2Vec的一些看法

来源:互联网 发布:windows7优化开机速度 编辑:程序博客网 时间:2024/05/17 09:02

参考:http://mp.weixin.qq.com/s?__biz=MzA4OTk5OTQzMg==&mid=2449231187&idx=1&sn=ecdb7cc4ddd8953bd0a48e8c14d8077a&mpshare=1&scene=1&srcid=0310tZN8SjNbDVd7f8cOFAEc#rd

Topic Model (主题模型)这个东西如果从99年Hofmann的pLSA开始算起,得火了有近20年了。这20年里出现了很多东西,这篇文章不准备对这些东西做细致的介绍,而是谈谈个人对这些模型的一些看法。首先,我先阐明观点,就是这些东西虽然看起来很不一样,但是在某一层面的本质上看差不太多。


因为我是做推荐系统的,我就从推荐系统这个角度去说吧。2009年参加Netflix Prize的时候,当时解决的是一个评分预测的问题。也就是每个用户给电影打了1~5分,然后让你去预测一个用户对一个电影会打多少分。这个时候就遇到一个矩阵,叫做user-item矩阵。这个矩阵中大量的元素都是missing的,而不missing的哪些pair都有一个1~5分的分数。整个比赛的目的就是去预测那些missing的pair如果不missing会是多少分。


在Netflix Prize之前,这个问题都是这么解决的,首先把missing的值都填上3分(也有其他策略,但这不是本文的重点),然后把user-item矩阵做SVD分解,选取最大的K个特征值对应的特征向量组成的矩阵,然后再乘起来。这个时候,那些missing的pair都变成了其他的分数,这个分数就是预估值。在Netflix Prize这个方法能work的原因是当时只有一个MovieLens数据集,那个数据集只有几百个用户和物品,这么做还是OK的。但到了Netflix Prize,数据集顿时到了几十万维的矩阵,群众们傻眼了,因为SVD分解是个O(n^3)的复杂度。


这个时候有个哥们忽然在Blog上发了一篇文章(他的那篇博客可能是学术论文引用最多的博客文章),说你们不用管那些missing的pair。你们就直接在不missing的pair上用梯度下降法学习user和item的latent factor的表示吧。于是有了那个著名的伪SVD算法:


r(u, i) = <p(u), q(i)>


于是整个Netflix Prize中涌现了一大堆带SVD的算法,比如RSVD,NSVD,SVD++等等。我也发明了几个SVD算法,因为照着这个思路太容易发散了。


但是,我一直觉得Netflix Prize其实误导了整个推荐系统的发展。当然应该说是更早的MovieLens就误导了,只是Netflix Prize没有纠正过来。这个误导就是,评分预测其实不是重要的问题,反而是一个很次要的问题。因为,当人民群众拿着Netflix Prize的算法准备用在自己的系统里时,顿时傻眼了,因为没有评分数据。他们有的只是观看数据,点击数据,购买数据等等。这些数据有一个特点,就是user-item矩阵中所有的非missing值,都是1。而不是Netflix Prize里面的评分。而且人们意识到,评分这件事有2个步骤:

  1. 看电影

  2. 评分


也就是说,如果用户连电影都不看,他是不会去评分的。于是,预测用户会看什么电影,并把这些电影推荐给他,显然比知道这个用户会看这个电影后,预测他看完会给多少分更重要。


但预测用户会看什么电影时,我们遇到了一个问题,就是如何对一个非missing值都是1的矩阵进行分解。这也是2012年KDD Cup的Track 2提出的问题。


这个时候,人们忽然发现,在NLP领域,做Topic Model时,遇到的doc-word矩阵,和我们遇到的这种user-item矩阵一样,都是非missing值都是1的矩阵(有人会说doc-word矩阵的值是tfidf,但本质上其实就是1)。而那个领域已经提出了2个算法来解决这个问题,就是著名的pLSA和LDA。这两个算法的训练复杂读都只取决于非0元素的个数,和0元素的个数都没有关系。于是很多人开始把这两个算法应用于推荐系统领域(其实之前在Netflix Prize就有人用了,但后来因为那个SVD算法太NB,大家都纷纷搞SVD去了)。


但是在2012年KDD Cup的时候。我们想,我们为什么不在0,1上训练SVD的模型呢?那是因为0太多了(这里0就是missing value)。既然0太多,我们采样吧。比如我们每遇到一个1,就随机采样出N个0,然后用SVD训练。那么我们怎么采样0呢?当时有两种候选:

  1. 纯随机的选择,也就是说如果一个用户看过K个item,我们就从所有item中随机选择 NK个他没看过的item作为负样本。

  2. 按照item的热门度去选,也就是说如果一个用户看过K个item,我们就从所有item中按照item的热门度随机选择 NK个他没看过的item作为负样本。


第2种更合理。这是因为,对于missing值来说,一个人没有看过一个电影,有两种可能:

  1. 他不知道有这个电影

  2. 他知道,但不喜欢


而对于热门的电影来说,是2个概率更高(当然这里还存在一种可能,就是他在其他平台上看过了,但这个在整体用户的统计意义上不高)。而我们的模型学习的就是兴趣,所以越可能是原因2的item,越应该作为负样本。这个算法就是Negative Sampling。


到这个时候为止,对于0-1矩阵的分解,我们有了2个武器,一个是贝叶斯学派的LDA,一个是频率学派的矩阵分解。我们知道,贝叶斯学派和频率学派有着各种各样的区别,如果从优化的角度去看,MCMC是贝叶斯学派的模型常用的优化方法,而梯度下降是频率学派常用的。


故事发展到这个阶段时,群众的目光忽然转向了。Topic Model的发展忽然转向了“我们需要更多的Topic”。之前,大家弄个几百个topic就非常高兴了,这个时候忽然有人说,我们要几百万个Topic。据说是因为google有个系统能学50万topic,非常NB。另外大家希望,topic多了就能学习出更多小的topic,表达更小众的语义。于是群众们开始干了。一开始大家是拿LDA开刀的。于是乎,LDA从12年开始,经历了SparseLDA, AliasLDA, LightLDA, WarpLDA的发展道路,到了15年底,已经能非常快的学100万topic了,而且这个快是靠直接降低理论的时间复杂度实现的,代码写的更好只是起了辅助作用。


  1. SparseLDA利用了如果topic很多,那么当模型快收敛时,一个word其实只会属于很少的topic,然后利用稀疏性来加速了算法。但这个算法有个致命的缺陷,就是初始化时,模型并不稀疏,因此迭代的前几轮会非常慢。当然充满智慧的群众发明了一堆奇技淫巧部分解决了这个问题。

  2. AliasLDA是优化了Gibbs Sampling采样的时间复杂度,利用Alias Table让对K个topic采样的时间复杂度从O(K)降低到O(1)。

  3. LightLDA修改了采用的分布,把原来基于一个word doc在topic上联合分布的采样过程,改成了2个交替进行的独立采样过程,一个只依赖word,另一个只依赖doc。

  4. WarpLDA做了更多的工程级别的优化,让LightLDA更快。


但后来,LDA一直没有大规模的火起来。这是因为不幸的又遇到了深度学习这股风,google在2013年提出了word2vec。word2vec本身不是一个很深的模型,他其实就是一个一层的模型。但这个模型的nb之处在于,他是频率学派的,支持梯度法优化,因此这一层可以插入到DL的网络中作为一层,和其他层一起做end-to-end的优化,LDA就没法这么搞。这样,大量的有监督的问题,用上word2vec后,效果顿时就超过LDA了。


word2vec刚出来时,我发现他在优化时用了霍夫曼编码来实现了层次化的SoftMax(HS)。当时我觉得他这么做有2个目的:

  1. 减少运算复杂度,如果是普通的SoftMax,其实就相当于在0-1矩阵的所有值上做矩阵分解,没有能利用到矩阵的稀疏性。

  2. 倾向于选择热门的item做负样本,因为霍夫曼编码是按照热门度对item编码的,越热门的item离根节点越近。


所以,HS真是太巧妙了。果然不出所料,2014年的时候,有群众提出,那我们直接用Negative Sampling吧。这样程序写起来简单。大家一试,发现效果还不错,并不比HS差,而且代码确实很容易写。


故事发展到这个阶段时,我们总觉得少了点啥。这个word2vec忽然跳出来就抢了LDA的饭碗,那么LDA最后搞的那些把topic提升到100万个的工作,貌似word2vec还没搞啊?我去google了一下,发现群众的智慧是无限的,果不其然,有人发现这个遗留问题了。Facebook的研究人员在一个标题为What's next, word2vec[1]的演讲中明确提出,稀疏表达是word2vec下一个要解决的问题。其实稀疏表达的前提就是topic要多。只有多了,才有可能学习出非常小的topic。


好吧,后面就让我们拭目以待吧。


读后思考:为什么Netflix Prize的评分问题可以只在不missing的value上训练,而不用管missing value?


参考资料:

[1] http://www.machinelearning.ru/wiki/images/d/db/MikolovWord2vecSlides.pdf


0 0
原创粉丝点击