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

本文主要是介绍特征交叉系列: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, TensorDatasetclass 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.biasreturn outclass 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) ** 2sum_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 outclass 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_dimlayers.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_dimself.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%免费

这篇关于特征交叉系列:FM和深度神经网络的结合,DeepFM原理简述和实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式