MIND - 基于动态路由的用户多向量召回

2024-03-17 03:38

本文主要是介绍MIND - 基于动态路由的用户多向量召回,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题背景

  应用场景

在一个典型的推荐场景中,推荐算法的任务是将一个经过筛选排序的,贴近用户兴趣的商品列表推荐给用户。下面两张图片展示了手机淘宝两个比较典型的推荐场景,分别是首页的信息流场景和微详情页场景。正如场景名字猜你喜欢所表达的,推荐算法的目标是使得推荐结果尽可能贴合用户的兴趣,满足用户的需求。

  

在实际的场景中,淘宝的数据体量相对较大,面对的是亿级的用户与亿级的商品。在这样体量的工业场景中,我们通常将整个推荐系统拆分为多个环节,其中召回(Match) 与排序 (Rank)是其中两个比较典型的环节。MIND 算法是我们团队针对召回环节的一项工作。

  召回

召回系统负责从海量的候选商品中挑选出与用户兴趣相关的商品集合。它作为推荐算法的第一环,直接决定了整个系统的效果上限。与此同时,面临亿级别的候选集合,也就要求所使用的召回算法在计算上足够地高效。通常计算效率上的要求是通过建立索引的方式来达到。

很长一段时间,协同过滤,尤其是 Item-based 的协同过虑都是业界主要使用的一种召回算法,例如图中的基于图的算法和基于 graph embedding 的算法。线上服务时,它使用键值索引,简单,高效,时效性强,往往能达到比较不错的效果。但它也受限于索引形式,表达能力有限,并且不能做到端到端的优化,这就对我们提出了新的算法要求。

近些年,向量检索技术的普及使得用户与商品能以向量的形式进行表征,增强了数据的表达能力,也给我们算法设计带来了新的可能。

  电商场景特点 – 数据多峰分布

提到向量召回算法,图中谷歌 YouTube 提出的这个向量召回模型是早期一个具有代表性的模型。但是在我们场景直接使用该模型上线,却并没有拿到非常令人满意的效果。

回到我们的电商场景中,电商的数据是很有自身的特点的。通常来说,一个用户的行为是比较丰富的,用户的购物行为和浏览兴趣往往横跨多个类目,并且常常体现出内在的聚集性,也就是数据的多峰分布。因此我们认为,在向量维度有限的情况下,像 YouTube 召回模型中单个用户向量的表达范式是有改进优化空间的。

算法思路

  如何表达用户的多个兴趣

前面提到单个向量对用户的刻画可能存在不足,一个很直接的想法就是使用多个向量来对用户进行表征。通过丰富的用户行为产生用户的几个隶属于某些方面的兴趣的方法,容易联想到可以通过聚类的方式来将用户丰富的行为集合聚合成几个比较具体的兴趣。

在算法设计之初,端到端的优化是我们纳入考虑的一个点,我们期望聚类的过程能够很好地嵌入到深度模型结构中。从训练的成本上来看, 我们也希望这个过程能比较快地收敛,不会带来太多额外的开销。胶囊网络中的动态路由算法正符合我们的算法设计需求。

  如何学习用户的多个兴趣

如图所示,动态路由算法处理的是两层向量之间的关系,其中每个元素都代表一个向量,即所谓的胶囊。下层的特征表达是固定的,而上层胶囊在开始阶段是未知的。

最开始我们随机得到一个初始连接权重,得到上层胶囊的一个初始的表达。接下来在迭代过程中,上层的胶囊会和下层的胶囊进行相似度的计算,并根据相似度来进行权重的重新分配,重新计算上层胶囊的表达。重复几轮这样的迭代,最终这个权重会倾向于收敛到一组具体的值。从计算过程来看,动态路由算法的迭代的过程和 Kmeans 聚类是一个非常相似的过程。

因此,可以将用户的行为序列看作下层的胶囊,将要抽取的用户兴趣向量表达看作是上层的胶囊,进行用户多兴趣的抽取。

将用户的行为序列表达成多个兴趣向量,同时也引入了一个新的问题: 在训练过程中,抽取出来的多个兴趣对应了一个具体行为,如何进行求解。具体来说, 问题可以表述为对于每条训练样本,使用用户的哪个兴趣进行训练。我们认为, 用户某次具体的行为,是其多个兴趣其中一个的具体表现。因此,在每次训练中,我们根据用户后续的实际行为,在多个兴趣中挑选与后续行为最相关的兴趣,进行训练。这个根据 label 来挑选具体兴趣的训练机制,我们称之为 Label-aware Attention。

  MIND

