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

相关文章

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可