DeepFM:结合因子分解机与深度神经网络的特征交叉

FreeGuideOnline 最新 2026-06-23

什么是特征交叉?

在推荐系统和计算广告中,特征交叉(Feature Interaction)是指两个或多个原始特征组合后产生的新特征,能够捕捉特征之间的非线性关联。例如,在预测用户是否会点击一个广告时,将“用户性别”与“商品类目”进行交叉,形成“性别×类目”的组合特征,往往比单独使用原始特征效果更好,因为它描述了“特定性别对特定商品类目的偏好”这种复合模式。

传统的线性模型只能学习单特征的权重,无法自动建模特征之间的相互作用。手动构造交叉特征费时费力,且容易遗漏重要的高阶关系。因此,自动特征交叉成为了推荐模型的核心挑战。

因子分解机(FM)简介

因子分解机(Factorization Machine, FM)是一种能够自动学习二阶特征交叉的通用模型,由 Rendle 在 2010 年提出。它通过为每个特征学习一个隐向量,将交叉特征的重数从离散组合数目降低到线性级别,极大增强了泛化能力。

FM的数学模型

二阶因子分解机的预测函数可以表示为:

[ \hat{y}(\mathbf{x}) = w_0 + \sum_{i=1}^{n} w_i x_i + \sum_{i=1}^{n}\sum_{j=i+1}^{n} \langle \mathbf{v}_i, \mathbf{v}_j \rangle x_i x_j ]

其中:

  • (w_0) 为全局偏置
  • (w_i) 为一阶特征的权重
  • (\mathbf{v}_i \in \mathbb{R}^k) 为第 (i) 个特征的隐向量,(k) 是隐向量的维度
  • (\langle \mathbf{v}i, \mathbf{v}j \rangle = \sum{f=1}^{k} v{i,f} v_{j,f}) 为两个隐向量的点积,用于刻画特征 (i) 和特征 (j) 的交叉强度

FM如何处理特征交叉

FM 的核心思想是将每个特征的权重分解为一组隐因子。即使两个特征在训练数据中从未同时出现过,只要它们各自的隐向量已通过其他交叉学习好,FM 仍然能够估算它们之间的相关性。这使得 FM 在高维稀疏数据上拥有极强的泛化能力,远优于需要显式存储所有交互项的二次模型。

计算优化后,二阶交叉项可以在线性时间复杂度 (O(kn)) 内完成:

[ \sum_{i=1}^{n}\sum_{j=i+1}^{n} \langle \mathbf{v}i, \mathbf{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) ]

这使 FM 在实际应用中非常高效。

深度神经网络与特征交叉

深度神经网络(DNN)天然具备学习复杂非线性关系的能力。在推荐领域,我们可以将所有特征的嵌入向量拼接后输入一个多层感知机(MLP),让网络自动探索高阶交叉特征。这种方式的优势在于:

  • 无需手动设计交叉特征,网络可以隐式地学习任意高阶组合
  • 通过非线性激活函数引入更丰富的表示能力
  • 借助嵌入层,可以将高维类别特征转化为低维稠密向量,与数值特征拼接处理

然而,纯粹的深度模型(如 Deep Crossing、经典的 Embedding + MLP 架构)在低阶特征交叉上往往逊于 FM,因为深度网络的学习过程更偏向于全局非线性关系,而 FM 通过显式的向量内积建模了清晰的二阶关系。低阶交叉在很多场景中依然非常重要。

DeepFM:FM与DNN的融合

DeepFM 是由华为诺亚方舟实验室在 2017 年提出的一种端到端模型,它无缝结合了因子分解机的低阶特征交叉能力和深度神经网络的高阶特征交叉能力,且共享输入层,无需额外特征工程。

DeepFM架构概览

DeepFM 的整体结构由两大部分组成:FM 组件(左边部分)和 Deep 组件(右边部分),两者共享同一个输入和嵌入层,最终输出是两部分的简单加和并通过 sigmoid 函数得到预测值。

输入特征 (稀疏, 高维)
       |
  特征嵌入层 (共享)
     /           \
  FM 组件      Deep 组件
  (二阶交叉)    (MLP 高阶交叉)
     \           /
       相加 → Sigmoid → 点击概率

这种设计使得模型既能像 FM 那样记忆住重要的低阶特征对,又能像深度网络那样泛化出高阶隐藏模式。

FM 组件

FM 组件精确地复现了因子分解机的预测机制。它除了保留一阶线性部分外,重点计算所有特征嵌入向量的逐元素二维交叉和。与原始 FM 不同,DeepFM 中的 FM 模块可以直接利用嵌入层得到的稠密向量,而无需单独存放每个特征的隐向量。

  • 一阶线性部分:对原始特征(未嵌入)赋予权重并相加
  • 二阶交叉部分:利用嵌入向量,按照 FM 的高效计算公式得到交叉得分

FM 组件的最终输出为一阶部分与二阶部分之和。

Deep 组件

