协同过滤模型

今年早些时候看了一下协同过滤( Collaborative Filtering )的综述,看到 model-based 和 graph 方法,还只是觉得不明觉厉。然后,最近有两件事促使我再次看起这个模型,一个是同学的毕设可能会从这个方面着手做一些东西,另一方面,穿衣搭配算法比赛也用到了类似 graph 的商品关联想法。

对于协同过滤,一个比较好的入门例子可以百度一下,或者参考这篇博客。协同过滤有两个关键点:一个是构建评分矩阵,另一个是寻找相似用户和商品。

协同过滤的核心想法是通过寻找相似的用户,然后根据相似用户的关系进行推荐。例如,A 和 B 相似,而 B 喜欢 C ,那么猜测 A 也喜欢 C。在连续剧里可能比较狗血,但是如果真的能够抓住 A 和 B 的相似性(例如都喜欢小清新),那么 A 喜欢 C 也是很可能的。这样,用户与用户之间就建立起了联系,关系网就形成一张图(graph)。

协同模型最具影响力的例子是来自用户-商品(User-Item)的评分矩阵,大多数讲解都是从用户评分矩阵中,通过计算相似性进行推荐的。而评分矩阵式是一个比较有意思的东西,它并不直接根据某些内容指标对用户进行相似度的评估,而是根据用户的打分记录『挖掘』出用户的喜好。例如,A 喜欢商品 I 和商品 J,而 B 也喜欢商品 I 和商品 J,且商品 I、 J 喜欢的人又不是很多,那么是不是就可以认为 A 和 B 十分相似呢?从这个方面来看,协同过滤就和一般的基于内容(content-based)的方法区别开来。目的实际上是通过评分的不同找出用户喜好的不同方面,从而推荐,想想平时我们的朋友圈其实也是这样的 - - || 。

而评分矩阵实际上应该是用户行为汇总矩阵,但是在一般的兴趣社区(例如豆瓣),评分矩阵可以简化为用户对某电影、某书籍的评分。而对于其他没有明显评分的事情,实际上也可以归纳到评分,例如某些音乐电台可以根据收听次数确定一个用户对某音乐的喜好程度,那么这个次数就可以认为是一种评分。当然,评分应该有一个更严格的定义,例如存在一个理论上届和下界,满足对称性等等。怎样定评分也是协同过滤需要解决的一个很重要的问题。

另外,基于评分矩阵来计算相似性的时候,要考虑的是非缺失值。但是往往矩阵是『稀疏的』,也就是缺少用户的评分。两个用户评分的商品可能没有交集,也就不能比较相似性了。于是,考虑一种称为矩阵分解的技术就很有必要。矩阵分解(matrix factorization)是通过迭代计算两个矩阵相乘,使得结果中对应位置的值刚好是原来稀疏矩阵的值。那么分解出来的两个矩阵就可以看做是原矩阵在两个维度(用户和商品)的一种分解,其中的行向量或者列向量就可以作为各维度的特征进行相似度的比较。

但是,网站一开始没有评分记录啊。即便网站有了,新用户也没有评分记录,用这种方法怎么进行推荐?这个称为『冷启动问题』。和『稀疏性』有点类似,也是因为信息缺失,即使通过矩阵分解,也未必可以得到理想的值。现有的方法……记得在社交网络上注册一个用户的流程么?它会问你喜欢什么、关注什么人——也就说在猜你的评分向量了。所以注册的时候需要麻烦点,但是对于你短期内浏览这个社交网络(例如微博)还是很有帮助的。

不过,人们还想到了通过你的profile(例如你在社交网络中注册的个人信息)和内容的profile(文本分析?音频分析?视频分析?)进行内容的推测。某深度学习文章也曾结合过两者——首先取定一个比较稠密的用户商品评分矩阵,进行矩阵分解得到两个特征矩阵,然后用深度学习通过内容特征(就是从上文profile中提取的)训练处分解后的矩阵。那么新用户就可以通过这个深度学习模型解决冷启动问题了。

总之,尽可能从现有信息找用户喜欢,就是解决这类问题的关键了。