转:netflix推荐系统竞赛
原文链接: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上的体验。
转:netflix推荐系统竞赛的更多相关文章
- Netflix推荐系统:从评分预测到消费者法则
http://in.sdo.com/?p=11 原文链接:Netflix recommendations: beyond the 5 stars (Part 1), (Part 2) 原文作者:Xav ...
- 【推荐系统】Netflix 推荐系统:第二部分
原文链接:http://techblog.netflix.com/2012/06/netflix-recommendations-beyond-5-stars.htm 在 blog 的第一部分,我们详 ...
- 【RS】Matrix Factorization Techniques for Recommender Systems - 推荐系统的矩阵分解技术
[论文标题]Matrix Factorization Techniques for Recommender Systems(2009,Published by the IEEE Computer So ...
- Netflix工程总监眼中的分类算法:深度学习优先级最低
Netflix工程总监眼中的分类算法:深度学习优先级最低 摘要:不同分类算法的优势是什么?Netflix公司工程总监Xavier Amatriain根据奥卡姆剃刀原理依次推荐了逻辑回归.SVM.决策树 ...
- 第一篇:使用Spark探索经典数据集MovieLens
前言 MovieLens数据集包含多个用户对多部电影的评级数据,也包括电影元数据信息和用户属性信息. 这个数据集经常用来做推荐系统,机器学习算法的测试数据集.尤其在推荐系统领域,很多著名论文都是基于这 ...
- Spark探索经典数据集MovieLens
Spark探索经典数据集MovieLens 阅读目录 前言 环境 初步预览 探索用户数据 探索电影数据 探索评级数据 回到顶部 前言 MovieLens数据集包含多个用户对多部电影的评级数据,也包括电 ...
- Netflix公布个性化和推荐系统架构
Netflix的推荐和个性化功能向来精准,前不久,他们公布了自己在这方面的系统架构. 3月27日,Netflix的工程师Xavier Amatrain和Justin Basilico在官方博客发布文章 ...
- 推荐系统之LFM
这里我想给大家介绍另外一种推荐系统,这种算法叫做潜在因子(Latent Factor)算法.这种算法是在NetFlix(没错,就是用大数据捧火<纸牌屋>的那家公司)的推荐算法竞赛中获奖的算 ...
- TOP 10开源的推荐系统简介
最近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature.LibMF.LibFM等,也有重量级的适用于工业系统的 Mahout.Oryx.Eas ...
随机推荐
- 如何在UIimageview里显示一张图片里的某一部分
首先,获取想要显示的部分的大小及位置 CGRect rect: 然后,将此部分从图片中剪切出来 CGImageRef imageRef=CGImageCreateWithImageInRect([im ...
- jq mobile非ajax加载,ready执行两次
jqm只有通过ajax加载的页面才只执行一次ready(正常情况) 页面刷新(同非ajax加载的页面)都会执行两次ready,包括pageinit和pageshow事件也是如此. 两种避免的方法是: ...
- ASP.NET 使用Ajax
转载: http://www.cnblogs.com/dolphinX/p/3242408.html $.ajax向普通页面发送get请求 这是最简单的一种方式了,先简单了解jQuery ajax的语 ...
- js对象学习
1. 属性类型 数据属性 ①Configurable 表示能否通过delete删除属性,默认值true ②Enumerable 表示能否通过for-in循环访问属性,默认值true ③Writable ...
- jQuery基础--样式篇(5)
jQuery的属性与样式 (1).attr()与.removeAttr():每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息. attr()有4个表达式 attr(传入 ...
- 我的一个小作品 android App ---校园资讯助手
软件主界面采用Fragment+ViewPager组成.在点开后将会自动对学校新闻页面使用URl类来抓取,然后对网页中的信息提取,使用WebView来loadData在主界面上面显示, 为了使 ...
- Android新旧版本Notification
Android新旧版本Notification 在notification.setLatestEventInfo() 过时了 以前: NotificationManager mn = (Notific ...
- 美化select下拉框
直接上干货: 需要的材料: change_select.js (文末会给出下载地址) 使用方法: 1.调用方法:<script type="text/javascript" ...
- 【Codeforces 707B】Bakery 水题
对每个storages找一下最短的相邻边 #include <cstdio> #define N 100005 #define inf 0x3f3f3f3f using namespace ...
- 【CodeForces 567E】President and Roads(最短路)
Description Berland has n cities, the capital is located in city s, and the historic home town of th ...