ATRank: An Attention-Based User Behavior Modeling Framework for Recommendation
论文地址:https://arxiv.org/pdf/1711.06632.pdf
1. Introduction
- 正如单词可以由上下文表示一样,一个用户也可以由他/她的历史行为来表征
- 用户行为通常构成一个与时间相关的序列(a sequence over the timeline)
- RNN/CNN被引入来encode behavior sequence,但是 both the basic RNN and CNN encoders suffer from the
problem that the fixed-size encoding vector may not support both short and long sequences well- 即使使用LSTM或者GRU,RNN 也难以对 long-term dependencies 建模 ,且无法并行
- CNN可以并行,但是任意两个位置的behavior之间的interaction paths最长为 l o g k n log_kn logkn, k k k 为卷积核的大小, n n n为用户行为的数量
- attention被引入,在decode时能够给予不同的行为不同的权重
- However, we show that the one-dimensional attention score between any two vectors may neutralize their relationships in different semantic spaces
- attention的机制如下: C = ∑ i = 1 n a i v i ⃗ C=\sum_{i=1}^na_i\vec{v_i} C=∑i=1naivi
- v i ⃗ \vec{v_i} vi的每个元素都使用相同的权重 a i a_i ai,因此对 v ⃗ i \vec{v}_i vi的不同语义并不能能够做出区分
- 此外,用户的行为是异质的(heterogeneous),非常灵活的,因此很难去建模
- 以电商推荐系统举例,用户可能会浏览/点击/收藏商品(browse/click/mark items)、接收/使用优惠券(receive/use coupons)、点击广告(click ads)、搜索关键词(search keywords ),写评论(write down reviews)、看商铺的视频或者直播等,每一种行为都反映了用户的某一方面的特征,对于构建全方位的用户模型都是非常有帮助的
- RNN/CNN被引入来encode behavior sequence,但是 both the basic RNN and CNN encoders suffer from the
2. Self-Attention Based Behavior Modeling Framework
用户行为被表示为一个三元组: { a , o , t } \{a,o,t\} {a,o,t}
- a a a 表示行为的类型 (behavior type),比如点击/收藏/加购、领取/使用
- o o o 表示行为的对象 (the object the behavior acts on),比如商品、优惠券、搜索词等
- t t t 表示行为发生的时间
- 用户的行为序列被表示为 U = { ( a j , o j , t j ) ∣ j = 1 , 2 , ⋯ , m } U=\{(a_j,o_j,t_j) | j=1,2,\cdots,m\} U={(aj,oj,tj)∣j=1,2,⋯,m}
模型分为如下几块:
- Raw Feature Spaces
- Behavior Embedding Spaces
- Latent Semantic Spaces
2.1 Raw Feature Spaces
-
首先会根据行为的对象 o j o_j oj 将 U = { ( a j , o j , t j ) ∣ j = 1 , 2 , ⋯ , m } U=\{(a_j,o_j,t_j) | j=1,2,\cdots,m\} U={(aj,oj,tj)∣j=1,2,⋯,m} 划分至不同的组 G = { b g 1 , b g 2 , ⋯ , b g n } G=\{bg_1,bg_2,\cdots,bg_n\} G={bg1,bg2,⋯,bgn},
b g i ∩ b g j = ∅ , U = ∪ i = 1 n b g i bg_i\cap bg_j= \emptyset,U=\cup_{i=1}^{n}bg_i bgi∩bgj=∅,U=∪i=1nbgi,例如划分为商品行为,优惠券行为,关键字行为等等 -
在每个 b g i bg_i bgi 内部,object的空间相同,之后可以使用 group-specific 的神经网络去获得 behavior embeddings
-
举例:对商品的行为组成第一组 b g 1 bg_1 bg1,优惠券行为是 b g 3 bg_3 bg3,搜索相关行为 b g 2 bg_2 bg2,注意每组里面行为的个数不一定相同
2.2 Behavior Embedding Spaces
- 对于在
b
g
i
bg_i
bgi 中的某个行为
u
i
=
(
a
j
,
o
j
,
t
j
)
u_i=(a_j,o_j,t_j)
ui=(aj,oj,tj),会将
a
j
,
o
j
,
t
j
a_j, o_j, t_j
aj,oj,tj 分别转化为嵌入式向量:
- 对于时间
t
j
t_j
tj 会将其离散化:计算行为发生时间距当前时间的间隔,然后按照如下区间将时间间隔离散化,之后再进行embedding:
- behavior embedding spaces的输出是一组向量,其中
u
b
g
i
=
c
o
n
c
a
t
j
(
u
i
j
)
u_{bgi}=concat_j(u_{ij})
ubgi=concatj(uij),表示所有属于第
i
i
i 组的 behavior embedding 的 concat:
- 具体的计算过程示例如下:
- 有以下两点注意事项:
- 每组embedding的维度是不一样的,因为:
- 每个用户在不同组别下行为的个数不一样
- 不同组别embedding size不一定一样,比如商品行为一般会比搜索行为反映更多的信息,所以会有更长的embedding size
- 不同bg的objects如果有相同的特征,embedding 是跨组共享的,比如 shop id, category id 可以由 item, coupon组共享;但是关于时间的embedding不共享,因为时间对于不同组行为的影响不同。
- 每组embedding的维度是不一样的,因为:
2.3 Latent Semantic Spaces
- 由于不同组的embedding size不一样,因此首先通过
F
M
i
F_{Mi}
FMi 将
u
b
g
i
u_{bgi}
ubgi 映射到一个相同的维度
s
a
l
l
s_{all}
sall,若一个user行为的个数为
n
a
l
l
n_{all}
nall,
S
S
S 的维度则为
n
a
l
l
×
s
a
l
l
n_{all} \times s_{all}
nall×sall
- 之后再利用
F
P
k
F_{P_k}
FPk 将
S
S
S 映射到不同的语义空间,
S
k
S_k
Sk 的维度为
n
a
l
l
×
s
k
n_{all}\times s_k
nall×sk
2.4 Self-Attention Layer
self-attention layer 用于 capture 不同语义空间的内在联系。
第
k
k
k 个语义空间的 attention score matrix
A
k
A_k
Ak 为:
attention score function
a
(
S
k
,
S
;
θ
k
)
a(S_k,S;\theta_k)
a(Sk,S;θk) 为:
- S k ∈ n a l l × s k , S ∈ n a l l × s a l l , a ( S k , S ; θ k ) ∈ n a l l × n a l l S_k \in {n_{all} \times s_k},S \in {n_{all} \times s_{all}}, a(S_k,S;\theta_k) \in n_{all} \times n_{all} Sk∈nall×sk,S∈nall×sall,a(Sk,S;θk)∈nall×nall
attention vectors of space
k
k
k are:
- F Q k F_{Q_k} FQk 是另外一个将 S S S 映射到第 k k k 个语义空间的映射函数(本文中为一个单层的全连接加relu激活)
- C k ∈ n a l l × s k C_k \in n_{all} \times s_k Ck∈nall×sk
然后将
C
k
C_k
Ck concat 起来,再经过一个只有一个hidden layer的前馈神经网络:
最后会依次经过 drop out, residual connections 和 layer normalization。
参考资料
阿里北大 ATRank 论文图解
李宏毅Transformer笔记附代码
github: Transformer代码
github: ATRank代码