Deep 组件是一个典型的前馈神经网络。它将所有特征(类别特征经过嵌入,数值特征可标准化后直接传入或也映射成等长向量)的嵌入向量拼接成一个长向量,然后送入多层全连接网络:

[ \mathbf{a}^{(0)} = \text{concat}(\mathbf{e}_1, \mathbf{e}_2, \dots, \mathbf{e}_n) ] [ \mathbf{a}^{(l+1)} = \text{ReLU}(\mathbf{W}^{(l)} \mathbf{a}^{(l)} + \mathbf{b}^{(l)}) ]

经过若干隐藏层后,deep 组件的输出是一个标量 ( y_{\text{deep}} ),它代表所有高阶特征交叉的综合得分。

预测层整合

模型的最终预测由 FM 组件输出 ( y_{\text{FM}} ) 和 Deep 组件输出 ( y_{\text{deep}} ) 相加,再经过 sigmoid 变换得到:

[ \hat{y} = \sigma(y_{\text{FM}} + y_{\text{deep}}) ]

其中 ( \sigma ) 为 sigmoid 函数。这种简单相加的方式使得两部分可以联合训练,梯度同时反向传播到 FM 和 Deep 部分,共享的嵌入层可以从两方面获得学习信号。

DeepFM 的优势

  • 无需预训练:DeepFM 是端到端训练的,不需要像某些宽度与深度结合模型那样分开训练。
  • 端到端的联合交叉:低阶和高阶特征交叉被同时学习,且共享嵌入表示,避免了分别学习导致的不一致。
  • 参数效率高:相比于 Wide & Deep 模型中 Wide 部分需要人工设计交叉特征,DeepFM 的 FM 部分自动捕获所有二阶交叉,无需任何人工介入。
  • 性能稳定:在多数公开数据集(如 Criteo、Avazu)上,DeepFM 与其它主流模型(DeepFM、xDeepFM、DCN 等)相比,训练速度较快,且 AUC 指标具有竞争力。

代码实现思路

实际实现时,嵌入层是最关键的部分。对于分类特征,我们需要为每个特征值分配一个嵌入向量;对于连续特征,可以选择直接使用其标量值或也将其映射为固定长度的向量。下面给出使用深度学习框架的核心逻辑示意(伪代码):

# 输入:原始特征,分为离散特征和连续特征
# embedding_dict: 每个离散特征 field 的嵌入矩阵

# 离散特征嵌入
embs = []
for field in categorical_fields:
    idx = input_dict[field]   # 该特征的索引
    emb = embedding_dict[field](idx)  # 查表得到 (batch, emb_size)
    embs.append(emb)

# 连续特征转换
for field in continuous_fields:
    val = input_dict[field]   # 实数值
    # 可将其扩展为维度匹配的向量,或直接拼接数值
    embs.append(val.unsqueeze(-1))   # 保留为标量时需注意维度

# 拼接所有特征向量
concat = tf.concat(embs, axis=-1)   # (batch, total_dim)

# FM 部分
linear_part = linear_layer(original_features)  # 各特征的一阶线性组合
# 将嵌入向量堆叠为三维张量 (batch, n, k)
emb_stacked = tf.stack(embs, axis=1)
sum_square = tf.square(tf.reduce_sum(emb_stacked, axis=1))
square_sum = tf.reduce_sum(tf.square(emb_stacked), axis=1)
fm_interaction = 0.5 * tf.reduce_sum(sum_square - square_sum, axis=-1, keepdims=True)
y_fm = linear_part + fm_interaction

# Deep 部分
hidden = concat
for units in [128, 64, 32]:
    hidden = tf.layers.dense(hidden, units, activation='relu')
y_deep = tf.layers.dense(hidden, 1)

# 合并
logits = y_fm + y_deep
prediction = tf.sigmoid(logits)

实际应用场景

DeepFM 广泛应用于需要处理大规模稀疏特征和自动特征交叉的任务:

  • 推荐系统:AppStore、电商平台的商品推荐,根据用户画像、历史行为、场景上下文预测点击或转化率。
  • 计算广告:CTR 预估是广告系统的核心,DeepFM 能够实时处理百亿级特征,平衡记忆(FM 部分)与泛化(Deep 部分)。
  • 搜索排序:搜索引擎可以将查询词、用户特征、文档特征输入 DeepFM,对搜索结果的相关性进行自动交叉建模。
  • 信息流排序:社交平台的信息流内容排序,通过用户和内容特征的交叉提升多样性及精准度。

总结

DeepFM 巧妙地将因子分解机与深度神经网络集成在同一架构中,共享输入嵌入,无需预训练即可联合优化低阶特征显式交叉和高阶特征隐式交叉。它解决了 Wide & Deep 模型依赖手工设计交叉特征的问题,保留了 FM 的泛化能力,又通过 Deep 部分扩展了更深层次的组合模式。作为经典的 CTR 预估模型,DeepFM 是现代推荐系统工程中的重要基石,理解其原理有助于构建更复杂的自动特征交叉模型。