1. 从“特征工程”到“特征交叉”:为什么我们需要DCN?
如果你做过推荐系统、广告点击率预测或者任何涉及大量类别特征的机器学习任务,你一定对“特征工程”这四个字又爱又恨。爱的是,一个巧妙的特征组合(比如“用户性别”和“商品品类”交叉)往往能让模型效果立竿见影;恨的是,这活儿太费人了,得靠业务经验和大量试错,简直就是“玄学”加“体力活”。
传统的深度神经网络(DNN)号称能自动学习特征,但它真的能学好“特征交叉”吗?我自己的经验是,DNN更像一个“抽象大师”。它把原始特征一层层往上传递,通过非线性激活函数,学习到的是越来越抽象、高阶的“表示”。比如,它可能从“年龄”、“收入”、“浏览历史”这些原始特征中,抽象出一个“高消费潜力用户”的隐含概念。但这种交叉是隐式的、非线性的,我们很难知道它到底组合了哪几个原始特征,组合的权重又是多少。这就好比一个黑盒子,虽然最终效果不错,但我们失去了对模型行为的可解释性。
那么,有没有办法让模型既能自动进行特征交叉,又能保持一定的可解释性和高效性呢?这就是DCN(Deep & Cross Network)要解决的问题。它的核心思想非常直观:我专门设计一个子网络(Cross Network),就干一件事——高效、显式地做特征交叉。 然后,我再并联一个传统的DNN(Deep Network)去捕捉那些复杂的非线性高阶模式。最后把两者的输出一合并,强强联合。
简单来说,DCN把“特征交叉”这个原本需要人工完成的步骤,变成了模型架构的一部分。它不是为了取代DNN,而是给DNN加装了一个“特征交叉引擎”,让模型既能“大力出奇迹”(DNN的拟合能力),又能“精巧做手工”(Cross Network的显式交叉)。接下来,我们就一层层剥开DCN,看看这个引擎到底是怎么工作的。
2. DCN网络结构拆解:并行双引擎如何协同工作?
DCN的整体结构图在很多论文里都能看到,乍一看有点复杂,但其实它的设计思路非常清晰。我们可以把它想象成一个“双核处理器”:一个核(Cross Network)专门处理逻辑清晰、需要显式组合的任务(特征交叉);另一个核(Deep Network)负责处理需要深度抽象和模式识别的任务。整个网络的工作流程可以分为四步。
2.1 输入层:Embedding与Stacking
第一步是处理输入,这和我们搭建大多数深度模型一样。我们的输入通常有两类特征:
- 稠密特征:比如用户的年龄、消费金额,这些本来就是数值,可以直接用。
- 稀疏特征:比如用户ID、城市、商品类别,这些是类别型数据,维度极高且稀疏。
对于稀疏特征,直接扔进模型是灾难。标准的做法是使用嵌入层,把它们映射成低维、稠密的向量。比如,一个包含上百万个商品的ID,通过嵌入层可以变成一个长度为32的浮点数向量。这个嵌入矩阵是在训练过程中和其他参数一起学习的。
处理好之后,我们把所有稠密特征和所有稀疏特征的嵌入向量拼接起来,形成一个长的向量,记作 X0。这个 X0 就是整个DCN模型的总输入,也是后续Cross Network和Deep Network共同的起点。
2.2 交叉网络:显式特征交叉的核心
这是DCN最精华、最具创新性的部分。Cross Network的结构出奇地简单,但效果却非常强大。它的每一层都只做一件事:
X_{l+1} = X_0 * (X_l^T * W_l + b_l) + X_l
别被公式吓到,我们用人话和例子来解释一下:
X_l:第l层交叉层的输出。X_0:永远是最开始的输入向量。这是关键!它保证了原始特征信息能贯穿整个交叉过程。W_l, b_l:这一层要学习的权重和偏置。*:这里的乘法是逐元素相乘(Hadamard product)。
这个过程在干什么? 你可以把它看作一个“特征搅拌机”。每一层,它都把当前的特征表示 X_l 和最初的原始特征 X_0 拿过来,让它们进行一次“亲密接触”(相乘)。这个操作会生成原始特征和当前层特征的所有两两组合(交叉项)。然后,通过学习到的权重 W_l 和偏置 b_l,模型决定哪些交叉组合是重要的,并赋予它们不同的权重。
为什么公式最后要加上 X_l? 这是借鉴了残差网络的思想。加上前一层的输出,相当于学习的是当前层输出相对于输入的“残差”或“增量”。这样做有两个巨大好处:一是缓解了深度网络中的梯度消失问题,让网络可以做得更深;二是让模型更容易学习,因为每一层只需要学习一个“微调”量,而不是完全重构特征。
交叉的阶数如何增长? 这是另一个精妙之处。假设 X_0 包含特征A, B, C。第一层后,<

特征交叉机制与代码实战解析&spm=1001.2101.3001.5002&articleId=151638641&d=1&t=3&u=76871ca4c32a4bd3b55706a8d47ae8d5)
9530

被折叠的 条评论
为什么被折叠?



