推荐系统Deep & Cross Network(DCN)

Posted 天泽28

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐系统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 \\tag1 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 \\tag2 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 . . . . . . ] \\beginbmatrix w_1 * x_i,1 + w_2*x_i,2 + ... + w_247*x_i,247& \\\\ ...& \\\\ ...& \\\\ \\endbmatrix 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 ) . . . . . . . . . . . . . . . . . . . . . ] \\beginbmatrix 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) & ...\\\\ ...& ...&... \\\\ ...& ...&... \\\\ \\endbmatrix 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=\\beginbmatrix x_0,1 \\\\ x_0,2 \\\\ \\endbmatrix x0=Deep & Cross Network 6 使用 TensorFlow 构建推荐系统

19推荐系统9Wide&Deep

推荐系统wide&deep

推荐系统wide&deep

Deep&Cross Network(DCN)

Deep&Cross Network(DCN)