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

本文探讨了推荐系统从评分预测问题向用户兴趣预测转变的过程,重点介绍了TopicModel及其相关算法(如pLSA和LDA)在处理非评分数据(如点击、观看等)中的应用,以及这些算法如何与矩阵分解、深度学习等技术相结合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考: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


<think>嗯,用户想了解常见的语义分布模型有哪些。我需要先回忆一下自然语言处理中相关的模型,特别是那些基于分布语义学的。首先,分布假设认为词语的语义由其上下文决定,所以基于这个假设的模型应该都是要考虑上下文的统计信息。 首先想到的是潜在语义分析(LSA),它通过矩阵分解来捕捉词语和文档之间的关系。然后是PLSA,也就是概率潜在语义分析,引入了概率模型。接下来应该是LDA,潜在狄利克雷分配,这是更高级的主题模型,用于发现文档中的主题结构。 还有Word2Vec,这个应该分为CBOW和Skip-Gram两种模型,利用神经网络来学习词向量。GloVe也是一个重要的模型,结合了全局矩阵分解和局部上下文窗口的优点。ELMo通过双向LSTM来生成上下文相关的词向量。再就是BERT,基于Transformer的预训练模型,能捕捉更深的上下文信息。还有像FastText,通过子词信息处理未登录词的问题。 需要确认这些模型的分类是否准确,比如LSA、PLSALDA属于基于矩阵分解或概率图模型,而Word2Vec、GloVe属于基于神经网络的模型。另外,像ELMo和BERT属于预训练语言模型,可能属于不同的类别。 可能还需要提到这些模型的优缺点,比如LSA无法处理一词多义,而BERT能处理上下文相关的语义。此外,是否遗漏了其他模型,比如FastText或者更近的模型如GPT系列?不过用户问的是常见的,可能不需要涵盖所有,但主要的一定要提到。 需要组织这些模型,分门别类地介绍,结构要清晰。比如分为基于矩阵分解的、基于概率图模型的、基于神经网络的,以及预训练模型。每个类别下列举几个模型,说明基本原理和特点。 还要注意使用正确的中文术语,比如“潜在语义分析”而不是“隐语义分析”。确保每个模型名称和对应的解释准确,没有混淆。比如PLSA是概率潜在语义分析,而LDA是潜在狄利克雷分配,属于主题模型,但都属于分布语义模型的一部分。 最后,检查是否有遗漏的重要模型,比如GloVe是否应该单独作为一类,或者归入神经网络?可能GloVe属于矩阵分解和窗口方法的结合,但通常和Word2Vec一起讨论。可能还需要简要说明每个模型的贡献和区别,帮助用户理解它们的演进和应用场景。</think>常见的语义分布模型旨在通过统计或神经网络方法,从文本数据中捕捉词语或句子的语义信息。以下是主要模型的分类及简介: --- ### **一、基于矩阵分解的模型** 1. **潜在语义分析(LSA/LSI)** - **原理**:对“词-文档”共现矩阵进行奇异值分解(SVD),降维后得到词和文档的潜在语义表示。 - **特点**:能缓解一词多义问题,但无法捕捉局部上下文信息。 2. **全局向量表示(GloVe)** - **原理**:结合全局词共现统计与局部窗口上下文,通过矩阵分解学习词向量。 - **公式**:优化目标函数为: $$ J = \sum_{i,j} f(X_{ij}) (w_i^T \tilde{w}_j + b_i + \tilde{b}_j - \log X_{ij})^2 $$ - **特点**:兼顾全局统计与局部上下文,适合中等规模语料。 --- ### **二、基于概率图模型的模型** 1. **概率潜在语义分析(PLSA)** - **原理**:假设文档由潜在主题生成,通过概率模型建模“文档-主题-词”关系。 - **公式**:文档中词的概率为: $$ P(w|d) = \sum_{z} P(w|z)P(z|d) $$ - **缺点**:未考虑文档级先验分布,可能过拟合。 2. **潜在狄利克雷分配(LDA)** - **原理**:引入狄利克雷先验分布,扩展PLSA为贝叶斯模型,可自动推断文档主题分布。 - **特点**:适合长文本主题挖掘,但计算复杂度高。 --- ### **三、基于神经网络的模型** 1. **Word2Vec** - **两种架构**: - **CBOW**:通过上下文预测中心词。 - **Skip-Gram**:通过中心词预测上下文。 - **特点**:高效生成高质量词向量,但无法处理未登录词。 2. **FastText** - **原理**:将词表示为子词(n-gram)向量的平均,解决未登录词问题。 - **公式**:词向量为: $$ w = \frac{1}{n} \sum_{i=1}^n v_{\text{subword}_i} $$ - **应用**:适合形态丰富的语言(如土耳其语)。 --- ### **四、基于预训练的语言模型** 1. **ELMo** - **原理**:基于双向LSTM生成上下文相关的词向量,融合多层语义。 - **特点**:解决一词多义问题,但训练速度较慢。 2. **BERT** - **原理**:基于Transformer编码器,通过掩码语言模型(MLM)和下一句预测(NSP)任务预训练。 - **公式**:注意力机制计算为: $$ \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$ - **优势**:支持双向上下文建模,适用于多种下游任务。 --- ### **五、对比与总结** | 模型类型 | 代表模型 | 优点 | 局限性 | |----------------|------------|-------------------------------|-----------------------------| | 矩阵分解 | LSA, GloVe | 可解释性强 | 难以捕捉复杂语义关系 | | 概率图模型 | PLSA, LDA | 适合主题建模 | 计算复杂度高 | | 神经网络 | Word2Vec | 高效且通用 | 静态词向量 | | 预训练模型 | BERT | 上下文敏感,泛化能力强 | 需要大量计算资源 | --- ### **六、应用场景建议** - **短文本相似度**:Word2Vec、FastText - **主题建模**:LDAPLSA - **上下文敏感任务**:BERT、ELMo - **资源受限场景**:GloVe、Word2Vec 希望以上分类和对比能帮助您选择合适的模型!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值