MIND

8/2/2021 MIND

# 简要说明MIND模型的出发点是什么?做了哪些工作的创新?

传统 DeepMatch 方法为每个用户生成一个兴趣向量,但在实际的购物场景中,用户的兴趣是多样的,不同兴趣之间甚至可能是不相关的。比如用户可能同时期望购买服装、化妆品、零食,而一个长度有限的向量很难表示用户这样的多个兴趣。我们的 MIND 模型通过 Dynamic Routing 的方法从用户行为和用户属性信息中动态学习出多个表示用户兴趣的向量,更好的捕捉用户的多样兴趣,来提升召回的丰富度和准确度

它的创新之处在于:

  1. 通过Mulit-Interest Extractor Layer 获取多个向量表达用户兴趣的不同方面;
  2. 提出了具有动态路由的多兴趣网络(MIND),利用Dynamic Routing 以自适应地聚合用户历史行为到用户表达向量中,以处理用户的不同兴趣;
  3. 开发 Label-Aware Attention 标签感知注意力机制,以帮助学习具有多个向量的用户表示。

# 请简述用户多兴趣网络MIND的整体结构。

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表达;

# 请简要说明一下MIND模型的Training服务和Serving服务的结构。

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集合;

# 请说明一下MIND模型中多兴趣抽取层的原理

多兴趣抽取层的关键点在于兴趣胶囊,简单介绍下Capsule,类似传统神经元,其活动向量(activity vector)表示特定实体类型的实例化参数,如对象或对象部分。我们使用活动向量的长度表征实体存在的概率,向量方向表示实例化参数。同一水平的活跃 Capsule 通过变换矩阵对更高级别的 capsule 的实例化参数进行预测。

假设我们有两层Capsule,我们从第一层和第二层引用 Capsule分别为低级Capsule和高级Capsule。动态路由(Dynamic Routing) 的目标是在迭代中给出低级别Capsule的值来计算高级别Capsule的值方法。在每轮迭代中,给定一个低阶Capsule 向量: $$\overrightarrow{c}_i^l\in R^{N_l\times 1},i\in {1,...,m} $$

和高阶Capsule向量: $$\overrightarrow{c}_j^h\in R^{N_h\times 1},j\in {1,...,n} $$

路由 logit 可以表示为:

每个胶囊就是个向量,高level的胶囊是由低level的胶囊聚合而成,其实就是简单的线性加权,权重是模型自动学到的,计算权重的方式如下:

$$w_{ij}=\frac{exp b_{ij}}{\sum_{k=1}^m}exp b_{ik} $$

有了权重就可以线性加权了:

加权完后,就应该有激活函数了,胶囊网络中用的激活函数都是squash,因为胶囊向量的方向表示特征,长度表示概率。最后高level的胶囊计算如下:

在MIND中,高level向量就是兴趣向量,低level向量就是交互的item过pooling后的向量。这里要注意的是,在传统胶囊网络bij第一次计算是要初始化为0的,但是在MIND中却不行,因为该论文对胶囊网络做了3大改造。

  1. 共享:这样做其实很容易理解,毕竟低level的胶囊,都是item向量,量纲是统一的。
  2. 第一次按高斯分布随机初始化,这样做是因为共享后,如果还把初始化为0,那么得到的兴趣向量都是相同的。
  3. 动态调节兴趣数量:.

该层就是通过动态路由算法将N个item生成的N个embedding映射成k个兴趣embedding。

最后是Label-aware Attention层,该层做的事很简单,把target item的embedding作为Q,兴趣向量作为K和V,做attention操作,变成一个向量,如下:

公式中的 表示 item embedding, 表示 Multi-Interest 抽取层输出的用户多个兴趣向量 embedding。

p是我们可以调节的一个参数,p是0,最终向量就是兴趣向量的平均。如果p>1,那最终向量偏向于和target向量最接近的向量。p无穷大,就相当于选择和target向量最相关的兴趣向量作为最终向量。论文实验发现,调大p,收敛较快。

最后使用 和待推荐 item embedding,计算用户 u 和商品 i 交互的概率,计算方法和 YouTube DNN 一样:

在线服务的时候,每个兴趣向量,都用来做召回,取最相关的top N个。需要注意的一点是,在用户与item不断交互的过程中,兴趣向量是在不断改变的。