DeepFM推荐领域深度学习的Baseline

DeepFM推荐领域深度学习的Baseline

CTR(点击率)预估是推荐系统、广告系统和搜索排序的核心环节,而特征交叉(Feature Interaction)的建模能力,直接决定了模型效果的上限。DeepFM 由华为诺亚方舟实验室于 2017 年提出,凭借”无需人工特征工程、无需预训练、同时捕捉低阶与高阶特征交叉”三大优势,成为工业界落地最广的 CTR 模型之一。

在电商、信息流、短视频等场景中,用户每刷新一次页面,系统都要回答一个问题:把哪些内容排在最前面?

CTR 模型输出的 pCTR 决定了内容的展示顺序,哪怕是一点点 AUC 的提升,都可能带来较大的营收变化。所以CTR 建模能力是推荐系统的核心竞争力,而 CTR 建模的本质难题,是特征交叉。举几个直观的例子:

  • 用户性别 = 女 × 品类 = 母婴 → 高点击
  • 用户年龄 = 30 岁 × 商品价格 = 高价 → 低点击
  • 用户所在城市 = 北京 × 天气 = 雨天 → 打车 App 高活跃

单独看任何一个特征都无法捕捉这些规律,只有把多个特征组合起来才有意义。于是,”如何自动、高效、充分地学习特征交叉”,就成了 CTR 模型演进的主线。


模型的演进

在理解 DeepFM 之前,有必要先梳理一下它之前的技术脉络——因为 DeepFM 的每一处设计,几乎都是针对前人模型痛点的”对症下药”。

LR:线性模型的无奈

逻辑回归(LR)是工业界最早大规模使用的 CTR 模型,优点是简单、可解释、易上线,但它只能学习一阶特征,对特征交叉无能为力。传统做法是人工构造交叉特征(如”性别_品类”组合)后再喂给 LR,代价是海量的人工特征工程投入,且难以穷举所有有效组合。

FM:二阶交叉的优雅解

因子分解机(Factorization Machine)用隐向量(Embedding)的技巧解决了二阶交叉在高维稀疏场景下的参数估计问题:

$$ y_{FM} = w_0 + \sum_{i=1}^{n} w_i x_i + \sum_{i=1}^{n}\sum_{j=i+1}^{n} \langle v_i, v_j \rangle x_i x_j $$

每个特征 $i$ 学习一个 $k$ 维隐向量 $v_i$,二阶交叉项用内积 $\langle v_i, v_j \rangle$ 度量。这种隐向量机制使得即便某两个特征从未在训练集中共现过,模型依然可以通过向量相似度进行泛化,从而很好地缓解了稀疏场景下的参数估计难题。但 FM 的表达能力止步于二阶交叉,更高阶的非线性关系它无能为力。

FNN / PNN:神经网络登场

FNN(2016)尝试用 FM 预训练得到的隐向量去初始化 DNN 的 Embedding 层,再通过全连接网络学习高阶交叉,但它依赖 FM 预训练,两阶段的训练流程相互割裂,难以联合优化。

PNN(2016)在 Embedding 层之后引入内积(IPNN)或外积(OPNN)运算来显式建模特征交叉,但更高阶的交叉仍然依赖 DNN 的隐式学习,且外积运算的计算开销较大。

Wide & Deep:记忆与泛化的结合

Google 提出的 Wide & Deep(2016)把 LR(Wide 部分,负责”记忆”)与 DNN(Deep 部分,负责”泛化”)并联训练,是业界影响力很大的一次架构创新。但它的问题也很明显:Wide 部分仍然依赖人工设计的交叉特征(Cross-Product Transformation),自动化程度不足;同时 Wide 与 Deep 两侧使用不同的输入特征表示,需要精心设计,工程复杂度较高。

不同模型对比

模型 低阶交叉 高阶交叉 无需人工特征工程 无需预训练
LR ✓(人工构造)
FM
FNN ✘(需预训练)
PNN
Wide & Deep ✓(人工构造) ✘(Wide侧需要)
DeepFM

可以看到,此前的每一个模型都在某个维度上有所妥协。而 DeepFM 的目标非常明确:全都要——既要低阶交叉,又要高阶交叉;既不需要人工特征工程,也不需要预训练。

DeepFM 模型详解

DeepFM模型由FM + DNN组成,FM 部分负责低阶特征交叉提取,Deep 部分负责高阶特征交叉提取,两者共享同一个 Embedding 层,端到端联合训练。

整体架构

DeepFM 的核心结构由两部分并行组成:FM 组件(FM Component)Deep 组件(Deep Component),两部分共享同一套输入与 Embedding 层,其预测结果相加后经过 Sigmoid 得到最终的 CTR:

image-20250725002017499

最终预测公式为:
$$ \hat{y} = \sigma\left( y_{FM} + y_{DNN} \right) $$
其中 $\sigma$ 是 Sigmoid 函数,$y_{FM}$ 是 FM 部分的输出(包含一阶项和二阶交叉),$y_{DNN}$ 是 Deep 部分的输出(高阶交叉)。两个部分接收相同的原始特征输入,也共享同一个 Embedding 层——这正是 DeepFM 相较于 Wide & Deep 的关键改进之一。

共享 Embedding 层:最精妙的设计

image-20250725002612407
  • Field表示原始特征(每个Field表示一个特征 如,Field1:性别,Field2:年龄段);

  • 通过one-hot操作把原始特征展开,所以一个Filed有多个稀疏值也就是Sparse Features;

  • Sparse Features通过Embedding层(词嵌入矩阵)也就是图上没有展示的权重$W$转相乘得到稠密矩阵也就是Dense Embedding,其中权重参数$W$就是FM二阶(one-hot后的特征)引入的辅助隐向量矩阵$ V $,Dense Layer就是$V_i,V_j,...,V_n$向量。

原始输入通常是若干个稀疏 Field(字段)经过 One-Hot 或 Multi-Hot 编码后拼接而成,例如:

Field 取值示例
用户性别 [男, 女]
用户年龄段 [18-24, 25-34, 35-44, …]
商品品类 [美妆, 数码, 服饰, …]
广告位 [首页, 详情页, 购物车]

每个 Field 的非零取值通过查表映射为一个稠密的 $k$ 维隐向量(Embedding)。DeepFM 设计中最精妙的一点在于:FM 部分用于计算二阶交叉的隐向量,与 Deep 部分作为网络输入的 Embedding,是完全共享的同一组参数

这样设计带来两个显著好处:

  1. 表达一致性:FM 与 Deep 学到的是同一套特征语义表示,不会出现两部分”各自为政”导致的语义漂移;
  2. 训练更高效:Embedding 向量同时接受来自 FM 和 DNN 两侧的梯度更新,低阶交叉的信息可以直接辅助高阶部分的学习,反之亦然;同时无需像 Wide & Deep 那样为两个组件分别维护独立的特征表示,大幅降低了参数量与训练复杂度,也无需像 FNN 那样先做 FM 预训练——两个组件从一开始就在同一个特征空间里联合训练。

FM 部分:负责低阶特征交叉

image-20250725002314210

FM 部分本质上是一个标准的因子分解机,负责抽取一阶线性特征与二阶特征交叉:

$$ y_{FM} = w_0 + \sum_{i=1}^{n} w_i x_i + \sum_{i=1}^{n}\sum_{j=i+1}^{n} \langle v_i, v_j \rangle x_i x_j $$

  • 一阶部分:累加单个特征的线性权重 $w_i \cdot x_i$,相当于一个 LR;
  • 二阶部分:利用隐向量内积 $\langle v_i, v_j \rangle$ 自动计算任意两个特征之间的交叉强度,无需人工指定哪些特征需要交叉。

由于输入是稀疏的 One-Hot 特征,实际计算时只需遍历非零特征。同时,二阶交叉项还有一个经典的数学优化技巧:

$$ \sum_{i=1}^{n}\sum_{j=i+1}^{n} \langle v_i, v_j \rangle x_i x_j = \frac{1}{2} \sum_{f=1}^{k} \left[ \left( \sum_{i=1}^{n} v_{i,f} x_i \right)^2 - \sum_{i=1}^{n} v_{i,f}^2 x_i^2 \right] $$

这一化简把原本 $O(kn^2)$ 的双重循环计算复杂度降低到 $O(kn)$(结合稀疏性可进一步降为 $O(kN_z)$,$N_z$ 为非零特征数),是 FM 及 DeepFM 能够支撑亿级样本高效训练的关键工程基础。

  • Field是数据特征的原始值,如:$i$为性别(男,女),$j$为年龄段(少年,中年,老年)

  • Sparse Features为原始特征经过one-hot转换之后的稀疏特征,如(一个35岁的中年男人):$i$为 [0,1],$j$为 [0,1,0]

  • Sparse Features层与Dense Embedding层中间的权重$W$:

    • 在架构图中权重$W$也就是Embedding矩阵没有展示,省略了。

    • $i$的维度为$(2,k)$, $j$的维度为$(3,k)$,拼接后维度大小为$(5,k)$,也就是$W_{5,k}$

    • $k$为二阶隐向量的大小

    • $W$为FM二阶隐向量矩阵$V$

  • Dense Embedding层为Embedding矩阵(也就是权重$W$)与经过one-hot的特征通过embedding-lookup查找后的向量:$ V_{i}$的纬度为$(1,k)$,$ V_{j}$的纬度为$(1,k)$,拼接起来$\left [ V_{i},V_{j} \right ]$ 的维度为$(1,2k)$。

  • 在FM Layer,来自Sparse Features层的一阶与来自Dense Embedding层的二阶(二阶内部先进行内积计算)进行求和得到一个标量。

    • 一阶公式:$ \sum_{i=1}^n w_i x_i $ 【在架构图中$w_i$没有展示,省略了】
    • 二阶公式:$ \sum_{i=1}^{n-1} \sum_{j=i+1}^n \langle V_i, V_j \rangle x_i x_j $ 【在架构图中$x_i x_j$没有体现是因为当两者都为1时整个项才有意义,乘以1可以忽略】

FM中二阶的部分

每个特征称为一个Field, 每个特征通过one-hot编码之后会包含多个列,也就是每个Field包含多个稀疏的列(Sparse Features),每个Field中的值只有一个是1 如:[0,1,0,0], [0,0,01]

  • field_size:Field的大小,也就是特征one-hot编码之前的大小
  • feature_size:特征经过one-hot之后的大小
  • k:FM二阶交叉隐向量v的维度

稀疏的Field通过embedding层之后得到Dense Vector。也就是Field通过embedding_lookup词向量矩阵(嵌入矩阵)得到稠密的向量(把词向量矩阵作为权重W与Field相乘)

在DeepFM中是拿FM当中的二维矩阵V来作为词向量矩阵作为权重W,所以W的shape为(feature_size, k) ,而模型的input是feature_size维的0、1向量,所以在input与W相乘后就得到了(feature_size, k)维的dense vector了。

Deep 部分:负责高阶非线性特征学习

image-20250725002331596
  • DNN在共享的Dense Embedding层上通过Hidden Layer计算得到一个标量值
  • DNN与左侧的FM共享Embedding向量。

Deep 部分是一个多层前馈神经网络(DNN),用于拟合更复杂的高阶非线性特征交叉。具体做法是先将各 Field 对应的 Embedding 向量拼接(Concatenate)成一个稠密向量:

$$ a^{(0)} = [e_1, e_2, \dots, e_m] $$

其中 $e_i$ 是第 $i$ 个 Field 的 Embedding 向量,$m$ 是 Field 的数量。随后向量经过若干层全连接网络逐层进行非线性映射:

$$ a^{(l+1)} = \sigma\left( W^{(l)} a^{(l)} + b^{(l)} \right) $$

激活函数通常使用 ReLU。原始论文中采用的是 3 层、每层 400 个神经元的结构(即 400-400-400),最后一层输出一个标量 $y_{DNN}$。深层网络通过层层非线性变换,隐式地捕捉三阶、四阶乃至更高阶的特征组合关系,这是 FM 无法做到的。

DeepFM中连续特征的处理方式

DeepFM中连续特征有多种处理方式,提供以下几种作为参考:

  • 连续特征直接作为DNN的输入,不参与FM的输入。
  • 连续特征直接作为DNN的输入,参与FM一阶的计算,不参与二阶交叉。(DeepCTR就是这么实现的)
  • 也可以把连续特征离散化后,同时作为DNN和FM的输入。【推荐】
  • 连续特征做规划化,通过embedding向量乘以数值,让连续特征自然地融入FM的交叉计算里,相当于对embedding做了缩放。

主流 CTR 模型横向对比

结合前文的分析,我们可以把 DeepFM 与业界几个经典模型放在一起做一个更完整的横向对比:

