推荐系统论文阅读(十七)-阿里巴巴深度会话兴趣网络
论文:
论文地址:https://arxiv.org/abs/1905.06482
论文题目:《Deep Session Interest Network for Click-Through Rate Prediction》
一 、背景
在正式介绍这篇论文之前,说一个自己对于前面那些阿里推荐系统论文的见解,我发现无论是din,还是dien中,模型的输入特征都是相似的,用户侧主要是点击序列,物品侧主要是是一些类别特征,店铺特征等。可以看到,无论是在din还是dien中,模型的重心都是在处理session,无论是din中对点击序列进行sum pooling操作,还是在dien中用gru去对点击序列建模都是为了更好地从用户对点击序列中探秘出用户的兴趣点。而在我们那这篇DSIN中也是类似的做法,重点处理session,下面就开始介绍吧。
用户的session一般是这样的:
直观的理解是这样,用户同一个session中的物品是相似的,比如第一排都是跟裤子相关的物品,第二排就都是戒指相关的了。这也说明了,session中的物品可以代表当时用户的兴趣点,如果我们能抓住用户在某个时刻的兴趣点,那么我们就能很容易给我用户推荐那些相似的物品了。
怎么划分session呢?在之前airbnb那篇论文中,我们也提到了划分方式:首先将用户的点击行为按照时间排序,判断每两个行为之间的时间间隔,前后的时间间隔大于30min,就进行切分。上面的图中每个session的间隔都是大于30min的。
为了更好的利用session信息,阿里提出了深度会话兴趣网络来对session信息更好的建模,深入分析到了session隐藏的用户兴趣。
二 、模型结构
咋一看这个网络你可能会有点懵又有点熟悉的感觉,没错,这个就是跟你之前看过的dien相似,回一下dien的模型结构是不是差不多长这样。模型结构一共分为好几部分,下面我们来一部分一部分介绍。
2.1 Base Model
这部分是用于对比的,Base Model就是一个全连接神经网络,其输入的特征的主要分为三部分,用户特征,待推荐物品特征,用户历史行为序列特征。用户特征如性别、城市、用户ID等等,待推荐物品特征包含商家ID、品牌ID等等,用户历史行为序列特征主要是用户最近点击的物品ID序列。
这些特征是跟DSIN的输入特征一样,只有模型结构不一样,一般这些特征都是通过embedding层然后concat后送到全连接层后进行分类,损失函数使用logloss。
2.2 User Item Feature Representation
这部分内容就不详细介绍了,跟din,dien中用户侧,物品侧的兴趣抽取方式一样,把候选物品和用户特征经过embedding层后送到concat层后准备进行后面的分类任务。
2.3 Session Division Layer
这里先说明一下,我们在介绍这四部分的时候默认embedding层是特征必须经过的层,所以后面就不介绍embedding层了。
Session Division Layer主要是对用户按时间顺序点击过的物品S进行session切分,按照间隔大于30min进行切分,得到用户的session序列Q:第k个会话为Qk=[b1;b2;...;bi;...;bT],其中,T是会话的长度,bi是会话中第i个行为,是一个d维的embedding向量。所以Qk是T * d的。而Q,则是K * T * d的。
2.4 Session Interest Extractor Layer
这部分就是跟DIEN中的Interest Extractor Layer差不多了,不同的是dien中用gru进行建模,这里我们使用的是transformer来操作,有关于transformer的知识,我们在BST详细介绍过了,可以参考一下。
在transformer中,每个序列都是需要用Position Encoder的,不同的是以前我们使用transformer时,PE是只针对一个session的,而在DSIN中我们一下子输入了K个session,所以PE要变一下了。
在DSIN中,这种对位置的处理,称为Bias Encoding,它分为三块:
BE是K * T * d的,和Q的形状一样。BE(k,t,c)是第k个session中,第t个物品的嵌入向量的第c个位置的偏置项,也就是说,每个会话、会话中的每个物品有偏置项外,每个物品对应的embedding的每个位置,都加入了偏置项。所以加入偏置项后,Q变为:
这里我就要提一下了,我们这里不能看上面原论文中的三部分w相加的操作,直接把PE当成原始transfromer中的PE就行了,就是需要PE跟输入Q一样就行,无论Q的大小怎么变,只需要每个session有一个PE就行。
有了transformer的输入后就是进入transformer中的操作了,这里跟一般的transformer结构一样:
具体过程可以参考之前的BST那篇文章,只有输入跟输出的维度是不一样的。
我们输入的大小是K*T*d,输出的大小也是K*T*d,每个session的大小是T*d,随后,我们经过一个avg pooling操作,将每个session兴趣转换成一个d维向量:
avg后,Ik就代表第k个session对应的兴趣向量,这时候整个输出的大小就变成了K*d。
2.5 Session Interest Interacting Layer
前面我们从tran的输出中得到了K*d的的向量,我们需要进一步对这个部分的数据进行处理,因为session之间也是有关系的。DSIN中用双向LSTM来处理,Bi-LSTM的具体过程这里就不提了,感兴趣的可以去搜一下具体过程:
简单介绍下状态H的计算过程:
也就是前向跟后向两部分的状态相加,Ht就代表了具备上下文信息的的状态了。
2.6 Session Interest Activating Layer
我们通过Session Interest Interacting Layer得到了T*d的输出了,正常情况下我们对这部分LSTM的输出进行一些操作的,除了进行avg,sum等操作,我们还可以用attention来处理,同样是用候选物品作为attention的信号:
对于transformer的输出向量I,我们也这么处理:
其中,XI是候选推荐物品向量,因为跟候选物品更相似的物品应该赋予更大的权重。
2.7 Concat & Flatten
我们前面得到了三部分的输出了,分别是用户特征向量、待推荐物品向量、会话兴趣加权向量UI、带上下文信息的会话兴趣加权向量UH进行横向拼接,输入到全连接层中,得到输出。
三、实验
3.1 损失函数
模型结构图中的最后一层是softmax,由于是ctr预估任务,所以这里不管是用sigmoid,效果都是一样的,可以用logloss来作为损失函数。
3.2 实验结果
评价指标是AUC:
实验结果:
主要看一下DIEN跟DSIN的比较,其实模型结构变复杂了,效果虽然有所提升,但是效果不是很明显,这篇论文主要是对用户的点击序列进行更深层次的处理,还是有借鉴意义的。