原文链接:Netflix recommendations: beyond the 5 stars (Part 1), (Part 2)
原文作者:Xavier Amatriain and Justin Basilico
翻译:大魁
前言
在这篇博文中,作者为我们掀开了Netflix最有价值的资产--推荐系统的面纱。
过去几年间,我们对推荐算法的关注点发生了变化,原因在于Netflix公司的业务也在不断变化。在Netflix Prize举办一年之后,我们发布了实时的流媒体服务,流服务不仅仅改变了用户与系统的交互方式,也改变了推荐算法的数据来源。对DVD租赁业务来说,目标是帮助用户找到电影,并在接下来几天邮寄到用户邮箱。用户从选择电影到观看电影,当中需要延迟几天,因此系统收到反馈的时间比较长;用户如果不满意,进行更换的代价比较大,所以用户一般会仔细挑选。而对流服务的用户来说,选好一部电影立马就可以观看,甚至可以在很短时间内观看多部,同时,我们也可以知道用户是看完了整部电影,还是只看了一部分。
另一个巨大的变化是,网站从单纯的web端扩展到了成百上千的不同设备,例如与Roku播放器和XBOX的集成在2008年就发布了,又过了一年,Netflix流服务登陆了IPhone,到现在为止,各种Android设备以及最新的AppleTV上都有Netflix的身影。
两年前,我们发布了加拿大版,2011年我们在43个拉美国家启动了我们的服务,最近我们还登陆了英国和爱尔兰。今天,Netflix遍布47个国家,共有2300万的订阅用户。上个季度,这些用户通过几百种不同的设备,观看了20亿个小时的视频。每一天,有200万的电影和电视剧被观看,并新增400万个用户评分。
我们已经在这些新的场景中添加了个性化服务,现在有75%的视频观看是与推荐系统有关。这些成就的取得源于不断优化的用户体验,通过优化算法,我们的用户满意度有了显著提升。下面我们将展示一些推荐系统的技术和算法。
推荐无处不在
Netflix个性化系统的另一个重要元素是认知(awareness)。我们想让我们的用户知道我们是怎么把握到他们的喜好的。这不仅仅能使用户信任我们的系统,而且鼓励用户提交更多的反馈来帮助我们的推荐做到更好。个性化系统的另一个可以提升信任度的方式是提供推荐理由:为什么我们要推荐这部电影或剧集?不是因为它满足了我们的商业需求,而是基于我们从用户那里获得的信息(用户的评分、观看记录、用户朋友的推荐等等)。
还有基于好友的推荐,我们最近刚刚在47个相关国家中的46个发布了我们的Facebook连接组件,只有美国除外,这是因为考虑到VPPA(《录像隐私权保护法案》,1998)的影响。通过了解朋友们在做什么,不仅仅为我们的推荐算法提供了另一个数据来源,也使我们能够以“社交圈”为主题生成几行新的推荐结果。
我们的推荐服务中让人印象深刻的一点便是“风格”为主题的几行推荐结果。这里包含了像“喜剧”这样的大类,也包含了"时空穿越剧“这样的非常长尾的小类。每一行的展现都考虑了三个方面:选择哪一种风格;选这个风格里的哪些视频;这些视频如何排序。用户对这个模块的关注度是很高的,当我们把长尾的类别放到前面的时候,检测到用户停留时间有明显的增长。新颖性和多样性也是我们选择视频时要考虑的因素。
我们也为每一行的选择提供了推荐理由,有些是基于隐式反馈:最近观看、用户评分和其他交互,有些是基于显式反馈,显式反馈是通过我们邀请用户做口味偏好测试得来的。
基于相似性的推荐也是我们提供个性化服务的一方面。相似性是一个很宽泛的概念,描述的对象可以是不同的电影、用户,也可以是评分、视频元信息等。这些相似性的计算也会用于别的模块。基于相似性的推荐用在多种场景之中,例如当用户搜索一个电影或者把一部电影放到观看列表的时候,也可以用来生成”动态风格“的推荐结果,这些结果是基于用户最近看过的视频。
上述的场景,包括优选的10行推荐、风格推荐、基于相似性的推荐,都要涉及到排序算法,这是提供有效的推荐结果的关键一步。排序系统的目标是为不同的场景发现用户最感兴趣的视频。我们把排序系统分解为:评分、排序、过滤几部分。我们的商业目标是最大化用户的满意度和每月订阅比例,这实际上等价与最大化用户对视频的观看次数。因而我们把用户兴趣得分最高的视频推荐给用户。
现在我们很清楚,Netflix Prize对电影评分的预测,只是构建有效的推荐系统的众多组成的一种。我们也需要考虑像用户场景、视频流行度、新颖性、多样性、用户兴趣、可解释性等方方面面。为了兼顾这些要素,我们要挑选合适的算法。在下一部分,我们将要详细地讨论排序问题,同时也涉及到我们的数据和模型,以及我们为满足以上需求所做的创新。
第二部分
既然我们的目标是推荐用户最可能观看的视频,最自然的方法就是利用用户对视频的评分的预测值,来代替视频的热门程度。但这样也有个问题,用户评分高的很可能是小众的电影,但用户往往更喜欢看那些虽然评分不高,但是比较流行的电影。因此,最好的做法是兼顾视频的热门程度和用户的期望评分。
有很多方法可以用来设计排序系统,比如评分排序方法、配对优化方法、全局优化方法。举例说明,我们可以设计一个简单的评分排序方法:对视频热门程度和用户期望评分进行线性加权:(u,v) = w1*p(v) + w2*r(u,v) + b,其中u表示用户,v表示视频,p表示热门函数,r表示期望评分。这个公式可以通过一个二维空间表示,如下图:
- 我们有几十亿的用户评分数据,并且以每天几百万的规模在增长。
- 我们以视频热度为算法基准,但是我们可以用来计算热度的数据源也是很丰富的。可以在不同的时间段内进行统计,例如最近一小时、一天、或者一周。可以将用户按照地域划分,计算视频在某部分用户中的热度值。
- 我们的系统每天产生几百万次播放,这些播放的场景也带来很多特征,例如播放时长、播放时刻、设备类型。
- 我们的用户每天将几百万不视频添加到他们的播放列表。
- 每个视频拥有不同的属性信息:演员、导演、类型、评分、评论。
- 视频展现方式:我们知道推荐的视频是在什么时间、什么位置展现给用户的,因而可以推断这些因素如何影响用户的选择。我们也能够观察到用户与系统交互的细节:滚动鼠标、悬停鼠标、点击,以及在页面的停留时间。
- 社交网络信息最近也成为我们的数据源,我们可以知道用户的好友们都在看什么视频。
- 用户每天要进行几百万次搜索请求。
- 上述的所有数据源都来自于我们自己的系统,当然我们也可以获取外部数据,例如电影的票房、影评家的点评。
- 以上并非全部,还有诸如人口统计数据、地点、语言、时间数据(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)
实际工作中,如何贯彻实施这个理念呢?跟传统的科学研究有些不同,我们对想法的验证是借助线上分流测试(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,我们都很热衷于挑选、观看电影和剧集,我们把这份激情转化为提升系统的强大直觉:对数据的透彻分析、发现更好的特征、更合理的模型和评测、以及弥补现有系统的不足。我们通过数据挖掘和别的试验方法来验证我们的直觉,并对其按优先级逐步实现,这个过程就像任何科学发现一样,运气是很重要的,但是俗话说的好:机会青睐有准备的人。最后,还是需要让我们的用户来评测我们的推荐系统,毕竟我们的目标就是提升用户在Netflix上的体验。