Deep & Cross Network
在CTR模型中,FM可以自动组合特征,但也仅限于二阶叉乘。Deep & Cross 主要解决CTR模型中如何自动学习高阶的特征组合。Deep & Cross Network(DCN)自动构造有限高阶的交叉特征,并学习对应权重,告别了繁琐的人工叉乘。
Deep & Cross的网络结构如图所示:
主要包括四个部分,输入部分,Cross network部分,Deep network部分,输出部分。其中Deep network部分就是简单的神经网络全连接层,输出部分是对Cross network部分和Deep network部分的结果进行组合,然后经过一个sigmoid为激活函数的全连接层,采用logistic loss作为损失函数,进行联合训练。这两部分较为简单,下面重点介绍Cross network部分和输入部分。
输入部分
输入部分包括:
(1)对sparse特征进行embedding,对于multi-hot的sparse特征,embedding之后再做一个简单的average pooling;
(2) 对dense特征归一化,然后和embedding特征拼接,作为随后Cross层与Deep层的共同输入,
即:
x
0
=
[
x
e
m
b
e
d
,
1
T
,
x
e
m
b
e
d
,
2
T
,
.
.
.
x
e
m
b
e
d
,
k
T
,
x
d
e
n
s
e
T
]
T
x_0 = [x^T_{embed, 1},x^T_{embed, 2},...x^T_{embed, k},x^T_{dense}]^T
x0=[xembed,1T,xembed,2T,...xembed,kT,xdenseT]T
Cross 部分
Cross的目的是以一种显示、可控且高效的方式,自动构造有限高阶交叉特征,Cross结构如上图左侧所示,其中第
l
+
1
l+1
l+1 层输出为:
此处注意以下细节:
(1)每层的输出 x l x_l xl的维度都相同,均为 d d d。
(2)受残差神经网络的启发,每层的函数 f f f拟合的是 x l − 1 − x l x_{l-1}-x_l xl−1−xl的残差(残差网络可以有效处理梯度消失的问题,使得网络更加的深)
接下来通过具体的例子来简述Cross背后的数学原理。假设cross 有2层,网络的输入
x
0
=
[
x
0
,
1
,
x
0
,
2
]
T
x_0 = [x_{0, 1} ,x_{0, 2}]^T
x0=[x0,1,x0,2]T,为方便讨论令
b
i
=
0
b_i = 0
bi=0,则有:
x
1
=
x
0
x
0
T
w
0
+
x
0
=
[
x
0
,
1
x
0
,
2
]
[
x
0
,
1
,
x
0
,
2
]
[
w
0
,
1
w
0
,
2
]
+
[
x
0
,
1
x
0
,
2
]
=
[
w
0
,
1
x
0
,
1
2
+
w
0
,
2
x
0
,
1
x
0
,
2
+
x
0
,
1
w
0
,
1
x
0
,
2
x
0
,
1
+
w
0
,
2
x
0
,
2
2
+
x
0
,
2
]
\begin{aligned} \boldsymbol{x}_{1} &=\boldsymbol{x}_{0} \boldsymbol{x}_{0}^{T} \boldsymbol{w}_{0}+\boldsymbol{x}_{0}=\left[\begin{array}{c} x_{0,1} \\ x_{0,2} \end{array}\right]\left[x_{0,1}, x_{0,2}\right]\left[\begin{array}{c} w_{0,1} \\ w_{0,2} \end{array}\right]+\left[\begin{array}{c} x_{0,1} \\ x_{0,2} \end{array}\right]=\left[\begin{array}{c} w_{0,1} x_{0,1}^{2}+w_{0,2} x_{0,1} x_{0,2}+x_{0,1} \\ w_{0,1} x_{0,2} x_{0,1}+w_{0,2} x_{0,2}^{2}+x_{0,2} \end{array}\right] \\ \end{aligned}
x1=x0x0Tw0+x0=[x0,1x0,2][x0,1,x0,2][w0,1w0,2]+[x0,1x0,2]=[w0,1x0,12+w0,2x0,1x0,2+x0,1w0,1x0,2x0,1+w0,2x0,22+x0,2]
所以:
x
2
=
x
0
x
1
T
w
1
+
x
1
=
[
w
1
,
1
x
0
,
1
x
1
,
1
+
w
1
,
2
x
0
,
1
x
1
,
2
+
x
1
,
1
w
1
,
1
x
0.2
x
1
,
1
+
w
1
,
2
x
0
,
2
x
1
,
2
+
x
1
,
2
]
=
[
w
0
,
1
w
1
,
1
z
0
,
1
3
+
(
w
0
,
2
w
1
,
1
+
w
0
,
1
w
1
,
2
)
x
0
,
1
2
x
0
,
2
+
w
0
,
2
w
1
,
2
x
0
,
1
x
0
,
2
2
+
(
w
0
,
1
+
w
1
,
1
)
x
0
,
1
2
+
(
w
0
,
2
+
w
1
,
2
)
x
0
,
1
z
0
,
2
+
x
0
,
1
⋅
⋅
⋅
⋅
⋅
⋅
⋅
]
\begin{aligned} \boldsymbol x_{2}=& \boldsymbol x_{0} \boldsymbol x_{1}^{T} \boldsymbol w_{1}+ \boldsymbol x_{1} \\ =&\left[\begin{array}{c} w_{1,1} x_{0,1} x_{1,1}+w_{1,2} x_{0,1} x_{1,2}+x_{1,1} \\ w_{1,1} x_{0.2} x_{1,1}+w_{1,2} x_{0,2} x_{1,2}+x_{1,2} \\ \end{array}\right] \\ =& \left[\begin{array}{c} {w_{0,1} w_{1,1} z_{0,1}^{3}+\left(w_{0,2} w_{1,1}+w_{0,1} w_{1,2}\right) x_{0,1}^{2} x_{0,2}+w_{0,2} w_{1,2} x_{0,1} x_{0,2}^{2}+\left(w_{0,1}+w_{1,1}\right) x_{0,1}^{2}+\left(\operatorname{w}_{0,2}+w_{1,2}\right) x_{0,1} z_{0,2}+x_{0,1}} \\ \cdot \cdot \cdot \cdot \cdot \cdot \cdot \end{array}\right] \end{aligned}
x2===x0x1Tw1+x1[w1,1x0,1x1,1+w1,2x0,1x1,2+x1,1w1,1x0.2x1,1+w1,2x0,2x1,2+x1,2][w0,1w1,1z0,13+(w0,2w1,1+w0,1w1,2)x0,12x0,2+w0,2w1,2x0,1x0,22+(w0,1+w1,1)x0,12+(w0,2+w1,2)x0,1z0,2+x0,1⋅⋅⋅⋅⋅⋅⋅]
最后得到
y
c
r
o
s
s
=
x
2
T
w
c
r
o
s
s
y_{cross} = \boldsymbol x_2^T \boldsymbol w_{cross}
ycross=x2Twcross 参与到loss的计算。从上述的计算过程可以看出:
(1) x 1 \boldsymbol x_1 x1 包含了原始特征 x 0 , 1 , x 0 , 2 \boldsymbol x_{0,1}, \boldsymbol x_{0,2} x0,1,x0,2 从一阶到二阶的所有可能叉乘组合。
(2) x 2 \boldsymbol x_2 x2包含了其从一阶到三阶的所有可能叉乘组合。
从这个计算过程看出了cross是如何自动构造有限高阶交叉特征
下面是cross的几个优点:
(1)有限高阶:叉乘阶数由网络的深度决定,深度 L c L_c Lc对应最高 L c + 1 L_c+1 Lc+1阶的叉乘
(2)自动叉乘:Cross输出包含了原始特征从一阶(即本身)到 L c + 1 L_c+1 Lc+1 阶的所有叉乘组合,而模型参数量仅仅随输入维度成线性增长: 2 ∗ d ∗ L 2*d*L 2∗d∗L 。
(3)参数共享:并不是每个交叉组合都具有独立的权重参数,而是共享了 2 ∗ d ∗ L 2*d*L 2∗d∗L 个权重参数。参数共享机制使得模型具有更强的泛化性和鲁棒性。
还有一点需要注意:输入 x 0 x_0 x0是在embedding之后得到的,后续的交叉也是对 embedding 后的数值进行的交叉,直接使用大规模高维的sparse特征作为输入,会导致极大地增加Cross的参数量。
xDeepFM
DCN 的设计十分巧妙,DCN 的Cross层接在Embedding层之后,Cross层的独特结构,使其可以显示、自动的构造有限的高阶特征叉乘。 xDeepFM 可以认为是在DCN 的基础上改进的。
在讲解xdeepFM之前先来了解一下bit-wise和vector-wise。假设有两个特征向量: ( a 1 , b 1 , c 1 ) 和 ( a 2 , b 2 , c 2 ) (a_1,b_1,c_1)和(a_2,b_2,c_2) (a1,b1,c1)和(a2,b2,c2) 在进行特征交互时,有如下两种交互形式:
(1)交互形式类似于: f ( w 1 ∗ a 1 ∗ a 2 , w 2 ∗ b 1 ∗ b 2 , w 3 ∗ c 1 ∗ c 2 ) f(w_1*a_1*a_2,w_2*b_1*b_2,w_3*c_1*c_2) f(w1∗a1∗a2,w2∗b1∗b2,w3∗c1∗c2) ,此时,我们认为特征交互发生在元素级**(bit-wise)**上。
(2)交互形式类似于: f ( w ∗ ( a 1 ∗ a 2 , b 1 ∗ b 2 , c 1 ∗ c 2 ) ) f(w*(a_1*a_2,b_1*b_2,c_1*c_2)) f(w∗(a1∗a2,b1∗b2,c1∗c2)),此时,我们认为特征交互发生在特征向量级**(vector-wise)**上。
Cross 以嵌入向量中的单个bit为最细粒度,而FM是以向量为最细粒度学习相关性,即vector-wise。xDeepFM的动机,正是将FM的vector-wise的思想引入Cross部分。
xDeepFM模型的整体结构图如下图所示:
其中的Linear部分是指:一阶特征进行加权求和。Plain DNN 是简单的MLP(多层感知机)。
模型的输入是将特征进行嵌入后的Embedding layer。比较难理解的是CIN:Compressed Interaction Network。下面重点讲述CIN。
CIN的输入来自Embedding层,假设有m个field,每个field的embedding vector维度为D,这些vector 依次排列组成 mxD 的矩阵
X
0
\mathbf X^0
X0 。接着对矩阵
X
0
\mathbf X^0
X0 进行一系列的运算。如下图所示:
图中的 X k ∈ R H k ∗ D \mathbf X^k \in \mathcal R^{H_k *D} Xk∈RHk∗D 表示第 k k k层的输出,其中 H k H_k Hk表示第 k k k层的vector个数,vector维度始终为D。
CIN 内部有 k 层,每一层都会输出一个矩阵
X
k
∈
R
H
k
∗
D
X^k \in \mathbb R^{H_k * D}
Xk∈RHk∗D ,k 表示第 k 层的输出,
H
k
H_k
Hk 表示第 k 层有
H
k
H_k
Hk 个维度为 D 的向量。要得到
X
k
X^{k}
Xk ,需要接收两个矩阵作为输入,一个是
X
k
−
1
X^{k-1}
Xk−1 ,另一个是
X
0
X^0
X0 ,具体的计算公式如下:
X
h
,
∗
k
=
∑
i
=
1
H
k
−
1
∑
j
=
1
m
W
i
j
k
,
h
(
X
i
,
∗
k
−
1
∘
X
j
,
∗
0
)
∈
R
1
∗
D
,
where
1
≤
h
≤
H
k
\boldsymbol{X}_{h, *}^{k}=\sum_{i=1}^{H_{k-1}} \sum_{j=1}^{m} \boldsymbol{W}_{i j}^{k, h}\left(\boldsymbol{X}_{i, *}^{k-1} \circ \boldsymbol{X}_{j, *}^{0}\right) \in \mathbb{R}^{1 * D}, \quad \text { where } 1 \leq h \leq H_{k}
Xh,∗k=i=1∑Hk−1j=1∑mWijk,h(Xi,∗k−1∘Xj,∗0)∈R1∗D, where 1≤h≤Hk
其中
W
k
,
h
∈
R
H
k
−
1
∗
m
W^{k, h} \in \mathbb R^{H_{k-1} * m}
Wk,h∈RHk−1∗m,表示要得到第 k 层第 h 个向量所需要的权重矩阵,
H
k
−
1
H_{k-1}
Hk−1 表示第
k
−
1
k-1
k−1 层的输出矩阵
X
k
−
1
X^{k-1}
Xk−1 由
H
k
−
1
H_{k-1}
Hk−1 个维度为 D 的向量组成。
∘
\circ
∘ 表示Hadamard乘积,即逐元素乘,例如:
<
a
1
,
b
1
,
c
1
>
∘
<
a
2
,
b
2
,
c
2
>
=
<
a
1
a
2
,
b
1
b
2
,
c
1
c
2
>
<a_1, b_1, c_1> \circ <a_2, b_2, c_2> = <a_1a_2, b_1b_2, c_1c_2>
<a1,b1,c1>∘<a2,b2,c2>=<a1a2,b1b2,c1c2>
式子中
X
i
,
∗
k
−
1
∘
X
j
,
∗
0
\boldsymbol{X}_{i, *}^{k-1} \circ \boldsymbol{X}_{j, *}^{0}
Xi,∗k−1∘Xj,∗0 是表示取出
X
k
−
1
X^{k-1}
Xk−1 的第
i
i
i 个向量与输入层
X
0
X^{0}
X0 中第
j
j
j 个向量进行 Hadamard 乘积运算。整个公式的计算过程可以用下图表示:
上面的公式的计算结果只得到了第 h 个向量
X
h
,
∗
k
\boldsymbol{X}_{h, *}^{k}
Xh,∗k ,实际上我们会使用
H
k
H_k
Hk 个不同的权重矩阵
W
k
,
h
W^{k,h}
Wk,h 来获得不同的向量,最后这些向量拼接成输出
X
k
∈
R
H
k
∗
D
X^{k} \in \mathbb R^{H_k * D}
Xk∈RHk∗D 。
CIN与Cross的几个主要差异:
(1)Cross是bit-wise 而CIN是vector-wise。
(2)Cross在第 l l l层,包含从1阶到 l + 1 l+1 l+1阶的所有特征组合,而CIN只包含 l + 1 l+1 l+1阶的组合特征。且Cross在输出层输出全部结果,而CIN在每层都输出中间结果。
总结:
- xDeepFM将基于Field的vector-wise思想引入Cross,并且保留了Cross的优势,模型结构也很elegant,实验效果也提升明显。如果说DeepFM只是“Deep & FM”,那么xDeepFm就真正做到了”Deep” Factorization Machine。
- xDeepFM的时间复杂度会是其工业落地的一个主要性能瓶颈,需要重点优化
参考文章: