今天的博客主要参考了2019年KDD会议上的paper《Pairwise Multi-Layer Nets for Learning Distributed Representation of Multi-field Categorical Data》。这篇paper主要针对输入源数据为多个领域的类别特征(且每个领域的特征都有多种取值),设计了一种巧妙的提取特征之间交互信息的结构,并在正式训练任务之前提出了一种预训练模型的方式。这篇paper提出的模型属于结构并不复杂,但是思想确很巧妙的类型,还是很值得学习的。
首先,整个模型的架构图如下所示:
可以看到和一般的神经网络不一样,该网络以特征之间pairwise的方式进行输入特征Embedding之间全部的两两交叉组合,文中作者给出了3种交叉方式:1
f
s
u
m
(
c
i
,
c
j
)
=
c
i
+
c
j
f^{sum}(c_i,c_j)=c_i+c_j
fsum(ci,cj)=ci+cj;2
f
m
u
l
(
c
i
,
c
j
)
=
c
i
⨀
c
j
f^{mul}(c_i,c_j)=c_i \bigodot c_j
fmul(ci,cj)=ci⨀cj; 3
f
h
i
g
h
w
a
y
(
c
i
,
c
j
)
=
τ
⨀
g
(
W
H
(
c
i
+
c
j
)
+
b
H
)
+
(
1
−
τ
)
⨀
(
c
i
+
c
j
)
f^{highway}(c_i,c_j)=\tau \bigodot g(W_H(c_i+c_j)+b_H)+(1-\tau) \bigodot (c_i+c_j)
fhighway(ci,cj)=τ⨀g(WH(ci+cj)+bH)+(1−τ)⨀(ci+cj),
τ
=
σ
(
W
τ
(
c
i
+
c
j
)
+
b
τ
)
\tau=\sigma (W_\tau (c_i+c_j)+b_\tau)
τ=σ(Wτ(ci+cj)+bτ)。假设输入特征的field个数为n,那么交叉之后的交叉field Embedding个数则为
n
∗
(
n
−
1
)
2
\frac{n*(n-1)}{2}
2n∗(n−1),接下来就是k-max pooling操作,从这些交叉field Embedding中选出模最大的k个,然后输入到下一层。从图中可以看出,每一层都经历了相同的操作,最后接到了输出层,这样多层的变换,使模型可以提取到更高阶的交互信息。由于是pairwise的方式进行训练,其中共现性的思想和Aprior思想又不谋而合,到这里其实整个模型的操作流程已经讲完了。
下面要重点讲一下作者巧妙设计的无监督预训练策略,如下图所示:
模型的训练目标是预测当前样本是真样本还是随机生成的样本,那么如何随机生成Fake sample呢?其实很简单,就是随机的去把某一个或某几个field的值替换成其他值,比方说有一个真样本
(
a
1
,
b
2
,
c
3
,
d
4
)
(a_1,b_2,c_3,d_4)
(a1,b2,c3,d4),如果把第一维
a
1
a_1
a1和第二维
b
2
b_2
b2随机替换掉,就变成了
(
a
3
,
b
1
,
c
3
,
d
4
)
(a_3,b_1,c_3,d_4)
(a3,b1,c3,d4),那么这个被随机替换了的就是负样本。这样先采用生成一些负样本,和原来数据中的正样本进行输入field Embedding的预训练过程,然后再把预训练后的模型参数针对目标下游任务进行fine-tuning。
作者在多个推荐数据集上进行了验证,和直接把输入field Embedding 向量拼接以及对输入field 向量sum-pooling操作进行比较,证明了这种结构的有效性。同时作者发现多层次的变换,更有利于模型提取到特征之间的高阶交叉信息,对最终效果的提升帮助是很大的。