2018-WSDM-Personalized Top-N Sequential Recommendation via Convolutional Sequence Embedding
卷积序列推荐模型Caser,使用CNN从近期items序列中以局部特征的方式提取序列模式。
为了捕获
user和item都有嵌入,在t时刻user的items集合是L个:
把 E 矩阵 L×d 看作"image",把序列模式看作 “image” 中的局部特征。
Horizontal 卷积
h×d,捕获联合级别的序列模式*(不会在嵌入维度之间进行卷积,就像textcnn一样)*
这个h就是 联合级别中联合的size
行为序列(image): L×d
1个卷积核:h×d (如果num个filter h×d×num)
卷积操作:[L-h+1] ×1 (如果num个filter [L-h+1] ×1×num)
max pooling:1×1 (如果num个filter 1 ×1×num)
(总之每个filter最终提取的feature结果一定是1维的)
然后可以有不同h的卷积核,每个h的卷积核也可以有数量;最后得到的feature维度是 1× filter数量。k是filter的idx:
卷积操作
第k个filter卷积后得到的feature map (后续max池化就变成1维了)
n个filter池化后得到的feature
Vertical 卷积
L×1 卷积核,通过加权组合pre items得到特征向量,捕获单独级别的序列模式。
行为序列(image): L×d
1个卷积核:L×1 (如果num个filter L×1×num)
卷积操作:1×d (如果num个filter 1 ×d×num)
(总之每个filter最终提取的feature结果一定是d维的)
其实这种卷积就相当于对items的加权组合,卷积核 L×1 对应的就是这L个物品的权重,最后得到 num×d 的聚合特征:
将Horizontal 卷积和Vertical 卷积得到的特征concat+MLP,得到卷积序列嵌入:
将卷积序列嵌入和user嵌入concat+MLP+sigmoid得到预测输出概率:
注意为了捕获skip行为,预测的是next,next+1,next+2,…next+T-1;即:
刚开始这个输出有点没看明白,以为要输出next item是所有候选item的概率(理论上应该要的),但一般都是softmax-每个正样本负采样-层次softmax-得到正样本+负样本的sigmoid loss,看这个意思就是:
很喜欢这一部分
2018-ICDM-Self-Attentive Sequential Recommendation
序列动态,基于用户近期的行为,寻求捕获用户活动的上下文。两种方法:MC,认为next item和近几个item相关,适用于稀疏数据集;RNN,能捕获长距离的关系,适用于更密集的数据集。本文提出SASRec,能够捕获长距离语义,又能使用注意力机制让其预测基于相关的少量行为。
常规(通用)的推荐*(不知道咋翻译合适)*
时间的推荐
序列推荐
注意力机制
固定输入序列长度为n,不够的用pad填充,pad的嵌入为常数0向量
自注意力层:在NLP中,通常K=V(RNN encoder-decoder翻译任务,encoder隐藏层做K和V,decoder隐藏层做Q)
本文的自注意力层以 E ^ \hat E E^ 为输入,通过三个投影矩阵进行线性映射做Q K V,
(这种投影让模型更灵活,比如 < q i , k j >
<qi,kj> 和 < q j , k i >
<qj,ki> 可以是不同的)
因果关系:考虑 t+1 的item时,应该只考虑前t个items,所以禁止 j > i j>i j>i的 Q i , K j Q_i,K_j Qi,Kj
Ponit-Wise 的FFN:虽然自注意力能够自适应的赋予previous items的权重,但它仍然是一个线性模型。为了赋予模型非线性并且考虑不同隐维度之间的交互作用,对于所有的S添加了两层FFN
堆叠多个自注意力层可能有助于学习更复杂的物品转移关系:
随着网络加深,带来一些问题:
解决方法:
对于 1)自注意力层和 2)FFN:
输入x——LN(x)——送入函数g()——dropout(输出)——残差add输入x
残差连接:核心思想是通过残差连接将低层的特征传播到更高的层
层归一化:normalize the inputs across features,有助于稳定和加速神经网络的训练
丢弃
预测某个序列 t+1 时刻的item时,我们基于 序列 t 时刻的模型输出和所有target item的嵌入 做内积
(注:提到了FPMC需要使用不同的item嵌入,应该是说 item 做序列中的 history一项 的嵌入和 item 做 target的嵌入不同,这是为了构造不对称的转移关系;而本文的F和M共享 Items嵌入,因为模型设计的 i j 输出 和 j i输出不对称)
显式用户建模,两种方式:
本文对于一个序列产生的 F n F_n Fn 就可以看作是第2种方法,即将序列的最终表示作为用户表示;也可以用第1种方法,再加一个用户嵌入表 U,把 F n F_n Fn 看作history 表示,U+F 联合表示用户+his序列 ;
本文使用的是方法2。
给定输入序列 s = s 1 , s 2 , s 3 , . . . , s n s={s_1,s_2,s_3,...,s_n} s=s1,s2,s3,...,sn,t时刻的期望输出为:
注意输入和输出长度相同都为n,因为输入 s1,s2,…sn;label是s2,s3,…,sn+1。
(这才知道序列推荐是seq2seq,不知道是不是全是这样,还是可以只考虑预测 n+1时刻)
每个epoch,要为 st 随机采样负样本
可以看成这些模型的扩展版:
数据集划分成三部分,每个用户的行为序列中:
2层自注意层
Hit Rate@10、NDCG@10
在不同time上,近15个item位置上的平均注意力得分
item之间的注意力得分,能够证明注意力机制能够识别出相似的(同一类)items,即attention score更高:
2019-CIKM-BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer
之前的研究使用序列神经网络,从左到右编码用户的交互记录,编码为隐藏表示。本文认为这种从左到右的单向模型是次优解,因为:
本文提出BERT4Rec,采用Cloze task的损失函数(为了避免信息泄露),联合使用左右上下文来预测随机mask的物品。
早期的CF:
Deep Learning:
用户的时间顺序交互序列:
任务,建模用户在下一时刻对所有物品的点击可能性:
不同于RNN和SASRec的单向建模,本文的模型是双向建模
多头自注意力
d维的表示,线性投影到h个子空间中,每个子空间中纬度 d/h;每层的投影矩阵有3个,并且不同层之间的投影矩阵不共享
按位置的前馈神经网络
W、b这些参数在不同的层与层之间是不同的
堆叠Transformer层
堆叠更多的Transformer层来学习更复杂的item转移模式;由于多层训练困难,增加了残差连接+dropout+LN:
总结:
在多层Trim的最底部加上位置嵌入p
其中E是物品的嵌入表,在输入和输出使用共享的物品嵌入表来缓解过拟合和减少参数
(Q:共享item嵌入表指的是,h的输入就是E吗?)
传统的单向序列推荐,预测输入序列的下一个物品;即输入【 v 1 , . . . , v t v_1,...,v_t v1,...,vt】,traget是【 v 2 , . . . , v t + 1 v_2,...,v_{t+1} v2,...,vt+1】
本文训练目标使用Cloze task (Masked Language Model),在每个train step,随机mask掉输入序列 ρ比例的items,使用其左右来预测它:
这种task是预测随机mask处,为了适合序列推荐,在用户历史序列最后加入了一个特殊的token [mask],基于最终token的表示来预测next item;因此训练的时候也mask掉每个输入序列的最后一个item。
(Q:这为啥类似于 fine-tuning ?)