深度模型笔记04 NFM模型与应用

2023-10-07 22:38
文章标签 应用 笔记 深度 模型 04 nfm

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

深度模型笔记04 NFM模型与应用

具体NFM模型学习资料来源请参考datawhale

1.NFM模型

一句话来描述NFM,NFM模型是在FM的模型基础上引进特征交叉池化层,使FM和DNN完美衔接的模型,既具有FM的低阶特征交互能力,又具有DNN学习高阶特征交互和非线性的能力。
模型大致结构如下图所示:
在这里插入图片描述
各层作用如下:

  • input和embedding层:输入层,稀疏输入转稠密向量
  • Bi-Interaction Layer:NFM模型最关键的一层,组合二阶交叉信息,给DNN进行高阶交叉的学习
  • Hidden Layer:堆积隐藏层以期来学习高阶组合特征
  • Prediction Layer:用来预测,回归问题。

2.代码实现

def NFM(linear_feature_columns, dnn_feature_columns):"""搭建NFM模型,上面已经把所有组块都写好了,这里拼起来就好:param linear_feature_columns: A list. 里面的每个元素是namedtuple(元组的一种扩展类型,同时支持序号和属性名访问组件)类型,表示的是linear数据的特征封装版:param dnn_feature_columns: A list. 里面的每个元素是namedtuple(元组的一种扩展类型,同时支持序号和属性名访问组件)类型,表示的是DNN数据的特征封装版"""# 构建输入层,即所有特征对应的Input()层, 这里使用字典的形式返回, 方便后续构建模型# 构建模型的输入层,模型的输入层不能是字典的形式,应该将字典的形式转换成列表的形式# 注意:这里实际的输入与Input()层的对应,是通过模型输入时候的字典数据的key与对应name的Input层dense_input_dict, sparse_input_dict = build_input_layers(linear_feature_columns+dnn_feature_columns)input_layers = list(dense_input_dict.values()) + list(sparse_input_dict.values())# 线性部分的计算 w1x1 + w2x2 + ..wnxn + b部分,dense特征和sparse两部分的计算结果组成,具体看上面细节linear_logits = get_linear_logits(dense_input_dict, sparse_input_dict, linear_feature_columns)# DNN部分的计算# 首先,在这里构建DNN部分的embedding层,之所以写在这里,是为了灵活的迁移到其他网络上,这里用字典的形式返回# embedding层用于构建FM交叉部分以及DNN的输入部分embedding_layers = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False)# 过特征交叉池化层pooling_output = get_bi_interaction_pooling_output(sparse_input_dict, dnn_feature_columns, embedding_layers)# 加个BatchNormalizationpooling_output = BatchNormalization()(pooling_output)# dnn部分的计算dnn_logits = get_dnn_logits(pooling_output)# 线性部分和dnn部分的结果相加,最后再过个sigmoidoutput_logits = Add()([linear_logits, dnn_logits])output_layers = Activation("sigmoid")(output_logits)model = Model(inputs=input_layers, outputs=output_layers)return model

3. NFM与FM对比

3.1 异同:
FM:以线性的方式学习二阶特征交互,对于捕获现实数据非线性和复杂的内在结构表达力不够
NFM:增加Bi-Interaction层操作来对二阶组合特征进行建模。使得low level的输入表达的信息更加的丰富,极大的提高了后面隐藏层学习高阶非线性组合特征的能力。Bi-Interaction层实际是一个pooling层操作,计算的方式是将嵌入向量对应位置相乘,即元素积。而FM计算的是内积。
NFM特例:当元素权重为常数向量[1,1,...1]时,NFM退化为FM,说明除特征交叉池化层的计算外,NFM和FM基本相同
3.2 代码上进行对比

#不同点
#NFM模型中加入:特征交叉池化层(Bi-Interaction层)
pooling_output =
get_bi_interaction_pooling_output(sparse_input_dict, dnn_feature_columns, embedding_layers)    
pooling_output = BatchNormalization()(pooling_output)

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



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

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动