仿TikTok推荐系统开发与部署

目录

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零售商品的个性化推荐场景。

课程内容将全面涵盖构建端到端推荐系统所需的架构模式,重点包括以下关键环节:

  1. 特征工程的构建与优化

  2. 模型训练的最佳实践

  3. 实时服务的高效实现

我们将采用四阶段架构设计,指导您构建一个能够处理数百万商品推荐的高性能系统。特别地,课程将重点讲解双塔模型——这一灵活的神经网络架构,能够为用户和商品分别创建高质量的嵌入表示。

在实践部署方面,我们将展示如何运用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阶段推荐架构中,数据流两个方向上流动:

  1. 离线流水线,计算候选嵌入并将它们加载到向量索引或数据库中。这个流水线通常以批处理模式运行。
  2. 在线流水线,为某个客户计算实际的推荐。这个流水线可以根据你构建的应用类型以批处理、异步、实时或流式模式运行。

离线计算商品候选嵌入允许我们从大量商品(数百万)中进行推荐,同时仍然确保少量推荐商品是个性化的化并吸引用户。

图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商品的流程:

  1. 当客户浏览H&M应用程序时,我们将他们的ID和日期发送到推荐系统推理管道。
  2. 客户查询模型基于第1步中的两个特征计算客户的嵌入。
  3. 由于客户的嵌入与H&M时尚商品处于同一向量空间,我们利用Hopsworks向量索引来检索相关的商品列表。
  4. 接下来,我们过滤掉客户已经点击或购买过的所有商品。
  5. 我们使用Hopsworks特征视图中的更广泛的功能列表增强时尚商品和客户。
  6. 我们使用CatBoost模型对剩余的时尚商品相对于客户进行排名。
  7. 我们根据相关性得分对商品进行排序并展示给客户。
但什么是 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疯人院获取

更多技术信息~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32943.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<03.13>八股文补充知识

