再谈序列化推荐

2021-05-14 17:13:25 浏览数 (1)

作者:十方

近年来很多序列化推荐的方法都是通过把用户历史行为序列转化为一个总的向量化表达,来给用户做下一个item推荐。然而,通过经验性的分析,我们就会发现用户序列行为中包含多种多样完全不同含义的item,这个表示用户的向量受历史行为的影响非常大,因此无法推荐出用户历史行为中类别占比较小的item。所以应该用不同的embedding去编码用户当前的意图,这篇论文《Sparse-Interest Network for Sequential Recommendation》提出了SINE解决序列化推荐的问题,炼丹笔记前面已经介绍了大部分阿里的序列化推荐算法,所以废话不多说,直接介绍SINE。

SINE解决啥问题?

假定 x (?) ?=1...N 表示N个用户与M个item的数据,x (?) = [x1, x2, ..., xn] 表示用户点击序列,考虑到工业级推荐系统包含数十亿的item,SINE的目标是挖掘出用户K个向量表达,能抓住用户准确的意图,召回top的item提供给下游(排序模块)。

最新的用于抓住用户准确意图的序列化编码器可以被总结为两大类。第一类方法隐式的挖掘用户多层兴趣,例如基于多头self-attention的方法,另一类显式的捕捉用户多层意图。第一类方法在和单个向量推荐相比较,并没有明显的提升。另一类则可以有效的挖掘用户的多兴趣,这些方法都存在一个共同的问题,就是要求用户在交互过的各个类目都有一个embeding表达,导致该类方法可扩展性特别差。举个例子,按照专家的标注,阿里天猫所有商品可以分为1w类,所以在推荐系统中一个用户有类目个向量是不现实的。

因此稀疏兴趣网络就诞生了,该网络有能力挖掘出用户兴趣最高的几个意图。

SINE长啥样?

大家可以边看图,边阅读下面各个模块的介绍:

稀疏兴趣模块(Sparse-interest module)

Concept Activation:先用自注意力方法把输入的序列聚合,如下公式所示:

W1 ∈ R?×? 和W2 ∈ R ? 都是训练参数,然后按照attention的score a把输入的向量序列聚合起来z? = (a ⊤ X? ) ⊤ ,Zu就是用户的一个D维度的总体向量表达,用这个向量去激活兴趣,C ∈ R?×?表示L个兴趣(类目)向量:

从上公式,我们看到,先要找到和用户最相关的k个兴趣,然后按照相关度缩放k个兴趣向量。

Intention assignment:在得到k个兴趣向量后,我们可以通过计算行为序列到兴趣向量的距离,挖掘出用户最相关的意图,参考下公式:

pk|t表示位置t处的item与第k个兴趣相关的概率。

Attention weighting:当计算出pk|t后,我们还需要关注pt|k,即位置t的item对于表达用户第k个兴趣的重要程度,通过下公式计算:

Interest embedding generation:有了以上所有向量和attention score后,可以通过下式进行兴趣向量集成:

兴趣集成模块(interest aggregation module)

在稀疏兴趣模块中,我们实际上获得了k个兴趣,我们可以像MIND一样,用下一个item作为目标label,去选择不同的兴趣向量训练,尽管这样很简单,但是缺陷就是实际预估中,是没有目标label的,导致训练和线上有着很大的gap,导致效果上有很大损失。

为了解决这个问题,可以先预估用户下一个意图的类目,而不是item。我们通过上面计算的pk|t可以得到用户倾向性矩阵Pu∈ R ?×k ,我们用此矩阵对用户的兴趣向量进行聚合,得到最终的兴趣向量:

Capt可以理解为用户目前的意图,是个D维度的向量,我们通过下式得到用户的最终表达vu:

通过下式模型优化:

由于上式复杂度较高,所以实际使用了sampled softmax进行优化。同时为了保证兴趣向量互相正交,所以还引入了正则化损失:

|| · ||F 表示Frobenius 范数,最终loss为:

实验效果如何?

从实验效果,我们可以看出SINE 的HR和NDCG的结果都是比较出众的:

通过拉出多个兴趣向量top k的item,我们也发现模型对商品集合做了很好的聚类:

关注我们!

0 人点赞