深度模型笔记03 DeepFM原理与应用

2023-10-07 22:38

本文主要是介绍深度模型笔记03 DeepFM原理与应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

深度模型笔记03 DeepFM原理与应用

引言:本节需要先了解关于FM和Deep的一些知识,学习链接参考:datawhale

1. DeepFM网络结构和原理

在这里插入图片描述
简单来说,DeepFM模型由Deep模型和FM模型的输出通过一个sigmoid函数获得。
y = s i g m o i d ( y F M + y D N N ) y=sigmoid(y_FM+y_DNN) y=sigmoid(yFM+yDNN)

  • FM:一阶特征部分与二阶特征交叉部分组成
  • DNN:高阶特征交叉
    在构建模型的时候需要分别对这三部分输入的特征进行选择。

1.1 采用随机梯度下降SGD训练FM

FM模型公式如下:
y ( x ) = w 0 + ∑ i = 1 d w i x i + 1 / 2 ∑ f = 1 k ( ( ∑ i = 1 d v i , f x i ) 2 − ∑ i = 1 d v i , f 2 x i 2 ) y(x)=w_0+\sum_{i=1}^dw_ix_i+1/2\sum_{f=1}^k((\sum_{i=1}^dv_{i,f}x_i)^2-\sum_{i=1}^dv_{i,f}^2x_i^2) y(x)=w0+i=1dwixi+1/2f=1k((i=1dvi,fxi)2i=1dvi,f2xi2)
当FM使用梯度下降法进行学习时,模型的梯度为:
在这里插入图片描述式中, ∑ j = 1 d v i , j x j \sum_{j=1}^dv_{i,j}x_j j=1dvi,jxj只与f有关而与I无关,在每次迭代过程中,可以预先对所有f的 ∑ j = 1 d v i , j x j \sum_{j=1}^dv_{i,j}x_j j=1dvi,jxj进行计算,复杂度 O ( k d ) O(kd) O(kd),就能在常数时间 O ( 1 ) O(1) O(1)内得到 v i , f v_{i,f} vi,f的梯度。而对于其他参数的 w 0 w_0 w0 w i w_i wi,也是在常数时间里计算梯度。此外,更新参数只需要 O ( 1 ) O(1) O(1),一共有 1 + d + k d 1+d+kd 1+d+kd个参数,因此FM参数训练的复杂度也是 O ( k d ) O(kd) O(kd)

1.2 关于Sparse Feature中不同颜色节点代表的含义

  • 灰色节点
  • 黄色节点
    Sparse Feature层总共有M个field,每个field对应k个嵌入维数,而在由输入得到embedding Vector的过程中,需要考虑同一个field位置下0、1的个数。一般对于输入的一条记录,同一个field只有一个位置是1,也就是黄色节点代表的含义。对应的,灰色节点代表的是0的含义。

2.具体构造代码如下:

def DeepFM(linear_feature_columns, dnn_feature_columns):# 构建输入层,即所有特征对应的Input()层,这里使用字典的形式返回,方便后续构建模型dense_input_dict, sparse_input_dict = build_input_layers(linear_feature_columns + dnn_feature_columns)# 将linear部分的特征中sparse特征筛选出来,后面用来做1维的embeddinglinear_sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), linear_feature_columns))# 构建模型的输入层,模型的输入层不能是字典的形式,应该将字典的形式转换成列表的形式# 注意:这里实际的输入与Input()层的对应,是通过模型输入时候的字典数据的key与对应name的Input层input_layers = list(dense_input_dict.values()) + list(sparse_input_dict.values())# linear_logits由两部分组成,分别是dense特征的logits和sparse特征的logitslinear_logits = get_linear_logits(dense_input_dict, sparse_input_dict, linear_sparse_feature_columns)# 构建维度为k的embedding层,这里使用字典的形式返回,方便后面搭建模型# embedding层用户构建FM交叉部分和DNN的输入部分embedding_layers = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False)# 将输入到dnn中的所有sparse特征筛选出来dnn_sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), dnn_feature_columns))fm_logits = get_fm_logits(sparse_input_dict, dnn_sparse_feature_columns, embedding_layers) # 只考虑二阶项# 将所有的Embedding都拼起来,一起输入到dnn中dnn_logits = get_dnn_logits(sparse_input_dict, dnn_sparse_feature_columns, embedding_layers)# 将linear,FM,dnn的logits相加作为最终的logitsoutput_logits = Add()([linear_logits, fm_logits, dnn_logits])# 这里的激活函数使用sigmoidoutput_layers = Activation("sigmoid")(output_logits)model = Model(input_layers, output_layers)return model

这篇关于深度模型笔记03 DeepFM原理与应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160888

相关文章

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

Java领域模型示例详解

《Java领域模型示例详解》本文介绍了Java领域模型(POJO/Entity/VO/DTO/BO)的定义、用途和区别,强调了它们在不同场景下的角色和使用场景,文章还通过一个流程示例展示了各模型如何协... 目录Java领域模型(POJO / Entity / VO/ DTO / BO)一、为什么需要领域模

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

Java枚举类型深度详解

《Java枚举类型深度详解》Java的枚举类型(enum)是一种强大的工具,它不仅可以让你的代码更简洁、可读,而且通过类型安全、常量集合、方法重写和接口实现等特性,使得枚举在很多场景下都非常有用,本文... 目录前言1. enum关键字的使用:定义枚举类型什么是枚举类型?如何定义枚举类型?使用枚举类型:2.