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

DCNcenter_0">
推荐系统(六)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_24">二、DCN网络结构

DCN_25">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_113">三、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视频


http://www.niftyadmin.cn/n/966999.html

相关文章

不同映射方式下cache的失效率_洗衣机选上排水还是下排水?不同的排水方式,使用起来有何不同?...

洗衣机的上排水与下排水在我们使用洗衣机的过程中,肯定会涉及到把洗衣机里的水排走的过程。很多人的眼睛只看到了那根用来排水的排水管,但你不知道的是,排水管的另一端(与洗衣机连接的地方)还可以分为上排水与下排水▼如上图,管道…

推荐系统(七)xDeepFM模型

推荐系统(七)xDeepFM模型推荐系统系列博客: 推荐系统(一)推荐系统整体概览推荐系统(二)GBDTLR模型推荐系统(三)Factorization Machines(FM)推荐系…

github 代理_GUI版:用随机代理隐藏IP防止被ban

之前发了一个随机代理的命令行版,经过学习后使用lazarusres2gogovcl组件库更新了这么一款GUI版的工具。这款相对以前的重构了很多代码,欢迎各位看官试用提issue。项目地址:https://github.com/chroblert/JCRandomProxy命令行版:ma…

推荐系统(八)FNN模型(FM+MLP=FNN)

推荐系统(八)FNN模型(FMMLPFNN)推荐系统系列博客: 推荐系统(一)推荐系统整体概览推荐系统(二)GBDTLR模型推荐系统(三)Factorization Machines&am…

ld.so.conf.d/ 不是一_双十一光棍节文案朋友圈说说2020

每年的11月11日,是一年一度的光棍节。光棍节是一种流传于年轻人的娱乐性节日,庆祝自己仍是单身一族。以下是小编为大家准备的双十一光棍节文案朋友圈说说,欢迎大家前来参阅。双十一光棍节文案朋友圈说说1. 过不过光棍节无所谓,只要…

让老版本浏览器支持JSON

2019独角兽企业重金招聘Python工程师标准>>> 一些老旧的浏览器是不支持JSON对象的。可以用下面这个JSON-js库来实现: https://github.com/douglascrockford/JSON-js 转载于:https://my.oschina.net/letiantian/blog/282735

如何编译和安装libevent

如何编译和安装libevent编译和安装步骤:$ apt-get install git $ git clone https://github.com/libevent/libevent.git $ cd libevent $ apt-get install cmake $ apt-get install libssl-dev $ mkdir build && cd build $ cmake .. # Default…

推荐系统(九)PNN模型(Product-based Neural Networks)

推荐系统(九)PNN模型(Product-based Neural Networks)推荐系统系列博客: 推荐系统(一)推荐系统整体概览推荐系统(二)GBDTLR模型推荐系统(三)Fact…