现有的基于矩阵分解的模型不能捕捉序列信息,于是作者提出了新颖的SeqFM模型,分别学习静态特征(如性别)、动态特征(如交互信息)以及二者之间的关系。
为了避免特征工程中手工设计,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一样,来表示顺序方向)
○、▷、⋆ 分别表示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
G \mathbf{G} G通过一层全连接得到embedding
说这么多one-hot,实际上代码实现的时候直接用embedding矩阵查表就可以,不需要全连接。
hidden state和transformer采用的计算方式一样
由 Q K \mathbf{Q}\mathbf{K} QK学习vector-wise的关系,得到attention weight,为 K \mathbf{K} K赋权,学习bit-wise(每个维度之间)的关系
这样做的原因是为了让需要mask的行softmax之后的概率为0
cross view的emb由堆叠得到
其他规定与dynamic一样
在每个view中,对 H \mathbf{H} H所有行做一个平均池化,得到hidden state
将所有隐向量送入 l l l 层的残差前馈网络,注意是共享的残差层,不是分别输入不同的。
为了稳定并加快训练,采用Layer Normalization(与batch normalization不同的时,均值和方差只在单条数据上求)
ϵ \epsilon ϵ 需要加一个极小值防止分母为0
训练时,对于ResNet中的每一层,加上dropout作为模型的正则化约束;测试时,使用所有的神经元
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
进行next-POI recommendation(应该和next-item recommendation一样)
输入:
和一般的RS架构不大一样,对于每个candidate item,item之外的static部分都要计算一遍
代价不会很大吗?可以想想改进办法
进行size=1的负采样,然后用BPR loss(实验中实际负采样1000个)
输入同ranking一样构造
为了获得概率(ranking可以只是获得score),使用sigmod激活
同样需要负采样,大小由groundtruth数决定(实验中为1),损失函数使用交叉熵
剔除频数小于10的user和频数小于10的object(Beauty和Toys不需要)
我使用pytorch复现了一个版本 SeqFM