特征交叉系列:FM和深度神经网络的结合,DeepFM原理简述和实践

从FM,FFM到DeepFM

在上两节中介绍了FM和FFM

这两种算法是推荐算法中经典的特征交叉结构,FM将特征交叉分解到底层属性,通过底层属性的点乘来刻画特征交叉的计算,而FFM引入特征域的概念,对不同的特征对所引用的底层属性进行隔离,避免导致多重特征交叉下,底层属性表征产生互相拉扯,导致表达矛盾。

在深度学习时代之前,FM结构是主流的推荐算法,而随着深度学习的到来,FM逐渐和DNN深度神经网络进行结合,即期望构建模型既可以拥有FM的二阶特征交互的学习能力,也能够像DNN那样能够学习特征间高阶的复杂关系,其中DeepFM是最经典的FM和DNN结合的例子。

DeepFM提出于2017年,由于网络中只有FM和简单DNN,因此易于快速实现作为业务场景的一个Baseline。


DeepFM网络结构解析

DeepFM的网络结构如下

DeepFM模型结构

模型结构中左侧部分是FM,右侧部分是DNN,底层的输入从一个业务特征Field转化为稀疏onehot的Sparse Feature特征,模型的前馈传播有三块计算网络:

    1. Sparse Feature特征直接进入左侧FM的一阶线性层,完成一个wx+b的操作返回一阶的结果,只有Sparse Feature有值的位置才会进行权重加和
    1. Sparse Feature特征进入Dense Embedding层进行稠密向量映射,映射后进入左侧FM,映射的结果作为FM的隐向量进行点乘操作得到FM的二阶输出
  • 3.Sparse Feature特征进入Dense Embedding层进行稠密向量映射,映射后进入右侧DNN,所有Field的映射结果进行拼接作为DNN的输入,经过2层DNN隐藏层输出结果

最终DeepFM的结果是三个计算流程的相加组合,注意FM的二阶和DNN的底层输入是共享的,共用了Dense Embedding层的结果,因此隐藏层的学习不仅要考虑适配FM的交叉,也要适配DNN的高阶复杂关系学习。


DeepFM在PyTorch下的实践

本次实践的数据集和上一篇[特征交叉系列:完全理解FM因子分解机原理和代码实战]一致,采用用户的购买记录流水作为训练数据,用户侧特征是年龄,性别,会员年限等离散特征,商品侧特征采用商品的二级类目,产地,品牌三个离散特征,随机构造负样本,一共有10个特征域,全部是离散特征,对于枚举值过多的特征采用hash分箱,得到一共72个特征。
PyTorch代码实现如下

import torch
import torch.nn as nn
from torch.utils.data import DataLoader, random_split, TensorDataset


class Linear(nn.Module):
    def __init__(self, feat_num):
        super(Linear, self).__init__()
        self.embedding = nn.Embedding(feat_num, 1)
        self.bias = nn.Parameter(torch.zeros(1))
        nn.init.xavier_normal_(self.embedding.weight.data)

    def forward(self, x):
        # [None, field_dim] => [None, field, 1] => [None, 1]
        out = self.embedding(x).sum(dim=1) + self.bias
        return out


class Embedding(nn.Module):
    def __init__(self, feat_num, k_dim):
        super(Embedding, self).__init__()
        self.embedding = nn.Embedding(feat_num, k_dim)
        nn.init.xavier_uniform_(self.embedding.weight.data)

    def forward(self, x):
        return self.embedding(x)


class FM(nn.Module):
    def __init__(self):
        super(FM, self).__init__()

    def forward(self, x):
        square_of_sum = torch.sum(x, dim=1) ** 2
        sum_of_square = torch.sum(x ** 2, dim=1)
        ix = square_of_sum - sum_of_square
        # [None, 1]
        out = 0.5 * torch.sum(ix, dim=1, keepdim=True)
        return out


class DNN(nn.Module):
    def __init__(self, input_dim, fc_dims=(64, 16), dropout=0.1):
        super(DNN, self).__init__()
        layers = list()
        for fc_dim in fc_dims:
            layers.append(nn.Linear(input_dim, fc_dim))
            layers.append(nn.BatchNorm1d(fc_dim))
            layers.append(nn.ReLU())
            layers.append(nn.Dropout(p=dropout))
            input_dim = fc_dim
        layers.append(nn.Linear(input_dim, 1))
        self.mlp = torch.nn.Sequential(*layers)

    def forward(self, x):
        return self.mlp(x)


