论文地址:https://arxiv.org/abs/1904.06690
摘要
通过用户的历史行为建模用户的动态兴趣偏好,对推荐系统来说,是具有挑战性且重要的。现有模型利用序列神经网络模型将用户的历史行为交互从左到右编码成隐含表示用做推荐。尽管他们的效果不错,我们认为这样从左到右的单向模型不是最优的,因为以下一些限制:a)单向架构限制了用户行为序列隐含表示的能力;b)它们经常假设一个严格有序的序列,并不总是切合实际。为了解决这些限制,我们提出了一个序列推荐模型(BERT4Rec),利用深度双向自注意力建模用户行为序列。为了避免信息遗漏和有效地训练双向模型,我们采用了填充目标式序列推荐,结合它们左右内容的条件来预测序列中随机标记的items。用这种方法,我们学习一个双向表示模型用做推荐,用户行为序列中的每个item都能融合它左右两边的信息。使用四个基准数据集进行扩展实验,结果表明我们的模型优于各种目前最优的序列模型。
本文要解决的问题
用户动态行为序列对推荐系统是至关重要的,越来越多的序列模型被用来建模用户序列行为。但是它们普遍存在一个问题:网络都是单向的,并不能高效地学习用户序列行为信息。如下图中的(c)和(d)所示,它们对用户行为序列编码只能依赖序列的前置item,从而限制了模型的表示能力。第二个限制就是它们假设用户行为是一个严格有序的序列,但在实际应用中,这并不总是真的,用户历史行为中的顺序并不是严格有序的。
为了解决以上两个问题,本文使用了双向序列模型建模用户序列行为。受到BERT模型的启发,本文运用深度双向自注意力模型建模序列推荐。本文的三个主要贡献是提出了使用双向自注意力网络和填充式任务建模用户行为序列。
本文模型
问题申明:
U
=
{
u
1
,
u
2
,
.
.
.
,
u
∣
U
∣
}
U=\{u_1,u_2,...,u_{|U|}\}
U={u1,u2,...,u∣U∣}表示用户集,
V
=
{
v
1
,
v
2
,
.
.
.
,
v
∣
V
∣
}
V=\{v_1,v_2,...,v_{|V|}\}
V={v1,v2,...,v∣V∣}表示items集,
S
u
=
{
v
1
(
u
)
,
.
.
.
,
v
t
(
u
)
,
.
.
.
,
v
n
u
(
u
)
}
S_u=\{v_1^{(u)},...,v_t^{(u)},...,v_{n_u}^{(u)}\}
Su={v1(u),...,vt(u),...,vnu(u)}表示用户的交互行为序列。建模:
p
(
v
n
u
+
1
(
u
)
=
v
∣
S
u
)
p(v_{n_u+1}^{(u)}=v|S_u)
p(vnu+1(u)=v∣Su)
模型架构:如上图中(b)的模型结构,最下面是embedding层,上面是由transformer层堆叠而成,对比图中的(c)和(d),可以看出最大的区别就是BERT4Rec是双向的,可以更有效地捕获用户行为序列信息。
对于Embedding层,除了item的embedding还需要sumitem的position embedding:
h
i
0
=
v
i
+
p
i
h_i^0=v_i+p_i
hi0=vi+pi其中
v
i
v_i
vi表示第
i
i
i个item的embedding,
p
i
p_i
pi表示第
i
i
i个item的位置embedding。
Transformer层,本质上就是self-attention网络+Dropout+Add & Norm,本文采用的是多头自注意力机制,如上图中(a)所示。建模过程:
M
H
(
H
l
)
=
[
h
e
a
d
1
:
h
e
a
d
2
:
.
.
.
:
h
e
a
d
h
]
W
O
MH(H^l)=[head_1:head_2:...:head_h]W^O
MH(Hl)=[head1:head2:...:headh]WO
h
e
a
d
i
=
A
t
t
e
n
t
i
o
n
(
H
l
W
i
Q
,
H
l
W
i
K
,
H
l
W
i
V
)
head_i=Attention(H^lW_i^Q,H^lW_i^K,H^lW_i^V)
headi=Attention(HlWiQ,HlWiK,HlWiV)
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
/
h
)
V
Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d/h}})V
Attention(Q,K,V)=softmax(d/hQKT)V由于自注意力子层主要是基于线性映射,为了是模型也能适应非线性交互,本文运用了Position-wise Feed-Forward Network作为自注意力子层的输出
P
F
F
N
(
H
l
)
=
[
F
F
N
(
h
1
l
)
T
;
.
.
.
;
F
F
N
(
h
t
l
)
T
]
T
PFFN(H^l)=[FFN(h_1^l)^T;...;FFN(h_t^l)^T]^T
PFFN(Hl)=[FFN(h1l)T;...;FFN(htl)T]T
F
F
N
(
x
)
=
G
E
L
U
(
x
W
(
1
)
+
b
1
)
W
(
2
)
+
b
(
2
)
FFN(x)=GELU(xW^{(1)}+b^{1})W^{(2)}+b^{(2)}
FFN(x)=GELU(xW(1)+b1)W(2)+b(2)
G
E
L
U
(
x
)
=
x
Φ
(
x
)
GELU(x)=x\Phi(x)
GELU(x)=xΦ(x)最后将Transformer层堆叠起来便得到了BERT4Rec模型
H
l
=
T
r
m
(
H
(
l
−
1
)
)
H^l=Trm(H^{(l-1)})
Hl=Trm(H(l−1))
T
r
m
(
H
(
l
−
1
)
)
=
L
N
(
A
l
−
1
+
D
r
o
p
o
u
t
(
P
F
F
N
(
A
(
l
−
1
)
)
)
)
Trm(H^{(l-1)})=LN(A^{l-1}+Dropout(PFFN(A^{(l-1)})))
Trm(H(l−1))=LN(Al−1+Dropout(PFFN(A(l−1))))
A
(
l
−
1
)
=
L
N
(
H
l
−
1
+
D
r
o
p
o
u
t
(
M
H
(
H
(
l
−
1
)
)
)
)
A^{(l-1)}=LN(H^{l-1}+Dropout(MH(H^{(l-1)})))
A(l−1)=LN(Hl−1+Dropout(MH(H(l−1))))
p
(
v
)
=
s
o
f
t
m
a
x
(
G
E
L
U
(
h
t
L
W
P
+
b
P
)
E
T
+
b
O
)
p(v)=softmax(GELU(h_t^LW^P+b^P)E^T+b^O)
p(v)=softmax(GELU(htLWP+bP)ET+bO)
模型训练:和传统的单向序列模型不同,单向模型每个item只依赖前置item,最后很自然地可以输入最后一个item的概率。双向模型在学习过程中依赖左右item,这样可以学习到预测item的信息,导致模型可以轻易的预测结果。本文采用填充式任务对输入序列进行随机mask,如图
最终,定义损失函数
L
=
1
∣
S
u
m
∣
∑
v
m
∈
S
u
m
−
l
o
g
P
(
v
m
∗
∣
S
u
′
)
L=\frac{1}{|S_u^m|}\sum_{v_m \in S_u^m}-logP(v_m^*|S_u')
L=∣Sum∣1vm∈Sum∑−logP(vm∗∣Su′)其中
S
u
′
)
S_u')
Su′)表示被mask之后的
S
u
S_u
Su
实验结果:通过利用4个基准数据集测试,模型取得了最优结果。
模型代码已开源:https://github.com/FeiSun/BERT4Rec
总结
本文主要提出了一个双向序列模型BERT4Rec模型,在几个基准数据集上取得了不错的效果。本文最主要的贡献就是通过引入bert模型做推荐。对于序列任务是一个不错的开始。目前只用到了用户行为数据,缺失了其他的用户或item属性信息,后续可以考虑引入其他的一些特征,预期能提升模型的效果。