Deep & Cross Network

在CTR模型中,FM可以自动组合特征,但也仅限于二阶叉乘。Deep & Cross 主要解决CTR模型中如何自动学习高阶的特征组合。Deep & Cross Network(DCN)自动构造有限高阶的交叉特征,并学习对应权重,告别了繁琐的人工叉乘。

Deep & Cross的网络结构如图所示:

Deep & Cross Network (DCN) 与 xDeepFM 解读

主要包括四个部分,输入部分,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层的共同输入,

即:
x0=[xembed,1T,xembed,2T,...xembed,kT,xdenseT]T x_0 = [x^T_{embed, 1},x^T_{embed, 2},...x^T_{embed, k},x^T_{dense}]^T
Cross 部分

Cross的目的是以一种显示、可控且高效的方式,自动构造有限高阶交叉特征,Cross结构如上图左侧所示,其中第 l+1l+1 层输出为:
Deep & Cross Network (DCN) 与 xDeepFM 解读

此处注意以下细节:

(1)每层的输出xlx_l的维度都相同,均为dd

(2)受残差神经网络的启发,每层的函数ff拟合的是xl1xlx_{l-1}-x_l的残差(残差网络可以有效处理梯度消失的问题,使得网络更加的深)

接下来通过具体的例子来简述Cross背后的数学原理。假设cross 有2层,网络的输入x0=[x0,1,x0,2]Tx_0 = [x_{0, 1} ,x_{0, 2}]^T,为方便讨论令 bi=0b_i = 0,则有:
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] \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}
所以:
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] \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}
最后得到ycross=x2Twcrossy_{cross} = \boldsymbol x_2^T \boldsymbol w_{cross} 参与到loss的计算。从上述的计算过程可以看出:

(1) x1\boldsymbol x_1 包含了原始特征 x0,1,x0,2\boldsymbol x_{0,1}, \boldsymbol x_{0,2} 从一阶到二阶的所有可能叉乘组合。

(2)x2\boldsymbol x_2包含了其从一阶到三阶的所有可能叉乘组合。

从这个计算过程看出了cross是如何自动构造有限高阶交叉特征

下面是cross的几个优点:

(1)有限高阶:叉乘阶数由网络的深度决定,深度LcL_c对应最高Lc+1L_c+1阶的叉乘

(2)自动叉乘:Cross输出包含了原始特征从一阶(即本身)到 Lc+1L_c+1 阶的所有叉乘组合,而模型参数量仅仅随输入维度成线性增长2dL2*d*L

(3)参数共享:并不是每个交叉组合都具有独立的权重参数,而是共享了 2dL2*d*L 个权重参数。参数共享机制使得模型具有更强的泛化性和鲁棒性。

还有一点需要注意:输入x0x_0是在embedding之后得到的,后续的交叉也是对 embedding 后的数值进行的交叉,直接使用大规模高维的sparse特征作为输入,会导致极大地增加Cross的参数量。

xDeepFM

​ DCN 的设计十分巧妙,DCN 的Cross层接在Embedding层之后,Cross层的独特结构,使其可以显示、自动的构造有限的高阶特征叉乘。 xDeepFM 可以认为是在DCN 的基础上改进的。

在讲解xdeepFM之前先来了解一下bit-wisevector-wise。假设有两个特征向量:(a1,b1,c1)(a2,b2,c2)(a_1,b_1,c_1)和(a_2,b_2,c_2) 在进行特征交互时,有如下两种交互形式:

(1)交互形式类似于:f(w1a1a2,w2b1b2,w3c1c2)f(w_1*a_1*a_2,w_2*b_1*b_2,w_3*c_1*c_2) ,此时,我们认为特征交互发生在元素级**(bit-wise)**上。

(2)交互形式类似于:f(w(a1a2,b1b2,c1c2))f(w*(a_1*a_2,b_1*b_2,c_1*c_2)),此时,我们认为特征交互发生在特征向量级**(vector-wise)**上。

Cross 以嵌入向量中的单个bit为最细粒度,而FM是以向量为最细粒度学习相关性,即vector-wisexDeepFM的动机,正是将FM的vector-wise的思想引入Cross部分

