入门构建推荐系统的最大难点之一就是理解推荐系统在实践中是如何应用的。目前,关于推荐系统的网络资料大多集中在推荐模型本身,仅限于介绍一些简单的协同过滤(CollaborativeFiltering)模型。对于新手来说,仅仅了解一个简单的推荐模型是不足以让他们搭建一个可以在实际生产中使用的推荐系统的。无论是简单的协同过滤模型,还是DLRM等深度学习模型,推荐模型的作用都是对用户可能感兴趣的内容进行排序(Ranking),更准确地说,是打分(Scoring)。但在现实场景中,单靠打分并不足以获得好的推荐结果。本文将以Meta、Netflix和Pinterest等公司的例子介绍构建推荐系统的主流模型。NVIDIAMerlin团队认为该模型是构建端到端推荐系统的核心,希望通过介绍该模型帮助大家了解推荐系统(不仅仅是推荐模型)在实际生产中的应用。1.两阶段推荐系统:推荐检索打分的item越多,带来的问题也就越多。待推荐目录中的内容可以达到数百万甚至数十亿项。此时,根据每个用户的喜好对每个内容进行评分是不现实的。评分需要大量的计算能力。在实际操作中,系统通常只从所有项目中快速选择与用户偏好相关的子集,并对其中的1000或10000个项目进行评分。因此,推荐系统可以分为两个阶段。在我们对项目进行评分之前,我们需要选择一组合理的最终会与用户接触的相关项目。这个阶段称为候选检索阶段(也叫候选生成阶段),也就是选择用户可能感兴趣的项目集合。有很多候选检索模型,包括矩阵分解、双塔、线性模型、近似最近邻和图遍历。它们通常比评分模型的计算效率高得多。2016年,谷歌发表了一篇关于YouTube推荐系统的论文(https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/45530.pdf),这是关于候选检索的其中一个最早的关于体系结构的公开文件,这种方法在今天的工业中被广泛使用。EugeneYan也写了一篇关于这个的优秀文章(https://eugeneyan.com/writing/system-design-for-discovery/),他将推荐系统分为两个阶段(即候选人检索和评分),我们从中得到启发并将其细化为四个阶段(详见下文)。值得一提的是,在同一个推荐系统中使用多个候选源也是一种常见的做法,这样才能保证呈现给用户的候选物品更加多样化,这里就不多说了。2.过滤阶段的必要性虽然候选检索和打分这两个阶段对于大规模的推荐任务来说似乎已经足够了,但是推荐系统还需要支持一些其他的约束条件。因为在大多数情况下,总会有一些你不想给用户展示的内容,比如缺货的产品,不适合用户年龄段的内容,用户已经看过的内容,以及用户所在国家不允许上线的内容等。与其让评分或检索模型推理上述业务逻辑来避免无法推荐的内容,还不如直接加一个“过滤”(Filtering)阶段到推荐系统。过滤阶段通常在检索阶段之后,也可以与检索阶段结合(过滤阶段最复杂的问题是保证检索后有足够的候选项目),有时甚至在评分阶段之后。模型本身难以实现的业务逻辑规则可以通过过滤来实现。过滤有时需要简单的排除查询,有时会比较复杂,比如使用BloomFilter筛选出用户接触过的内容。3.排序阶段:Ranking还是Ordering?到目前为止,我们已经涵盖了三个阶段:候选人检索、过滤和评分。经过这三个阶段,系统已经筛选出相关的推荐内容,并一一打分。每个项目的分数代表评分系统估计的用户兴趣水平。推荐内容通常以列表的形式呈现给用户,这带来了一个有趣的问题:理想的推荐列表不应局限于系统的评分,还必须保证一定的多样性,向用户展示一些他们认为平时不会接触的,帮助他们探索未知领域,避免掉入信息茧。一些文献将推荐系统的评分阶段称为“排名(Ranking)”,但最终给用户的推荐列表中的排名(或位置)很少直接与模型输出的结果对齐(译注:对于例如,在推荐列表中排名靠后的内容通常不是模型评分最低的内容)。并且通过提供明确的“排序”阶段,我们可以使推荐模型的评分与其他业务需求的约束保持一致。4.推荐系统的四个阶段和实例候选检索、过滤、打分、排序四个阶段构成了目前大部分推荐系统的设计模式。下图展示了如何分四个阶段训练、部署和支持推理时间查询。应用于实际生产的推荐系统要比基本的推荐模型复杂得多。我们相信下图相当准确地代表了当今最实用的推荐系统是如何构建的。接下来我们看看推荐系统的实际应用。首先,通过研究常见的推荐任务,我们发现以下用例都具有相似的模式,符合上述四个阶段。那么,我们就可以分析一下现实中的推荐系统,看看每个步骤属于哪个阶段。Meta的Instagram团队曾发表文章PoweredbyAI:Instagram'sExplorerecommendersystem(IGQLquerylanguage),介绍其开发的查询语言(QueryLanguage),可以让推荐系统的开发变得更简单。Instagram提供了下面的例子,从中我们可以看出这种查询语言完全可以映射出我们总结的四个阶段。Pinterest也有一系列关于推荐系统的论文:Pinterest上的相关Pins:真实世界推荐系统的演变,Pixie:实时向200+百万用户推荐3+0亿个项目并将深度学习应用于相关引脚。下图摘自上面的第一篇论文,显示了Pinterest系统架构的演变。同样,Pinterest的推荐系统一般也符合四个阶段,只不过候选检索和过滤是集成在同一个阶段。最后,Instacart在2016年公布了如下推荐架构(http://slideshare.net/SharathRao6/recommendation-systems-instacart),也符合我们提到的四个阶段。首先是检索候选商品,过滤用户购买的商品,然后对推荐商品打分,最后对推荐商品进行重新排序,增加展示商品的多样性。总之,实际的推荐系统要比单一的推荐模型复杂得多,而且业内新手在网上找到的推荐系统资料大多只介绍了协同过滤模型。所以,当他们真正开始做推荐系统的时候,难免会一头雾水。水。
