继续学习推荐系统,还是推荐算法的部分。
因为我的学习是围绕《推荐系统实践》展开,这边书是12年写成的,所以一开始都是那年比较流行的算法模型,里面总共讲了三个算法,一个是协同过滤,一个是隐语义模型,一个图模型。图模型我觉得现在实际上用的比较少,所以我就只看了一下,这里不写出来了。后面我会研究一下深度学习在推荐系统的应用。
隐语义模型(LFM)
之前讲的协同过滤,不管是UserCF还是ItemCF,都是存在问题的。要么存在无法解释为什么给别人推荐这个物品的问题,要么就是效率比较低,做到实时推荐有点难,还有就是如果一个大热的商品,比如做书籍推荐,你会发现很多有不同喜好的人都会买《哈利波特》,那是不是要给每一个人都推荐《哈利波特》呢?
所以,还有一种推荐方法,可以对书和物品的兴趣进行分类,对于某个用户,首先得到他的兴趣分类,然后从分类中挑选他可能喜欢的物品,这样划分了小类,推荐的范围就更精准了,也不会出现一个大热商品不知道该怎么推荐的问题。
但是这里就引出了3个问题:
- 如何给物品进行分类?
- 如何确定用户对哪些的物品感兴趣,以及感兴趣的程度?
- 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?
为了解决这个问题,就有大佬提出了隐含语义分析技术,采取基于用户行为统计和自动聚类。这个技术有几个解决以上三个问题的地方:
- 隐含语义分析技术的分类来自对用户行为的统计,代表了用户对物品分类的看法。隐含语义分析技术和ItemCF在物品分类方面的思想类似,如果两个物品被很多用户同时喜欢,那么这两个物品就很有可能属于同一个类。
- 隐含语义分析技术允许我们指定最终有多少个分类,这个数字越大,分类的粒度就会越细,反正分类粒度就越粗。
- 隐含语义分析技术会计算出物品属于每个类的权重,因此每个物品都不是硬性地被分到某一个类中。
- 隐含语义分析技术给出的每个分类都不是同一个维度的,它是基于用户的共同兴趣计算出来的,如果用户的共同兴趣是某一个维度,那么LFM给出的类也是相同的维度。
- 隐含语义分析技术可以通过统计用户行为决定物品在每个类中的权重,如果喜欢某个类的用户都会喜欢某个物品,那么这个物品在这个类中的权重就可能比较高。
后来隐含语义分析技术延伸了很多著名的模型,比如pLSA,LDA等等。他的本质就是通过数据不同的特征,挖掘物品间隐性的关联,从而做到推荐。
概念讲完了,我觉得这里觉得应该注意很重要的一点,是关于样本问题。因为搜集推荐系统的样本,怎么弄到负样本这个是值得讨论的问题。这里这本书中提了4分方法,我按实际训练模型的效果排列出来,有人有专门的论文讲这个。
- 对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,但采样时,保证每个用户的正负样本数目相当。
- 对于一个用户,从他没有过行为的物品中均匀采样出一些物品作为负样本。
- 对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,但采样时,偏重采样不热门的物品。
- 对于一个用户,用他所有没有过行为的物品作为负样本。
书里给出的样本方法的原则是:
- 对每个用户,要保证正负样本的平衡(数目相似)。
- 对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。
一般认为,很热门而用户却没有行为更加代表用户对这个物品不感兴趣。因为对于冷门的物品,用户可能是压根没在网站中发现这个物品,所以谈不上是否感兴趣。
LFM的公式我就不贴了,看了一下也不难,说一下这个模型存在的问题。
首先,理论基础。LFM具有比较好的理论基础,它是一种学习方法,通过优化一个设定的指标建立最优的模型。基于邻域的方法更多的是一种基于统计的方法,并没有学习过程。
然后,离线计算的时间复杂度。假设有M个用户、N个物品、K条用户对物品的行为记录。那么,UserCF计算用户相关表的时间复杂度是O(N * (K/N)^2),而ItemCF计算物品相关表的时间复杂度是O(M*(K/M)^2)。而对于LFM,如果用F个隐类,迭代S次,那么它的计算复杂度是O(K * F * S)。那么,如果K/N > F*S,则代表UserCF的时间复杂度低于LFM,如果K/M>F*S,则说明ItemCF的时间复杂度低于LFM。在一般情况下,LFM的时间复杂度要稍微高于UserCF和ItemCF,这主要是因为该算法需要多次迭代。但总体上,这两种算法在时间复杂度上没有质的差别。
然后是实时推荐的问题。UserCF和ItemCF在线服务算法需要将相关表缓存在内存中,然后可以在线进行实时的预测。以ItemCF算法为例,一旦用户喜欢了新的物品,就可以通过查询内存中的相关表将和该物品相似的其他物品推荐给用户。因此,一旦用户有了新的行为,而且该行为被实时地记录到后台的数据库系统中,他的推荐列表就会发生变化。而从LFM的预测公式可以看到,LFM在给用户生成推荐列表时,需要计算用户对所有物品的兴趣权重,然后排名,返回权重最大的N个物品。那么,在物品数很多时,这一过程的时间复杂度非常高,可达O(MNF)。因此,LFM不太适合用于物品数非常庞大的系统,如果要用,我们也需要一个比较快的算法给用户先计算一个比较小的候选列表,然后再用LFM重新排名。另一方面,LFM在生成一个用户推荐列表时速度太慢,因此不能在线实时计算,而需要离线将所有用户的推荐结果事先计算好存储在数据库中。因此,LFM不能进行在线实时推荐,也就是说,当用户有了新的行为后,他的推荐列表不会发生变化。
最后关于可解释性。ItemCF算法支持很好的推荐解释,它可以利用用户的历史行为解释推荐结果。但LFM无法提供这样的解释,它计算出的隐类虽然在语义上确实代表了一类兴趣和物品,却很难用自然语言描述并生成解释展现给用户。
推荐系统的算法部分就到这了,下次来点其他的。