熟悉双塔的人都知道,在用户侧,模型最后往往都生成一个向量去检索,这个向量不足以表达用户的多兴趣,《Multi-Interest Network with Dynamic Routing for Recommendation at Tmall》这篇就提出了一个label-aware attention把用户表达为多个兴趣。
左图展示了天猫给上亿用户个性化的推荐,右图展示了商品丰富的品类,我们肯定不希望最近买了个iphone12,打开天猫,一整面的手机配件商品推荐,多兴趣的目标,也是增加推荐的多样性。天猫上亿的用户,每个人都要每天浏览上百的商品,这些商品不同的类目,就反应了用户不同的兴趣。废话不多说,下面直入论文主题。
问题定义
多兴趣的目标,就是为每个用户从上亿规模的商品集合I中找到候选集,该候选集一般有几千个商品,都和该用户当前的兴趣相关。历史数据就尤为重要了,当前兴趣和历史行为强相关。每个样本都能表达为一个三元组(Iu, Pu, Fi),Iu表示历史上,和用户交互过的商品。Pu就是用户的基础特征(年龄性别啥的),Fi就是商品的特征了(itemid, 类目id)。
这篇论文的模型,目标就是把每个用户历史交互特征和基本特征映射成多个向量:
然后把商品映射成向量:
最后ANN召回Top N:
MIND模型
上图就是整个MIND模型,看似很复杂,其实没那么复杂,我们拆解下。
从这张图我们看到,有N个与用户交互过的item,每个item有3个特征,分别是ItemID、Category ID、Brand ID。embeding后进入Pooling Layer。这里增加Category ID和Brand ID有利于冷启动,当新的item出现,这些ID通过pooling层,还是有不错的泛化性。
other features就是用户特征了,直接embeding后concat在一起,不赘述。重要的当属多兴趣提取层了,如下图。
大家看到个熟悉的字眼,兴趣胶囊。没错,又是胶囊网络。先回归一下动态路由算法。假若有两层胶囊。
低level的m个胶囊:高level的n个胶囊:
每个胶囊就是个向量,高level的胶囊是由低level的胶囊聚合而成,其实就是简单的线性加权,权重是模型自动学到的,计算权重的方式如下:
有了权重就可以线性加权了:
加权完后,就应该有激活函数了,胶囊网络中用的激活函数都是squash,因为胶囊向量的方向表示特征,长度表示概率。最后高level的胶囊计算如下:
在MIND中,高level向量就是兴趣向量,低level向量就是交互的item过pooling后的向量。这里要注意的是,在传统胶囊网络bij第一次计算是要初始化为0的,但是在MIND中却不行,因为该论文对胶囊网络做了3大改造。
共享Sij:这样做其实很容易理解,毕竟低level的胶囊,都是item向量,量纲是统一的。bij第一次按高斯分布随机初始化:这样做是因为共享Sij后,如果还把bij初始化为0,那么得到的兴趣向量都是相同的。动态调节兴趣数量:Ku′ =max(1,min(K,log2(|Iu|))).
下面是动态路由算法的详细过程:
所以该层就是通过动态路由算法将N个item生成的N个embedding映射成k个兴趣embedding。
最后是Label-aware Attention层,该层做的事很简单,把target item的embedding作为Q,兴趣向量作为K和V,做attention操作,变成一个向量,如下:
p是我们可以调节的一个参数,p是0,最终向量就是兴趣向量的平均。如果p>1,那最终向量偏向于和target向量最接近的向量。p无穷大,就相当于选择和target向量最相关的兴趣向量作为最终向量。论文实验发现,调大p,收敛较快。
训练&在线
有了最终兴趣向量,和target向量,损失函数如下:
就是softmax计算概率,然后用logloss做梯度下降。在线服务的时候,每个兴趣向量,都用来做召回,取最相关的top N个。需要注意的一点是,在用户与item不断交互的过程中,兴趣向量是在不断改变的。实验就不详细说了,想了解调参和算法比较的去看下原文。
结语
多兴趣看似不是双塔,其实本质上还是双塔,只是用户侧向量映射成了多个。召回场景下双塔的使用是最频繁的,十方也在尝试些其他召回方式,如TDM,DR等,大家在工作学习中有什么实践经验,欢迎留言或者进群交流!
参考论文
1、Multi-Interest Network with Dynamic Routing for Recommendation at Tmall