论文《Self-Attentive Sequential Recommendation》

论文地址:https://arxiv.org/pdf/1808.09781.pdf

Self-Attentive Sequential Recommendation

SASRec是较早应用Self-Attention到序列推荐中的模型,目前作为序列SOTA的baseline,应用十分广泛。在工业界也是很早就大规模落地,取得的效果也是非常显著,在SASRec基础上面进行改进的工作很多,包括后面引入对比学习,加入其他side info,以及加入双向Transformer结构等等。

摘要

序列模型一般是由马尔科夫链(Markov Chain)或者循环神经网络(RNN)来处理,Markov Chain假设用户的下一个行为由最近一个或者最近几个行为产生,在稀疏数据集上面表现不错。RNN能处理较长的序列,在稠密的序列上面表现不错。基于Self-Attention的SASRec能综合两者的优点,而且性能上面比基于RNN/CNN的要好。

引言

SASRec在稀疏数据集和稠密数据集上表现都不错。基于Self-Attention机制,SASRec能关注到长距离的序列依赖,而且在稀疏数据集上面,能关注到最近的序列,另外,Self-Attention可以并行,效率较高。
在这里插入图片描述

方法

符号表示
在这里插入图片描述

Embedding Layer

取固定长度的n个序列, s = ( s 1 , s 2 , . . . , s n ) s=(s_1,s_2,...,s_n) s=(s1,s2,...,sn),如果用户序列长度不够,用padding填充,不过超过了n,就取最近的n个。item的embedding矩阵 M ∈ R ∣ I ∣ × d \mathbf{M} \in R^{\vert I \vert \times d} MRI×d,输入的embedding矩阵 E ∈ R n × d \mathbf{E} \in R^{n \times d} ERn×d,这里 E i = M s i \mathbf{E_i} = \mathbf {M}_{s_i} Ei=Msi

Positional Embedding

self-attention对位置不感知,需要额外加入位置信息,引入一个待学习的位置矩阵 P \mathbf {P} P,论文也尝试过固定的位置embedding,效果比较差。
在这里插入图片描述

Self-Attention Block

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d ) V Attention(\mathbf {Q,K,V}) = softmax(\frac {\mathbf {QK}^T}{\sqrt d}) \mathbf{V} Attention(Q,K,V)=softmax(d QKT)V
Q \mathbf Q Q表示queries, K \mathbf K K表示keys, V \mathbf V V表示values(item embedding表示)。整个式子就是item向量表示的加权和。

Self-Attention Layer

S = S A ( E ^ ) = A t t e n i o n ( E ^ W Q , E ^ W K , E ^ W V ) \mathbf S = SA(\hat {\mathbf E}) = Attenion( \hat {\mathbf E} \mathbf W^Q,\hat {\mathbf E} \mathbf W^K,\hat {\mathbf E} \mathbf W^V) S=SA(E^)=Attenion(E^WQ,E^WK,E^WV)
即通过不同的映射投影作为Attention的输入

Causality

预测第t+1个item时仅考虑前面t个item,不能用到后面的item信息,因此需要修改 Q i \mathbf Q_i Qi K j \mathbf K_j Kj的连接当 j > i j > i j>i

Point-Wise Feed-Forward Network

F i = F F N ( S i ) = R e L U ( S i W ( 1 ) + b ( 1 ) ) W ( 2 ) + b ( 2 ) \mathbf F_i=FFN(\mathbf S_i)=ReLU(\mathbf S_i \mathbf W^{(1)} + \mathbf b^{(1)}) \mathbf W^{(2)} + \mathbf b^{(2)} Fi=FFN(Si)=ReLU(SiW(1)+b(1))W(2)+b(2)
W ( 1 ) \mathbf W^{(1)} W(1) W ( 2 ) \mathbf W^{(2)} W(2) d × d d \times d d×d的矩阵

Stacking Self-Attention Blocks

第一个Self block F i \mathbf F_i Fi基本聚合了所有item的embedding,堆叠更多的block能学习到更复杂的行为模式。对于第 b ( b > 1 ) b(b>1) b(b>1)个block,定义如下
S ( b ) = S A ( F ( b − 1 ) ) \mathbf S^{(b)} = SA(\mathbf F^{(b-1)}) S(b)=SA(F(b1))
F i ( b ) = F F N ( S i ( b ) )         i ∈ { 1 , 2 , . . . , n } \mathbf F^{(b)}_i = FFN( \mathbf S^{(b)}_i ) \ \ \ \ \ \ \ i \in \{ 1,2,...,n \} Fi(b)=FFN(Si(b))       i{1,2,...,n}

