推荐系统(六)Deep & Cross Network(DCN)

推荐系统(六)Deep & Cross Network(DCN)

推荐系统系列博客:

  1. 推荐系统(一)推荐系统整体概览
  2. 推荐系统(二)GBDT+LR模型
  3. 推荐系统(三)Factorization Machines(FM)
  4. 推荐系统(四)Field-aware Factorization Machines(FFM)
  5. 推荐系统(五)wide&deep

这篇文章是斯坦福和谷歌合作发表在ADKDD’17上的成果,这篇paper的一作是斯坦福的数学&统计系的学生,在谷歌实习时,与谷歌的研究人员合作发表了这篇文章。这篇文章的思想依然是推荐系统模型的永恒主题——如何得到更有效的交叉特征,从而提高模型的表达能力。
其主要工作是针对wide&deep网络中wide部分做了改进,在wide&deep网络中,wide部分是个简单的线性模型,其交叉特征依然需要人工设计,而在DCN中设计了专门的cross网络用于自动学习交叉特征。
关于这个cross网络目前存在一定的争议,比如在xdeepFM这篇论文中认为DCN中cross网络交叉的本质只是对输入向量 x 0 x_0 x0做了一个和 x 0 x_0 x0相关的放缩。我个人认为,DCN中cross网络还是有一定作用的,但这个交叉是bit-wise的,并不像FM系列的vector-wise,所以其交叉能力应该不像FM系列这么强。至于到实践中,其效果还需要在具体的场景中来验证,如果你的场景中目前还在用LR等模型,想要应用深度模型,个人更推荐直接跨越到deepFM。
言归正传,我们来看看这篇文章,还是和以前的博客结构差不多,从动机、模型结构、细节等入手。

一、动机

这篇文章的动机可以归纳为两个点:

  1. 普通的DNN虽然理论上可以逼近任意的函数,随着网络层数加深能学到任意的特征组合,但实际上其很难有效的学到特征的二阶交叉甚至三阶交叉。个人认为那些怀抱着只要有足够的数据,其他的都交给DNN去办想法的,基本上很难取得令人满意的效果。引用本文作者在DCN V2论文中的一段话:

People generally consider DNNs as universal function approximators, that could potentially learn all kinds of feature interactions. However, recent studies found that DNNs are inefficient to even approximately model 2nd or 3rd-order feature crosses。

  1. 正因为DNN无法有效的学到明显的交叉特征,所以大多还是人工手动的做一些交叉特征,比如wide&deep模型中wide部分的特征,但显然人工的去设计,会面临着诸多的痛点:组合爆炸问题,需要先验的专家知识等。

基于以上两个痛点,这篇文章提出了DCN模型,其包含两个部分:cross网络和普通的dnn网络,cross网络能够自动的学习任意高阶的交叉特征。

二、DCN网络结构

2.1 DCN整体结构

这里直接拿原始论文中的网络结构图,如下图所示。从图中能够比较清晰的看到DCN的结构也是类似于wide&deep这种范式,不同的是用了一个cross network替代了wide network,右边都是一样的,用了普通的DNN。所以我们接下来也是把重心放在cross network上。
在这里插入图片描述

2.2 cross network部分

整篇论文的核心,也将是本篇博客的重点笔墨的部分。cross network的网络结构如下所示(引用DCN V2论文[2]中的的图):
在这里插入图片描述
再结合形式化的公式一起,感觉更好理解:
x l + 1 = x 0 x l T w l + b l + x l (1) x_{l+1} = x_0x_l^Tw_l + b_l + x_l \tag{1} xl+1=x0xlTwl+bl+xl(1)
在实践中显然是不能按照这个公式去算得,因为复杂度有点高。我们稍微把这个公式变个形,一来更方面计算,二来也更加有利于理解及实现(作者在dcn v2这篇论文中也是这样写的):
x l + 1 = x 0 ⊙ ( w l x l ) + b l + x l (2) x_{l+1} = x_0\odot (w_lx_l) + b_l + x_l \tag{2} xl+1=x0(wlxl)+bl+xl(2)
⊙ \odot 为哈达玛积,即element-wise乘积。这里 x l x_l xl为一个列向量。

从上图以及公式2能够明显的发现,cross network每一层都会和输入 x 0 x_0 x0做个哈达玛,也就意味着每一层的维度都是固定的,与 x 0 x_0 x0维度相同。 这样做的好处是减少网络参数量,提高训练效率。另外我们能够明显发现cross network的设计借鉴了ResNet网络中的skip connection,这样做的好处是减轻梯度消失,使得可以训练很深的网络。

我们来看个paddle的实现,完整的代码参见 DCN

    def _cross_layer(self, input_0, input_x):
    	"""
    	input_0: Tensor(shape=[8, 247]), 8=batch_size
    	input_x: Tensor(shape=[8, 247])
    	"""
        # input_x, Tensor(shape=[8, 247]) --> 8=batch_size
        # layer_w, shape=[247]
        # input_w, Tensor(shape=[8, 247])
        input_w = paddle.multiply(input_x, self.layer_w) 
        # Tensor(shape=[8, 1])
        input_w1 = paddle.sum(input_w, axis=1, keepdim=True)  
        # input_0=[8, 247], input_w1=[8,1]
        # broadcast --> [8, 247]
        input_ww = paddle.multiply(input_0, input_w1)
        input_layer_0 = paddle.add(input_ww, self.layer_b)
        input_layer = paddle.add(input_layer_0, input_x)
        # print("-----input_layer----", input_layer)
        return input_layer, input_w

