【第六章:项目实战之推荐/广告系统】3.精排算法-(2)精排算法模型精讲: DNN、deepFM、ESMM、PLE、MMOE算法精讲与实现- DeepFM 模型

部署运行你感兴趣的模型镜像

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

第三部分:精排算法

第二节:精排算法模型精讲: 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 精排基础模型之一。

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>嗯,用户遇到了在编译OpenCV的dnn模块时出现的错误,具体是mingw32-make在生成avx512_skx.cpp.obj时出错,错误代码1。我需要根据提供的引用信息和OpenCV编译的常见问题来找出可能的原因和解决方案。 首先,看错误信息中的路径:modules/dnn/CMakeFiles/opencv_dnn.dir/build.make:1741,这指向了avx512_skx.cpp.obj的编译失败。引用[4]提到了同样的错误,说明可能是AVX-512指令集相关的问题。 可能的第一个原因是编译器不支持AVX-512指令集。用户使用的是MinGW,可能其GCC版本较旧,不支持AVX-512。需要检查GCC版本是否足够新,或者是否启用了相应的编译选项。 第二个可能的原因是CMake配置中错误地启用了AVX-512支持。在CMake配置时,如果设置了相关的选项如CV_ENABLE_INTRINSICS或FORCE_VS2015,可能会导致不兼容的问题。需要重新配置CMake,关闭这些选项。 第三个可能性是源码或环境配置问题。例如,缺少必要的依赖库,或者路径设置不正确。但根据引用[2],用户之前成功编译过其他部分,所以更可能是特定模块的配置问题。 解决方案方面,首先建议用户禁用AVX-512优化。在CMake中设置-DCPU_BASELINE=SSE4_2,这样会跳过AVX-512的编译。其次,确保GCC版本支持AVX-512,比如GCC 7及以上,并添加-mavx512f等编译选项。如果问题依旧,可能需要更新OpenCV源码,应用相关补丁,或者检查CMake缓存,确保没有残留的旧配置。 另外,参考引用[3]中提到的D3D11错误,可能需要检查系统SDK是否安装正确,但这里的问题更可能指令集支持相关。用户需要逐步除,先尝试禁用AVX-512,再处理其他可能性。</think>针对使用 MinGW32 编译 OpenCV dnn 模块时出现的 $mingw32-make\ opencv_dnn\ avx512\_skx.cpp.obj\ Error\ 1$ 错误,以下是分步解决方案: --- ### **根本原因分析** 该错误通常由以下原因导致: 1. **指令集不兼容**:AVX-512 指令集需要特定 CPU 和编译器支持[^2] 2. **CMake 配置冲突**:启用了 MinGW 不兼容的编译优化选项(如 FORCE_VS2015 或 CV_ENABLE_INTRINSICS)[^3] 3. **源码/环境问题**:OpenCV 源码版本 MinGW 工具链存在兼容性问题[^4] --- ### **解决方案步骤** #### **步骤 1:禁用 AVX-512 指令集** 通过 CMake-GUI 修改编译配置: ```bash # 在 CMake 配置中添加 -D CPU_BASELINE=SSE4_2 # 禁用 AVX-512,改用 SSE4.2 指令集 -D CPU_DISPATCH= # 清空指令集自动分发 ``` ![CMake 配置示例](https://placehold.co/600x400?text=CMake+AVX-512+Disable) #### **步骤 2:验证编译器兼容性** 检查 MinGW 的 GCC 版本是否支持 AVX-512: ```bash gcc -march=native -dM -E - < /dev/null | grep AVX512 ``` 若无输出,说明编译器不支持 AVX-512,需升级至 GCC 7+ 并添加编译参数 `-mavx512f`[^2] #### **步骤 3:清理并重新编译** ```bash # 删除旧编译缓存 rm -rf build/ mkdir build && cd build # 重新生成 Makefile cmake -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D WITH_OPENMP=ON \ -D BUILD_EXAMPLES=OFF .. mingw32-make -j4 opencv_dnn # 仅编译 dnn 模块 ``` --- ### **备选方案** 若仍出现错误,可尝试: 1. **源码补丁**:更新到 OpenCV 4.5+ 版本(已修复部分 AVX 指令集兼容性问题) 2. **交叉编译**:使用 MSYS2 的 MinGW-w64 替代原生 MinGW32[^3] 3. **环境检查**:确认 PATH 环境变量未混用不同版本的 MinGW 工具链 --- ### **关键配置验证** 成功编译后的 dnn 模块应生成以下文件: ``` <build_dir>/lib/libopencv_dnn451.dll # MinGW 动态链接库 <build_dir>/bin/opencv_dnn.pdb # 调试符号文件(Debug 模式) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值