原文链接:Netflix recommendations: beyond the 5 stars (Part 1), (Part 2)
原文作者:Xavier Amatriain and Justin Basilico
翻译:大魁
前言
Nexflix是一家提供在线视频流媒体服务和DVD租赁业务的公司,也是著名的Netflix大奖赛的发起者。如果读者希望进一步了解Netflix,建议读一下和讯上的一篇文章:
以及爱范儿上的:
Netflix大奖赛与推荐系统
在2006年,我们启动了Netflix大奖赛,是一个机器学习和数据挖掘的比赛,旨在解决电影评分预测问题。我们举办这个比赛的目的是为了发现更好的方法来向我们的用户推荐产品,这是我们商业模式的核心任务。对于能够将我们的Cinematch系统的准确率提升10%的获胜团队,我们准备了一百万美元的大奖。当然,我们需要一个比较容易评测和量化的问题定义,我们选择的评测指标是RMSE--预测的评分与真实评分相差的均方根(root mean squared error)。竞赛的要求是要打败我们0.9525的RMSE得分,并将其降低到0.8572或更低。
竞赛开始一年之后,队伍Korbell以8.43%的提升赢得了第一个半程奖。他们付出了超过2000小时的努力,融合了107种算法才得到了这份奖金。他们将源代码提供给了我们。我们分析了其中2种最有效的方法:矩阵分解(SVD)和波尔兹曼机(RBM)。SVD能取得0.8914的RMSE,RBM是0.8990,将这两种方法线性融合能达到0.88。为了将这些方法应用到实际系统,我们必须克服一些限制,例如比赛的数据集是一亿个评分,但实际的线上系统是50亿个,并且这些方法的设计并没有考虑用户不断产生新评分的情况。但是我们最终克服了这些挑战,并将这两种方法用到实际产品中,而且直到现在还作为系统的一部分在运行。
如果读者对此次竞赛有过关注的话,可能对2年后大奖的归属很感兴趣。大家后2年的工作也确实令人印象深刻,数百种预测模型被融合到一起,最终突破了0.8572的临界线。我们评测了一些最新的离线算法,但是很遗憾,这些在竞赛数据集上优胜的算法,到了线上系统却表现的不够出色。考虑到系统实现以及部署的代价,我们最终并没有应用到我们的线上环境。
与此同时,我们的关注点也从提升Netflix的个性化体验转移到了新的领域。接下来我们会讲述具体的原因。
从美国DVD租赁到全球视频流媒体服务
过去几年间,我们对推荐算法的关注点发生了变化,原因在于Netflix公司的业务也在不断变化。在Netflix Prize举办一年之后,我们发布了实时的流媒体服务,流服务不仅仅改变了用户与系统的交互方式,也改变了推荐算法的数据来源。对DVD租赁业务来说,目标是帮助用户找到电影,并在接下来几天邮寄到用户邮箱。用户从选择电影到观看电影,当中需要延迟几天,因此系统收到反馈的时间比较长;用户如果不满意,进行更换的代价比较大,所以用户一般会仔细挑选。而对流服务的用户来说,选好一部电影立马就可以观看,甚至可以在很短时间内观看多部,同时,我们也可以知道用户是看完了整部电影,还是只看了一部分。
另一个巨大的变化是,网站从单纯的web端扩展到了成百上千的不同设备,例如与Roku播放器和XBOX的集成在2008年就发布了,又过了一年,Netflix流服务登陆了IPhone,到现在为止,各种Android设备以及最新的AppleTV上都有Netflix的身影。
两年前,我们发布了加拿大版,2011年我们在43个拉美国家启动了我们的服务,最近我们还登陆了英国和爱尔兰。今天,Netflix遍布47个国家,共有2300万的订阅用户。上个季度,这些用户通过几百种不同的设备,观看了20亿个小时的视频。每一天,有200万的电影和电视剧被观看,并新增400万个用户评分。
我们已经在这些新的场景中添加了个性化服务,现在有75%的视频观看是与推荐系统有关。这些成就的取得源于不断优化的用户体验,通过优化算法,我们的用户满意度有了显著提升。下面我们将展示一些推荐系统的技术和算法。
推荐无处不在
经过几年的积累我们发现,在Netflix中尽可能地集成推荐系统的个性化功能,会对我们的订阅用户产生巨大的价值。首页上的个性化包含了按行展示的视频,每一行有一个主题,主题揭示了这行视频的内在联系。大多数的个性化都是基于挑选行视频的方法,包括哪些行该放哪些视频,以及如何对视频排序。
以最顶部的10行为例:我们猜测你最可能喜欢这10个主题。当然,我们说“你”的时候也包含了你的家人。不得不提的是,Netflix的个性化是针对每一个家庭,而一个家庭的不同成员很有可能兴趣不一致。这也是为什么要选10行视频的原因,我们要为“爸爸“,”妈妈“,”小孩“或者整个家庭来做推荐。即使是这个家庭只有一个用户,那我们也想兼顾到这个用户的不同兴趣和情绪。正是因为如此,我们系统的目标不仅是准确性,还包括结果的离散程度。
Netflix个性化系统的另一个重要元素是认知(awareness)。我们想让我们的用户知道我们是怎么把握到他们的喜好的。这不仅仅能使用户信任我们的系统,而且鼓励用户提交更多的反馈来帮助我们的推荐做到更好。个性化系统的另一个可以提升信任度的方式是提供推荐理由:为什么我们要推荐这部电影或剧集?不是因为它满足了我们的商业需求,而是基于我们从用户那里获得的信息(用户的评分、观看记录、用户朋友的推荐等等)。
还有基于好友的推荐,我们最近刚刚在47个相关国家中的46个发布了我们的Facebook连接组件,只有美国除外,这是因为考虑到VPPA(《录像隐私权保护法案》,1998)的影响。通过了解朋友们在做什么,不仅仅为我们的推荐算法提供了另一个数据来源,也使我们能够以“社交圈”为主题生成几行新的推荐结果。
我们的推荐服务中让人印象深刻的一点便是“风格”为主题的几行推荐结果。这里包含了像“喜剧”这样的大类,也包含了"时空穿越剧“这样的非常长尾的小类。每一行的展现都考虑了三个方面:选择哪一种风格;选这个风格里的哪些视频;这些视频如何排序。用户对这个模块的关注度是很高的,当我们把长尾的类别放到前面的时候,检测到用户停留时间有明显的增长。新颖性和多样性也是我们选择视频时要考虑的因素。
我们也为每一行的选择提供了推荐理由,有些是基于隐式反馈:最近观看、用户评分和其他交互,有些是基于显式反馈,显式反馈是通过我们邀请用户做口味偏好测试得来的。
基于相似性的推荐也是我们提供个性化服务的一方面。相似性是一个很宽泛的概念,描述的对象可以是不同的电影、用户,也可以是评分、视频元信息等。这些相似性的计算也会用于别的模块。基于相似性的推荐用在多种场景之中,例如当用户搜索一个电影或者把一部电影放到观看列表的时候,也可以用来生成”动态风格“的推荐结果,这些结果是基于用户最近看过的视频。
上述的场景,包括优选的10行推荐、风格推荐、基于相似性的推荐,都要涉及到排序算法,这是提供有效的推荐结果的关键一步。排序系统的目标是为不同的场景发现用户最感兴趣的视频。我们把排序系统分解为:评分、排序、过滤几部分。我们的商业目标是最大化用户的满意度和每月订阅比例,这实际上等价与最大化用户对视频的观看次数。因而我们把用户兴趣得分最高的视频推荐给用户。
现在我们很清楚,Netflix Prize对电影评分的预测,只是构建有效的推荐系统的众多组成的一种。我们也需要考虑像用户场景、视频流行度、新颖性、多样性、用户兴趣、可解释性等方方面面。为了兼顾这些要素,我们要挑选合适的算法。在下一部分,我们将要详细地讨论排序问题,同时也涉及到我们的数据和模型,以及我们为满足以上需求所做的创新。
第二部分
在第一部分中,我们详细介绍了Nexflix推荐系统的各个部分。我们也解释了从Netflix Prize开始,我们的推荐系统是如何随着时间演变的。付出一百万美元的奖金为我们换来了丰厚的回报,不只是是算法的创新,也提升了我们的品牌价值,并吸引了优秀的人才加盟。评分预测只是我们的世界级的推荐系统的一部分功能,在接下来的部分中,我们将要介绍更为广泛的个性化技术:我们会讨论下我们的模型、数据,以及我们在这方面的创新方法。
排序算法
推荐系统的目的在于提供一些有吸引力的物品供用户选择。具体做法是先选择一些候选物品,并对这些物品按照用户感兴趣的程度排序。展示推荐结果的最常用的方式是组成某种有序列表,例如在Netflix中,列表就是一行行的视频。因此,我们需要借助一个合适的排序方法,利用各种各样的信息,来为每一个用户生成个性化的推荐列表。
最显而易见的排序方法,就是根据物品的热门程度排序。选择热门推荐作为基准算法的原因也很明显,用户总是倾向于购买大家都喜欢的物品。但是,热门推荐是个性化推荐的反义词,它为每一个用户生成的结果千篇一律。因而,我们的目标就是找到一个比热门推荐更好的个性化排序算法,以满足不同用户的不同口味。
既然我们的目标是推荐用户最可能观看的视频,最自然的方法就是利用用户对视频的评分的预测值,来代替视频的热门程度。但这样也有个问题,用户评分高的很可能是小众的电影,但用户往往更喜欢看那些虽然评分不高,但是比较流行的电影。因此,最好的做法是兼顾视频的热门程度和用户的期望评分。
有很多方法可以用来设计排序系统,比如评分排序方法、配对优化方法、全局优化方法。举例说明,我们可以设计一个简单的评分排序方法:对视频热门程度和用户期望评分进行线性加权:(u,v) = w1*p(v) + w2*r(u,v) + b,其中u表示用户,v表示视频,p表示热门函数,r表示期望评分。这个公式可以通过一个二维空间表示,如下图:
一旦我们设计好了评分函数,我们就可以输入一组视频,并对它们基于评分由高到低进行排列。你可能很好奇我们怎么选择w1和w2的值,换句话说,怎么确定热门程度更重要,还是用户的期望评分更重要?这个问题最少有两种解决方案。你可以对w1和w2简单的选一些候选数值,放到线上进行A/B测试。这种做法虽然比较耗时,但是代价仍旧可以接受。另一个方案是用机器学习的方法:从历史数据中选择一些正样本和负样本,设计一个目标函数,让机器学习算法自动地为w1和w2学习一个权重。“
Learning to rank”就是用来解决这个问题的,现在已经在搜索引擎和广告精准匹配领域得到了广泛应用。但推荐系统的排序任务有一个很重要的区别--个性化,我们不是要获得一个全局的w1和w2权重,而是想为每个用户有一个个性化的值。
你可能想到,除了热门程度和用户期望评分,我们在Netflix推荐系统还试了很多别的特征,有些没有效果,有些明显地提升了系统排序精度。下图展示了我们通过添加不同的特征和优化机器学习目标函数,对排序性能的改进效果。
许多分类算法可以用于排序系统,例如逻辑斯特回归(Logistic Regression)、支持向量机(Support Vector Machines)、神经网络(Neural Networks)、决策树(Decision Tree)、以及GBDT(Gradient Boosted Decision Trees)。另一方面,许多算法在过去几年中被应用到Learning to rank领域,像RankSVM和RankBoost。对于一个给定的排序问题,找到效果最好的算法并不容易。通常,你的特征越简单,模型就可以越简单。但是有一个值得注意的地方是,有时候一个特征不起作用,恰恰是是因为你选的模型对它不友好;或者一个很好的模型在系统中表现不好,可能是因为你用的特征跟模型不匹配。
数据和模型
在为用户构建一个完美的个性化体验的过程中,拥有优质的数据和选择合适的模型,对我们的排序算法都十分重要。很幸运的是,在Netflix我们既拥有大量相关的数据,也有很多天才的工程师能够将数据特征转化为产品。以下是我们的推荐系统中用到的数据源。
- 我们有几十亿的用户评分数据,并且以每天几百万的规模在增长。
- 我们以视频热度为算法基准,但是我们可以用来计算热度的数据源也是很丰富的。可以在不同的时间段内进行统计,例如最近一小时、一天、或者一周。可以将用户按照地域划分,计算视频在某部分用户中的热度值。
- 我们的系统每天产生几百万次播放,这些播放的场景也带来很多特征,例如播放时长、播放时刻、设备类型。
- 我们的用户每天将几百万不视频添加到他们的播放列表。
- 每个视频拥有不同的属性信息:演员、导演、类型、评分、评论。
- 视频展现方式:我们知道推荐的视频是在什么时间、什么位置展现给用户的,因而可以推断这些因素如何影响用户的选择。我们也能够观察到用户与系统交互的细节:滚动鼠标、悬停鼠标、点击,以及在页面的停留时间。
- 社交网络信息最近也成为我们的数据源,我们可以知道用户的好友们都在看什么视频。
- 用户每天要进行几百万次搜索请求。
- 上述的所有数据源都来自于我们自己的系统,当然我们也可以获取外部数据,例如电影的票房、影评家的点评。
- 以上并非全部,还有诸如人口统计数据、地点、语言、时间数据(temporal data,或者为临时数据)等都可以用来预测用户兴趣。
介绍完数据,那选什么模型呢?我们发现,有这么多种高质量的数据,单一的模型是不够的,我们必须要做模型选择、模型训练和测试。我们用了许多种的机器学习算法:诸如聚类这种无监督方法,还有一些有监督的分类方法。如果你对推荐领域的机器学习算法感兴趣,以下是一个不完整的方法列表。
- 线性回归(Linear Regression)
- 逻辑斯特回归(Logistic Regression)
- 弹性网络(Elastic Nets)
- SVD(Singular Value Decomposition)
- RBM(Restricted Boltzmann Machines)
- 马尔科夫链(Markov Chains)
- LDA(Latent Dirichlet Allocation)
- 关联规则(Association Rules)
- GBDT(Gradient Boosted Decision Trees)
- 随机森林(Random Forests)
- 聚类方法,从最简单的k-means到图模型,例如Affinity Propagation
- 矩阵分解(Matrix Factorization)
消费者法则
丰富的数据来源、度量方式和相关的实验结果,使我们能够以数据驱动的方式来组织我们的产品。从Netflix建立伊始,这种方式就成了公司的基因,我们称其为消费者法则(Consumer Data Science)。总体来讲,我们的消费者法则的目标是通过不断创新,来使我们的和用户得到便利。真正的失败是没有创新,就像IBM的创始人Thomas Watson先生所说,”如果你想要获得成功,那就不要畏惧失败。“(If you want to increase your success rate, double your failure rate.)我们的创新文化要求我们能够快速高效地通过实验来检验我们的想法,只有我们把试验完成,我们才能够理解,这个想法为什么成功或者失败。如此,我们能够专注于提升我们的用户体验,而不是把时间浪费在无用的想法上。
实际工作中,如何贯彻实施这个理念呢?跟传统的科学研究有些不同,我们对想法的验证是借助线上分流测试(A/B tesing, bucket testing)。
1. 提出假设
- 待检验的算法/特征/设计X能够帮助提升视频播放时长,并且提升用户停留时间。
2. 设计实验
- 开发解决方案或原型系统。想法的最终效果可能是原型系统的2倍,但一般没有10倍那么多。
- 考虑清楚系统的外部依赖、操作、重要性。
3. 进行测试
4. 让数据说话
当我们做A/B测试的时候,我们会记录多个维度的指标,但最信任的还是视频播放时长和用户停留时间。每一次测试通常覆盖到几千个用户,并且为了验证想法的方方面面,测试会分成2到20份进行。我们一般都是平行开展多个A/B测试,这使我们能够实验一些激进的想法,并且能同时验证多个想法,最重要的是,我们能够通过数据驱动我们的工作。关于我们A/B测试的详细介绍,请参考我们的技术博客和我们首席产品官Neil Hunt在Quora上的回复。
我们必须面对一个有趣的挑战,如何把我们的机器学习算法融入到Netflix以数据驱动的A/B testing文化中。我们的应对方式是既做离线测试,又做线上测试。离线测试是在线上测试之前,我们先优化并检验我们的算法。为了度量算法的离线性能,我们采用了机器学习领域的很多种指标:有排序指标,例如NDCG(normalized discounted cumulative gain)、mean reciprocal rank、fraction of concordant pairs;也有分类指标,例如accuracy、precision、recall、F-score,我们也用了Netflix Prize中著名的RMSE和别的不太常用的指标,像离散度(diversity)。我们跟踪比较这些离线指标和线上效果的吻合程度,发现它们的趋势并不是完全一致,因此线下指标只能作为最终决定的参考。
一旦离线测试验证了一个假设,我们就着手准备设计并发布A/B测试,通过用户的反馈再做进一步的验证。如果这一步也通过了,我们便将其加入到我们的主要系统中,为所有的用户提供服务。下图详细说明了整个创新周期。这个创新周期有一个强悍的例子,我们称之为”前十行结果的马拉松比赛“(Top10 Marathon)。这是一个为期10周的、高度专注的、高强度的工作,旨在快速检验数十种算法,以提升系统的前十行推荐结果。不同的团队和个人被邀请到一起,贡献想法,并编程实现。每周有6种不同的算法被推动到线上A/B测试,并要持续评估离线和线上的技术指标。最终表现优异的那些算法成为了我们推荐系统的一部分。
结语虽然Netflix Prize把推荐系统任务抽象为评分预测问题,但是评分只是推荐系统众多数据来源的一种,评分预测也只是我们的解决方案的一部分。在过去的几年中,我们把推荐系统任务重新定义为提升用户选择视频、观看视频、享受我们的服务、并成为回头客的概率。更多的数据可以带来更好的效果,但是为了达到这样的目标,我们必须不断地优化我们的方法,进行合理的评测,以及快速的迭代。
为了构建一个领先的个性化平台,仅靠我们的这些研究还是不够的,系统的上升空间还很大。在Netflix,我们都很热衷于挑选、观看电影和剧集,我们把这份激情转化为提升系统的强大直觉:对数据的透彻分析、发现更好的特征、更合理的模型和评测、以及弥补现有系统的不足。我们通过数据挖掘和别的试验方法来验证我们的直觉,并对其按优先级逐步实现,这个过程就像任何科学发现一样,运气是很重要的,但是俗话说的好:机会青睐有准备的人。最后,还是需要让我们的用户来评测我们的推荐系统,毕竟我们的目标就是提升用户在Netflix上的体验。