英文原文:Deconstructing Recommender Systems,编译:ccyou@guokr 如今,到网上购物的人已经习惯了收到系统为他们做出的个性化推荐。Netflix 会推荐你可能会喜欢看的视频。TiVo 会自动把节目录下来,如果你感兴趣就可以看。Pandora 会通过预测我们想要听什么歌曲从而生成个性化的音乐流。 所有这些推荐结果都来自于各式各样的推荐系统。它们依靠计算机算法运行,根据顾客的浏览、搜索、下单和喜好,为顾客选择他们可能会喜欢、有可能会购买的商品,从而为消费者服务。推荐系统的设计初衷是帮助在线零售商提高销售额,现在这是一块儿规模巨大且不断增长的业务。与此同时,推荐系统的开发也已经从上世纪 90 年代中期只有几十个人研究,发展到了今天拥有数百名研究人员,分别供职于各高校、大型在线零售商和数十家专注于这类系统的其他企业。 这些年来,推荐系统有了相当的进展。开始时它们还相对较为粗糙,往往对行为做出不准确的预测;但随着更多的和不同类型的网站用户数据变得可用,推荐系统得以将创新算法应用于这些数据之上,它们迅速得到了改善。今天,推荐系统都是些极其复杂和精专的系统,常常看起来比你自己还要了解你。同时,推荐系统正在向零售网站以外的领域拓展:大学用它们来引导学生选课,移动电话公司靠它们来预测哪些用户有可能转投另一家供应商,会议主办方也测试过用它们来分配论文给审稿专家。 我们两人从推荐系统的早期开始便一直在开发和研究它们,最初是以学术研究者的身份,参与 GroupLens 计划(GroupLens Project)。1992 年起,GroupLens 通过对美国兴趣论坛网站 Usenet 讨论区里的消息进行排序,将用户指向他们可能会感兴趣、但自己尚未发现的话题线索。几年以后,我们成立了 Net Perceptions,这是一家推荐算法公司,在互联网第一次热潮期间(1997 年 – 2000 年),一直处于业界领先地位。有鉴于此,虽然这些公司极少公开谈论他们的推荐系统是如何运作的,我们的经验使我们能够深入了解亚马逊和其他在线零售商幕后的情景。(在本文中,我们的分析是在观察和推理的基础上得出的,不包含任何内部消息)。 下面就是我们所看到的。 推荐算法是怎么"猜你喜欢"的? 你有没有想过自己在亚马逊眼中是什么样子?答案是:你是一个很大、很大的表格里一串很长的数字。这串数字描述了你所看过的每一样东西,你点击的每一个链接以及你在亚马逊网站上买的每一件商品;表格里的其余部分则代表了其他数百万到亚马逊购物的人。你每次登陆网站,你的数字就会发生改变;在此期间,你在网站上每动一下,这个数字就会跟着改变。这个信息又会反过来影响你在访问的每个页面上会看到什么,还有你会从亚马逊公司收到什么邮件和优惠信息。 许多年来,推荐系统的开发者试过用各种各样的方法来采集和解析所有这些数据。最近这段时间,多数人都选择使用被称为个性化协同推荐(Personalized Collaborative Recommender)的算法。这也是亚马逊、Netflix、Facebook 的好友推荐,以及一家英国流行音乐网站 Last.fm 的核心算法。说它 "个性化",是因为这种算法会追踪用户的每一个行为(如浏览过的页面、订单记录和商品评分),以此进行推荐;它们可不是瞎猫碰上死耗子——全凭运气。说它 "协同",则是因为这种算法会根据许多其他的顾客也购买了这些商品或者对其显示出好感,而将两样物品视为彼此关联,它不是通过分析商品特征或者关键词来进行判断的。 不同类型的个性化协同推荐系统最晚从 1992 年开始便已经出现。除了 GroupLens 计划,另一项早期的推荐系统是 MIT 的 Ringo,它会根据用户的音乐播放列表从而给用户推荐其他他们有可能会喜欢的音乐。 User-User 算法:计算用户之间的相似度 GroupLens 和 Ringo 都使用了一种简单的协同算法,被称为 "用户关联"(user-user)的算法。这种类型的算法会计算一对用户之间的 "距离",根据的是他们对同一物品打分的相似程度。举例来说,如果吉姆和简都给《电子世界争霸战》(Tron)这部电影打了 5 分,那么他们之间的距离就是 0。如果吉姆给它的续集《创:战纪》(Tron: Legacy )这部电影打了 5 分,而简只打了 3 分,那么他们之间的距离就变大了。按照这样的计算得出来品味相对 "靠近" 的用户,我们把他们称之为共有一个 "邻集"(neighborhood)。 但是,这种用户关联的策略效果并不是很好。首先,形成有意义的邻集很难:很多用户两两之间只有很少几个共同评分,有的就完全没有;而仅有的那几个都打了分的项目呢,往往是票房大片,基本上人人都喜欢的那种。再来,由于用户之间的距离可以变得很快,算法必须当场就进行大部分的计算;而这可能会比一个在网站上这儿点点那儿戳戳的人下一个动作发出之前需要更久的时间。 Item-Item 算法:计算物品之间的关联 因此,大部分的推荐系统如今都依靠一种"物-物关联"(item-item)的算法,这种算法计算的是两本书、两部电影或者两个其他什么东西之间的距离,依据的是给它们打过分的用户的相似度。喜欢 Tom Clancy 书的人很可能会给 Clive Cussler 的作品打高分,因此 Clancy 和 Cussler 的书就共处一个邻集。一对物品之间的距离可能是根据成百上千万的用户的评分计算得出,在一段时间里往往保持相对稳定,因此推荐系统可以预先计算距离,并更快的生成推荐结果。亚马逊和 Netflix 都曾公开表示过他们使用的是物-物关联算法的变种,但对细节都绝口不提。 用户关联算法和物-物关联算法都有的一个问题,是用户评分的不一致性。当给他们机会再评一次分时,用户往往会对同一件物品给出不同的得分。品味在变、心情在变,印象也在变。MIT 在上世纪 90 年代进行的一项研究表明,在最初打分一年以后,用户的评分会发生平均 1 分(满分 7 分)的变动。研究人员们也在一直在尝试不同的方法在模型中纳入这一变量;比如说,如果用户给某个商品了打一个分,但这个评分与推荐算法所了解的关于这个人和这个商品的所有其他信息不相符,有的推荐算法就会邀请用户再次对这个商品进行评价。 降维算法:把事物特征一般化 不过,用户关联算法和物-物关联算法还存在一个比一致性更大的问题:它们太死了。就是说,它们能发现都喜欢同一样东西的人,但却忽略了爱好非常相似的潜在用户组合。比如说你喜欢莫奈的睡莲。那么,在这个法国印象派大师画的 250 幅睡莲中,你最喜欢哪一幅?在一群喜欢莫奈的人当中,完全可能每个人喜欢的睡莲都不相同,而基本的算法就有可能识别不出这些人都有着共同的爱好。 大约十年前,研究者们想出了一个办法,通过一个叫降维(Dimensionality Reduction)的过程,把事物更一般化的表现出来。这种方法在计算量上比用户关联和物-物关联算法要密集得多,因此也就没有那么快的得到采用。但随着计算机变更快更便宜,降维算法也逐步取得了一些进展。 为了弄清降维算法是怎么工作的,我们来看看你爱吃的东西,以及如何把它跟其他一百万人爱吃的东西做比较。你可以把这些信息用一个巨型矩阵表示出来,每一条竖线代表一样食物,每个人爱吃什么东西就自然形成了一行。在你的这一行上面或许会显示你给了烤牛排 5 颗星、红烧小排 4 星半、烤鸡翅 2 颗星、冻豆腐卷 1 颗星、奶酪烤蘑菇 5 颗星、盐水毛豆 4 颗星,等等。 然而,使用这个矩阵的推荐算法并不关心你给哪种食物评了多少颗星。它想要了解的是你一般而言的喜好,这样它可以将这个信息应用到更丰富多样的食物上。比如说,基于你上面给出的信息,算法可能会认为你喜欢牛肉、咸的东西和烤制菜品,不喜欢鸡肉和任何油炸的东西,不喜欢也不讨厌蔬菜,依此类推。你爱吃的食物所拥有的特点或者说维度,它的数量和符合你要求的食物的数量比起来要小得多——至多可能 50 或 100。通过查对这些维度,推荐算法可以迅速决定你是否会喜欢一种新的食物(比方说盐焗排骨),方法就是把这种食物的各项维度(咸的、牛肉做的、不是鸡肉、不是炒的、不是蔬菜、不是烤的)同你的资料进行比对。这种更为一般性的呈现使得推荐算法能准确的发现有着相似但不同喜好的用户。而且,它大幅压缩了矩阵的规模,使算法变得更加高效。 这是一个很酷的解决方案。不过,你爱吃的食物的维度该上哪儿去找呢?肯定不是去问厨师。推荐系统会使用一种称为奇异值分解的数学方法来计算维度。这种方法涉及到把最初的一个巨型矩阵分解为两个 "口味矩阵"——其中一个包含了所有的用户和 100 项口味维度,另一个则包含了所有的食物和 100 项口味维度——再加上第三个矩阵,当乘以前面两个矩阵中的任意一个时,会得到最初的那个矩阵(※此处已更改)。 不像上面例子中说的那样,计算用的维度既不是描述性的,也一点儿都不直观;它们是纯抽象的值。这并没有什么,只要这些值最终生成准确的推荐结果就行了。这种方法的主要缺点是,创建矩阵所需要的时间会随着客户和产品数量的增多而飞速增长——创建一个拥有 2.5 亿名客户和 1000 万种产品的矩阵,需要花上创建一个 25 万名客户和 1 万种产品的矩阵 10 亿倍那么多的时间。而且这一过程还需要经常重复。一旦收到新的评分,矩阵就已经过时;在像亚马逊这样的公司,每一秒钟都会收到新的评论。幸运的是,就算略微过时,矩阵仍然能以一个挺不错的水平运作。研究人员们也已经在设计新的算法,为奇异值分解提供可用的近似值并显著缩短计算时间。 讲完了推荐算法是如何"猜你喜欢"的 ,现在,你对于每回上网购物时在线零售商是如何打量你,并努力把你的喜好和其他人的相匹配有了一个基本的概念。 推荐系统还有另外两大特点,也对你最终看到的推荐结果有着显著的影响:第一,在弄清楚你和其他购物者的相似度有多高之前,推荐系统必须先弄明白你真正喜欢什么;第二,推荐系统依照一组商业规则运行,以确保推荐结果既让你觉得有用,也使商家有利可图。 推荐算法是如何赢得你的信任,又让商家有钱可赚的? 采集你的上网数据 举个例子,来看亚马逊的艺术品商店,上次我们去看的时候那里有 900 多万册印刷品和海报在降价促销。亚马逊的艺术品商店有这样几个方法来评估你的喜好。它会让你在 1 到 5 颗星的等级上给某一件艺术作品打分,它也会记录下你把哪些画点击放大了来看、哪些画你反反复复看了好多次,你把哪些放进了心愿单,还有你最终实际下单买了什么。它还会追踪在你浏览过的每一个页面上都显示了哪些画作。在线零售商会使用你在其网站行进的路径(你浏览过的页面和点击商品的链接) 来向你推荐相关联的商品。此外,它还把你的购买记录和打分信息结合起来,建立一个你长期购买偏好的档案。 像亚马逊这样的公司会收集大量此类有关客户的数据。在你登录期间,你在它网站上的几乎每一个动作都会被记下来,留作将来使用。多亏有了浏览器 cookie,连匿名购物者的上网记录商家也能维持,最终这些数据将在匿名购物者创建账户或者登陆时,链接到顾客的个人资料。这种爆炸式的数据采集并非为在线商家所独有,沃尔玛便以其对现金收据数据的深入挖掘而著称于业界。但是,网上商店处在一个更有利的位置去查看和记录,不止是消费者买了些什么,还包括你曾考虑过、浏览过和决定不买哪些商品。在全世界大部分地区,所有这类活动都是任人监视和记录的;只有在欧洲,数据隐私法在一定程度上限制了这种操作。 当然,不论法律如何,顾客发现自己的数据被人滥用后,都会产生强烈的抵触情绪。早在 2000 年 9 月,亚马逊吃过一次苦头:有一部分顾客发现他们收到的报价更高,因为网站将他们识别为老顾客,而不是匿名进入或是从某个比价网站转接进来的顾客。亚马逊声称这只是一项随机的价格测试,其呈现出来的结果与老顾客身份之间的关联纯属巧合。话是这样说,它还是叫停了这项操作。 在商业规则下运行 加在推荐算法之上的种种商业规则,旨在防止算法给出愚蠢的推荐,并帮助在线零售商在不失去你信任的前提下实现营业额的最大化。最起码,推荐系统应该避免人们说的超市悖论(Supermarket Paradox)。例如,差不多每个去超市的人都喜欢吃香蕉,也经常会买一些。那么,推荐系统该不该向每一位顾客都推荐香蕉呢?答案是否定的——这样做既帮不上顾客,也提高不了香蕉的销量。所以,智能的超市推荐系统始终会包括有一条规则,明确地将香蕉排除在推荐结果之外。 这个例子可能听起来没什么,但在我们早期经手的一个项目中,我们的推荐系统就曾经向几乎每一个到访我们网站的人推荐披头士的《白色专辑》(White Album)。从统计学的意义上讲,这是个很棒的推荐:顾客此前都没有从这个电子商务网点购买过这张专辑,而大多数顾客对《白色专辑》的评价都很高。尽管如此,这个推荐仍然是无效的——任何一个对《白色专辑》感兴趣的人都已经有了一张了。 当然,大部分的推荐规则都是更加微妙的。比如说,当约翰在 9 月份在 Netflix 索动作影片时,结果中不会出现《复仇者联盟》(The Avengers),因为这部大片在当时还没有租借版,这样的推荐结果不会让 Netflix 有钱赚。因此,约翰被导向了《钢铁侠 2》(Iron Man 2),这部片已经可以用流媒体播放了。 其他的规则还包括禁止推荐为招徕顾客而亏本销售的商品(loss leader);反过来,鼓励推荐滞销品。在经营Net Perceptions期间,我们就曾与一位客户合作,他利用推荐系统来识别库存积压商品的潜在客户,取得了相当大的成功。 赢取你的信任 然而,这种事情很快就会变得棘手起来。一个只会推销高利润商品的推荐算法是不会赢得顾客的信任的。这就像是去餐馆,那儿的服务生极力向你推荐某道鱼一样。这个鱼真的是他觉得最好吃的吗?还是大厨催着底下的人赶在鱼变质前把它给卖出去? 为了建立信任感,更复杂的推荐算法会尽力保持一定的透明度,让顾客对系统为什么会向自己推荐这件商品有一个大致的概念,并且在不喜欢收到的推荐结果时,可以更改他们的个人资料。比如说,你可以删除你在亚马逊上买来送礼的购物记录;毕竟,那些东西反映的不是你个人的喜好。你还可以知道系统为什么会向你推荐某些产品。当亚马逊为约翰挑选了 Jonathan Franzen 的小说《自由》之后,约翰点击标签上的链接"为什么推荐给我?"。随即显示出一份简要的说明,原来是他放在心愿单里的几本书触发了这一推荐。不过,由于他还没有读过心愿单上的那几本书,约翰就不去管《自由》这个推荐结果了。像这样的解释说明会让用户明白推荐结果是否有用。 但是,完善个人资料和解释推荐结果往往不足以保证系统不出错。最近,亚马逊用高清大屏幕电视机(HDTV)的促销电子邮件对乔进行了轰炸——每周 3 封,连续扔了一个月。除了给乔寄了过多的电子邮件,这家零售商还没有意识到,乔已经用他妻子的账户买了一台电视机。此外,这些电子邮件并没有提供一种很明显的方法,让乔可以说"谢谢,但我不感兴趣"。最终,乔取消了他在亚马逊的一些邮件订阅;他并不在意收不到各种信息,而且他有了更多的时间来真的看他的电视。 推荐算法的作用究竟有多大? 那好,推荐算法究竟起了多大作用呢?它们当然一直都在增加在线销售额;据阿伦森集团(Aaronson Group)的分析师杰克•阿伦森(Jack Aaronson)估计,由于推荐算法带动销售额的增长,对推荐算法的投资能获得 10%-30% 的收益。而且,它们还只是刚刚起步。现在,对我们这些研究推荐系统的人来说,最大的挑战在于弄清楚如何去判断新的方法和算法才最好。这可不像基准化分析微处理器那么简单,因为不同的推荐系统有着非常不同的目标。 评价一个算法最简单的方法,是看它的预测和用户的实际评价之间差异有多大。举例来说,假如约翰给青春浪漫小说《暮光之城》(Twilight )一颗星,亚马逊或许会注意到算法根据其他相似用户的评价曾预计约翰会给两颗星,也即出现了一颗星的偏差。但是,卖家更加关心算法在用户评价高的商品上出的错,因为好评多的物品是顾客更有可能购买的;约翰反正也不会买《暮光之城》。所以,把这个评价计入考虑对理解推荐算法起了多大作用没什么帮助。 另一个常见方法是看算法给出的推荐结果和顾客实际购买的商品,之间匹配度有多高。不过,这种方法也可能起到误导作用,因为这样分析会将用户自己设法找到的商品错误地算在推荐算法的头上,而用户自己找得到东西恰恰是最不应该被推荐的!鉴于这些方法的缺点,研究人员一直在研究新的评判指标,不只看精度,也会关注像发现意外惊喜和多样性等其他属性。