Motivation
现有的基于矩阵分解的模型不能捕捉序列信息,于是作者提出了新颖的SeqFM模型,分别学习静态特征(如性别)、动态特征(如交互信息)以及二者之间的关系。
Introduction
为了避免特征工程中手工设计,FMs (factorization machines) 用来将原始的特征嵌入到隐向量空间,并且通过对emb内积学习特征之间的联系。
但是plain FM受限于线性表达能力,DNN-based FM,如Xiangnan He的NFM,学习高阶的联系。
FM有两种趋势:一种是加深网络,如使用残差网络的DeepCross;另一种是加“宽”网络,增加可以提取信息的特征联系,如利用用户日志和文本信息的CoFM,或者将低阶输出和高阶输出混合的Wide&Deep、DeepFM等。
FM-based模型并不能获取时序信息(temporal order),因此作者考虑时序上的因果关系,得到 full sequence-awareness for temporal
predictive analytics。
并且建立了一个多视角学习机制,static view
for static features, dynamic view
for dynamic features,
and cross view
for both,每一个都是用self-attention机制代替RNN或CNN,以减少时空复杂度。对于dynamic和cross,进一步地使用masked self-attention(和transformer一样,来表示顺序方向)
Preliminaries
○、▷、⋆ 分别表示static view, dynamic view and cross view
特征
x
\bold{x}
x以one-hot表示,如
embedding以
v
\bold{v}
v表示
与传统的FMs相比
SeqFM公式中
f
(
x
)
f(\bold{x})
f(x)就是提出的特征部分。
事实上,
x
\bold{x}
x也可以表示为
x
=
Σ
i
=
1
n
g
i
\bold{x} = \Sigma_{i=1}^n \bold{g}_i
x=Σi=1ngi,
g
i
=
[
0
,
.
.
.
,
0
,
1
,
0
,
.
.
.
,
0
]
\bold{g}_i = [0, ..., 0, 1, 0, ..., 0]
gi=[0,...,0,1,0,...,0].
对于三个类型,剥离出来:
x
∘
=
∑
i
=
1
n
∘
g
i
∘
\mathbf{x}^{\circ}=\sum_{i=1}^{n^{\circ}} \mathbf{g}_{i}^{\circ}
x∘=∑i=1n∘gi∘
x
▹
=
∑
i
=
1
n
▹
g
i
▹
\mathbf{x}^{\triangleright}=\sum_{i=1}^{n^{\triangleright}} \mathbf{g}_{i}^{\triangleright}
x▹=∑i=1n▹gi▹
G
∘
∈
{
0
,
1
}
n
∘
×
m
∘
\mathbf{G}^{\circ} \in\{0,1\}^{n^{\circ} \times m^{\circ}}
G∘∈{0,1}n∘×m∘
G
▹
∈
{
0
,
1
}
n
▹
×
m
▹
\mathbf{G}^{\triangleright} \in\{0,1\}^{n^{\triangleright} \times m^{\triangleright}}
G▹∈{0,1}n▹×m▹
其中,
G
▹
\mathbf{G}^{\triangleright}
G▹是按时间顺序堆叠的,如图示
另外,为了避免动态特征过长,最多只取最近的
n
▹
n^\triangleright
n▹个,少于则以
{
0
}
1
×
m
▹
\{0\}^{1\times m^\triangleright}
{0}1×m▹ pad
Architecture
Embedding Layer
G
\mathbf{G}
G通过一层全连接得到embedding
说这么多one-hot,实际上代码实现的时候直接用embedding矩阵查表就可以,不需要全连接。
Self-Attention
Static View
hidden state和transformer采用的计算方式一样
由
Q
K
\mathbf{Q}\mathbf{K}
QK学习vector-wise的关系,得到attention weight,为
K
\mathbf{K}
K赋权,学习bit-wise(每个维度之间)的关系
Dynamic View
这样做的原因是为了让需要mask的行softmax之后的概率为0
Cross View
cross view的emb由堆叠得到
其他规定与dynamic一样
Intra-View Pooling Operation
在每个view中,对
H
\mathbf{H}
H所有行做一个平均池化,得到hidden state
Shared Residual Feed-Forward Network
将所有隐向量送入
l
l
l 层的残差前馈网络,注意是共享的残差层,不是分别输入不同的。
为了稳定并加快训练,采用Layer Normalization(与batch normalization不同的时,均值和方差只在单条数据上求)
ϵ
\epsilon
ϵ 需要加一个极小值防止分母为0
训练时,对于ResNet中的每一层,加上dropout作为模型的正则化约束;测试时,使用所有的神经元
View-Wise Aggregation
串联后得到最终的hidden state
Output Layer
p
∈
R
1
×
3
d
\mathbf{p} \in \mathbb{R}^{1 \times 3 d}
p∈R1×3d与
h
a
g
g
\mathbf{h}^{agg}
hagg做向量点积,相当于加权和
时间复杂度分析
计算代价主要在于self-attention和FFN
因为
l
l
l 较小,主要集中在前者,而n和d都可以视作常数(超参),所以相对于数据量而言是线性的。
应用
主要有三类任务:ranking, classification, and regression tasks
Ranking
进行next-POI recommendation(应该和next-item recommendation一样)
输入:
和一般的RS架构不大一样,对于每个candidate item,item之外的static部分都要计算一遍
代价不会很大吗?可以想想改进办法
进行size=1的负采样,然后用BPR loss(实验中实际负采样1000个)
Classification
输入同ranking一样构造
为了获得概率(ranking可以只是获得score),使用sigmod激活
同样需要负采样,大小由groundtruth数决定(实验中为1),损失函数使用交叉熵
Regression
估计用户评分的任务
使用MSE方式约束
实验
数据集
剔除频数小于10的user和频数小于10的object(Beauty和Toys不需要)
指标
复现
我使用pytorch复现了一个版本 SeqFM