白话推荐系统(三):一文看懂DCN-v2(DeepCrossNet-v2)

303 阅读10分钟

DCN-V2(Deep & Cross Network V2)是谷歌提出的一种用于Web规模排序学习(Learning to Rank)的深度模型,是对原始 DCN(Deep & Cross Network)模型的改进版本。该模型专为工业级大规模推荐系统和广告排序系统设计,旨在高效、精确地捕捉特征之间的交叉信息。

DCN-V2模型给我带来了很大的震撼,特别是其中的低秩分解MoE部分,接下来将结合原文介绍DCN-V2模型。

Tips:

以前也觉得什么引言、相关工作部分不重要,但其实像这些经典论文的引言和摘要非常重要的,体验了作者团队怎样分析、思考、解决问题,所以我也按论文顺序分享。

不同于纯翻译论文的是,一方面会精简原文;另一方面,会在有些难的地方使用大白话表达自己的思考和理解。

论文:DCN V2: Improved Deep & Cross Network and Practical Lessons for Web-scale Learning to Rank Systems, WWW'2021, Google

摘要

原文的摘要部分主要围绕下述三个部分进行介绍:

研究背景:

  • 特征交叉的重要性:有效特征交叉是推荐系统核心,但稀疏庞大的特征空间导致有效交叉的搜索非常困难。
  • DCN 的局限性:虽能自动学习特征交互,但在web级流量模型中,交叉网络表达能力不足,难以捕捉高预测性特征交互。
  • 现有方法的不足:多数生产中的深度学习模型仍依赖传统前馈神经网络低效学习特征交叉。

这里的web级流量,可以理解为大规模样本

方法与模型:

  • 改进框架:针对 DCN 和现有方法的优缺点,提出 DCN-V2,旨在提升其在大规模工业场景的实用性。

  • 模型核心结构:通过交叉层学习输入的显式特征交互,结合深度网络学习隐式交互,交叉层继承 DCN 简单结构但具有更强的表达的表达能力。

实验:

  • 实验效果:DCN-V2在基准数据集上优于所有 SOTA 算法,与低秩架构结合时,特征交互学习更高效且成本低。

  • 工业应用成果:已在 Google 的网页级排序系统中部署,显著提升离线精度和在线业务指标。

1. 引言

引言部分主要介绍了排序学习中特征交叉的重要性、挑战以及 DCN-V2 的改进方向,具体内容如下:

(1)排序学习与特征交叉的重要性

  • 排序学习的广泛应用:排序学习(LTR)是现代机器学习和深度学习的核心问题之一,在搜广推等领域有着广泛的应用。
  • 特征交叉的关键作用:有效的特征交叉能提供单个特征之外的交互信息,例如 “国家” 和 “语言” 的组合比单一特征更具信息量。在线性模型时代,从业者依赖手动设计特征交叉,但这种方式在大规模稀疏分类数据中面临组合搜索空间大、依赖领域知识且泛化性差的问题。

(2)特征交叉学习的技术演进

  • 嵌入技术与 FM 的发展:嵌入技术将高维稀疏特征投影到低维密集空间,因子分解机(FM)通过隐向量内积构建成对特征交互,比传统线性模型的特征交叉更具泛化能力。
  • DNN 的局限性:尽管 DNN 被视为通用函数近似器,但近期研究发现其在二阶或三阶特征交叉时效率低下,甚至需要通过加宽或加深网络来增强能力,这导致模型延迟增加、训练难度上升,难以满足高 QPS 生产环境的实时推理需求。

(3)现有解决方案与 DCN 的挑战

  • 显式与隐式交叉结合的趋势

    近期研究通过结合 DNN 的隐式高阶交叉与线性模型的显式有限阶交叉来解决上述问题。其中,DCN 通过交叉网络自动学习显式特征交互,但在大规模工业应用中存在两大局限:

    • 表达能力不足:交叉网络的多项式类仅由 O (输入规模) 个参数刻画,限制了对随机交叉模式的建模灵活性。
    • 容量分配失衡:应用于大规模数据时,DNN 会占用绝大多数参数学习隐式交叉,导致交叉网络的能力未被充分利用。