模型 低阶特征学习 高阶特征学习 是否需要人工特征工程 是否共享 Embedding 是否需要预训练
LR 一阶 -
FM 一阶 + 二阶 -
FNN 高阶 - 是(FM 预训练)
PNN 高阶 -
Wide & Deep 一阶 + 二阶 高阶 是(Wide 侧需要)
DeepFM 一阶 + 二阶 高阶 完全不需要

可以清晰地看到,DeepFM 是表格中唯一一个在所有维度上都拿到”最优解”的模型——这也是它能够迅速成为工业界默认基线的核心原因。


DeepFM 工业落地

回顾 DeepFM 能被大规模部署的核心原因,可以归纳为四点:

  1. 开箱即用:稀疏特征可直接输入模型,无需特征工程、无需预训练,接入成本极低;
  2. 表达能力均衡:低阶交叉(FM)负责”记忆”用户的具体偏好模式,高阶交叉(DNN)负责”泛化”到训练集中未曾见过的特征组合,二者互补;
  3. 训练高效:共享 Embedding 让参数利用率更高,二阶项的数学优化也让训练速度更快,能够支撑亿级样本量的工业级训练;
  4. 易于扩展:多值特征的池化处理、连续特征的分桶 Embedding、注意力机制等技巧都能无缝叠加在 DeepFM 框架之上,社区生态也相对成熟。

在具体工程实践中,还有几个经验值得关注:

  • Embedding 维度:一般设置在 8~64 之间,需结合特征基数、样本规模和线上推理延迟综合权衡,维度过大容易过拟合、增加推理耗时;
  • Deep 层的深度与宽度:通常 2~3 层全连接(如 [256, 128, 64] 或论文中的 [400, 400, 400])便能覆盖大部分场景的拟合需求;
  • 正则化:推荐系统数据天然极其稀疏,在 Deep 部分适当加入 Dropout(0.2~0.5)或 $L_2$ 正则,能显著提升模型的泛化能力;
  • 与序列特征结合:在真实业务中,DeepFM 常与用户行为序列建模(如 DIN、DIEN 中的注意力机制)结合使用,进一步提升效果,这也是 DeepFM 之后一系列改进工作的重要方向。

正因如此,DeepFM 至今仍是许多公司(尤其是中小团队)上线 CTR 模型时的默认基线,也常被用作衡量新模型效果的对比基准。

局限与后续演进

当然,DeepFM 并非完美无缺,它也存在一些明显的局限:

  • 高阶交叉是隐式的:DNN 学习到的高阶特征交叉不具备可解释性,也不一定是最优的交叉方式;
  • 二阶交叉粒度较为粗糙:所有特征对共享同一个 Embedding 维度 $k$,无法自适应地区分不同特征交叉的重要程度;
  • Embedding 维度固定:不同 Field 的稀疏度和信息量差异巨大,统一的 Embedding 维度往往不是最优选择。

围绕这些短板,学术界和工业界近年提出了不少改进方向:

方向 代表工作
显式高阶交叉 xDeepFM(CIN 网络)、DCN / DCN-V2(特征交叉网络)
交叉重要性建模 AFM(注意力 FM)、FiBiNet(SENet + 双线性交互)
自适应维度 AutoField、AutoEmb(NAS 搜索维度)
结构化特征交互 FmFM(Field-aware 矩阵分解)、FinalMLP
多任务融合 与 ESMM、MMoE 等结合,同时优化 CTR 与 CVR

其中比较值得一提的是 xDeepFM:它把 FM 中向量外积的思想推广到高阶,用 CIN(Compressed Interaction Network)显式地学习任意阶特征交叉,在表达能力和可解释性上又前进了一步。不过,DeepFM 结构简洁、性价比高的特点,依然让它成为大多数团队”先用起来”的最优选择。


小结

DeepFM 的设计哲学可以用一句话概括:

让 FM 做它擅长的事(低阶交叉),让 DNN 做它擅长的事(高阶交叉),再用共享 Embedding 把它们”缝”在一起,端到端联合训练。

它把 CTR 建模从”人工特征工程 + 两阶段训练”的繁琐流程中解放出来,用一套优雅且高效的架构,同时拿到了模型的记忆能力泛化能力。理解 DeepFM,不仅是掌握一个具体模型,更是理解特征交叉建模这一推荐系统核心命题的一把钥匙——后续的 xDeepFM、DCN、FiBiNet 等一系列进阶模型,几乎都是在这个框架基础上演进而来的。