Deep&Cross(DCN)模型及torch实现

一、前言

模型针对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提到的外积操作, 在此基础上增加了外积操作的权重向量w_{1}, 以及原输入向量x_{1}和偏置向量b_{1}。 交叉层的可视化如下:

 代码实现部分对应

 # 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值