设计推荐系统

原文:Design a Recommendation System

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

我们从一个简单的问题开始:如何设计推荐系统?

似乎这个问题在最近的系统设计面试中被多次闻到。另外,现在推荐系统非常重要,几乎每个公司都有自己的推荐系统,可以用来提供各种建议。所以这个话题讨论起来可能相当有趣。

在这篇文章中,我将主要讨论推荐系统的各个方面,可能在系统设计面试中讨论。将涉及的主题包括推荐系统,协同过滤(CF),推荐系统基础设施等。

推荐系统

推荐系统一直是一个热门话题。似乎几乎每个公司都在建立这样的系统。例如,亚马逊正在使用推荐系统来提供客户可能也喜欢的商品。 Hulu 正在使用推荐系统来推荐其他受欢迎的节目或剧集。

为了限制讨论范围,我们主要关注 Youtube 的推荐系统。更具体地说,系统负责推荐用户可能喜欢观看的视频。

启发式解决方案

虽然机器学习(ML)通常用于建立推荐系统,但并不意味着它是唯一的解决方案。有很多情况下,我们想要更简单的方法,例如,我们可能有很少的数据,或者我们可能想快速建立一个最小的解决方案。

在这种情况下,我们可以从一些启发式解决方案开始。事实上,我们可以实现很多黑魔法,来构建简单的推荐系统。例如,根据用户观看的视频,我们可以简单推荐同一作者的视频。我们也可以推荐标题或标签类似的视频。如果我们使用知名度(评论数量,分享数量)作为另一个信号,则这个推荐系统作为一个底线,可以运行得很好。

协同过滤

在谈到推荐系统时,我很难避免提到协同过滤(CF),这是推荐系统中最流行的技术。由于不是每个人都有机器学习的背景,所以我不会更深入地介绍这个算法。实际上,协同过滤的美妙之处在于基本思想非常简单,每个人都可以很容易的理解它。

简而言之,为了向用户推荐视频,我可以提供类似用户喜欢的视频。例如,如果用户 A 和 B 已经观看了一堆相同的视频,则用户 A 很可能喜欢 B 所喜欢的视频。当然,在这里定义什么是“相似”有很多方式。这可能是两个用户喜欢同一个视频,也可能意味着他们拥有相同的位置。

以上算法被称为基于用户的协同过滤。另一个版本称为基于条目的协作过滤,意思是推荐的视频与用户观看过的视频类似(条目)。

特征工程

事实上,在系统设计面试中提到协同过滤并不令人印象深刻,因为算法非常普遍。大多数面试官关心的是如何构建针对面试问题的系统。那么对于 Youtube 视频推荐,可以使用哪些功能来构建推荐系统?

通常有两种类型的特征 - 显式和隐式特征。显式特征可以是收视率,收藏夹等。在 Youtube 上,它可以是喜欢/共享/订阅行为。隐式特征不太明显。如果用户只观看了几秒钟的视频,可能是一个负面的迹象。给定一个推荐视频的列表,如果用户点击一个而不是另一个,这可能意味着他喜欢点击那个。通常,我们需要深入探讨隐式特征。

回到Youtube的问题,有几个特征是相当明显的:

  • 喜欢/分享/订阅 - 如上所述,它们是关于用户喜好的强烈信号。
  • 观看时间
  • 视频标题/标签/类别
  • 新鲜度

值得大家注意的是,构建机器学习系统的时候,你必须尝试大量的不同特征组合。如果不尝试,你就不会知道哪一个是好的。

基础设施

推荐系统是很好的系统设计面试问题,另一个原因是它也可以用来讨论基础设施。显然,系统包含多个步骤/组件。那么你如何设计整个系统的基础设施呢?

鉴于在 Youtube 上对比类似的用户/视频可能是耗时的,这部分应该在离线流水线中完成。因此,我们可以把整个系统分为在线和离线。

对于离线部分,所有的用户模型和视频需要存储在分布式系统中(有一整篇文章都在讲存储,本文简要介绍了这个话题)。计算相似用户/视频的流水线也会定期运行,以便保持数据更新。事实上,对于大多数机器学习系统来说,使用离线流水线来处理大数据是很常见的,因为你不会期望它在几秒钟内完成。

对于在线部分,根据用户个人资料和他的行为(如刚刚观看的视频),我们应该能够提供来自离线数据的推荐视频列表。通常情况下,系统会获取比所需更多的视频,然后进行过滤和排序。我们可以过滤与用户观看过的视频无关的视频。然后我们也应该排列这些建议。一些因素应该考虑进来,包括视频流行度(分享/评论/喜欢的数量),新鲜度,质量等方面。

总结

实际上,还有很多方法可以用于改进我们尚未涉及的系统。 我想简单地提一些技巧:

新鲜度可能是一个非常重要的因素。 我们应该弄清楚如何推荐新鲜的内容。
评估是推荐系统的重要组成部分,它使我们能够了解系统的工作情况。
为了训练协作过滤系统,我们还可以包括视频位置信号。 通常情况下,排名靠前的视频有更高的点击机会。
很难预测系统设计面试中会讨论什么,这就是我尽量在文章中涵盖尽可能多的话题,而不是深入到特定的领域的原因。

如果你觉得这篇文章有帮助,请分享给你的朋友,我会很感谢。 你也可以在这里查看更多的系统设计面试问题和分析。