Netflix推荐系统:从评分预测到消费者法则
http://in.sdo.com/?p=11
原文链接:Netflix recommendations: beyond the 5 stars (Part 1), (Part 2)
原文作者:Xavier Amatriain and Justin Basilico
- 前言
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推荐系统竞赛
原文链接:Netflix recommendations: beyond the 5 stars (Part 1), (Part 2) 原文作者:Xavier Amatriain and Justin ...
- 【推荐系统】Netflix 推荐系统:第二部分
原文链接:http://techblog.netflix.com/2012/06/netflix-recommendations-beyond-5-stars.htm 在 blog 的第一部分,我们详 ...
- 推荐系统(recommender systems):预测电影评分--问题描述
推荐系统很重要的原因:1>它是机器学习的一个重要应用2>对于机器学习来说,特征是非常重要的,对于一些问题,存在一些算法能自动帮我选择一些优良的features,推荐系统就可以帮助我们做这样 ...
- 推荐系统(recommender systems):预测电影评分--构造推荐系统的一种方法:低秩矩阵分解(low rank matrix factorization)
如上图中的predicted ratings矩阵可以分解成X与ΘT的乘积,这个叫做低秩矩阵分解. 我们先学习出product的特征参数向量,在实际应用中这些学习出来的参数向量可能比较难以理解,也很难可 ...
- (转载)极大似然估计&最大后验概率估计
前言 不知看过多少次极大似然估计与最大后验概率估计的区别,但还是傻傻分不清楚.或是当时道行太浅,或是当时积累不够. 这次重游机器学习之路,看到李航老师<统计学习方法>中第一章关于经验风险最 ...
- 推荐系统-协同过滤在Spark中的实现
作者:vivo 互联网服务器团队-Tang Shutao 现如今推荐无处不在,例如抖音.淘宝.京东App均能见到推荐系统的身影,其背后涉及许多的技术.本文以经典的协同过滤为切入点,重点介绍了被工业界广 ...
- 海量数据挖掘MMDS week4: 推荐系统Recommendation System
http://blog.csdn.net/pipisorry/article/details/49205589 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- 文章翻译:Recommending items to more than a billion people(面向十亿级用户的推荐系统)
Web上数据的增长使得在完整的数据集上使用许多机器学习算法变得更加困难.特别是对于个性化推荐问题,数据采样通常不是一种选择,需要对分布式算法设计进行创新,以便我们能够扩展到这些不断增长的数据集. 协同 ...
- SVD在推荐系统中的应用详解以及算法推导
SVD在推荐系统中的应用详解以及算法推导 出处http://blog.csdn.net/zhongkejingwang/article/details/43083603 前面文章SVD原理及推 ...
随机推荐
- [Java]类的生命周期(下)类的初始化[转]
上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后 ...
- C# 实现IDisposable的模式
来自MSDN官方文档:http://msdn.microsoft.com/en-us/library/system.configuration.provider.providercollection. ...
- 关于ConcurrentDictionary的线程安全
ConcurrentDictionary是.net BCL的一个线程安全的字典类,由于其方法的线程安全性,使用时无需手动加锁,被广泛应用于多线程编程中.然而,有的时候他们并不是如我们预期的那样工作. ...
- [Go] Http / Net 相关资料
[astaxie] [基础]GO搭建一个简单的Web服务器 [astaxie] Go如何使得Web工作 [astaxie] Go 的 Http 包详解 [叶剑峰] Go语言_HTTP包 [叶剑峰] 使 ...
- react-router 从 v2/v3 to v4 迁移(翻译)
react-router v4 是完全重写的,所以没有简单的迁移方式,这份指南将为您提供一些步骤,以帮助您了解如何升级应用程序. 注意: 这份迁移指南适用于react-router v2和v3,但为简 ...
- 关于GPL协议的理解(开源与商用、免费与收费的理解)
编者:请特别注意看暗红色粗体标注的那几句话,总结下来有下面几点: 如果你用了我的 GPL软件,那么你的软件也必须要开源,否则就不能使用我的软件,你是否把你的软件商用和我没关系 Oracle 卖的不是软 ...
- 得到WAV文件的长度
long getVideoLength (char *fileName){ MCI_OPEN_PARMS mciOpenParms; MCI_STATUS_PARMS mciStatusPar ...
- C#编程(三十三)----------Array类
Array类 创建数组 Array intArray1 = Array.CreateInstance(typeof(int), 5); for (int i = 0; i < 5; i++) { ...
- 设计模式之命令模式(Command)
from::http://www.cnblogs.com/itTeacher/archive/2012/12/04/2801322.html 命令模式将一个请求封装为一个对象,从而使你可用不同的请求对 ...
- Windows:C:\Windows\System32\drivers\etc\hosts
原文地址:http://zhumeng8337797.blog.163.com/blog/static/100768914201001983953188/. host是一个没有扩展名的系统文件,可以用 ...