DSIN (IJCAI’19)
还是阿里的工作,上文说到了用户的行为序列可能会超长,这里借用Airbnb KDD’18文章的做法,将超长的sequence以间隔超过30分钟为标准,分成了若干个session。
这里借机讨论一下Sequential RS (SRS) 和Session-based RS (SBRS)的区别
SRS和SBRS
session是根据一定时间规则对sequence进行划分的结果,一个sequence由k个session构成。如上图,以30分钟为间隔,将用户行为序列切割成各个session。可以看出同一session内部用户的行为是高度相关的(同构),不同session间用户行为差异比较大(异构)。此外SBRS允许用户是匿名的,即没有用户特征可以用。
Model Overview
这也是一个排序模型,输入是user 特征、候选item 特征以及用户的历史行为序列。和上文的模型关注的点一样,重点在提取用户行为序列的特征。模型分为四层:Session Divsion Layer (Session 划分层)、Session Interest Extractor Layer (Session 兴趣提取层)、Session Interest Interacting Layer (Session 兴趣交互层)、Session Interest Activating Layer (Session 兴趣激活层)
Session Divsion Layer
根据规则将一条长度为
N
N
N 的Sequence划分成
K
K
K 个session,每个session包含
T
T
T个item,多的截断,不足的padding。
Q
k
=
[
b
1
;
…
;
b
i
;
…
;
b
T
]
∈
R
T
×
d
model
\mathbf{Q}_{k}=\left[\mathbf{b}_{1} ; \ldots ; \mathbf{b}_{i} ; \ldots ; \mathbf{b}_{T}\right] \in \mathbb{R}^{T \times d_{\text {model }}}
Qk=[b1;…;bi;…;bT]∈RT×dmodel
Session Interest Extractor Layer
顾名思义这层主要是为了获取session的表征。用户在session内的行为是高度相关的,着重考虑过滤意外点击,因此用multi-head self-attention (Transformer);session间行为注重考虑顺序关系,因此用Bias Encoding(类似位置编码)。
Bias Encoding
类似于position encoding,每个session有一个bias、session里每个位置有一个bias、每个位置上的每一维有一个bias,所以:
B
E
∈
R
K
×
T
×
d
model
\mathbf{B E} \in \mathbb{R}^{K \times T \times d_{\text {model }}}
BE∈RK×T×dmodel ,第
k
k
k 个session的第
t
t
t 个item的第 $ c $ 个unit的bias为:
B
E
(
k
,
t
,
c
)
=
w
k
K
+
w
t
T
+
w
c
C
\mathbf{B E}_{(k, t, c)}=\mathbf{w}_{k}^{K}+\mathbf{w}_{t}^{T}+\mathbf{w}_{c}^{C}
BE(k,t,c)=wkK+wtT+wcC
所以经过bias encoding之后,用户的session
Q
Q
Q更新为:
Q
=
Q
+
B
E
\mathbf{Q}=\mathbf{Q}+\mathbf{B E}
Q=Q+BE
Transformer
一个session一个session的输入到Transformer中,输入的形状为
Q
k
∈
R
T
×
d
h
\mathbf{Q}_{k} \in \mathbb{R}^{T \times d_{h}}
Qk∈RT×dh,Transformer的输出形状也为,
I
k
Q
∈
R
T
×
d
h
\mathbf{I}_{k}^{Q} \in \mathbb{R}^{T \times d_{h}}
IkQ∈RT×dh然后用一个avg pooling操作,将一个session的兴趣特征压缩成一个
d
h
d_h
dh维的向量:
I
k
=
Avg
(
I
k
Q
)
\mathbf{I}_{k}=\operatorname{Avg}\left(\mathbf{I}_{k}^{Q}\right)
Ik=Avg(IkQ)
所以用户序列经过Transformer模块后输出
I
=
(
I
1
,
I
2
,
I
3
,
.
.
.
,
I
K
)
I = (I_1, I_2, I_3,...,I_K)
I=(I1,I2,I3,...,IK)的形状为
K
×
d
h
K \times d_h
K×dh。Transformer的参数在每个session中是共享的。
Session Interest Interacting Layer
现在每个session的interest都有了,尽管interest里已经加入了bias encoding,但是对于顺序关系的刻画还是不够的。这里用一个Bi-LSTM来刻画session间的顺序关系。
t 时刻正向传播和反向传播的hidden state拼接起来,作为该层的输出:
H
t
=
h
f
t
→
⊕
h
b
t
←
\mathbf{H}_{t}=\overrightarrow{\mathbf{h}_{f t}} \oplus \overleftarrow{\mathbf{h}_{b t}}
Ht=hft⊕hbt
到这里用户行为序列的特征算是彻底提取完了,没有再能挖掘的余地了,但是挖出了这么多特征到底怎么用,还要看下一层。
Session Interest Activating Layer
前两层挖掘出了Interest特征 I k I_k Ik 和时序特征 h k h_k hk,怎么用这些特征呢?自然是加权平均,怎么算出权重?自然是阿里CTR模型的常客,Activation Unit:
和self-attention计算方式一样,候选item作为query,兴趣/时序特征作为Value和Key,和候选item有关的特征会被放大权重,其他特征会被过滤或者权重很小。
因此Interest特征和时序特征计算方式:
a
k
I
=
exp
(
I
k
W
I
X
I
)
)
∑
k
K
exp
(
I
k
W
I
X
I
)
U
I
=
∑
k
K
a
k
I
I
k
a
k
H
=
exp
(
H
k
W
H
X
I
)
)
∑
k
K
exp
(
H
k
W
H
X
I
)
U
H
=
∑
k
K
a
k
H
H
k
\begin{aligned} &a_{k}^{I} =\frac{\left.\exp \left(\mathbf{I}_{k} \mathbf{W}^{I} \mathbf{X}^{I}\right)\right)}{\sum_{k}^{K} \exp \left(\mathbf{I}_{k} \mathbf{W}^{I} \mathbf{X}^{I}\right)} \\ &\mathbf{U}^{I}=\sum_{k}^{K} a_{k}^{I} \mathbf{I}_{k} \\ &a_{k}^{H}=\frac{\left.\exp \left(\mathbf{H}_{k} \mathbf{W}^{H} \mathbf{X}^{I}\right)\right)}{\sum_{k}^{K} \exp \left(\mathbf{H}_{k} \mathbf{W}^{H} \mathbf{X}^{I}\right)} \\ &\mathbf{U}^{H}=\sum_{k}^{K} a_{k}^{H} \mathbf{H}_{k} \end{aligned}
akI=∑kKexp(IkWIXI)exp(IkWIXI))UI=k∑KakIIkakH=∑kKexp(HkWHXI)exp(HkWHXI))UH=k∑KakHHk
所以Interest特征和时序特征最终会整合成维度为
d
h
d_h
dh 的
U
I
U^I
UI 和
U
H
U^H
UH。然后和原始用户特征和候选物品特征拼接,输入到base模型中:
缺点是论文里没有线上AB Test实验结果。