class Model(nn.Module):
    def __init__(self, field_num, feat_num, k_dim, fc_dims=(64, 16), dropout=0.1):
        super(Model, self).__init__()
        self.linear = Linear(feat_num=feat_num)
        self.embedding = Embedding(feat_num, k_dim)
        self.fm = FM()
        self.fc_input_dim = field_num * k_dim
        self.dnn = DNN(self.fc_input_dim, fc_dims, dropout)

    def forward(self, x):
        linear_out = self.linear(x)
        # [None, feat_size, k_dim]
        emb = self.embedding(x)
        fm_out = self.fm(emb)
        dnn_out = self.dnn(torch.reshape(emb, [-1, self.fc_input_dim]))
        out = torch.sigmoid(linear_out + fm_out + dnn_out)
        return out.squeeze(dim=1)

本例全部是离散分箱变量,所有有值的特征都是1,因此只要输入有值位置的索引即可,一条输入例如

>>> train_data[0]
Out[120]: (tensor([ 2, 10, 14, 18, 34, 39, 47, 51, 58, 64]), tensor(0))

其中x的长度10代表10个特征域,每个域的值是特征的全局位置索引,从0到71,一共72个特征。其中FM和DNN共用了Embedding对象。


DeepFM和FM,FFM模型效果对比

采用验证集的10次AUC不上升作为早停,FM,FFM,DeepFM的平均验证集AUC如下

FMFFMDeepFM
AUC0.6260.6300.631

DeepFM相比FM增加了DNN结构,AUC提升了0.5个百分点较为明显,而对比FFM,DeepFM也有略微提升,提升0.1个百分点。

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/681960.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis 单线程问题 BigKey问题

前言 简单的redis基础类型以及常用操作我们都也已经介绍过了 现在今天我们来谈谈redis对于单线程是需要怎么理解的 以及redis假设遇见大key我们需要怎么去查询和删除呢??? redis单线程 假设有个人现在问你一个问题:redis是单线程的还是多线程的 这个问题本身就不严谨 就像问…

植物大战僵尸杂交版2.0.88最新版+防闪退工具V2+修改工具+高清工具

植物大战僵尸杂交版,不仅继承原作的经典玩法,而且引入了全新的植物融合玩法,将各式各样的植物进行巧妙的杂交,孕育出前所未有、功能各异的全新植物。 创新的杂交合成系统 游戏引入了创新的杂交合成系统,让玩家可以将不…

每天CTF小练--ctfshow新手村

easy_base 密文:0XezFWZfNXafRjNlNXYit3dvh2cmR3Y 等号在前面,直接倒序后解码 ctfshow{base64_is_easy} 代码解: s 0XezFWZfNXafRjNlNXYit3dvh2cmR3Y print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转…

LLaSM:Large language and speech model

1.Introduction 级联方法使用ASR将语音输入转化为文本输入,语音到文本会导致信息损失,本文提出LLaSM,一个具有跨模态对话能力的大型语音与语言模型,能够理解和遵循语音与语言指令,借鉴LLaVA,利用预训练的语音模态编码器和大语言模型,使用Whisper作为语音编码器,将语音…

iOS18 新变化提前了解,除了AI还有这些变化

iOS 18即将在不久的将来与广大iPhone用户见面,这次更新被普遍认为是苹果历史上最重要的软件更新之一。据多方报道和泄露的消息,iOS 18将带来一系列全新的功能和改进,包括在人工智能领域的重大突破、全新的设计元素以及增强的性能和安全性。现…

Linux之文件操作

目录 第1关:文件的创建 任务描述 相关知识 文件的创建 编程要求 答案: 第2关:文件打开与关闭 任务描述 相关知识 文件的打开 文件的关闭 编程要求 答案: 第3关:文件读写操作 任务描述 相关知识 文件的写操作 文件的读…

Meta Llama 3 残差结构

Meta Llama 3 残差结构 flyfish 在Transformer架构中,残差结构(Residual Connections)是一个关键组件,它在模型的性能和训练稳定性上起到了重要作用。残差结构最早由He et al.在ResNet中提出,并被广泛应用于各种深度…

