推荐系统设计
推荐系统设计
一切始于一个简单的问题:如何设计一个推荐系统?
在近期的系统设计面试(System Design Interview)中,这个问题出现的频率非常高。此外,推荐系统在当今互联网产品中至关重要,几乎每家公司都在构建自己的推荐系统,用于为用户提供个性化的建议。因此,深入探讨这个话题非常有价值。
本文将主要讨论在系统设计面试中,关于推荐系统需要涵盖的各个 аспекты。主要主题包括推荐系统概述、协同过滤(Collaborative Filtering)、推荐系统基础设施等。
推荐系统概述
推荐系统一直是一个热门话题。似乎几乎每家公司都在构建这样的系统。例如,亚马逊(Amazon)使用推荐系统向顾客推荐他们可能喜欢的商品;Hulu 则使用推荐系统来推荐其他受欢迎的节目或剧集。
为了限制讨论范围,本文将主要聚焦于 YouTube 的推荐系统。更具体地说,我们将设计一个负责推荐用户可能喜欢观看的视频的系统。
启发式解决方案
尽管机器学习(Machine Learning, ML)通常用于构建推荐系统,但这并不意味着它是唯一的解决方案。在许多情况下,我们需要更简单的方法。例如,当我们只有很少的数据,或者需要快速构建一个最小可行性产品(MVP)时。
在这种情况下,我们可以从一些 启发式 解决方案开始。实际上,有很多技巧可以用来构建一个简单的推荐系统。例如:
- 根据用户观看过的视频,简单推荐来自相同作者的视频。
- 推荐标题或标签相似的视频。
- 将受欢迎程度(如评论数、分享数)作为另一个信号。
这些方法可以作为推荐系统的基准(Baseline),表现往往也不错。
协同过滤
在谈论推荐系统时,几乎不可避免地要 提及协同过滤(CF),这是推荐系统中使用最广泛的技术之一。由于并非每个人都有机器学习背景,本文不对算法进行深入数学推导。实际上,协同过滤的优点在于其基本概念非常简单,易于理解。
简而言之,要为用户推荐视频,我可以提供相似用户喜欢的视频。例如,如果用户 A 和用户 B 观看了一堆相同的视频,那么用户 A 很可能也会喜欢用户 B 喜欢的其他视频。当然,这里有很多方法可以定义“相似”的含义:可能是两个用户喜欢相同的视频集合,也可能意味着他们共享相同的地理位置等信息。
上面的算法称为 基于用户的协同过滤(User-based CF)。另一个版本称为 基于项目的协同过滤(Item-based CF),这意味着推荐与用户观看过的视频(项目)相似的其他视频。
特征工程
实际上,在系统设计面试中仅提及协同过滤并不能给人留下深刻印象,因为该算法过于普遍。大多数面试官关心的是你如何针对具体问题构建系统。那么,对于 YouTube 视频推荐,可以使用哪些特征来构建推荐系统?
通常,特征分为两种类型:显式特征和隐式特征。
- 显式特征:可以是评分、收藏夹等。在 YouTube 中,可以是点赞、分享、订阅等操作。
- 隐式特征:这类特征不太明显。例如,如果用户仅观看了几秒钟的视频,这可能是一个负向信号;给定推荐视频列表,如果用户在另一个视频上点击了一个,则表示他更喜欢被点击的视频。通常,我们需要探索很多关于隐式特征的知识。
回到 YouTube 的问题,有几个特征是很明显的:
- 点赞/分享/订阅:如上所述,它们是有关用户偏好的有力信号。
- 观看时间:用户观看了多久。
- 视频元数据:标题、标签、类别。
- 新鲜度:视频发布的时间远近。
值得一提的是,在构建机器学习系统时,您必须尝试多种不同的特征组合。除非您亲自尝试,否则无法确定哪种特征最有效。
系统基础设施
推荐系统是系统设计面试中的一个绝佳问题,因为它也可以用于讨论基础设施架构。显然,该系统包含多个步骤和组件。那么,您将如何在基础设施方面设计整个系统?
由于在 YouTube 上计算相似用户或视频可能非常耗时,这部分应该在离线管道中完成。因此,我们可以将整个系统分为在线和离线两部分。
离线部分
所有用户模型和视频数据都需要存储在分布式系统中(这可能是关于存储的完整文章,本文将 简要介绍该主题)。计算相似用户/视频的管道也需定期运行,以保持数据更新。实际上,对于大多数机器学习系统而言,通常都使用离线管道来处理大数据,因为您不会期望它在几秒钟内完成。
在线部分
基于用户个人资料及其操作(例如刚刚观看的视频),我们应该能够提供来自离线数据中的推荐视频列表。通常,系统会提取比所需更多的视频(候选集),然后即时进行过滤和排名。
- 过滤:我们可以过滤与用户观看过的视频显然不相关的视频。
- 排名:然后我们应该对建议进行排序。应考虑的因素包括视频的受欢迎程度(分享/评论/喜欢的数量)、新鲜度、质量等。
总结
实际上,有许多方法尚未在此完善。我想简单地提到一些技巧:
- 新鲜度:这可能是非常重要的因素。我们应该弄清楚如何推荐新鲜的内容。
- 评估:评估是推荐系统的重要组成部分,它使我们能够了解系统的运行情况。
- 位置偏差:为了训练协同过滤系统,我们可能还包括视频位置信号。通常,排名靠前的视频被点击的机会更高。
很难预测在系统设计面试中将讨论的具体内容,这就是为什么我尝试在帖子中涵盖尽可能多的主题,而不是更深入地研究特定领域。
说明:本文内容主要基于经典系统设计面试场景整理,文中部分链接指向 2016 年左右的技术博客。虽然核心设计思路(如离线/在线架构、协同过滤、特征工程)依然适用,但具体的工程实现细节(如深度学习模型的应用、实时流处理架构等)可能随技术发展有所演进。请以实际业务场景和最新技术栈为准。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/tui-jian-xi-tong-she-ji.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。