【推荐系统】Netflix 推荐系统:第二部分
原文链接:http://techblog.netflix.com/2012/06/netflix-recommendations-beyond-5-stars.htm
在 blog 的第一部分,我们详细介绍了 Netflix 个性化推荐系统的各个组成部分。我们也解释了自从我们宣布 Netflix Prize 后,Netflix 推荐系统是如何变化的。100 万美金的奖金让我们不论在算法创新,还是在品牌宣传和吸引人才加入方面都获得了丰厚的回报。不过,准确的预测电影评分仅只是我们推荐系统的一部分。在本文中,我们将更加深入的介绍个性化推荐技术,讨论当前我们使用的模型、数据,以及我们在这方面的创新方法。
排序
推荐系统的目的是给用户提供一些有吸引力的物品供用户选择。具体的做法是先选择一些候选物品,并对这些物品按照用户感兴趣的程度进行排序。展示推荐结果最常用的方式是组成某种有序列表,而在 Netflix,列表就是一行行的视频。因此,我们需要一个排序模型,利用各种各样的信息,来为每一个用户生成个性化推荐列表。
如果你正在寻找一个能够最大化用户消费的排序函数,那么最显然的基本函数就是物品的热门程度。原因很简单:用户总是倾向于观看大家都喜欢观看的视频。然而,热门推荐是个性化推荐的反义词,它将为每个用户生成千篇一律的结果。因此,我们的目标就是找到一个比热门推荐更好的个性化排序算法,从而满足用户不断变化的口味。
既然我们的目标是推荐用户最可能观看和喜欢的视频。最简单的方法是利用我们估计出的用户对物品的评分来代替物品的热门程度。不过利用预测评分会给用户推荐过于冷门或用户不熟悉的视频,而且不会给用户推荐那些他们可能不会打高分但是会观看的视频。为了解决这个问题,我们并不会只用热门推荐或者预测评分,我们希望能够设计出一个能够平衡这两种因素的排序算法。因此,我们可以将热门程度和预测评分都作为特征,在此基础上构建排序模型。
有很多方法可以用来设计排序算法,比如评分排序方法、配对优化法方法、全局优化方法。举例说明,我们可以设计一个简单的评分排序方法,对视频的热门程度和用户的期望评分进行线性加权:f(u, v) = w1*p(v) + w2*r(u, v) + b,其中 u 表示用户,v 表示视频,p 表示热门函数,r 表示期望评分。这个公式可以通过一个二维空间表示,如下图:
当我们有了这个排序函数后,我们就可以输入一组视频,然后对它们基于评分由高到底进行排序。你可能会很好奇我们是如何选择权重 w1 和 w2 的值(偏移量 b 是一个常量,不影响最终的排序)。换句话说,也就是在我们这个简单的二维模型里面如何确定热门程度更重要?还是期望分值更重要?这个问题至少有两种解决方案:第一种是可以对 w1 和 w2 简单的选一些候选值,然后放到线上通过 A/B Test 的方式找到最优的权重。但是这个方案比较耗时,效率不是很高。第二种是利用机器学习的方法:从历史数据中选择一些正样本和负样本,设计一个目标函数,让机器学习算法自动地为 w1 和 w2 学习一个权重。这种机器学习的方法叫做“Learn to rank (LTR)”,已经在搜索引擎和广告精准投放领域得到了广泛应用。但推荐系统的排序任务有一个重要的区别:排序的个性化。我们不是要获得一个全局的 w1 和 w2 权重,而是要为每个用户都找到一个个性化的值。
你们可能会猜到,除了热门程度和期望评分,我们在 Netflix 推荐系统中还尝试了很多其他的特征。有些没有效果,有些则显著的提升了排序的精度。下图展示了我们通过添加不同的特征和优化机器学习算法后对排序性能的改善效果。
很多监督学习方法都能被用来设计排序模型。其中代表性的有 Logistic 回归,支持向量机(SVM),神经网络或决策树类的算法(GBDT)。另一方面,近几年来许多算法被应用到“Learn to rank”中,比如 RankSVM 和 RankBoost。对于一个给定的排序问题,找到效果最好的算法并不容易。如果你的特征比较简单,那么可以选择一个简单的模型。但是值得注意的是有时候新加的一个特征却不起作用,这是因为模型对它不友好。或者是在一个很好的模型中表现不好,因为你的特征和模型不是很匹配。
数据和模型
在前面关于排序算法的讨论中已经强调了数据和模型对于构建个性化推荐系统的重要性。在 Netflix,我们很幸运的拥有大量相关数据和很多天才工程师,他们通过算法将数据转换为产品。以下是我们在优化推荐系统中用到的一些数据源:- 我们有几十亿的用户评分数据,并且以每天几百万的规模在增长。
- 我们以视频热度为算法基线,有很多方法用来计算热度。我们可以计算不同时间视频的热度,例如:一个小时、一天、或者一周。同时,我们可以将用户按地域划分,计算视频在某地用户的中的热度。
- 我们的系统每天产生几百万的播放点击,并且包含很多特征,例如:播放时长、播放时间点和设备类型。
- 我们的用户每天将几百万部视频添加到他们的播放列表。
- 每个视频都有丰富的元数据:演员、导演、类型、评论、评分。
- 视频展现方式:我们知道推荐的视频是在什么时间、什么位置展现给用户的,因而可以推断这些因素是如何影响用户的选择。我们也能够观察到用户与系统交互的细节:鼠标滚动、鼠标悬停、点击、以及在页面的停留时间。
- 社交数据已经成为我们个性化特征中最新的数据源,我们可以知道用户已经关注或评论的好友都在看什么视频。
- 我们的用户每天产生几百万的搜索请求。
- 上面提到的数据都来自我们自己的系统,我们也可以挖掘外部数据改善我们的特征,例如:电影票房、影评家的评论。
- 当然,以上并非全部,还有很多其他的特征,如:人口统计数据、地域、语言、时间上下文等都可以用于我们的预测模型中。
介绍完数据,那什么是模型呢?我们发现,有这些高质量、类型丰富的数据,单一的模型是不够的,我们有必要对模型进行选择、训练、和测试。我们使用了许多类型的机器学习方法:从聚类算法这样的无监督学习方法到分类算法这样的监督学习方法。如果你关注个性化推荐的机器学习算法,那么你应该知道下面这些还没有列举全的方法:
- 线性回归(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 创立伊始,这种方法就成了公司的基因,我们称之为消费者法则。从广义上说,消费者法则的目标是通过创新让用户获得便利。真正的失败就是没有创新,就像 IBM 的创始人 Thomas Watson 先生所说“如果你想成功,那就不要畏惧失败!”。我们的创新文化要求我们能够高效地通过实验来实践我们的想法,只有这样,我们才能理解这个想法为什么成功或者为什么失败?如此,我们能够专注于改善用户体验,而不是把时间浪费在一些无用的想法上。
那么,在实际工作中,如何贯彻实施这个理念呢?和传统的科学研究不同,我们通过线上的 A/B 测试来完成对想法的验证:
1. 提出假设
待验证的算法/特征/设计/... ,这些待验证的假设将能够提升我们的服务体验,增加用户在网站的停留时间
2. 设计实验
开发一个解决方案或原型。想法的最终效果可能是原型的 2 倍,但一般不会有 10 倍那么多。
考虑依赖和独立的变量、操作、重要性...
3. 执行测试
4. 让数据说话
当我们执行 A/B 测试的时候,我们会跟踪多个维度的指标,但我们最信赖用户的视频播放时长和停留时间。每一次测试通常会覆盖上千名用户,并且为了验证想法的方方面面,测试会分成 2 到 20 份进行。我们一般都是平行进行多个 A/B 测试,这使得我们可以验证一些激进的想法,并且能同时验证多个方法,但最重要的是,我们能够通过数据驱动我们的工作。关于 A/B 测试,可以参考我们以前的技术博客和我们首席产品官 Neil Hunt 在 Quora 上的回复。
另一方面,我们面临着一个有趣的问题:如何把我们的机器学习算法整合到 Netflix 以数据为驱动的 A/B 测试文化中。我们的做法是结合离线-在线测试。在线测试之前,我们会进行离线测试,先优化并检验我们的算法。为了评测算法的性能,我们采用了机器学习领域的很多种指标:有排序指标,例如:NDGC(Normalized Discounted Cumulative Gain)、Mean Reciprocal Rank、Fraction of Concordant Pairs。也有分类指标,例如:精准度、查准率、查全率、F-score。我们也使用了来自 Netflix Prize 著名的 RMSE(均方根误差)和其他一些独特的指标,例如:多样性指标。我们跟踪比较这些离线指标和线上效果的吻合程度,发现它们并不是完全一致的。因此,离线指标只能作为最终决定的参考。
一旦离线测试验证了一个假设,我们就准备设计和发布 A/B 测试,从用户的视角证明新的特征的有效性。如果这一步通过了,我们便将其加入到我们的主要系统中,为我们的用户提供服务。下图详细说明了整个创新周期。
这种创新周期是一个极端的例子,我们称之为“前十行结果的马拉松比赛(Top 10 Marathon)”。这是一个为期 10 周、高度专注、高强度的工作,旨在快速检验数十种算法,以改善我们前十行的推荐结果。可以把它看成是一项有考核指标的为期两月的黑客马拉松比赛。不同的团队和个人被邀请到一起贡献想法并编码实现。每周我们会推 6 种不同的算法到线上进行 A/B 测试,并持续评估这些算法的离线和线上指标。最终表现优异的算法会成为我们推荐系统的一部分。
结语
虽然 Netflix Prize 把推荐系统任务抽象为评分预测问题,但评分只是推荐系统众多数据来源的一种,评分预测也只是我们实际解决方案的一部分。随着时间的推移,我们已经把推荐系统的任务重新定义为提升用户选择视频、观看视频、享受我们服务、并成为我们回头客的机率。更多的数据可以带来更好的效果,但是为了达到这样的目标,我们需要不断优化我们的方法,进行合理的评测和迭代实验。
为了构建一个创新的个性化推荐平台,仅靠我们的这些研究是不够的,我们系统的提升空间还很大。在 Netflix,我们都很热衷于挑选、观看电影和电视剧,我们专注于研究,并把这份激情转化为提升系统的强大直觉。我们充分利用数据,发现更好的特征、更合理的模型和评测方法,以及弥补现有系统的不足。我们利用数据挖掘和其他的实验方法来验证我们的直觉,并按其优先级逐步实现。与科学实验一样,运气也是很重要的,但是俗话说的好:机会留给有准备的人。最后,最重要的一点是我们需要我们的用户来评测我们最终的推荐结果,因为我们的目标就是为了提升用户在 Netflix 上的体验。
相比 blog 的第一部分,本文(blog 的第二部分)透露了 Netflix 推荐系统的不少技术细节。可以看到在 Netflix 推荐系统中,除了预测评分,还关注视频的热门程度、多样性等其他的特征,毕竟预测评分的 RMSE 只能说明:当用户看这部电影的时候,会打高分。但这里有个前提,即:“用户要看这部电影”,所以 blog 的最后部分才强调:“我们已经把推荐系统的任务重新定义为提升用户选择视频、观看视频、享受我们服务、并成为我们回头客的机率”。可见,Netflix 推荐算法的优化目标是:吸引用户去看电影,然后给予高的评分。
本文中介绍的排序部分是 Netfix 推荐系统的重要部分,从介绍中可以明确这部分是离线计算完成的,通过机器学习算法离线训练找到不同的特征权重,然后在线通过 A/B 测试验证哪一种特征组合最优、最有效,最终根据最优的特征组合生成用户对物品的兴趣得分(一个综合的得分)。