(4)DCN-V2 的研究目标与贡献

  • 模型设计目标:提出 DCN-V2 以提升 DCN 在工业场景的实用性,其核心是通过交叉层学习显式特征交互,并与深度网络结合学习隐式交互。
  • 五大核心贡献
    • 提出了一种新颖的模型——DCN-V2,用于学习有效的显式和隐式特征交叉。与现有方法相比,我们的模型表现力更强,同时仍保持高效和简单。
    • 观察**到DCNV2中学习到的矩阵具有低秩特性,我们提议利用低秩技术在子空间中近似特征交叉,以实现更好的性能与延迟权衡。**此外,我们提出一种基于专家混合架构的技术,将矩阵进一步分解为多个较小的子空间。这些子空间随后通过门控机制进行聚合。
    • 我们使用合成数据集进行了广泛的研究,并给出了相关结果,该研究表明基于传统ReLU的神经网络在学习高阶特征交叉时效率低下。
    • 通过全面的实验分析,我们证明了所提出的DCN-V2模型在Criteo和MovieLen-1M基准数据集上显著优于当前最优(SOTA)算法。
    • 我们提供了一个案例研究,并分享了在大规模工业排名系统中应用DCN-V2的经验教训,该系统在离线和在线性能上均取得了显著提升。

2. 相关工作

RELATED WORK”(相关工作)部分主要围绕特征交互学习方法的分类与对比展开,重点分析了现有模型如何结合显式和隐式特征交叉,并指出 DCN-V2 与这些方法的关联及优势。具体内容如下:

2.1 特征交互学习的核心思路

近期研究的核心思路是结合显式特征交叉(如线性模型中的结构化交互)和隐式特征交叉(如 DNN 通过端到端学习的高阶交互)。显式交叉通常通过乘法操作(如xx2)建模,而隐式交叉依赖神经网络的非线性变换。

其实,显示特征交叉 可以理解为直接将特征进行交叉,如DCN中的Cross部分;隐式特征交叉可以理解为DNN通过神经网络训练权重,这些权重再结合特征值进行加权求和就是所谓的高阶交互。

以下按模型结构将相关工作分为两类:

2.2 并行结构模型(Parallel Structure)

Wide & Deep 模型启发:

  • 典型如 Wide & Deep,通过并行的 “Wide 组件”(手动设计的特征交叉)和 “Deep 组件”(DNN)联合训练。但 Wide 组件的特征交叉仍依赖人工设计,未解决特征工程的复杂性问题。
  • Deep1FM:用 FM 替代 Wide 组件,自动学习二阶特征交互,实现 “FM+DNN” 的并行结构。
  • DCN:引入交叉网络自动学习显式有界阶特征交互,与 DNN 并行。
  • xDeepFM:通过生成多个特征图增强 DCN 的表达力,每个特征图编码当前层与输入层的成对交互,但计算成本高(参数数量是 DCN 的 10 倍),且要求所有特征嵌入维度一致,限制了工业应用。
  • AutoInt:利用多头自注意力机制和残差连接,通过注意力权重动态捕捉特征交互。

2.3 堆叠结构模型(Stacked Structure)

**交互层前置设计:**在嵌入层与 DNN 之间插入交互层,提前捕捉特征交互,有助于后续隐藏层的学习,如:

  • PNN:通过内积(IPNN)或外积(OPNN)层构建二阶交互,但OPNN 计算成本高。
  • NFM:用哈达玛积替代 FM 的内积,增强非线性表达。
  • DLRM:遵循 FM 思路,通过内积计算特征交叉,仅支持二阶交互。

这些模型最多能创建二阶交互,所以其交叉能力有限。

  • AFN:将特征转换到对数空间,自适应学习任意阶交互,但同样要求嵌入维度一致。

与DeepFM和xDeepFM类似,他们只接受等长的嵌入,这个意思是这些模型都要求每个特征的维度相同,如:年龄映射后的维度为4,那么其余特征,如身高的特征维度也必须为4。

在原文结构部分介绍Embedding Layer,有介绍DCN-v2的特征维度可以是任意的。

尽管取得了许多进展,但综合实验(第 7 节)表明 DCN 仍然是一个强有力的基线。主要将其归因于其简单的结构,从而促进了优化。然而,如前所述,其有限的表达能力使它无法在 web级系统中学习更有效的特征交叉。在下文中,将介绍一种新的架构,它继承了 DCN 的简单结构,同时增加了其表现力。

3. DCN-v2架构

由图可知,DCN-v2可以分为串行结构(Stacked)和并行结构(Parallel),两者在不同的数据集上有着不一样的表现,串行结构在criteo数据集表现更好,并行结构在Movielen-1M数据集上表现更好。

总体来说,主要由三个部分组成:Embedding Layer、Deep Network和Cross Network。 在这里插入图片描述

其中Embedding Layer和Deep Network可以参考:

白话推荐系统(二):一文看懂DCN(DeepCrossNet)

中的Embedding Layer和 Deep Network部分。这里主要分享DCN-v2的CrossNet部分,以及对比与DCN-v1中的CrossNet的不同。

3.1 DCN-v2中的CrossNet

DCN-V2的核心在于交叉层,它能创建显式的特征交叉。下图表示了 Xi+1X_{i+1} 的计算公式: 在这里插入图片描述

可以看到,它是通过一个WW 矩阵来表示特征交叉的,这能使得它的交叉表达能力更强,这就是它的核心。它的公式化如下:

x_{l + 1}=x_{0} \odot\left(W_{l} x_{l}+b_{l}\right)+x_{l}\

当然,不可能如此简单,后面还有一些改进,一步步介绍。

接下来我们先看一下DCV-v2-CrossNet和DCN-CrossNet的区别吧!

3.2 DCN-v2-CrossNet与DCN-CrossNet的区别

在这里插入图片描述

如图所示,DCN-v1(或DCN)中的在进行特征交叉时,是使用向量 ww 来进行的,所以DCN-v1通常也被称为DCN-Vector,简称DCN-V;DCN-v2是使用矩阵 WW 来进行特征交叉的,所以它也通常被称为DCN-Martix,简称DCN-M,显然它的的参数量更大,能提高模型的表达能力,这也是上面提到的 DCN的表达能力在大规模数据中不足的原因

这就是DCN-v2与DCN最大的区别。

但DCN- v2点创新之处远不至此,接下里介绍文章作者结合工业应用和数学分析对DCN-v2的改进,也是我认为非常值得学习的地方,启发我们该如何去改进模型。

3.3 DCN-v2进一步改进

3.3.1 对 WW 矩阵进行低秩分解

这里就提到了,当DCN-v2使用矩阵 WW 时,在提高表达能力的同时,也带来了巨大的参数量,计算量和存储量都会暴涨,而实际应用中,模型容量和有限的服务资源以及模型计算的耗时要求。不难计算,当输入的 xx 的维度为 NN 时,那么矩阵 WW 的维度则是 (NN)(N * N) , 相比DCN-v1中的向量 ww 的参数扩大了NN 倍。

那么这里他们是怎样解决这个问题的呢?

他们分析了训练出来的矩阵 WW , 发现这个矩阵的秩很低。

这里就可以利用矩阵的一个特性:

一个 N×NN×N 的矩阵 AA,可以被分解为 A=BCA=B⋅C, 其中

BRN×M,CRM×NB\in \mathbb{R}^{N \times M}, C \in \mathbb{R}^{M \times N}

当且仅当:

rank(A)Mrank(A)≤M

原文分析了矩阵的奇异值变化情况: 在这里插入图片描述

其实这里我也有些不是很懂,看懂了的朋友可以在评论区分享。

矩阵的秩和奇异值可详见:

一文看懂矩阵的秩和奇异值及其作用附python实现

但我大概明白作者想表达的意思就是:训练出来的权重矩阵 WW 的秩很小,然后就可以将CrossNet中每层的矩阵 Wl,WlRd×dW_l, W_l \in \mathbb{R}^{d \times d} 分解为两个小矩阵相乘,如下式子所示:

