论文:

论文题目:《Controllable Multi-Interest Framework for Recommendation》
论文地址:https://arxiv.org/pdf/2005.09347.pdf
推荐系统中关于用户长短期兴趣建模一直是一个热点问题,而用户的多兴趣召回更是一个更加通用的对用户兴趣建模的方法,我们在之前的mind论文中已经介绍过了如何用胶囊网络来建模用户的多个兴趣点,今天我们来介绍一下阿里跟清华合作的另一篇关于多兴趣召回的文章。
一 、背景
在介绍这个论文之前,我想来给读者们讲讲为什么用户的兴趣需要进行细粒度的划分,这也是我在工作中真实碰到的情况。
用户在一次session或者说一段时间内浏览了一系列物品,这时候会出现两种情况:
1.这个序列中的所有item都是同一类商品/同一个品质的相似商品,这时候我们就认为这个序列是“收敛”的,也就是这个序列中的物品趋于同质化,这时候用户的兴趣就是单点的,这时候对这个序列建模就比较简单了,不管是rnn还是直接用transformer都可以直接建模出用户在这时候的兴趣点。
2.这个序列中出现了不同品类的商品,比如说衣服和裤子和口红同时出现,这时候我们可以认为这个序列是“发散”的,这时候如果用rnn之类的序列建模方法就没那么work了,你可以相信一下,如果把一些杂乱无章的单词随便凑到一个句子中,在用transformer去建模,那么建模出来的vec表达的意思是什么呢?这时候模型就没可解释性,可能你这时候又会说了,深度学习模型只需要关心work不work,不需要关心具体的解释性了,对于这个观点我不置可否。。
回到正题,如果我们碰到了一个杂乱无章的序列,我们斗胆猜测,用户在这时候的兴趣是多点的,这时候如果强行把用户的兴趣全部杂糅到一个向量中,这时候又会出现几个问题:
1.融合的向量需要完整的表达出用户的兴趣就需要把维度设置的很大,这样训练比较困难
2.融合会让信息损失
3.融合的兴趣向量的空间可解释性比较差,我们不知道这个融合的兴趣向量为什么可以检索出top-n个item,也不知道这个融合的向量在哪个空间维度下。
当然,上面的几个问题是我在实践过程中自己碰到的,尤其是第二点,信息损失会带来很大的影响,主要是无论融合的结构无论如何设计都会让一部分信息丢失。
看一个论文中举的例子吧:

我们可以看到用户的点击序列是发散的,也就是用户浏览的物品都是不相似的,这时候如果我们用多兴趣召回的方法,就可以自动的把用户的多点兴趣建模出来,然后分别去检索出每个兴趣点的物品。
基于以上的背景介绍和分析,我们直接就来开始介绍这篇论文吧。
二 、Comirec模型
模型的总体结构如下:

这篇文章主要采用了两种方法来建模用户的多兴趣,分别是动态路由算法还有self-attention算法。
我们先来看看一些概念吧:

2.1 Dynamic Routing
动态路由算法我们在mind那篇文章里面已经讲过了,今天进不打算详细介绍来,主要讲一下大体的公式。

其中W是映射矩阵,ei是序列中item i的embedding向量

其中:

而这里是每次动态改变的,初始化为全0。
最后我们得到用户的兴趣向量:

直接看算法的流程更好:

这个跟我们之前介绍mind的方法基本一样,除了对bij的初始化不一样,mind是用正态分布去初始化的。
这里K跟mind也不一样,mind中是动态的,而这里是超参数。
2.2 Self-Attentive Method
这个就更简单,selft-attention嘛,只要熟悉transformer的都知道,但是这里又不是trm中的self-attention方法,相比还更为简单:

其中H是n✖️d,n是序列的长度,也就是序列中的embedding的堆叠。
这里,为了弄出K个兴趣向量,把上式改成:


Vu就建模到了K个兴趣向量了。
比起上面的动态路由算法更为简单了。
3.3 Model Training
这部分没啥好说的咯,还是一样的负采样+交叉熵/极大似然:



serving就跟传统的knn一样就行,faiss直接存储item 向量,然后动态生成K个user的兴趣向量去检索,有点多路召回+粗排的意思。
2.3 Aggregation Module
论文为了表现推荐的精准性和多样性的平衡,引入了一个方法,我直接贴公式了,因为这部分我不是很赞同:



具体的过程如下:
其中N是每个兴趣向量去检索的item个数,M表示这K*N个物品,一共检索出K*N个item,这时候我们从这K*N个item中去选出top-N个物品,为了保持精确性和多样性的平衡,我们使用:使用一个值函数Q(u,S)通过可控因子来「平衡推荐的准确性和多样性」。
其中g(i,j)是一个多样性或差异性的函数:
其中CATE(i)表示物品 i的类别, 是一个指示函数。
如果想要最大的准确率,那么可以令 ,如果想要最大的多样性,可以令
。文章提出了一个「贪心推理算法」来近似最大化值函数 :

其实这部分的内容我是不赞同的,因为这相当于把多路召回+排序的任务给干了,一般情况下,整个推荐系统都有很多路召回,每路召回都各司其职就好了,也就是说每一路召回尽量不同质化,只需要在自己这条路上进行精益求精的工作,也就是说让模型的精确性提升就好了,而多样性指标让排序去解决就好了。
再者,假如召回把排序的事情做好了,那么即使召回把多样性搞的特别好,但是我觉得效果也不会很好,因为其他路召回也可以补充这些多样性,而且排序模型也会进行重新排序跟混排的,所以这个部分我觉得有点多此一举了。。
三、实验



这篇文章就介绍到这里了,其实有一些关于胶囊网络为什么可以将用户兴趣切分的这么细致,我还是有点没理解清晰的,我理解的是一个动态k-means的过程,但是又说不出来这个感觉,等我后面在看看这个,欢迎私信交流这个问题。
网友评论