这里是用的数据集是Criteo的Display Advertising Challenge数据集,26个类别特征,13个连续值特征,这里类别特征embedding维度为9,因此 x 0 x_0 x0的维度为13+26*9=247。一步步来看下这个代码:
input_w = paddle.multiply(input_x, self.layer_w) 为一个哈达玛积,即对应元素相乘
input_w1 = paddle.sum(input_w, axis=1, keepdim=True) 然后做一个sum,这两步的结果为一个 8 ∗ 1 8*1 81的矩阵:
[ w 1 ∗ x i , 1 + w 2 ∗ x i , 2 + . . . + w 247 ∗ x i , 247 . . . . . . ] \begin{bmatrix} w_1 * x_{i,1} + w_2*x_{i,2} + ... + w_{247}*x_{i,247}& \\ ...& \\ ...& \\ \end{bmatrix} w1xi,1+w2xi,2+...+w247xi,247......
然后再做一个与 x 0 x_0 x0的哈达玛积,input_ww = paddle.multiply(input_0, input_w1),即:
[ x 0 , 1 ( w 1 ∗ x i , 1 + w 2 ∗ x i , 2 + . . . + w 247 ∗ x i , 247 ) x 0 , 2 ( w 1 ∗ x i , 1 + w 2 ∗ x i , 2 + . . . + w 247 ∗ x i , 247 ) . . . . . . . . . . . . . . . . . . . . . ] \begin{bmatrix} x_{0,1}(w_1 * x_{i,1} + w_2*x_{i,2} + ... + w_{247}*x_{i,247})& x_{0,2}(w_1 * x_{i,1} + w_2*x_{i,2} + ... + w_{247}*x_{i,247}) & ...\\ ...& ...&... \\ ...& ...&... \\ \end{bmatrix} x0,1(w1xi,1+w2xi,2+...+w247xi,247)......x0,2(w1xi,1+w2xi,2+...+w247xi,247)...............
论文中通过定理证明了为什么cross layer这样能够学到交叉特征,定理部分太复杂,我们举个例子来看看,假设样本只有两个特征,为了简单,假设每个特征的embedding维度为1,偏置 b b b直接忽略,设 x 0 = [ x 0 , 1 x 0 , 2 ] x_0=\begin{bmatrix} x_{0,1} \\ x_{0,2} \\ \end{bmatrix} x0=[x0,1x0,2],那么,则有:
x 1 = x 0 ⊙ ( w 1 x 1 ) + x 0 = [ x 0 , 1 x 0 , 2 ] ⊙ [ w 1 , 1 x 0 , 1 + w 1 , 2 x 0 , 2 w 1 , 1 x 0 , 1 + w 1 , 2 x 0 , 2 ] + [ x 0 , 1 x 0 , 2 ] = [ x 0 , 1 ( w 1 , 1 x 0 , 1 + w 1 , 2 x 0 , 2 ) + x 0 , 1 x 0 , 2 ( w 1 , 1 x 0 , 1 + w 1 , 2 x 0 , 2 ) + x 0 , 2 ] = [ w 1 , 1 x 0 , 1 2 + w 1 , 2 x 0 , 2 x 0 , 1 + x 0 , 1 w 1 , 1 x 0 , 1 x 0 , 2 + w 1 , 2 x 0 , 2 2 + x 0 , 2 ] (3) \begin{aligned} x_1&=x_0\odot(w_1x_1) + x_0 \\ &=\begin{bmatrix} x_{0,1} \\ x_{0,2} \\ \end{bmatrix}\odot\begin{bmatrix} w_{1,1}x_{0,1} +w_{1,2}x_{0,2} \\ w_{1,1}x_{0,1} +w_{1,2}x_{0,2} \\ \end{bmatrix} + \begin{bmatrix} x_{0,1} \\ x_{0,2} \\ \end{bmatrix} \\\\ &=\begin{bmatrix} x_{0,1}(w_{1,1}x_{0,1} +w_{1,2}x_{0,2}) + x_{0,1} \\ x_{0,2}(w_{1,1}x_{0,1} +w_{1,2}x_{0,2}) + x_{0,2}\\ \end{bmatrix} \\\\ &=\begin{bmatrix} w_{1,1}x_{0,1}^2 +w_{1,2}x_{0,2}x_{0,1} + x_{0,1} \\ w_{1,1}x_{0,1} x_{0,2} +w_{1,2}x_{0,2}^2 + x_{0,2}\\ \end{bmatrix} \end{aligned} \tag{3} x1=x0(w1x1)+x0=[x0,1x0,2][w1,1x0,1+w1,2x0,2w1,1x0,1+w1,2x0,2]+[x0,1x0,2]=[x0,1(w1,1x0,1+w1,2x0,2)+x0,1x0,2(w1,1x0,1+w1,2x0,2)+x0,2]=[w1,1x0,12+w1,2x0,2x0,1+x0,1w1,1x0,1x0,2+w1,2x0,22+x0,2](3)
从上面的例子能够比较清晰的看出cross network这种结构是如何做到特征交叉的,并且cross network的网络层数决定了特征交叉的阶数。

三、DCN网络一些参数设置

通过看这些网络结构的一些超参数的设置以及训练时的一些小trick,多多少少能对我们有一些帮助,下面来看看DCN的一些超参数的设置:

  1. embedding size: 6 ∗ 字 典 大 小 4 6*\sqrt[4]{字典大小} 64 ,这个trick似乎是G家一贯的设置。
  2. 优化算法:adam,batch size=512,用了BN,并且用了梯度裁剪,上下限为[-100,100]
  3. 避免过拟合: L 2 L_2 L2正则没效果,用了early stop。




参考文献:

[1]. Deep & Cross Network for Ad Click Predictions
[2]. DCN V2: Improved Deep & Cross Network and Practical Lessons
for Web-scale Learning to Rank Systems

[3]. tensorflow官方Deep & Cross Network (DCN)
[4]. DCN一作presentation视频

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值