MIND算法全称为:Multi-Interest Network with Dynamic Routing for Recommendation at Tmall,由阿里的算法团队开发。
1. 概括
工业界的推荐系统通常包括召回阶段和排序阶段。召回阶段我们根据用户的兴趣从海量的商品中去检索出用户(User)感兴趣的候选商品( Item),满足推荐相关性和多样性需求。目前的深度学习模型的套路是将User和Item在同一向量空间中进行Embedding表示,使用User的Embedding表示User的兴趣。然而实际情况是User的兴趣是多种多样的,使用一个Embedding不足以全面的表示User的兴趣信息。
该文的创新点在于:
1. 通过Mulit-Interest Extractor Layer 获取User的多个兴趣向量表达。提出了具有动态路由特点的多兴趣网络,利用Dynamic Routing以自适应地聚合User历史行为到User兴趣表达向量中;
2. 通过Label-Aware Attention 标签感知注意力机制,指导学习User的多兴趣表达Embedding;
2. MIND模型结构
MIND模型的整体结构如下:
图1 MIND网络结构图
输入层:
User画像特征;
User行为特征,即产生行为(历史点击或购买等)的Item列表和Item属性列表;
正标签,即User真实发生行为(下一次点击或购买等)的 Item ID;
Embedding层:
将ID信息映射成稠密向量,即Embedding;
Pooling层:
将行为序列的Item和Item属性的Embedding表达进行mean, sum或max等池化操作;
Multi-interest Extractor 层:(本文重点)
输入:User行为序列的Embedding Features,即 Pooling层 结果;
输出:Interest Capsules,用户的多兴趣Embedding表达;
H layers:
多个兴趣Embedding分别经过两个全连接层,得到User最终的多个兴趣Embedding表达;
Training服务:
输入层:
H layers 结果作为 Label-aware Attention层的Keys和Values(此时Keys=Values);
正标签,即User真实发生行为(下一次点击或购买等)的 Item ID,作为Query;
Label-aware Attention层:
对输入的Keys和Query做内积、Softmax等操作作为Keys的权重值w;
使用w与Values做内积,然后对应元素求和,得到一个Embedding,作为User对当前正标签Item的兴趣分布;
Sampled Softmax Loss层:
抽取多个负标签,与正标签组成 Sampled 组;
使用 tf.nn.sampled_softmax_loss 函数得到正标签的概率;
Serving服务:
输入层:
H layers 结果作为 User 最终的多个兴趣Embedding表达;
全集 Item 的Embedding表达;
TopN Recall:
针对User的多兴趣Embedding,根据faiss或annoy在全集 Item 池中检索,获得User兴趣Embedding所感兴趣的候选Item集合;
3. MIND模型理论部分
3.1 MIND模型的问题定义
每个User-Item的实例可以使用三元组 表示,其中 表示User发生行为的Item集合, 表示User的画像特征(例如:性别,年龄等), 表示目标Item的画像特征(例如Id, 类型Id, 品牌Id等)。
MIND模型的主要任务:
(1)学习一个函数可以将User-Item实例映射为User的兴趣Embedding表达集合:
其中: 表示Embedding的向量长度, 表示User的兴趣Embedding个数。
(2)学习Item的Embedding表达:
(3)线上Serving服务检索,获得N个User感兴趣的候选Item池:
3.2 Embedding和Pooling层
MIND模型的输入是:User特征 ,User行为序列特征 ,和label Item 。
User Embedding:User Id(例如:年龄,性别等)经过Embedding 后通过Concat 操作后作为用户侧特征输入;
Item Embedding:Item Id(例如:Item Id,类型Id,品牌Id等)经过Embedding 后统一经过Pooling 层得到Item侧特征输入;
User行为序列特征Embedding:多个Item Embedding&Pooling 后,得到用户行为序列输入 。
3.3 Multi-Interest Extractor Layer
该层主要是采用多个向量来表达 User 不同的兴趣,将 User 的历史行为分组到多个 Interest Capsules 的过程。实现逻辑如下:
输入:
User行为序列特征Embedding, ;
迭代次数 ;
兴趣胶囊个数 ;
输出:
兴趣胶囊Embedding,
定义:
(1)动态兴趣个数 ;
(2)低阶行为向量Embedding表达: 代表User的行为向量(同 );
(3)高阶兴趣向量Embedding表达: 代表User的兴趣向量(同 );
(4)行为向量 与兴趣向量 之间的 路由logit:
(5)双线性映射矩阵:
步骤:
(1)计算兴趣Embedding个数 ;
(2)初始化 (使用正态分布初始化);
(3)遍历迭代次数 :
(3.1)对所有的行为路由 ,计算 ;
(3.2)对所有的兴趣路由 ,计算 ,和 ;
(3.3)迭代更新 ;
3.4 Label-aware Attention Layer
通过多兴趣提取器层,对用户行为序列embedding 我们得到多个个兴趣Capsule 表达用户多样的兴趣分布,不同的兴趣Capsule表示用户兴趣的不同偏好。为了评估多个兴趣Capsule对目标Item 相关度及贡献度,我们设计标签意识的Attention 机制来衡量目标Item 选择使用哪个兴趣Capsule,具体表述见 Training服务。表达式:
其中: 是指数。
3.5 Training & Serving
训练的目标是:使用User的Embedding ,正标签 Item Embedding ,和随机抽样负标签 Items Embedding ,使用如下公式进行计算:
损失函数:
ok,MIND的理论部分介绍到此结束,欢迎讨论交流。
参考:
1. Multi-Interest Network with Dynamic Routing for Recommendation at Tmall
2. Dynamic Routing Between Capsules
3. Attention Is All You Need
欢迎关注“python科技园”,然后添加小编进群交流。