论文原文
论文题目:《Personalized Re-ranking for Recommendation》
论文链接:https://arxiv.org/pdf/1904.06813.pdf
一 、背景
大型推荐系统的推荐分为好几个阶段:
Fig 1 推荐系统的四个阶段ps:图来源张俊林老师知乎文章《推荐系统技术演进趋势:从召回到排序再到重排》
在传统的推荐系统中,推荐可以分为召回+排序两个阶段,召回阶段从海量商品库中筛选出用户感兴趣的商品,召回任务的特点是快速,能快速选出用户感兴趣的大量商品,这个阶段用的特征不用很多很全面,模型通常比较简单。在排序阶段,由于要精确给用户推荐商品了,这个时候就会用比较复杂的模型,把更多的特征融入到模型中,通过精准的排序方法把对应的商品推荐给用户。
如果在召回阶段召回了大量的商品,但是排序阶段不再细分的情况下,排序模型可能跟不上召回阶段,所以这个时候可以加上粗排,后面在进行精排,粗排阶段可以引入多一点的用户特征和商品特征了,而在精排环节,就可以引入你所能想到的所有特征,模型也可以更加复杂。
排序结果出来后是可以直接推给用户的,但是有时候为了更多的业务需求,需要对这些物品进行重排序,比如去已读、去重、打散、多样性保证、固定类型物品插入等等。
本文的主要工作就是推荐系统的最后一个阶段:重排序
为什么进行重排序而不是直接把精排的结果直接推荐给用户呢,文中提到,排序阶段从标记的数据集中学习排序功能以优化全局性能,从而为每个单独的项目生成一个得分。但是,它可能不是最佳选择,因为评分功能分别应用于每个项目,并且没有明确考虑项目之间的相互影响以及用户偏好或意图的差异。所以,在重排序阶段引入了Transformer结构来对每一个item pair关系进行建模,从而直接优化整个推荐列表,进一步提高性能。
二、问题和符号定义
2.1 符号定义
Table 1 符号定义2.2 Learning to Rank
LTR(learning to rank) 方法通过一个全局的函数给每一个item打分,然后根据分数进行排序来产生初始化的推荐列表,全局的损失函数如下:
公式中的每个参数跟Table 1中的定义一样,l 是计算和P(| .)的交叉熵损失,其实就是Ctr预估中的损失。
但是通过这种方式去优化模型的参数会产生问题,光靠item的特征x不足以学习到一个很理想的排序函数。阿里的研究人员发现,推荐系统的排名应考虑以下额外信息:
(a)项目对之间的相互影响
(b) 用户与项目之间的互动关系
物品对之间的相互影响可以直接从现有LTR模型为请求r给出的初始列表 = [,,...,]中学习。但是,很少有模型考虑用户和项目之间的交互。 物品对的相互影响程度因用户而异。 本文引入了个性化矩阵PV来学习用户特定的编码功能,该功能可以对物品对之间的个性化相互影响进行建模。
新的loss定义如下:
比上面的loss多了PV,其他的是一样的,Sr是初始化列表,参数变成来re-rank模型的参数。
三、模型结构
3.1 模型的输入
S = [] 为上一个排序阶段的结果,共有n个item
X 是item的原始特征向量,维度为n ✖️ d-feature
Personalized Vector (PV ):预训练模型中得到的个性化矩阵向量,维度是n ✖️d-pv
把X和PV拼接后形成一个原始特征+个性化特征的矩阵:
PE: 位置特征向量,维度为n ✖️(d-pv+d-feature)
将PE和相加后形成矩阵:
有了后,将它送到一个全连接层后想成一个最终的矩阵,维度是n✖️d:
3.2 Encoding Layer
就是Transformer的结构
Attention:
Multi head attention:
Feed-Forward Network和Stacking the Encoding Layer:在《Attention is all you need》中有,就不展开了。
3.3 Output Layer
Nx个位置的结果都计算一个值,然后对这Nx个值进行softmax操作得出分数,这里应该是每个位置共享的参数,用来学习每个item的得分。
上式是模型的损失函数,yi是每个item的标签,个人觉得在这个模型中,所有的item的标签都为1
3.4 Personalized Module
个性化部分,用来产生PV向量,在整个模型训练的一开始就要先进行预训练。是用户u交互过的所有物品,除此之外,用户的性别,年龄等信息也会作为特征输入。当然这个模型还可以用fm,ffm.deepfm等来替代,把最后一层的vector拿出来当PV就可以来。该模型的损失函数如下:
三、实验结果
可以看到模型整体的效果相对于其他LTR模型还是有提升的,而且在线上也表现出来优势。
网友评论