Wl=UlVlTW_l = U_l V_l^T

其中WlRd×d,Ul,VlRd×r,r<<d W_l \in \mathbb{R}^{d \times d}, U_l, V_l \in \mathbb{R}^{d \times r}, 且r << d , 所以每层的特征交叉公式变为:

xl+1=x0(Ul(Vlxl)+bl)+xlx_{l + 1}=x_{0} \odot\left(U_{l}(V_lx_{l})+b_{l}\right)+x_{l}

此时:UlVlU_l和V_l的参数量相对矩阵WlW_l 就要少很多了。

这里通过分析矩阵的秩,然后使用矩阵分解这种方法来改善参数量大的问题,有理有据。相比一些直接改进模型的可解释性强的多!

3.2.2 使用MoE进一步增强特征提取能力

当使用矩阵分解的思想降低其参数量后,这激发了作者使用MoE(Mixture of Expert,专家混合网络)进一步增强特征提取能力。

原文引出MoE的转折感觉有些生硬,但我理解就是:矩阵分解就是将大矩阵转化为了两个矩阵,既然都可以分解为小矩阵了,那就完全可以使用MoE了,毕竟MoE其实就是进一步将并行的矩阵变得更多,最后加权求和。

MoE通常由两个部分组成:Expert(专家),通常由一个小网络组成;Gate(门控网络),通常由一个函数组成。DCN-v2利用多个专家分别在不同子空间中学习特征交叉,并使用依赖于输入 xx 的门控机制自适应地组合学习到的交叉特性,具体可见下图: 在这里插入图片描述

如上图所示,每一步都有非常清晰的注释,可仔细阅读,这里介绍一下 专家部分和门控部分:

Exper(专家)部分:在每一层的特征交叉中,由 kk 个转化,每个专家都会经过一个小网络,即 Uli,Cli,VliU_l^i, C_l^i, V_l^i 组成,其各自的维度可见上图的维度变化,在专家网络计算时,作者并没有立即从维度 dd' 投影回 dd<<dd (d' << d),而是进一步在投影空间中应用非线性变换来优化表示,非线性变换即为非线形激活函数,常使用 tanh()tanh() 函数,所以在 Uli,Cli,VliU_l^i, C_l^i, V_l^i 计算之间都有一个 tanh()tanh() 函数。

Gate(门控网络)部分:不用把门控网络想的非常高大上,实际就是用来生成每个专家的权重,常使用的LinearLinear 线形网络。

它们的公式化表现如下,每个专家网络的计算如下:

Ei(xl)=x0(Ulig(Clig(Vlixl))+bl)E_{i}\left(x_{l}\right)=x_{0} \odot\left(U_{l}^{i} \cdot g\left(C_{l}^{i} \cdot g\left(V_{l}^{i \top} x_{l}\right)\right)+b_{l}\right)

其中g()g(·)表示任何非线性激活函数。从 xlxl+1x_l 到 x_{l+1} 的计算如下:

xl+1=i=1KGi(xl)Ei(xl)+xl\begin{aligned} x_{l+1} & =\sum_{i=1}^{K} G_{i}\left(x_{l}\right) E_{i}\left(x_{l}\right)+x_{l} \end{aligned}

或许有人会认为M o E不是让模型变得更加麻烦了吗?

其实并不然,无论有多少的专家,实际的代码中都是矩阵运算,一个与N个差别并不大。详见后面的代码部分!

至此,DCN-v2的结构就讲述完成了,后面就是使用数据集验证效果,反正好就OK了,这里不在赘述。

4. 代码实现

详见EasyDeepRecommand-DCNv2

5. EasDeepRecommand个人推荐系统开源项目介绍

在这里插入图片描述

链接如下:EasyDeepRecommand

一个通俗易懂的开源推荐系统(A user-friendly open-source project for recommendation systems).

本项目将结合:代码、数据流转图、博客、模型发展史 等多个方面通俗易懂地讲解经典推荐模型,让读者通过一个项目了解推荐系统概况!

持续更新中..., 欢迎star🌟, 第一时间获取更新,感谢!!!