当网络层级较深时,容易产生几个问题
(1)模型容量增加,容易过拟合
(2)层级深梯度容易消失或者爆炸,训练过程不稳定
(3)模型参数较多,训练耗时也在增加
直接套用Transformer的解决办法,使用残差连接

Residual Connections

将低层的特征直接输入给高层,高层更容易利用低层的信息。
g ( x ) = x + D r o p o u t ( g ( L a y e r N o r m ( x ) ) ) g(x) = x + Dropout(g(LayerNorm(x))) g(x)=x+Dropout(g(LayerNorm(x)))
g表示自注意力层或者 feedforward network,先对输入x做LayerNorm,然后对g的输出做Dropout,再和原始输入x相加作为最后的输出。

Layer Normalization

Transformer里面用的是Layer Normalization,而不是Batch Normalization,主要原因是序列任务经常长短不一,而输入是固定维度,不够长的会补0,如果使用BN,会导致数据失真的比较严重,但是LN不存在这个问题,每个样本Normalization是独立的,不受其他样本的影响。
L a y e r N o r m ( x ) = α ⊙ x − μ σ 2 + ϵ + β LayerNorm(x)=\alpha \odot \frac {x - \mu} { \sqrt {\sigma^2 + \epsilon}} + \beta LayerNorm(x)=ασ2+ϵ xμ+β
α \alpha α β \beta β是待学习的参数

Prediction Layer

堆叠了b个self-attention blocks之后,再加一个MF Layer来预测,
r i , t = F t ( b ) N i T r_{i,t} = F_t^{(b)}N_i^T ri,t=Ft(b)NiT
r i , t r_{i,t} ri,t表示序列 ( s 1 , s 2 , . . . , s t ) (s_1,s_2,...,s_t) (s1,s2,...,st)的下一个行为item是item i i i的相关性分数
N ∈ R ∣ I ∣ × d N \in R^{\vert I \vert \times d} NRI×d 是item embedding矩阵

Shared Item Embedding

出于减少模型大小及避免过拟合的原因,使用单个item embedding矩阵 M M M
r i , t = F t ( b ) M i T r_{i,t} = F_t^{(b)}M_i^T ri,t=Ft(b)MiT

Network Training

将每个用户的序列( S 1 u , S 2 u , . . . , S ∣ S u ∣ − 1 u S_1^u,S^u_2,...,S^u_{\vert S_u \vert -1} S1u,S2u,...,SSu1u)从处理成一个固定长度的序列 s = { s 1 , s 2 , . . . , s n } s=\{s_1,s_2,...,s_n\} s={s1,s2,...,sn},定于 o t o_t ot表示t时刻希望的输出
在这里插入图片描述
定义交叉熵损失函数如下
− ∑ S u ∈ S ∑ t ∈ [ 1 , 2 , . . . , n ] [ l o g ( σ ( r o t , t ) ) + ∑ j ∉ S u l o g ( 1 − σ ( r j , t ) ) ] -\sum_{S_u \in S} \sum_{t \in [1,2,...,n]} [ log(\sigma(r_{o_t,t})) + \sum_{j \notin S_u} log(1 - \sigma(r_{j,t})) ] SuSt[1,2,...,n][log(σ(rot,t))+j/Sulog(1σ(rj,t))]

Complexity Analysis

Space Complexity: O ( ∣ I ∣ d + n d + d 2 ) O(\vert I \vert d + nd + d2) O(Id+nd+d2)
Time Complexity:主要是self-attention和the feed forward network的计算 O ( n 2 d + n d 2 ) O(n^2d + nd^2) O(n2d+nd2)
但是attention是能够并行计算的,实际这里耗时可以接受

实验

实验回答4个问题:
RQ1:SASRec是不是比包括CNN/RNN的方法好?
RQ2:SASRec不同组件的影响如何?
RQ3:SASRec训练性能如何?
RQ4:attention的权重是否能学到item属性或者位置的有意义的模式?

