介绍
现在有很多地方都需要推荐系统,比如网购平台、音乐平台、影视平台等等。一个应用如果能更准确地进行内容推送,那么自然用户的黏性会更强,有更强的竞争力。 但是现在出现了一个问题,我们以往做的一些工作都是基于用户历史记录进行的推荐,现在由于隐私政策的问题,有时候我们不能得到用户的长历史,我们能拿到手的只有用户当前在网页/app里面的行为,这个短历史我们就叫session。 举个例子,当你下载淘宝的软件之后,在没有登陆的情况下搜索你想要的东西,这个时候淘宝对你一无所知。你先点击了adidas的一件上衣,又点击了nike的一条裤子,然后又点击了李宁的一件上衣,这三个click就组成了你当前的一个session。我们要做的就是基于这三个点击对你下次想点击的东西进行预测,通过这个模型,我们可能会给你推荐安踏的衣服,或者adidas的另一版型的衣服。 总而言之,这个session-based方法可以在不侵犯用户隐私的情况下仍然进行有一定质量的推荐,值得我们进行研究。
模型介绍
从大体上来看,session-based recommendationo有两种分支,一种是把session看作一个sequence,利用诸如处理流数据的RNN模型得到隐层向量,并基于此搭建预测模型。
另一种则是基于图神经网络GNN的方法,通过构建有向图,利用GNN的方法学习表达向量,基于此进行预测。
今天要介绍的两个都是属于第一类的模型
NARM
每一个商品实际上都可以用一个id进行标识,这个和NLP任务里面把每一个单词都转化成id的思路是一样的。那么类似的,我们也可以有每一个商品的embedding,以此为基础把数据喂到RNN里面。
这个模型其实很简单,编码上分为两部分,Global encoder 和 Local Encoder。
global encoder
通过我们上面提到的与NLP任务类似的地方,我们这里为了方便理解可以把这个session看作一句话的等价,我们先通过word2id把商品转化为了id,得到了他们的embedding,然后把他们送进RNN里面。
在这篇文章里,作者使用的是GRU。
说起来fancy,但是这个global encoder得到的第一部分编码实际上就是RNN最后的隐层向量而已。
c
t
g
=
h
t
c_t^g=h_t
ctg?=ht?
local encoder
这个地方使用到了attention。
对于session里面的每一个商品,他的attention权重是:
α
t
j
=
v
T
σ
(
A
1
h
t
+
A
2
h
j
)
\alpha_{tj} = v^T\sigma(A_1h_t + A_2h_j)
αtj?=vTσ(A1?ht?+A2?hj?) 这里
A
1
,
A
2
,
v
A_1,A_2,v
A1?,A2?,v都是参数,
h
t
h_t
ht?表示最后一个隐层,实际上就是刚才提的global encoder得到的东西,而
h
j
h_j
hj?则是第j个商品的地方GRU拿到的隐层向量。
这个encoder最终得到的向量表示:
c
t
l
=
∑
j
=
1
t
α
t
j
h
j
c_t^l=\sum_{j=1}^t \alpha_{tj}h_j
ctl?=j=1∑t?αtj?hj?
final model
最终的向量表示就是把两个encoder得到的向量拼在一起,
c
t
=
[
c
t
g
;
c
t
l
]
c_t = [c_t^g ; c_t^l]
ct?=[ctg?;ctl?] 对于当前的session,我们可以直接拿到他们的embedding矩阵:
E
∈
R
n
×
e
m
b
e
d
??
s
i
z
e
E \in \mathbb{R}^{n \times embed \;size}
E∈Rn×embedsize 最终的得分向量计算如下:
S
=
E
B
c
t
,
??
B
∈
R
e
m
b
e
d
×
h
i
d
d
e
n
?
2
S = EBc_t, \; B \in \mathbb{R}^{embed\times hidden*2}
S=EBct?,B∈Rembed×hidden?2 这里B是参数
这个最终的得分作者没有送到softmax里进行归一化,而是直接送到了cross entropy loss里面去计算loss。
STAMP
在这里你会看到和NARM很多类似的东西,但是叫法不一样,也可以理解对吧(笑)。但是在这个模型里,没有用到RNN来计算隐层向量,一切都是直接从embedding拿向量来做的。
short-term memory
这个短期记忆就是上面的global encoder,把session里面所有商品的embedding按照出现顺序排成一个矩阵,最后一个商品的embedding就是这个short0-term memory。
long-term memory
这里多了一个向量:
m
s
=
1
t
∑
i
=
1
t
x
i
m_s = \frac{1}{t}\sum_{i=1}^tx_i
ms?=t1?i=1∑t?xi? 这里的
x
i
x_i
xi?代表每个商品的embedding,换言之这个向量就是当前session里面所有商品embedding的均值。
上面提到的短期记忆
m
t
=
x
t
m_t = x_t
mt?=xt? 就是最后一个商品的embedding。
这里的attention权重是这样计算的:
α
i
=
W
0
σ
(
W
1
x
i
+
W
2
x
t
+
W
3
m
s
+
b
)
\alpha_i = W_0\sigma(W_1x_i + W_2x_t+W_3m_s+b)
αi?=W0?σ(W1?xi?+W2?xt?+W3?ms?+b)
通过加权求和我们得到了这个部分的表示向量:
m
a
=
∑
i
=
1
t
α
i
x
i
m_a = \sum_{i=1}^t\alpha_ix_i
ma?=i=1∑t?αi?xi?
final model
把短期和长期记忆
m
t
,
m
a
m_t, m_a
mt?,ma?分别送进两个线性层,得到了中间向量
h
t
,
h
s
h_t, h_s
ht?,hs?
最终每一个商品的预测得分是:
z
i
^
=
σ
(
<
h
s
,
h
t
,
x
i
>
)
,
1
≤
i
≤
∣
V
∣
\hat{z_i} = \sigma(<h_s, h_t, x_i>), 1 \leq i \leq |V|
zi?^?=σ(<hs?,ht?,xi?>),1≤i≤∣V∣ 这里看似内积的符号是文中自己定义的,代表着把三个向量每个位置都乘起来,再把乘完之后的向量每个位置加起来。用公式表达就是:
<
a
,
b
,
c
>
=
∑
i
=
1
d
a
i
b
i
c
i
<a,b,c> = \sum_{i=1}^d a_ib_ic_i
<a,b,c>=i=1∑d?ai?bi?ci? 最后的预测就是把这些得分送到softmax里面过一下。
比较
这两个模型看起来非常的相像,两个都用最后一个位置的向量作为当前的表示,用attention加权平均的方法对整体得到一个表示,最终都使用一种类似内积的方法得到每个商品的评分。
但是这两个模型还是有本质上的不同的,最大的点就在于STAMP没有像之前那些论文那样非要使用RNN先对embedding进行初步的处理,而是直接使用了embedding的向量进行处理。
这点和Attention is all you need这篇文章的意义很类似,都是仅仅基于embedding和attention的机制搭建的模型。这种文章出来最大的意义就是说明了基于RNN进行处理的方法是有局限性的,换句话说RNN对于session内容的处理是完全可以被替代甚至丢弃的。我想这也是为什么慢慢后面的学者会把目光放在GNN上面。
|