DCN — 在 DNN 旁边并联一条专门学特征交叉的网络
是什么
DCN(Deep & Cross Network)是 Google 2017 年提出的 CTR 预测结构,思路是:在普通 DNN 旁边再并联一条专门学特征交叉的细网络,叫 Cross Network,两路输出拼起来过 sigmoid 输出点击概率。
日常类比:你开一家烤肉店要预测「某顾客在某时段会不会下单」。
- Deep 路 像一个新员工,他把每位顾客的所有特征(年龄、性别、所在地、上次来的时间)映射成向量,过几层神经网络,凭整体感觉给一个分数。
- Cross 路 像一个调料组合师,他认死理:单一特征不够看,关键是组合——「年轻男 × 周五晚 × 雨天 × 商场半径 500 米内」这种四元组合才是高单率信号。他每加一层就自动把已有特征再乘一次原始特征,L 层就把所有 L+1 元组合权重学一遍,不用人手指定。
DCN 把两个人绑成一个团队,同一份订单两人各算一个分,直接拼接送进 sigmoid,一起反向传播。
为什么重要
不理解 DCN,下面这些事都没法解释:
- 为什么 wide-deep-2016 之后还有人继续发 CTR 论文——Wide&Deep 的 wide 端人工指定交叉特征,DCN 第一次让交叉自动学
- 为什么ByteDance、阿里、Meta 的精排层至今主流是 DCN-V2 而不是更花哨的 Transformer——cross 网络的「显式有界阶交叉」工业上稳得多
- 为什么 FM(Factorization Machines)虽然简单但被淘汰——FM 卡死在 2 阶交叉,cross 网络 L 层就到 L+1 阶
- 为什么 CTR 模型大多长得「两路并行」——Wide&Deep 起的头,DCN 把这个范式压实
核心要点
整个网络拆成四块。
-
Embedding & Stacking 层。稀疏分类特征(user_id、item_id、地区码)每个过一张 embedding 表映射成约 32 维稠密向量,连续特征做归一化,全部拼成一个长向量
x_0。后面所有计算都从这个x_0出发。 -
Cross Network。这是论文的核心创新。每层做:
x_{l+1} = x_0 · x_l^T · w_l + b_l + x_l逐项读:
x_0 · x_l^T是外积,得到一个矩阵;乘w_l(是个向量)得到一个新向量;加偏置b_l;再加x_l残差连接。关键点:每一层都把x_0重新拉回来乘一次,所以第 L 层包含了x_0的 L+1 次幂级别的所有交叉项。 -
Deep Network。普通的 ReLU MLP,几层全连接,跟 Wide&Deep 的 deep 端一模一样。隐式学交叉。
-
Combination 层。把 cross 的输出向量和 deep 的输出向量拼接(不是相加,注意区别于 Wide&Deep),过最后一层逻辑回归输出 CTR。
实践案例
案例 1:cross 层为什么参数这么少
x_0 是 d 维。一层 cross 的参数是 w_l(d 维)+ b_l(d 维)= 2d 个。L 层总参数 = 2dL,线性于输入维度。同样达到 L 阶交叉,纯 DNN 要靠隐藏层堆,参数量平方级增长。这就是论文标题里 negligible extra complexity 的意思。
举个具体数:embedding 拼接后 x_0 维度 d = 1000,cross 网络 6 层,总参数 = 2 × 1000 × 6 = 1.2 万。同样深度的 DNN 即使每层 1000 维,单层就有 100 万参数,6 层 600 万——差两个数量级。
案例 2:Cross 层凭什么能拿到高阶交叉
直觉:第 0 层是 x_0,每个分量是单个特征。第 1 层每个分量大致是 x_0 的某分量 × x_0 的某分量(2 阶)。第 2 层乘上 x_0 又升一阶(3 阶)……以此类推。w_l 学的是「在这一层我希望保留哪些组合方向」。所以 cross 网络等价于显式的多项式特征展开 + 学习权重,但不必把所有项写出来(那会爆炸)。
数学上论文证明:L 层 cross 的输出可以展开成 x_0 中所有元素的次数 ≤ L+1 的单项式的加权和,权重由 w_0, ..., w_l, b_0, ..., b_l 共同决定。换句话说,cross 网络等于一台学习权重的多项式回归机器。
案例 3:DCN 在 Criteo 上的对比
Criteo Display Ads 是 CTR 标准 benchmark,1 周日志 4500 万样本。论文报的 LogLoss(越小越好):
| 模型 | LogLoss | 参数量 |
|---|---|---|
| LR | 0.4570 | 极少 |
| FM | 0.4555 | 中 |
| 纯 DNN | 0.4428 | 大 |
| Deep Crossing | 0.4425 | 较大 |
| Wide & Deep | 0.4435 | 大 |
| DCN | 0.4419 | 比 DNN 小 |
DCN 比纯 DNN 准且参数更少——cross 网络把「学交叉」这件事从 DNN 卸载到一条更高效的细网络上。
案例 4:和 Wide&Deep 的关键差别
wide-deep-2016 的 wide 端是 LR(手工交叉特征),需要工程师告诉模型「想学 user × item × time 这种组合」。DCN 不用——cross 网络自己遍历所有可能的组合方向,省掉的是特征工程师的工作量。这也是为什么 Google 内部从 Wide&Deep 迁到 DCN:广告业务特征上千维,没人愿意天天手写交叉规则。
踩过的坑
-
Cross 层的
w_l是向量,不是矩阵。这个限制让一层 cross 实际上是 rank-1 投影——表达力有上限。这正是 DCN-V2(2020)改进的起点:把w_l换成矩阵W_l,参数变多但表达力质变。ByteDance、阿里目前部署的都是 V2,不是原始 DCN。 -
Embedding 才是参数大头。论文宣传 cross 网络省参数,但工业场景下 user_id / item_id 的 embedding 表才是真正的存储瓶颈(动辄千亿参数)。cross 省的那点参数在巨型 embedding 面前几乎可以忽略——这是论文没强调的工程现实。
-
Cross 输出和 Deep 输出拼接 vs 相加是关键设计。Wide&Deep 是 logit 相加(共享 sigmoid),DCN 是向量拼接(再过一层 LR)。拼接保留两路的全部信息让最后一层自己挑,相加则强制两路同维度同尺度,少一些灵活性。
-
稠密特征要先归一化。
x_0包含连续特征时如果尺度不一(比如年龄 0-100 和价格 0-10000),cross 层会被大尺度特征主导。论文用 log 变换 + min-max 归一化处理。
训练细节
论文里训练的工程细节值得记一下,否则复现会踩坑:
- 优化器:Adam,学习率 1e-4,对 cross 和 deep 一视同仁。这一点和 wide-deep-2016 不同——后者 wide 端必须用 FTRL 才稀疏,DCN 因为 cross 不追求稀疏所以 Adam 就行
- 正则:每层加 L2 weight decay = 1e-5;deep 端额外加 dropout 0.5
- batch size:512,每个 epoch 看完整训练集后早停(patience 3)
- embedding 维度:每个分类特征 embedding 维度 =
6 × (vocab_size)^0.25,这是 TensorFlow 的经验公式 - 稠密特征预处理:先 log(1+x) 再 min-max 到 [0,1],避免大尺度特征支配 cross 层
适用 vs 不适用场景
适用:
- CTR / CVR 预测、推荐排序、广告点击率——所有需要大量特征交叉的场景
- 类别特征极多(user_id、item_id、tag、category)的工业级推荐
- 想替代 FM / Wide&Deep 又不想完全黑箱化时
不适用:
- 序列建模(用户行为序列)——交叉网络对时序无感,要换 attention / DIN / Transformer
- 图像 / 文本主导的任务——cross 网络是为离散特征设计的
- 小数据场景——cross 网络的高阶交叉需要充足样本支撑,否则过拟合
历史小故事(可跳过)
- 2016 年:Google 发 wide-deep-2016,把记忆和泛化绑一起,但 wide 端要人工写交叉特征
- 2017 年 8 月:Wang Ruoxi(在 Google 的 Stanford PhD 实习生)发 DCN,把”交叉”从手写规则升级成可学网络
- 2020 年:同一作者发 DCN-V2,把向量
w_l升级成矩阵W_l,并报告 Google 实际部署效果。从此 DCN-V2 成为业界标配 - 2024 年现状:ByteDance火山引擎、阿里达摩院的精排框架都把 DCN-V2 列为内置 backbone
学到什么
- 「显式 + 隐式」是 CTR 模型的胜利配方。explicit cross 抓住低阶模式(保证收敛和可解释),implicit DNN 抓住模糊语义(保证泛化)。两路并联是 2016 之后的范式
- 参数效率比绝对精度更重要。工业推荐 latency 卡死,DCN 比 DNN 小且准是它能落地的关键
- 架构创新有时只是一个递推公式。
x_{l+1} = x_0 · x_l^T · w_l + b_l + x_l这一行就是全文核心,剩下的都是工程包装 - 从 wide-deep-2016 → DCN → DCN-V2 是同一思想的三代演化——记住这条线就抓住了工业 CTR 模型 2016-2020 的主轴
- 多项式回归 + 神经网络可以同居。cross 网络本质是参数化的多项式展开,DNN 是非线性映射,两者并不冲突而是互补——这点对今后看任何 hybrid 架构都有启发
延伸阅读
- 原论文:Deep & Cross Network for Ad Click Predictions, ADKDD 2017
- 升级版:DCN V2: Improved Deep & Cross Network, WWW 2021
- TensorFlow 官方实现:
tfrs.layers.dcn.Cross - wide-deep-2016 —— DCN 的直接前辈,理解了它再看 DCN 一目了然
- attention —— 处理序列特征的另一条路线,与 DCN 互补
一句话总结
给 CTR 模型并联一条「每层都把原始向量乘回来再加残差」的细网络,它就自动学会所有有界阶特征交叉,参数还比 DNN 少。
这条细网络的递推公式 x_{l+1} = x_0 · x_l^T · w_l + b_l + x_l 是论文唯一需要记住的式子。剩下的全是 embedding 拼接 + 拼接两路 + sigmoid 的标准操作。
关联
- wide-deep-2016 —— 同一思想体系的前一代,DCN 把人工交叉自动化
- attention —— 推荐里序列建模的主力,与 DCN 并存于阿里 DIN 等模型
- transformer —— 当前另一种交叉范式,但工业推荐主流仍是 DCN-V2 类结构
反向链接
- attention —— Attention Is All You Need
- din-2018 —— DIN — 让推荐模型按你看的广告决定该激活你哪段历史
- wide-deep-2016 —— Wide & Deep — 让模型同时学会”记住”和”举一反三”