深入解析 DeepFM:在 D2L 中融合因子分解机与深度神经网络实现点击率预测

发布时间:2026/10/3 8:12:31
深入解析 DeepFM:在 D2L 中融合因子分解机与深度神经网络实现点击率预测
文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载深度因子分解机Deep Factorization MachinesDeepFM是广告点击率CTR预测领域最具代表性的深度学习模型之一它通过并行融合经典二阶因子分解机与多层感知机MLP同时捕捉低阶与高阶特征交互。本篇指南以《动手学深度学习》D2L推荐系统章节中的 DeepFM 文档为核心完整还原其模型架构推导、MXNet 源码实现与在匿名广告数据集上的完整训练流程并深入仓库底层解析CTRDataset数据封装与train_ch13训练工具的实现细节帮助读者从公式到代码、从数据到训练全链路掌握 DeepFM 的落地方法。为什么需要 DeepFM因子分解机的局限线性交互假设与二阶瓶颈因子分解机FM在 CTR 预测中被广泛使用其核心假设是特征交互可以通过双线性范式bilinear interactions来建模即任意两个特征 $i$、$j$ 的交互强度由其隐向量 $\mathbf{v}_i$ 与 $\mathbf{v}_j$ 的点积 $\langle\mathbf{v}_i, \mathbf{v}_j\rangle$ 表示具体公式与推导见仓库中的 因子分解机文档。但在真实世界的广告数据中特征交叉结构往往高度复杂且非线性例如“用户画像 × 广告位 × 上下文”之间的高阶耦合关系难以用简单的双线性项刻画。更糟糕的是实践中 FM 通常只使用二阶特征交互理论上 FM 可以推广到更高阶degree 2的交互但高阶建模会带来数值不稳定与极高的计算复杂度因此很少在实际中被采用从复杂度看朴素计算所有两两交互需要 $\mathcal{O}(kd^2)$即使经过重写优化降到线性复杂度 $\mathcal{O}(kd)$也只是解决了二阶项的计算效率并未突破交互阶数的天花板。深度神经网络的补位深度神经网络擅长特征表示学习具备捕捉精细复杂特征交互的能力。自然的思路是将深度神经网络与因子分解机集成在 FM 上叠加非线性变换层使其同时具备建模低阶特征组合与高阶特征组合的能力同时输入数据中固有的非线性结构也能被 DNN 捕获。正是基于这一动机Guo 等人提出了 DeepFM 模型见文献引用Guo.Tang.Ye.ea.2017即论文DeepFM: A Factorization-Machine based Neural Network for CTR Prediction。DeepFM 模型架构FM 与 DNN 的并行融合总体结构DeepFM 由一个FM 组件和一个深度deep组件以并行结构集成而成FM 组件与二阶因子分解机完全一致负责建模低阶特征交互一阶线性项 二阶双线性项深度组件一个 MLP负责捕获高阶特征交互与非线性共享输入两个组件共享相同的输入/嵌入embeddings最终输出相加作为预测值。值得一提的是DeepFM 的精神与Wide Deep架构相似——都能同时捕获记忆memorization与泛化generalization。但 DeepFM 相比 Wide Deep 的优势在于它通过自动识别特征组合大幅减少了手工特征工程的工作量。数学表达记 FM 组件的输出为 $\hat{y}^{(FM)}$其详细公式可参考 fm.md 中的二阶 FM 定义。设 $\mathbf{e}_i \in \mathbb{R}^{k}$ 为第 $i$ 个字段field的隐特征向量则深度组件的输入是所有字段稠密嵌入的拼接由稀疏类别特征查表得到$$ \mathbf{z}^{(0)} [\mathbf{e}_1, \mathbf{e}_2, \ldots, \mathbf{e}_f], $$其中 $f$ 是字段field数量。该输入随后送入如下神经网络$$ \mathbf{z}^{(l)} \alpha(\mathbf{W}^{(l)}\mathbf{z}^{(l-1)} \mathbf{b}^{(l)}), $$其中 $\alpha$ 为激活函数$\mathbf{W}^{(l)}$ 与 $\mathbf{b}^{(l)}$ 分别是第 $l$ 层的权重与偏置。记深度组件的输出为 $y_{DNN}$DeepFM 的最终预测是 FM 与 DNN 两个分支输出的求和$$ \hat{y} \sigma(\hat{y}^{(FM)} \hat{y}^{(DNN)}), $$其中 $\sigma$ 为 sigmoid 函数将得分压缩到 $(0,1)$ 区间以表示点击概率。整体架构如下图所示。值得注意的是DeepFM 并非将深度神经网络与 FM 结合的唯一方式——也可以在特征交互之上直接叠加非线性层参见文献引用He.Chua.2017。这一设计空间为后续的 NFM、xDeepFM 等模型留下了延伸方向。DeepFM 的 MXNet 实现实现思路DeepFM 的实现与 FM 高度相似FM 部分保持原样额外引入一个以relu为激活函数的 MLP 块并使用Dropout进行正则化。MLP 的神经元数量通过mlp_dims超参数灵活调节。模型代码仓库中 deepfm.md 给出了完整的 MXNet 实现DeepFM继承自nn.Block#tab mxnet class DeepFM(nn.Block): def __init__(self, field_dims, num_factors, mlp_dims, drop_rate0.1): super(DeepFM, self).__init__() num_inputs int(sum(field_dims)) self.embedding nn.Embedding(num_inputs, num_factors) self.fc nn.Embedding(num_inputs, 1) self.linear_layer nn.Dense(1, use_biasTrue) input_dim self.embed_output_dim len(field_dims) * num_factors self.mlp nn.Sequential() for dim in mlp_dims: self.mlp.add(nn.Dense(dim, relu, True, in_unitsinput_dim)) self.mlp.add(nn.Dropout(ratedrop_rate)) input_dim dim self.mlp.add(nn.Dense(in_unitsinput_dim, units1)) def forward(self, x): embed_x self.embedding(x) square_of_sum np.sum(embed_x, axis1) ** 2 sum_of_square np.sum(embed_x ** 2, axis1) inputs np.reshape(embed_x, (-1, self.embed_output_dim)) x self.linear_layer(self.fc(x).sum(1)) \ 0.5 * (square_of_sum - sum_of_square).sum(1, keepdimsTrue) \ self.mlp(inputs) x npx.sigmoid(x) return x逐部分解读这段代码嵌入层与线性层self.embedding维度num_inputs × num_factors用于查表得到各字段的稠密嵌入self.fc是每个特征的线性权重经self.linear_layer输出一阶线性项FM 二阶交互项利用上一节 FM 文档中推导的等价重写公式通过0.5 * (square_of_sum - sum_of_square)在 $\mathcal{O}(kd)$ 线性时间内计算二阶交互避免显式枚举所有特征对MLP 深度组件将嵌入按embed_output_dim len(field_dims) * num_factors展开拼接后送入 MLP每层使用relu激活并紧跟Dropout(ratedrop_rate)最后一层输出标量 $y_{DNN}$输出融合一阶项 二阶交互项 深度组件输出求和后经npx.sigmoid得到最终的点击概率。关键超参数参数含义文档默认值field_dims各字段的词典大小列表由数据集计算得到由CTRDataset.field_dims提供num_factors嵌入/隐因子维度 $k$10FM 中为 20mlp_dimsMLP 各隐藏层神经元数[30, 20, 10]drop_rateDropout 丢弃率0.1数据加载与训练评估广告数据集与 CTRDataset 封装DeepFM 的训练沿用 FM 章节的数据加载流程使用的同样是匿名的在线广告 CTR 数据集。数据集共34 个字段第一列是标签是否点击1/0其余为类别特征训练集与测试集分别包含15000 与 3000 个样本详见 ctr.md。数据加载的关键组件CTRDataset在仓库源码 d2l/mxnet.py 中实现与数据集的注册条目d2l.DATA_HUB[ctr]包含下载地址与 SHA-1 校验码位于同一位置。其内部逻辑要点如下特征映射feat_mapper对出现次数不低于min_threshold4的特征值建立连续索引低于阈值的罕见特征归入默认桶有效控制词典规模、缓解稀疏性字段维度field_dims为每个字段记录len(feat_mapper) 1含默认桶累计得到全局嵌入表大小全局偏移offsets通过np.cumsum(field_dims)计算各字段的起始索引__getitem__时将各字段的特征索引加上偏移量得到拼接后的全局稀疏索引feat self.offsets供nn.Embedding(num_inputs, num_factors)直接查表。训练配置以下为 deepfm.md 中给出的完整训练流程MLP 采用金字塔结构30-20-10其余超参数与 FM 保持一致#tab mxnet batch_size 2048 data_dir d2l.download_extract(ctr) train_data d2l.CTRDataset(os.path.join(data_dir, train.csv)) test_data d2l.CTRDataset(os.path.join(data_dir, test.csv), feat_mappertrain_data.feat_mapper, defaultstrain_data.defaults) field_dims train_data.field_dims train_iter gluon.data.DataLoader( train_data, shuffleTrue, last_batchrollover, batch_sizebatch_size, num_workersd2l.get_dataloader_workers()) test_iter gluon.data.DataLoader( test_data, shuffleFalse, last_batchrollover, batch_sizebatch_size, num_workersd2l.get_dataloader_workers()) devices d2l.try_all_gpus() net DeepFM(field_dims, num_factors10, mlp_dims[30, 20, 10]) net.initialize(init.Xavier(), ctxdevices) lr, num_epochs, optimizer 0.01, 30, adam trainer gluon.Trainer(net.collect_params(), optimizer, {learning_rate: lr}) loss gluon.loss.SigmoidBinaryCrossEntropyLoss() d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs, devices)要点说明数据加载训练集与测试集共享feat_mapper与defaults保证两边字段索引空间一致num_workers由d2l.get_dataloader_workers()决定Linux 下默认 4 进程Windows 下为 0见 d2l/mxnet.py训练工具d2l.train_ch13是 d2l/mxnet.py 中定义的多 GPU 训练函数支持在多个设备上并行训练并记录 train loss / train acc / test accd2l.try_all_gpus()d2l/mxnet.py会自动探测可用 GPU无 GPU 时回退到 CPU损失与优化采用SigmoidBinaryCrossEntropyLoss二分类交叉熵 Adam 优化器学习率 0.01训练 30 轮参数用 Xavier 初始化。实验结论与原文档结论一致相比 FMDeepFM 收敛更快、性能更优。这也验证了深度组件引入的高阶交互建模能力确实带来了可测量的收益。读者可以通过修改mlp_dims与num_factors复现这一对比。小结将神经网络集成进 FM使其能够建模复杂且高阶的特征交互突破二阶交互的表达瓶颈在广告 CTR 数据集上DeepFM 的性能优于原始 FM且收敛速度更快DeepFM 通过与 Wide Deep 类似的“并行 共享嵌入 输出求和”结构在避免手工特征工程的同时兼顾了记忆与泛化能力。练习建议改变 MLP 的结构层数与每层神经元数观察其对模型性能的影响更换数据集例如 Criteo并与原始 FM 模型进行对比实验。延伸阅读本部分属于 D2L 推荐系统章节见 chapter_recommender-systems/index.md的内容建议按顺序阅读前序的 ctr.md特征丰富的推荐系统与 CTR 数据集与 fm.md因子分解机原理与实现以完整理解 DeepFM 两个组件的来源。D2L 项目在 d2l/ 目录下同时维护了 MXNet、PyTorch、TensorFlow 与 JAX 四种框架的配套工具实现可将本节思路迁移到其他框架中复现。赞分享文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载相关推荐DeepFM网络架构解析Pytorch实现广告点击率预测终极指南DeepFM网络架构解析Pytorch实现广告点击率预测终极指南 在当今的数字广告时代精准预测用户点击率CTR已成为推荐系统和广告业务的核心技术。Dee示例工程教程React Table组件设计模式如何构建可复用、易扩展的表格系统React Table组件设计模式如何构建可复用、易扩展的表格系统 在现代Web应用开发中表格是展示和管理数据的核心组件之一。一个设计良好的React TaFunRec中的DeepFM深度学习与FM的完美结合FunRec中的DeepFM深度学习与FM的完美结合 引言推荐系统中的特征交互挑战 在推荐系统Recommender System领域如何有效捕捉用户人工智能机器学习深度学习教程示例工程后端前端上一篇标题掌握鼠标探索Python的Mouse库下一篇探索DOM元素的视觉边界VisSense.js深度剖析与应用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考