一、前言
模型针对W&D的wide部分进行了改进, 因为Wide部分有一个不足就是需要人工进行特征的组合筛选, 过程繁琐且需要经验, 2阶的FM模型在线性的时间复杂度中自动进行特征交互,但是这些特征交互的表现能力并不够,并且随着阶数的上升,模型复杂度会大幅度提高。于是乎,作者用一个Cross Network替换掉了Wide部分,来自动进行特征之间的交叉,并且网络的时间和空间复杂度都是线性的。 通过与Deep部分相结合,构成了深度交叉网络(Deep & Cross Network),简称DCN。
二、Deep&Cross模型
下面就来看一下DCN的结构:模型的结构非常简洁,从下往上依次为:Embedding和Stacking层、Cross网络层与Deep网络层并列、输出合并层,得到最终的预测结果。
(1)Embedding and stacking layer
这里的作用依然是把稀疏离散的类别型特征变成低维密集型。
运用起来就是在训练得到的Embedding参数矩阵中找到属于当前样本对应的Embedding向量
最后,该层需要将所有的密集型特征与通过embedding转换后的特征进行联合(Stacking)
(2) Cross Network
设计该网络的目的是增加特征之间的交互力度。 交叉网络由多个交叉层组成
交叉层的操作的二阶部分非常类似PNN提到的外积操作, 在此基础上增加了外积操作的权重向量, 以及原输入向量
和偏置向量
。 交叉层的可视化如下:
代码实现部分对应
# x是(None, dim)的形状, 先扩展一个维度到(None, dim, 1)
x_0 = torch.unsqueeze(x, dim=2)
x = x_0.clone() #32*221*1
xT = x_0.clone().permute((0, 2, 1)) # (None, 1, dim) 32*1*221
for i in range(self.layer_num):
x = torch.matmul(torch.bmm(x_0, xT), self.cross_weights[i]) + self.cross_bias[i] + x # (None, dim, 1)32*221*1 bmm(32*221*1,32*1*221), W=221*1, b=221*1
xT = x.clone().permute((0, 2, 1)) # (None, 1, dim)