全面介绍个性化推荐

jopen 10年前

初识推荐

每天访问亚马逊的时候它不仅会在首页根据你的名字问候你,同时也会在展示一些推荐你购买的东西。它给小明推荐了《射雕英雄传》(金庸)和《小李飞刀》(古龙),一番浏览之后,小明选择了《明朝那些事儿》(当年明月)。

现在这些个性化的推荐已经司空见惯了,Netflix推荐视频;TiVo会记录一些我们感兴趣的东西;Pandora构建了一个个性化音乐流来预测我们接下来可能会听什么。

这些推荐都来自个性化推荐系统——一堆计算机程序。根据用户的浏览、搜索、购买等行为以及用户的年龄等属性,帮助用户找到他们喜欢或者需要购买的商品。目标是提升销量,推荐系统是一项规模巨大的成长性业务。与此同时,推荐系统领域的开发者数量也从90年代中期的几十个人到现在的数十万人。他们来自大学、大型的电商公司以及其它一些专注于推荐系统的公司。

推荐系统的历史

时光荏苒,推荐系统得到了长足的发展。最开始的推荐系统相当不给力,经常推荐不准确。随着网站上用户的数据可用性的提高和推荐算法上的创新,推荐系统快速成长。今天的推荐系统非常复杂,专业化程序非常高,甚至标榜“比你更懂你”。它们也不仅仅用于电商领域,大学借助它来指导学生的课程;手机厂商依赖它来预测哪些用户更有可能会转向竞争对手;大会的主办单位在为同行评审的时候使用它来分发论文。

我和我的小伙伴很早就开始学习并参与构建推荐系统,最初是以研究员的身份从事GroupLens Project。从1992年开始,GroupLens对Usenet论坛上的信息进行了分类处理,试图找出用户可能感兴趣但连他们自己都不知道的话题。几年之后,我们创建了Net Perceptions,它在第一次互联网浪潮中是推荐系统的领航者。藉由这些经验,我对亚马逊及其它一些电商网站背后的逻辑略知一二,甚至包括那些从来没有公开描述他们的推荐系统是如何工作的那些公司。(在这篇文章中,我们的分析来自于细致的观察推论,不基于其它任何秘密信息)。下面是一些我们已经知道的东西:

你有没有想过对亚马逊那边是什么样的?这是冰冷的事实:你是一张非常大的表中的一行长长的数字!这一行数字描述了所有你看过的东西,所有你点过的东西,所有你买过的东西。其余的行则代表亚马逊上数百万的购物者。你的那一行数字在你每次访问网站的时候都会被修改,当你每做一个动作的时候,它会再次被修改。这些数据影响着你在网页上实际看到的商品以及电商给你发送的购物邮件。

协同过滤

多年以来,推荐系统的开发者尝试了很多种方式来收集和解析所有数据,那时,主要是个性化协同过滤推荐系统。这种类型的推荐系统是amazon、Netflix、非死book的朋友推荐以及last.fm(英国一家受欢迎的音乐网站)的核心。

  1. 个性化:通过跟踪每个用户的行为——网页浏览、购买、评分等产生推荐,并不是事先准备好的一萝匡建议

  2. 协同:根据所有其它用户的购买或偏好来计算两个物品之间的相关度,而非通过分析物品所具有的特征或者关键字来计算

个性化协同过滤系统最早大概出现在1992年,当时除了GroupLens项目外,另一个比较早期的推荐系统是麻省理工的Ringo,它根据用户已有的音乐专辑推荐其它的一些用户可能会喜欢的音乐。

基于用户的协同过滤推荐系统

GroupLens和Ringo都使用简单的协同过滤算法——基于用户的协同过滤。这个算法根据用户对物品的评分来计算他们之间的相似度。例如:假如小明和小强都给快拿(一款移动app)打5分,那么他们之间的距离就是0(非常近);假如小明对快牙打5分,小强对快牙打3分,那么他们之间的距离就增大一些。用户的口味与他的“邻居”相近。

但是基于用户的方法实际上没那么好,其中一个问题就是,很多用户两两之间有共同评分的物品很少或者根本就没有,电影领域更是如此,在这种情况下就无法计算这两个用户之间的距离。另外,用户之间的距离变化很快,每次用户的点击或者购买都会导致重新计算,这样的计算量对于一个有数百万用户的网站来说是非常大的。