上图是 MIND 模型的整体结构。模型最下层是模型的输入层,首先,通过 Embedding 层,对 id 类特征进行了向量化,并通过 pooling 层对将商品 id 及其他商品侧特征进行了信息融合,引入了除商品 id 外的其他更多的特征,来更好地描述这个商品。

接下来就是我们的兴趣抽取层。这一层我们使用了动态路由算法对用户的行为进行了兴趣表达的抽取。在抽取出用户的多个兴趣表达之后,我们将用户的兴趣向量与用户的画像特征进行了一个拼接的操作,即在每个兴趣特征表达上加上用户画像的表达。然后通过若干层全连接层将用户的表达与兴趣的表达进行融合。

在这些全连接层之后,我们就得到了用户的多个最终表达向量,每个向量代表了用户一方面的兴趣。

训练过程中我们使用 label-aware attention 机制进行训练。而在线服务时,我们直接使用全连接层抽取出来的多个用户的表达向量,并行地在选品池中进行向量检索,将每个用户兴趣向量检索出来的结果合并之后,得到模型的最终召回结果。

  效果展示

这里是一个简单的效果展示。左边是demo的用户行为序列,可以看到它有服饰、游戏等相关的行为。在右侧是我们根据模型抽取出的4个兴趣,分别用这4个向量进行召回得到一些结果。我们可以看到这几个向量很好地刻画表达了用户不同方面的兴趣,并且在最终的召回中也召回了相关的商品。

MIND 方式所生成的用户表达,除了直接进行商品召回,还能做有意思的扩展,比如说通过用户的实时表达,去找到与当前用户相似的用户,做一些 U2U 的召回。

 

系统架构

  流程

在离线流程中,模型每天使用新增数据进行增量训练。在训练完成后,导出最新的商品向量表示,并分别将模型与商品向量回流到线上系统。在线服务时,用户请求打分服务,得到用户多组向量,并使用这些用户向量请求召回服务,得到召回结果。

  引擎

在线系统使用的是阿里自研的 Proxima 向量检索引擎,支持 fp16,int8 多种量化,支持异构计算,并支持商品索引的实时更新。MIND 模型结构决定了每个用户是一个多向量的请求模式,因此在实践中我们工程团队使用了 GPU对向量检索引擎进行加速。优化后单次用户查询 9 个向量,线上延迟在 5ms 以内。

 

  全图化架构

前面介绍的流程中,模型和商品向量索引分别部署在两个不同的系统上,很难保证两边模型和数据版本切换的一致性。因此我们的工程团队提出了全图化的系统架构,其核心是把用户向量的生成步骤,从原来离线完成转移到在线完成。每当线上模型发生更新了之后,会自动触发线上优化过程,使用最新的模型直接生成商品的向量表征,同时进行向量索引的构建。在向量索引构建完成之后,管控系统统一地将模型和商品索引同步进行更新切换。通过这种方式,一方面简化了离线流程,保证了在线模型与数据的一致性,另一方面也对商品索引的增量构建更为友好。

 

总结

MIND 模型在手淘多个核心场景全量上线,并取得10%+的效果提升。目前 MIND 召回是手淘首页信息流线上流量占比最高的一路召回。线上的 CASE 与效果都表明了模型的有效性: 既表达了用户多样的兴趣,又展现出了一定的发现性。通过对用户行为的扩展,MIND 模型也可以同时表达用户的搜索兴趣与购买兴趣,更好地对用户兴趣进行刻画与表达。


*本文内容来自于由达摩院领航举办的3月20日向量检索专场Meetup讲师演讲内容

 

✿  拓展阅读

作者|睿德

编辑|橙子君

出品|阿里巴巴新零售淘系技术

这篇关于MIND - 基于动态路由的用户多向量召回的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817686

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

mysql删除无用用户的方法实现

《mysql删除无用用户的方法实现》本文主要介绍了mysql删除无用用户的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 1、删除不用的账户(1) 查看当前已存在账户mysql> select user,host,pa

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配