数据集

3个应用的4个数据集,数据的平台、领域、稀疏性差异显著
Amazon:从Amazon.com.产生的数据集,分成2个数据集‘’Beauty,’ and ‘Games’
Steam:大型在线视频游戏分发平台
MovieLens:很多推荐系统的基线
在这里插入图片描述
对数据进行处理,对行为序列按照时间排序,去掉序列长度不超过5的用户。按照最近的时间顺序将用户序列分成3部分,一部分测试,一部分验证,其他的训练。

对比方法

PopRec:流行度推荐,就是热门推荐
Bayesian Personalized Ranking (BPR):

基于一阶马尔科夫链的模型
Factorized Markov Chains (FMC):将item矩阵分解为2个embedding,依靠最近访问的item来推荐
Factorized Personalized Markov Chains (FPMC):结合矩阵分解和一阶马尔科夫链
Translation-based Recommendation (TransRec):每个用户转换成embedding

基于深度学习的模型
GRU4Rec:使用RNN的序列推荐模型
GRU4Rec + ^+ +:GRU4Rec,的增强版,使用了不同的loss函数和采用策略
Convolutional Sequence Embeddings (Caser):基于CNN的高阶马尔科夫链

为公平起见, 向量维度 d d d考虑 { 10 , 20 , 30 , 40 , 50 } \{10,20,30,40,50 \} {10,20,30,40,50} ,正则参数 l 2 l_2 l2考虑 { 0.0001 , 0.001 , 0.01 , 0.1 , 1 } \{ 0.0001,0.001,0.01,0.1,1 \} {0.0001,0.001,0.01,0.1,1}在验证集中找到表现最好的参数

实现细节

使用的self-attention block数目为2( b = 2 b=2 b=2),使用可学习的位置embedding,优化器是Adam,学习率为0.001,batch_size为128,dropout比例对于MovieLens-1M是0.2,其他是0.5,序列长度MovieLens-1M设置的是200,其他的设置的是50

评估指标

Hit Rate@10和NDCG@10
Hit Rate@10 下一个item在最相似的top10的比例

推荐结果

结果如下表,回答RQ1
在这里插入图片描述
实验了超参数,embedding维度 d d d d > = 40 d >= 40 d>=40在所有数据集上都表现最好
在这里插入图片描述

拆解分析

回答RQ2:,SASRec不同的组件如何影响
在这里插入图片描述
(1)Remove PE (Positional Embedding):即去掉了序列的属性特性,对于稀疏数据集可能合适,稠密的数据集就比较糟糕了
(2)Unshared IE (Item Embedding):不共享item embedding效果较差
(3)Remove RC (Residual Connections):效果显著下降,可能是低层的信息比较难进入到最后一层
(4)Remove Dropout:去掉dropout效果变差,过拟合导致
(5)-(7)0个self-attention block非常差,仅依靠最后一个item
(8)Multi-head:Transformer里面使用了多头注意力有效,但是SASRec场景效果较差,可能是因为embedding维度较小(Transformer的纬度是512)

训练性能

从2个 维度评估,一个是训练速度(训练一个epoch需要的时间),另一个是训练收敛需要的时间,所有实验使用了单个GTX-1080 Ti GPU

在这里插入图片描述
序列长度n的耗时
在这里插入图片描述

Visualizing Attention Weights

回答RQ4:attention 权重是否学到了有意义的模式
Attention on Positions:
在这里插入图片描述
(a)vs (c):稀疏数据集Beauty上面attention权重显示更关注最近的item,稠密数据集ML-1M上面则对最近的item关注的表较少。也就是说模型能自适应的去处理不同的数据集。
(b)vs(c):显示是否使用position embedding的影响,没有位置embedding,attention权重对于每个item几乎是均匀分布的,有位置embedding的模型对于位置比较敏感,对相应位置的item关注度(权重)更高。
(c)vs(d)不同层的self attention block里面的区别,更高层的更关注相应位置的item,可能是第一层考虑了所有的item,后面的层只需要更关注相应位置的item。

Attention Between Items:
从数据集中随机抽取2个集合,item的类目分属4种,从热力图上看到相同类目的item聚集在一起,说明模型能够根据item的属性找到相似的item。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值