项目-双人五子棋对战:匹配模块的实现(3)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 模块详细讲解 功能需求 匹配就类似于大家平常玩的王者荣耀这样的匹配功能, 当玩家点击匹配之后, 就会进入到一个匹配队列, 当匹配到足够数量的玩家后, 就会进入确认页. 在这里, 我们主要实现的是1 - 1匹配功能, 首先先…

【Git】分支管理 -- 详解

一、理解分支 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习 C 的时候,另一个你正在另一个平行宇宙里努力学习 JAVA。 如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙…

ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家

作者:文婷 引言 如何正确使用消息队列保证业务集成链路的稳定性,是消息队列用户首要关心的问题。ApsaraMQ Copilot for RocketMQ 从集成业务稳定性、成本、性能等方面帮助用户更高效地使用产品。 背景 消息队列产品通过异步消息的传递,来…

使用Qt对word文档进行读写

目录 开发环境原理使用的QT库搭建开发环境准备word模板测试用例结果Gitee地址 开发环境 vs2022 Qt 5.9.1 msvc2017_x64,在文章最后提供了源码。 原理 Qt对于word文档的操作都是在书签位置进行插入文本、图片或表格的操作。 使用的QT库 除了基本的gui、core、…

Bond网卡

一、Bond网卡 1.1 Bond网卡概述 Bond网卡是指使用 Linux 系统中的 Bonding 技术创建的虚拟网络接口。 Bonding 技术允许将多个物理网卡(也称为接口或端口)绑定在一起,形成一个虚拟的网络接口,以增加网络带宽、提高网络容错性和…

【ARM Cache 及 MMU 系列文章 6 -- Cache 寄存器 CTR | CLIDR | CCSIDR | CSSELR 使用详解 1】

文章目录 Cache 常用寄存器Cache CSSELR 寄存器Cache CSSELR 使用场景Cache CSSELR 操作示例 Cache CLIDR 寄存器LoUU 介绍LoUU 使用 LoUIS 介绍CLIDR 使用 Cache CCSIDR 寄存器 Cache 常用寄存器 ARM Cache 常用到寄存器有以下几个: CSSELR, Cache Size Selectio…

VS2022,lib调用dll工程的一个函数

lib工程本身是一个静态库工程,没有链接器设置。然而,我们依然可以在lib工程中调用DLL工程中的函数,只需要确保头文件正确导入,并在最终使用lib的可执行文件项目中正确链接DLL的.lib文件。下面是一个详细的步骤说明: 假…

Windows 宿主机访问 VirtualBox 虚拟机中创建的 docker 容器中的 mysql8.0 的数据

一、场景需求 在开发环境中,一般使用 windows 系统进行开发,但需要在 linux 系统中创建运行 mysql8.0 的 docker 容器中进行测试(win10特定版本或win11才能安装 docker),为了方便还需要在 windows 系统中通过 SQLyog …

python ---requests

python包管理工具 pip 若发现报错,则可以通过 -i 命令指定软件源 requests库安装 通过 pip ,如上 或通过 pycharm 搜索 requests ,并安装即可 下载成功的证明 requests库使用 模拟 http 重要参数如下 如何模拟发包 支持模拟各种 http meth…

前端_防抖节流

目录 一、防抖(debounce) 1.使用场景 2.js代码实现 3.lodash工具库使用 二、节流(throttle) 1.使用场景 2.js代码实现 3.lodash工具库使用 前端做项目,为了防止用户因为网络不好数据响应慢,导致进行…

ARM的工作模式

ARM的几种工作模式 User : 非特权模式,大部分任务执行在这种模式 FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式 Supervisor(SVC) : 当复位或软中断…

利用短视频平台,轻松引流获客:自动私信评论策略全解析

在数字化时代,短视频已成为互联网流量的新蓝海,其独特的视觉吸引力和高度的用户粘性为各行各业提供了前所未有的营销机遇。无论是初创企业还是成熟品牌,都能通过短视频平台有效触达目标客户,实现高效引流与获客。本文将深入探讨如…

高通开发系列 - 借助libhybris库实现Linux系统中使用Andorid库(2)

By: fulinux E-mail: fulinuxsina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 参考上一篇文章:高通开发系列 - 借助libhybris库实现Linux系统中使用And…