xDeepFM模型的整体结构图如下图所示:

Deep & Cross Network (DCN) 与 xDeepFM 解读

其中的Linear部分是指:一阶特征进行加权求和。Plain DNN 是简单的MLP(多层感知机)。

模型的输入是将特征进行嵌入后的Embedding layer。比较难理解的是CIN:Compressed Interaction Network。下面重点讲述CIN。

CIN的输入来自Embedding层,假设有m个field,每个field的embedding vector维度为D,这些vector 依次排列组成 mxD 的矩阵X0\mathbf X^0 。接着对矩阵X0\mathbf X^0 进行一系列的运算。如下图所示:
Deep & Cross Network (DCN) 与 xDeepFM 解读

图中的XkRHkD\mathbf X^k \in \mathcal R^{H_k *D} 表示第kk层的输出,其中HkH_k表示第kk层的vector个数,vector维度始终为D。

CIN 内部有 k 层,每一层都会输出一个矩阵 XkRHkDX^k \in \mathbb R^{H_k * D} ,k 表示第 k 层的输出, HkH_k 表示第 k 层有 HkH_k 个维度为 D 的向量。要得到 XkX^{k} ,需要接收两个矩阵作为输入,一个是 Xk1X^{k-1} ,另一个是 X0X^0 ,具体的计算公式如下:
Xh,k=i=1Hk1j=1mWijk,h(Xi,k1Xj,0)R1D, where 1hHk \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}
其中 Wk,hRHk1mW^{k, h} \in \mathbb R^{H_{k-1} * m},表示要得到第 k 层第 h 个向量所需要的权重矩阵, Hk1H_{k-1} 表示第 k1k-1 层的输出矩阵 Xk1X^{k-1}Hk1H_{k-1} 个维度为 D 的向量组成。\circ 表示Hadamard乘积,即逐元素乘,例如:
<a1,b1,c1><a2,b2,c2>=<a1a2,b1b2,c1c2> <a_1, b_1, c_1> \circ <a_2, b_2, c_2> = <a_1a_2, b_1b_2, c_1c_2>
式子中 Xi,k1Xj,0\boldsymbol{X}_{i, *}^{k-1} \circ \boldsymbol{X}_{j, *}^{0} 是表示取出 Xk1X^{k-1} 的第 ii 个向量与输入层 X0X^{0} 中第 jj 个向量进行 Hadamard 乘积运算。整个公式的计算过程可以用下图表示:

Deep & Cross Network (DCN) 与 xDeepFM 解读
上面的公式的计算结果只得到了第 h 个向量 Xh,k\boldsymbol{X}_{h, *}^{k} ,实际上我们会使用 HkH_k 个不同的权重矩阵 Wk,hW^{k,h} 来获得不同的向量,最后这些向量拼接成输出 XkRHkDX^{k} \in \mathbb R^{H_k * D}

CIN与Cross的几个主要差异:

(1)Cross是bit-wise 而CIN是vector-wise。

(2)Cross在第 ll层,包含从1阶到l+1l+1阶的所有特征组合,而CIN只包含l+1l+1阶的组合特征。且Cross在输出层输出全部结果,而CIN在每层都输出中间结果。

总结:

  1. xDeepFM将基于Field的vector-wise思想引入Cross,并且保留了Cross的优势,模型结构也很elegant,实验效果也提升明显。如果说DeepFM只是“Deep & FM”,那么xDeepFm就真正做到了”Deep” Factorization Machine。
  2. xDeepFM的时间复杂度会是其工业落地的一个主要性能瓶颈,需要重点优化

参考文章:

CTR 模型之 Deep & Cross (DCN) 与 xDeepFM 解读

xDeepFM:名副其实的 ”Deep” Factorization Machine

相关文章:

  • 2021-08-03
  • 2021-10-30
  • 2021-08-13
  • 2021-06-25
  • 2021-04-24
  • 2021-10-14
  • 2021-05-06
  • 2021-08-15
猜你喜欢
  • 2021-06-29
  • 2021-06-16
  • 2021-09-26
  • 2021-10-02
  • 2021-09-14
  • 2021-11-05
  • 2021-07-30
相关资源
相似解决方案