它从一个简单的问题开始:如何设计推荐系统?
在最近的系统设计访谈中,似乎已经多次询问过这个问题。此外,推荐系统在当今如此重要,几乎每个公司都有自己的推荐系统,可用于提供各种建议。因此,讨论这个话题可能会很有趣。
在这篇文章中,我将主要讨论可以在系统设计访谈中讨论的推荐系统的各个方面。将涵盖的主题包括一般的推荐系统,协作过滤(CF),推荐系统基础结构等。
推荐系统
推荐系统一直是一个热门话题。似乎几乎每个公司都在构建这样的系统。例如,亚马逊正在使用推荐系统来提供顾客也可能喜欢的商品。Hulu正在使用推荐系统来推荐其他受欢迎的节目或剧集。
为了限制讨论的范围,我们主要关注YouTube的推荐系统。更具体地说,系统负责推荐用户可能喜欢观看的视频。
启发式解决方案
尽管机器学习(ML)通常用于构建推荐系统,但这并不意味着它是唯一的解决方案。在许多情况下,我们需要更简单的方法,例如,我们可能只有很少的数据,或者我们可能想快速构建最小的解决方案等。
在这种情况下,我们可以从一些启发式解决方案开始。实际上,我们可以做很多技巧来构建一个简单的推荐系统。例如,根据用户观看的视频,我们可以简单地推荐来自相同作者的视频。我们也可以建议标题或标签相似的视频。如果我们将受欢迎程度(评论数,分享数)用作另一个信号,则推荐系统可以很好地作为基准。
协同过滤
在谈论推荐系统时,我几乎不免提及合作过滤(CF),这是推荐系统中使用最广泛的技术。由于并非每个人都有机器学习背景,因此我将不对算法进行更深入的研究。实际上,协作过滤的优点在于基本概念非常简单,每个人都可以轻松理解它。
简而言之,要为用户推荐视频,我可以提供类似用户喜欢的视频。例如,如果用户A和B观看了一堆相同的视频,则用户A很可能会喜欢B喜欢的视频。当然,这里有很多方法可以定义“相似”的含义。可能是两个用户喜欢相同的视频,也可能意味着他们共享相同的位置。
上面的算法称为基于用户的协作过滤。另一个版本称为基于项目的协作过滤,这意味着推荐与用户观看过的视频类似的视频(项目)。
特征工程师
实际上,在系统设计访谈中提及协作过滤并没有给人留下深刻的印象,因为该算法是如此普遍。大多数面试者关心的是如何构建针对面试问题的系统。那么对于Youtube视频推荐,可以使用哪些特征来构建推荐系统?
通常,有两种类型的特征-显式和隐式特征。显式特征可以是评分,收藏夹等。在Youtube中,可以是点赞/分享/订阅操作。隐式特征不太明显。如果用户仅观看了几秒钟的视频,则可能是负号。给定推荐视频列表,如果用户在另一个视频上单击一个,则表示他更喜欢被单击的视频。通常,我们需要探索很多有关隐式特征的知识。
回到Youtube问题,有几个特征很明显:
- 点赞/分享/订阅-如上所述,它们是有关用户偏好的有力信号。
- 观看时间
- 视频标题/标签/类别
- 新鲜
值得一提的是,在构建机器学习系统时,您必须尝试多种不同特征组合,以使您不会尝试哪种特征,除非您尝试一下。
基础设施
推荐系统是一个很棒的系统设计面试问题的另一个原因是,它也可以用于讨论基础结构。显然,该系统包含多个步骤/组件。那么您将如何在基础架构方面设计整个系统?
由于在YouTube上比较相似的用户/视频可能很耗时,因此这部分应该在离线管道中完成。因此,我们可以将整个系统分为在线和离线两种。
对于离线部分,所有用户模型和视频都需要存储在分布式系统中(这可能是有关存储的完整文章,本文将简要介绍该主题)。计算相似用户/视频的管道也定期运行,以保持数据更新。实际上,对于大多数机器学习系统而言,通常都使用脱机管道来处理大数据,因为您不会期望它在几秒钟内完成。
对于在线部分,基于用户个人资料及其操作(例如刚刚观看的视频),我们应该能够提供离线数据中推荐视频的列表。通常,系统会提取比所需更多的视频,然后即时进行过滤和排名。我们可以过滤与用户观看的视频显然不相关的视频。然后我们还应该对建议进行排名。应考虑的因素很少,包括视频的受欢迎程度(分享/评论/喜欢的数字),新鲜度,质量等。
摘要
实际上,有许多方法尚未完善。我想简单地提到一些技巧:
- 新鲜度可能是非常重要的因素。我们应该弄清楚如何推荐新鲜的内容。
- 评估是推荐系统的重要组成部分,它使我们能够了解系统的运行情况。
- 为了训练协作过滤系统,我们可能还包括视频位置信号。通常,排名靠前的视频被点击的机会更高。
很难预测在系统设计面试中将讨论的内容,这就是为什么我尝试在帖子中涵盖尽可能多的主题,而不是更深入地研究特定领域。