import java.lang.reflect.*; public class Main {public static void main(String[] args) throws Exception {// 获取 Class 对象//1. 通过类字面量Class<?> clazz Person.class;//2 通过对象实例化String str "Hello";Class<?> clazz_str str.ge…

windows系统,pycharm运行.sh文件

博主亲身试验过&#xff0c;流程简单&#xff0c;可用。 需要pycharm &#xff0c;git。 注意需要Git Bash.exe &#xff0c;也就是Git Bash的应用程序&#xff0c;而不是快捷方式。 需要把这个应用程序的路径复制一下。可以通过右键&#xff0c;复制文件地址的方式。 接着在…

新闻网页信息抽取

1. 网页信息抽取 问题定义&#xff1a;对新闻网页&#xff08;输入为HTML&#xff09;提取结构化信息&#xff0c;包括标题、发布时间、作者、正文、图片等。 动机&#xff1a;由于网页&#xff08;大多数为HTML格式&#xff09;通常带有很多标签、样式、脚本等信息&#xff0…

Attention又升级!Moonshot | 提出MoE注意力架构:MoBA,提升LLM长文本推理效率

源自: AINLPer&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2025-3-13 更多&#xff1a;>>>>大模型/AIGC、学术前沿的知识分享&#xff01; 引言 对于大模型来说&#xff0c;有效扩展上下文长度对于实现通用…

人工智能与我何干

思考一下&#xff0c; 如果打破这样的磁场&#xff0c;当我焦虑的时候&#xff0c;总是想要看一些负面的内容&#xff0c;这是错误的&#xff0c;不应该这样做&#xff0c;要坚定自己的信念&#xff0c;我为什么和人工智能去争抢呢&#xff0c;不能和人工智能争抢&#xff0c;这…

Netty启动源码NioEventLoop剖析accept剖析read剖析write剖析

学习链接 NIO&Netty - 专栏 Netty核心技术十–Netty 核心源码剖析Netty核心技术九–TCP 粘包和拆包及解决方案Netty核心技术七–Google ProtobufNetty核心技术六–Netty核心模块组件Netty核心技术五–Netty高性能架构设计 聊聊Netty那些事儿 - 专栏 一文搞懂Netty发送数…

智能三防手持终端破解传统仓储效率困局

在数字化浪潮的推动下&#xff0c;传统仓储管理模式正面临效率低、成本高、错误频发等瓶颈。如何实现精准、高效、智能化的仓储管理&#xff0c;上海岳冉三防智能手持终端机以RFID技术为核心&#xff0c;结合工业级三防&#xff08;防水、防摔、防尘&#xff09;设计&#xff0…

13. Pandas :使用 to_excel 方法写入 Excel文件

一 to_excel 方法的相关参数 用它来指定要将 DataFrame 写入哪些工作表的哪些单元格&#xff0c;以及是否需要包含列标题和 DataFrame 索引。如何处理特殊值&#xff08;如 np.nan 和 np.inf&#xff09;。 1.指定工作表和单元格 sheet_name&#xff1a;指定将 DataFrame 写入的…

星越L_发动机舱开启及油液加注讲解

目录 1.拉手 2打开前机盖 3.冷却液加注口 4.玻璃水加注口 5.机油加注口 6.刹车油加注口 7.电瓶 1.拉手 中控台左下方有个拉手,拉动两次前机盖解锁。 2打开前机盖 向上抬打开前机盖。 3.冷却液加注口

基于Flink SQL的实时指标多维分析模型

数据流程介绍 1.创建源表kafka接入消息队列数据&#xff0c;定义字段映射规则&#xff1b; 2.创建目标表es_sink配置Elasticsearch输出&#xff1b; 3.通过多级视图&#xff08;tmp→tmp_dedup→tmp1/tmp2→tmp3→tmp_groupby&#xff09;实现数据清洗、去重、状态计算&#x…

专题|Python贝叶斯金融数据应用实例合集:随机波动率SV模型、逻辑回归、参数更新、绩效比较BEST分析亚马逊股票、普尔指数...

原文链接&#xff1a;https://tecdat.cn/?p41020 本专题合集系统梳理了贝叶斯方法在金融数据分析与分类建模中的前沿应用。合集聚焦于PyMC3概率编程框架&#xff0c;深度探讨了共轭先验参数更新、贝叶斯逻辑回归、贝叶斯夏普比率等核心算法在实际场景中的落地实践&#xff08;…

qwen2.5-vl使用vllm部署gradio页面调用

想在服务器上用vllm部署qwen2.5-vl, 然后使用gradio页面在本地调试&#xff0c;官方代码给了两条命令&#xff0c;列出的request body体结构&#xff0c; 不过要与gradio连用&#xff0c; 还需要重新组织代码。 官方服务代码如下&#xff1a; vllm serve Qwen/Qwen2.5-VL-7B-I…

论文笔记 - ULTRA-SPARSE MEMORY NETWORK

1、目前Transformer模型现状 dense模型相同激活参数下&#xff0c;性能远低于MOE模型&#xff0c;因此大家倾向于训练MOE模型虽然同激活参数下&#xff0c;MOE性能比dense好&#xff0c;但MOE模型内存访问高&#xff0c;因此推理速度相比dense要慢不少。比如top2的moe&#xf…

人工智能基础知识笔记四:聚类分析

1、什么是聚类分析&#xff1f; 聚类分析是一种将数据分组的技术&#xff0c;目的是让同一组内的数据点彼此相似&#xff0c;而不同组之间的数据点差异较大。你可以把它想象成整理一堆杂乱无章的物品&#xff0c;把相似的物品放在一起&#xff0c;比如把书放在一个书架&#x…

DeepSeek结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)转载

思维速览&#xff1a; 本文将详细介绍如何利用DeepSeek结合Mermaid语法绘制各类专业图表&#xff0c;帮助你提高工作效率和文档质量。 ▍DeepSeek入门使用请看&#xff1a;deepseek保姆级入门教程&#xff08;网页端使用 本地客户端部署 使用技巧&#xff09; DeepSeek官网…

麒麟v10 ARM64架构系统升级mysql数据库从mysql-5.7.27到mysql-8.4.4图文教程

1、背景与问题说明 因mysql-5.2.27版本存在安全漏洞问题&#xff0c;为保障系统安全&#xff0c;需将处于生产环境的麒麟v10 ARM64架构系统服务器上当前部署的mysql-5.7.27版本升级到mysql-8.4.4&#xff0c;以规避潜在风险&#xff0c;提升系统整体的安全性和稳定性。 1.1 本…

关于我和快速幂的事()

我之前只会这样的(dfs&#xff09;&#xff1a; 不懂下面这种写法的具体逻辑&#xff1a; 看完下面的推理&#xff0c;再转转我聪明的小老戴&#xff1a; 法一中&#xff1a;把2^11看成(2^5)^2 法二中&#xff1a;把2^11看成(2^2)^5

CSS3-流星雨

1. 绘制标签 <div class"container"><span></span> </div>2. 设置div背景 在百度上搜索一幅星空的图片 <style>* {/* 初始化 */margin: 0;padding: 0;}body {/* 高度100% */height: 100vh;/* 溢出隐藏 */overflow: hidden;}.contai…

P3390 【模板】矩阵快速幂

把 f&#xff08;ll k&#xff09; 写成 f&#xff08;int k&#xff09; 结果又是tle又是wa的。找了半天错误。 &#xff08;为了节省一点时间&#xff0c;因为函数不能return数组&#xff0c;还把数组改写到结构体里&#xff09; 我在想考试怎么办&#xff0c;考试不能看过…

STM32F407 cubeIDE Bootloader APP 如何写

一、bootloader 代码如下&#xff1a; #define FLASH_JUMP_ADDR (0x0800c000) /* USER CODE END PD *//* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ----------…