目录
1、对H&M零售数据集的简要介绍
2、个性化推荐的核心范式
3、引入双塔嵌入模型
4、理解4阶段推荐架构
4.1 第一阶段
4.2 第二阶段
4.3 第三阶段
4.4 第四阶段
5、将4阶段架构应用于我们的H&M案例
6、特征/训练/推理(FTI)架构
7、将FTI架构应用于我们的零售案例
8、使用GitHub Actions部署离线ML管道
9、快速演示H&M实时个性化推荐系统
本文,我们将深入探讨H&M实时个性化推荐系统的架构设计。我们将借鉴TikTok在短视频推荐领域的成功经验,将其核心策略应用于H&M零售商品的个性化推荐场景。
课程内容将全面涵盖构建端到端推荐系统所需的架构模式,重点包括以下关键环节:
-
特征工程的构建与优化
-
模型训练的最佳实践
-
实时服务的高效实现
我们将采用四阶段架构设计,指导您构建一个能够处理数百万商品推荐的高性能系统。特别地,课程将重点讲解双塔模型——这一灵活的神经网络架构,能够为用户和商品分别创建高质量的嵌入表示。
在实践部署方面,我们将展示如何运用MLOps最佳实践,通过基于Hopsworks AI湖仓的特征/训练/推理(FTI)架构,实现整个系统的有效部署。
完成本课程后,您将掌握以下核心能力:
-
理解并应用实时个性化推荐系统的架构设计原则
-
在H&M数据基础上构建高扩展性、模块化的推荐系统
-
实现从数据处理到模型部署的完整解决方案
1、对H&M零售数据集的简要介绍
个性化推荐最标准的应用场景之一是在零售领域,其中包含客户、商品和两者之间的交易。
我们将在本课程中使用的H&M个性化时尚推荐数据集是一个完美的例子。
它包含以下CSV文件:
- articles.csv
- customers.csv
- transactions.csv
在下一课中,当我们设计特征时,我们会更深入地探讨每张表。
当收集定制数据进行个性化推荐时,最具挑战的部分是从客户和商品之间获取(或生成)有意义的交互,例如:
- 客户点击了某个商品;
- 客户将某个商品添加到购物车;
- 客户购买了某个商品。
因此,我们将利用H&M数据集提供的交易来训练我们的模型并展示我们的用例。
但是,为了模拟真实世界的情景,我们将从我们的PoC UI中收集新的交互,这些交互将影响随后的预测推荐。
2、个性化推荐的核心范式
说到推荐系统,你可以选择两种核心范式:
- 基于内容的过滤:这种方法通过分析用户之前与之互动的商品的特征,然后找到具有相似特征的新商品来进行推荐——例如,如果一位顾客经常购买印花连衣裙,系统会推荐其他印花图案的衣服。
- 协同过滤:这种方法通过识别用户-商品交互中的模式,并根据行为模式找到相似的用户或商品来进行推荐。例如,如果购买皮夹克的顾客也倾向于购买黑色靴子,系统会向购买皮夹克的新顾客推荐黑色靴子。
图1:核心范式
让我们看看如何使用双塔模型应用这两种范式。
3、引入双塔嵌入模型
理解基于神经网络的推荐系统工作原理的第一步是检查双塔嵌入模型的架构。
本质上,双塔模型架构旨在计算客户和商品在相同嵌入空间中的特征丰富的嵌入。因此,在为某个客户寻找推荐时,我们可以计算客户的嵌入与要搜索的商品之间的距离,以找到最相关的商品候选者[8]。
图2:双塔模型
双塔模型架构并行训练两个神经网络:
- 客户查询编码器将客户特征转换为密集嵌入向量。
- 商品候选编码器将商品特征转换为与客户嵌入相同的向量空间中的密集嵌入。
两个编码器可以处理各种类型的特征:
- 客户编码器:人口统计信息、历史行为、上下文特征
- 商品编码器:标签、描述、评分
这引入了一种基于内容的范式。如果使用足够的特征,相似的商品和客户会被聚类在一起。
与传统架构的关键区别在于,双塔模型分别处理用户和商品特征。由于商品嵌入可以预先计算并存储在近似最近邻(ANN)索引或数据库(也称为向量数据库)中,这使得其在大规模检索中非常高效。
使用点积作为损失函数的得分,其中当客户与商品互动时期望得分为1,没有互动时得分为0,我们间接使用余弦距离,这迫使两个嵌入位于同一向量空间内。
余弦距离 = 归一化向量的点积
使用点积作为损失函数的得分引入了协同过滤范式,因为它捕捉了客户-商品交互模式。具有相似行为的客户和以相同模式访问的商品会被聚类。
因此,根据你为商品和客户使用的特征数量,双塔模型可以仅作为协同过滤算法(如果只使用ID),或者如果提供的特征中有足够信号,则两者都是。
我们将在第3课中深入探讨两个编码器的架构以及它们是如何训练的,解释训练流水线。
让我们直观地理解这两个模型如何在4阶段推荐架构中使用。
4、理解4阶段推荐架构
4阶段推荐架构是构建基于各种数据类型和应用场景的可扩展、实时个性化推荐系统的标准。
它被Nvidia和YouTube等巨头使用和提出。
在4阶段推荐架构中,数据流在两个方向上流动:
- 离线流水线,计算候选嵌入并将它们加载到向量索引或数据库中。这个流水线通常以批处理模式运行。
- 在线流水线,为某个客户计算实际的推荐。这个流水线可以根据你构建的应用类型以批处理、异步、实时或流式模式运行。
离线计算商品候选嵌入允许我们从大量商品(数百万)中进行推荐,同时仍然确保少量推荐商品是个性化的化并吸引用户。
图3:4阶段推荐系统的数据流。
离线管道利用项目候选编码模型(使用Two Tower模型训练)来计算我们数据库中所有项目的嵌入。它加载项目嵌入及其元数据(如ID)到一个优化了低延迟检索的近似最近邻(ANN)索引中。ANN索引有两种形式:
- 向量索引(例如,ScaNN、Faiss);
- 向量数据库(例如,Hopsworks、Qdrant、MongoDB)。
通过将项目嵌入的创建与实际推荐过程解耦,我们可以显著加快每个客户的推荐速度,因为:
- 我们在客户访问我们的应用程序时预先计算出所有需要查找(推荐)的内容。
- 我们可以分别优化离线和在线管道以获得更好的延迟、更低的成本、所需的吞吐量等。
在线管道分为4个阶段(顾名思义),从用户的请求开始,最终生成推荐结果。
图4:4阶段推荐系统架构
4.1 第一阶段
该阶段旨在处理大量(超过1亿个元素,最多达到数百万)候选项目,并检索相关子集(约数百个)项目用于下游排名和过滤任务。
候选生成步骤仅通过协同过滤提供广泛的个性化。相似性体现在项目和客户ID等粗粒度特征上。
管道接收customer_id
及其他输入特征(如当前日期),使用客户查询模型(使用Two Tower模型训练)计算客户嵌入,并查询向量数据库以获取相似的候选项目。
使用客户的嵌入,向量数据库(或索引)扫描整个语料库并将其缩减为xN潜在候选者(约数百个)。
4.2 第二阶段
第二阶段接收N个候选项目,并应用各种过滤器,例如移除客户已经查看或购买过的项目。
核心思想是在进行第三阶段最昂贵的操作之前过滤掉不必要的候选者。过滤通常使用布隆过滤器完成,这是一种空间高效的概率数据结构,用于测试元素是否是集合成员(如已查看或购买的项目)。
经过这一阶段后,我们只剩下xM个项目候选者。
4.3 第三阶段
第三阶段接收xM个项目候选者,并为排名做准备。算法基于项目对特定客户的相关性为每个“(项目候选者,客户)”组合提供一个分数。
在排名过程中,我们可以访问更多描述项目和用户关系的特征,因为只需对数百个项目评分,而不是候选生成阶段中的数百万个。
排名步骤较慢,因为我们用多个特征增强项目和客户。我们通常使用特征存储查询所有必要的特征。
因此,通过查询特征存储会增加额外的I/O开销,排名算法也会变慢,因为它处理的数据更多。
排名模型可以使用提升树,如XGBoost或CatBoost,神经网络,甚至LLM。
展示几个“最佳”推荐项需要细粒度的表示,以区分候选项目之间的相对重要性。排名网络通过使用丰富的描述项目和用户特征的特征集为每个项目分配分数来完成此任务。
4.4 第四阶段
在排名模型为每个“(项目候选者,客户)”组合打分之后,我们必须根据排名得分加上其他可选业务逻辑对项目进行排序。
得分最高的项目将呈现给用户,并按其得分排名。
如果项目候选列表对我们用例来说过于庞大,我们可以进一步削减到xK个项目候选者。
关键在于根据相关性对项目进行排序。将最个性化的候选项目放在顶部可以增加客户点击它们的概率。
例如,你希望当你打开Netflix、YouTube或Spotify时,你的首选电影或播放列表总是第一个出现。你不希望探索太多直到找到它。
在第四阶段结束时,我们将拥有xK个相关且个性化的项目,可以根据需要在我们的应用程序中显示。
让我们将其应用于我们的H&M案例,以便充分理解其工作原理。
5、将4阶段架构应用于我们的H&M案例
如果我们了解Two Tower模型和4阶段架构的工作原理,将其应用于我们的H&M案例是非常直观的。
首先,让我们理解在我们的案例中谁是“客户”和“项目”。
客户是在H&M网站或应用程序上浏览商品的用户。
项目是H&M销售的时尚商品,如衣服、袜子、鞋子等。
因此,我们必须向客户展示他们最有可能购买的时尚商品。
例如,如果他搜索T恤,我们很可能会推荐T恤。我们的推荐系统应该能捕捉到这一点。
图5:应用于我们的H&M案例的4阶段推荐系统架构
其次,让我们看看具体推荐H&M商品的流程:
- 当客户浏览H&M应用程序时,我们将他们的ID和日期发送到推荐系统推理管道。
- 客户查询模型基于第1步中的两个特征计算客户的嵌入。
- 由于客户的嵌入与H&M时尚商品处于同一向量空间,我们利用Hopsworks向量索引来检索相关的商品列表。
- 接下来,我们过滤掉客户已经点击或购买过的所有商品。
- 我们使用Hopsworks特征视图中的更广泛的功能列表增强时尚商品和客户。
- 我们使用CatBoost模型对剩余的时尚商品相对于客户进行排名。
- 我们根据相关性得分对商品进行排序并展示给客户。
但什么是 Hopsworks?
它是帮助我们将推荐系统部署到生产环境的人工智能湖仓。
它提供了以下功能:
- 特征存储:存储、版本管理和访问用于训练(离线,高吞吐量)和推理(在线,低延迟)所需的特征。
- 模型注册表:存储、版本管理和访问模型(候选编码器、查询编码器、排名模型)。
- 服务层:托管包含4个步骤的推理管道,以实现实时预测。
鉴于此,我们可以将特征存储在Hopsworks中,使其可用于训练和推理,并通过利用其模型注册表和服务层部署我们的模型。
6、特征/训练/推理(FTI)架构
该模式表明任何机器学习系统都可以简化为这三个管道:特征、训练和推理。
Hopsworks的创始人兼首席执行官Jim Dowling引入了该模式,以简化构建生产级机器学习系统的过程。
特征管道以原始数据作为输入,并输出用于训练模型的特征和标签。
训练管道以特征存储中的特征和标签作为输入,并输出训练好的模型。
推理管道以特征存储中的特征和模型注册表中的训练模型作为输入。有了这两者,可以在批处理或实时模式下轻松进行预测。
图6:特征/训练/推理(FTI)架构
总之,关于FTI管道最重要的事情是你必须记住它们的接口:
- 特征管道接收数据并输出保存到特征存储的特征和标签。
- 训练管道从特征存储查询特征和标签,并将模型输出到模型注册表。
- 推理管道使用特征存储中的特征和模型注册表中的模型进行预测。
无论你的机器学习系统有多复杂,这些接口都将保持不变。
7、将FTI架构应用于我们的零售案例
理解H&M推荐系统架构的最后一步是展示我们如何将FTI模式应用于它。
这个模式将帮助我们通过部署离线机器学习管道并在实时环境中提供推理管道(具有4阶段逻辑)将系统从笔记本转移到生产环境。
ML管道(特征、训练、嵌入、推理)将在Python中实现。同时,我们将利用Hopsworks人工智能湖仓进行存储和部署。
让我们通过独立查看每个管道来看看如何做到这一点。
特征管道将原始H&M数据(通常存储在数据仓库中)转换为存储在Hopsworks特征组中的特征。
目前,你需要知道特征组类似于数据库中的表,其中我们分组相关特征(例如,客户、商品、交易等)。
图7:架构真实时间个性化推荐系统——由H&M支持
训练管道从各种Hopsworks特征视图中输入特征,训练两个塔模型和排序模型,并将它们保存在Hopsworks模型注册表中。
请记住,两个塔模型会并行训练两个模型:项目候选编码器和查询编码器。因此,我们独立地将它们保存在模型注册表中,因为我们在不同的时间点会使用它们。
特征视图是一种只读操作(训练、推理)的虚拟表。它是基于从多个特征组中选择的多个特征创建的。这样做允许您创建具有您需要的精确特征的虚拟表,用于离线模式下的训练或在线模式下的推理。
嵌入推理管道(离线) 从模型注册表加载候选模型,并从检索特征视图加载时尚商品,计算嵌入,并将其加载到候选嵌入Hopsworks向量索引(也是特征组)中。
注意嵌入管道遵循FTI架构提出的推理管道接口。
这是因为推理逻辑分为离线和在线管道,如4阶段推荐系统架构部分所述。
这突显出FTI管道不仅仅是三个管道,而是一个思维导图,用于建模您的系统,通常包含许多更多的组件。
最终, 实时推理管道(在线) 从模型注册表加载查询检索和排序模型及其关联特征来自Hopsworks特征视图。
此管道部署在Hopsworks AI湖屋作为实时API,通过HTTP请求从前端调用。
实时推理管道封装了4阶段推荐系统逻辑,为客户提供最终的个性化推荐。
8、使用GitHub Actions部署离线ML管道
根据FTI架构,ML管道完全解耦,如果遵守特定顺序,可以作为独立组件运行。
因此,与Hopsworks作为AI湖屋一起,我们可以快速将ML管道部署到GitHub Actions,该动作可以在:
- 手动触发;
- 定时;
- 在合并新功能分支到主分支(或暂存区)后。
图8:使用GitHub Actions部署离线ML管道
由于我们的模型很小,我们可以免费使用GitHub Actions进行计算。因此,在CPU上训练它们是可行的。
此外,由于GitHub Actions与您的代码集成良好,只需几行代码,我们就可以准备必要的Python环境,运行代码,并将ML管道链式成一个有向无环图(DAG)。
9、快速演示H&M实时个性化推荐系统
为了展示我们为生产准备的H&M实时个性化推荐系统的端到端PoC,我们使用了以下技术栈:
- Hopsworks(无服务器平台) 提供免费计划以托管我们的特征存储、模型注册表和实时服务层。
- GitHub Actions 用于托管和调度离线ML管道(如上所述)
- Streamlit 用于原型化一个简单的前端来测试推荐系统。同时,我们利用Stream Cloud 托管前端。
这会花费我钱吗? 我们将坚持使用这些工具和平台的免费层,使我们能够免费测试整个推荐系统系列。
图9:由实时个性化推荐驱动的Streamlit应用
代码仓库:https://github.com/decodingml/personalized-recommender-course
本文转自汇智网翻译,侵删
👇点击关注AI疯人院获取
更多技术信息~