第六章:项目实战之推荐/广告系统

第三部分:精排算法

第二节:精排算法模型精讲: DNN、deepFM、ESMM、PLE、MMOE算法精讲与实现

2.DeepFM 模型


一、为什么需要 DeepFM?(从 DNN 和 FM 的缺陷切入)

在上一小节我们讲到的 DNN 精排模型虽然具备强大的非线性拟合能力,但它存在一个结构问题:

✅ 能学到高阶特征交互
低阶特征交互靠网络自己学,会非常困难、训练慢、效果不稳定

举个推荐中非常常见的交叉特征例子:

场景 重要交叉含义
用户性别 × 商品品类 不同性别对不同类目兴趣完全不同
城市 × 节日 × 商品价格区间 城市不同消费水平完全不同
用户职业 × 应用类型 职场/学生/自由职业者对 APP 内容行为差异明显

DNN 要靠大量训练样本才能自动“悟到”这些 feature cross。

于是业界希望:

最好有一个模型可以 显式地建模一阶关系 + 二阶特征交互 + 高阶特征交互,而且训练不要非常麻烦。

这就催生了 —— DeepFM(由华为诺亚提出)。


二、DeepFM 模型结构图(核心全貌)

DeepFM 由三部分组成:

组件 作用
FM(左侧) 显式建模 1 阶 / 2 阶特征交互
Embedding 为 FM 和 DNN 提供统一输入
DNN(右侧) 建模高阶非线性交互

整体结构如下:

                   ┌─────────── FM ────────────┐  →  捕获一阶 + 二阶特征交互
[sparse features] → Embedding → concat ───────┤
                   └────────── DNN ───────────┘  →  捕获高阶特征交互
                                 │
                              sigmoid
                                 │
                           CTR / CVR 预测

输出为 FM 与 DNN 的联合结果:

\hat{y} = \sigma(y_{FM} + y_{DNN})


三、FM 部分回顾(DeepFM 基石)

FM 的二阶交互核心公式:

\sum_{i=1}^{n} \sum_{j=i+1}^{n} \langle v_i, v_j \rangle x_i x_j

通过 embedding 内积 显式建模二阶组合。

FM 特点:

不需要人工 feature crossing
建模低阶关联效果极好
训练收敛快


四、DeepFM PyTorch 版本(可运行)

import torch
import torch.nn as nn
import torch.nn.functional as F

class DeepFM(nn.Module):
    def __init__(self, feature_size, emb_dim=16, hidden=[128, 64, 32]):
        super().__init__()
        self.embedding = nn.Embedding(feature_size, emb_dim)

        # FM 一阶
        self.fm_first = nn.Embedding(feature_size, 1)

        # FM 二阶 + DNN 输入
        input_dim = emb_dim * feature_size

        # DNN
        layers = []
        for h in hidden:
            layers.append(nn.Linear(input_dim, h))
            layers.append(nn.ReLU())
            input_dim = h
        self.dnn = nn.Sequential(*layers)
        self.out = nn.Linear(hidden[-1], 1)

    def forward(self, x):
        # x shape: [batch, field_num]
        emb = self.embedding(x)                  # [B, F, E]
        fm_first = self.fm_first(x).sum(dim=1)   # 一阶

        # FM 二阶: 1/2[(sum e)^2 - (square e)]
        sum_emb = emb.sum(1)
        square_sum = sum_emb * sum_emb
        sum_square = (emb * emb).sum(1)
        fm_second = 0.5 * (square_sum - sum_square).sum(1, keepdim=True)

        # DNN
        dnn_out = self.dnn(emb.view(emb.size(0), -1))
        dnn_out = self.out(dnn_out)

        return torch.sigmoid(fm_first + fm_second + dnn_out)

五、DeepFM 的优缺点与适用性

维度 结论
✅ 优点 低阶 + 高阶特征交互同时刻画;训练端到端;工业成熟
⚠️ 缺点 特征数量太多时,DNN 输入维度会膨胀
✅ 适用场景 CTR/CVR 精排 baseline, 推荐/广告/信息流全面可用

一句话总结:

DeepFM 是工业界最稳定、效果稳健、泛用性极高的 CTR 精排基础模型之一。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