基于物品的协同过滤推荐系统

现在的一些推荐系统使用了基于物品的协同过滤推荐系统,根据两个物品得到的评分来计算它们的距离。例如:假如对快拿评价很高的人同时对快牙评分也很高,那么快拿和快牙就是“邻居”。根据数百万用户的评分计算出来的两个物品的距离通常不会随时间变化的很快,所以就可以提前计算好任意两个物品之间的距离,这样在给出推荐的时候就会非常快。amazon和Netflix都公开表示他们用的是基于物品的协同过滤系统。

协同过滤的缺陷

这两种方法都有一个共同的问题:不靠谱的评分。受情绪、环境的影响,用户对同一个物品的评分在不同时期并不总是相同的。麻省理工实验室曾在20世纪 90年代末期做了一项调查发现,用户对个物品的评分与一年后的评分平均相差1分(总分7分),研究人员尝试了不同的方法把这个变化包含到他们的模型中。例如:当系统认为原有的评分已经过时的时候,会要求用户重新评分。

比评分不靠谱问题更严重的是:算法太死板了。它可以发现用户喜欢的同类的物品,但在非常相似的物品之间就不起作用了。例如:如果你喜欢莫奈的《睡莲》系列,在他画的250个睡莲中,你更喜欢哪一个呢?每个人可能都有自己特别喜欢的那一个,但是这两个基础算法却无能为力。

SVD

大约在十年前,研究人员发现了在这些非常相似的物品之间找出特征的方法,叫做降维。它需要的计算量远大于协同过滤,也因此被接受的比较慢。随着计算机变得更快更廉价,它也取得了很大的进展。

为了帮助理解降维是如何工作的,下面以对食物口味以及怎么跟其它人比较来举例说明。想象有一张很大的矩阵,每一行代表一个用户,每一列代表一种食物,你的那一行数据表明了你的偏好:烤红薯(5分)、炖排骨(4.5分)、炸鸡腿(2分)、凉拌花生米(1分)、盐水鸭(5分)等等。推荐系统所用的矩阵不会真的关心你对各种食物的评分。它只是把这种知识应用到各种各样的食物上,以便了解你的偏好。举例来说,根据上面的数据,系统可能会认为你喜欢炸的,肉类,那它可能会给你推荐鸭血粉丝汤或者酸菜鱼。食物所具有的属性(偏咸、油炸的等维度)可能高达上百种,通过把食物的属性与你的偏好(肉类、油炸的等维度)做比较,就可以预测你对于新食物的喜好。这样推荐系统就可以发现你对那些相似但实际上又是不同的物品的喜好。它大大压缩了矩阵,使系统更加高效。

这是一个相当给力的办法。但是怎么找到这些口味维度呢?找个大厨问问?这里我们运用一种叫做奇异值分解的数学技巧来计算出这些维度。把原始的大矩阵分成两个,一个包含所有的用户和100个口味维度,另一个包含所有的食物和100个口味维度。这两个矩阵乘上第三个矩阵就等同于原始矩阵

不同于上面的例子,这些维度即不可描述也不能直观的感觉到,它们只是数学上的抽象,你找不到一个类似于“偏咸的”维度。不过没关系,只要用这些值可以得到准确的推荐就行。它主要的缺点就是计算的复杂度随着用户数和物品数急剧攀升,一个具有1千万用户和1百万物品的矩阵比只有1万人和1千种物品的矩阵计算所需的时间可能要多出几亿倍。更要命的是,这个过程需要被频繁的执行。像amazon这样的公司,这样的计算每秒钟都在发生。幸运的是,即使这个矩阵稍微过时了一点,也能很好了工作。现在研究人员已经开发出了新的算法来逼近奇异值分解的结果,同时大大缩短了计算时间。

推荐系统的商业特征

到目前为止,你对电商公司怎么描述你,怎么尝试根据你的兴趣为你推荐商品已经有了基本的认识。推荐系统还有两个其它特征:

  1. 它不仅要计算谁跟你相似,还要计算你真正喜欢什么

  2. 它包含一些商业规则,推荐出来的商品不仅要让你感觉不错,同时也要对卖家有益