深度推荐模型之NFM模型
NFM
背景
今天学习深度推荐模型中的NFM(Neural Factorization Machines)模型,该模型是由2017年在SIGIR会议上提出的。CTR预估中,为了解决稀疏特征的问题,学者们提出了FM模型来建模特征之间的交互关系。但是FM模型只能表达特征之间两两组合之间的关系,无法建模两个特征之间深层次的关系或者说多个特征之间的交互关系,所以通过Deep Network来建模更高阶的特征之间的关系,提出了一种将FM融合进DNN的策略,通过引进了一个特征交叉池化层的结构,使得FM与DNN进行了完美衔接,这样就组合了FM的建模低阶特征交互能力和DNN学习高阶特征交互和非线性的能力,形成了深度学习时代的神经FM模型(NFM)。
NFM模型
由上面我们知道NFM模型与DeepFM模型类似,都是与DNN相结合得到的,只是DeepFM模型是并行结构,NFM是串行结构,下面看一下NFM模型的目标函数:
之前我们学的FM模型的公式如下:
由上面两个公式可以看出,二者在前半部分是一样的,后面在NFM中用一个函数来代替FM中二阶向量交叉,通常将这个函数用一个底层考虑交叉,高层使用的一个DNN,最后得到NFM模型。模型结构如下:
由图可以看出,NFM模型即是在Embedding层和Hidden之间加了一个B-Interation(特征交叉池化层)。假设Vx\mathcal{V}_{x}Vx是所有特征embedding的集合, 那么在特征交叉池化层的操作:
fBI(Vx)=∑i=1n∑j=i+1nxivi⊙xjvjf_{B I}\left(\mathcal{V}{x}\right)=\sum_{i=1}^{n} \sum_{j=i+1}^{n} x_{i} \mathbf{v}{i} \odot x{j} \mathbf{v}_{j} fBI(Vx)=i=1∑nj=i+1∑nxivi⊙xjvj
⊙\odot⊙表示两个向量的元素积操作,即两个向量对应维度相乘得到的元素积向量(可不是点乘呀),其中第kkk维的操作: (vi⊙vj)k=vikvjk\left(v_{i} \odot v_{j}\right){k}=\boldsymbol{v}{i k} \boldsymbol{v}_{j k} (vi⊙vj)k=vikvjk
NFM实现
NFM模型的实现,把输入分成linear input和dnn input两种情况,所以模型会分为linear 和 dnn两部分,下面分别介绍这两部分:
linear:这部分是有关于线性计算,也就是FM的前半部分w1x1+w2x2...wnxn+bw_1x_1+w_2x_2...w_nx_n+bw1x1+w2x2...wnxn+b的计算
dnn:这部分是后面交叉特征的那部分计算,FM的最后那部分公式f(x)。 这一块主要是针对离散的特征,首先过embedding, 然后过特征交叉池化层
模型的最后输出结果,就是把这两个部分的输出结果加和(当然也可以加权),再过一个sigmoid得到
代码参考
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)# 加个BatchNormalization
pooling_output = BatchNormalization()(pooling_output)# dnn部分的计算
dnn_logits = get_dnn_logits(pooling_output)# 线性部分和dnn部分的结果相加,最后再过个sigmoid
output_logits = Add()([linear_logits, dnn_logits])
output_layers = Activation("sigmoid")(output_logits)model = Model(inputs=input_layers, outputs=output_layers)return model
参考
DataWhale 组队学习
NFM模型理论与实践
推荐系统遇上深度学习(七)–NFM模型理论和实践
论文
深度推荐模型之NFM模型相关推荐
- 手搭深度推荐模型(四) NFM
本文是笔者参与datawhale组织的深度推荐模型组队学习的分享,学习内容见本链接 ,本文中所指的教程即该链接中的相应文件. 一.概念 为了在稀疏条件下有更好的预测性能,2017年何向南教授等人在SI ...
- 深度推荐模型 -NFM
NFM 文章目录 NFM 提出背景 & 与其他模型的关系 FM回顾 NFM公式 NFM网络总体结构 网络各层的详细解释 Input层和Embedding层 Bi-Interaction Poo ...
- 深度推荐模型-NFM
一.动机 传统的FM模型仅局限于线性表达和二阶交互,无法胜任生活中各种具有复杂结构和规律性的真实数据,针对这点不足,作者提出了一种将FM融合进DNN的策略,通过引进一个特征交叉池化层的结构,使得FM与 ...
- 【组队学习】【23期】Datawhale深度推荐模型
深度推荐模型 开源内容:https://github.com/datawhalechina/team-learning-rs/tree/master/DeepRecommendationModel 基 ...
- 注意力机制在深度推荐算法中的应用之AFM模型
1 前言 注意力机制来源于人类最自然的选择性注意的习惯,例如当用户浏览网页或图片时,会选择性的注意页面上特定的区域.基于此现象,在建模的过程中考虑注意力机制,往往会取得不错的收益. 注意力机制已经广泛 ...
- 推荐系统(7)——推荐算法4(深度学习时代来临:模型结构上的突破)ACF、DIN、DIEN、DRN
文章目录 1 ACF,DIN--注意力机制在推荐上的应用 1.1 AFM--NFM的交叉特征+Attention得分 1.2 DIN--淘系广告商品推荐的业务角度 1.3 注意力机制对于推荐系统的启发 ...
- 谷歌引入自动网络设计,高效解决大规模深度推荐模型的特征嵌入问题
来源 | 深度传送门(ID:gh_5faae7b50fc5) 导读:本文主要介绍Google在大规模深度推荐模型上关于特征嵌入的最新论文. 一.背景 大部分的深度学习模型主要包含如下的两大模块:输入模 ...
- Google最新论文:大规模深度推荐模型的特征嵌入问题有解了!
转载自深度传送门(ID: gh_5faae7b50fc5) 导读:本文主要介绍下Google在大规模深度推荐模型上关于特征嵌入的最新论文. 一.背景 大部分的深度学习模型主要包含如下的两大模块:输入模 ...
- 腾讯优图吴永坚:迈向深度学习,我们面临模型训练与推荐的双重考验
整理 | 琥珀 出品 | AI 科技大本营 对腾讯优图的发展历程,吴永坚表示,优图是非常幸运的,幸运的同时也知道优图选对了方向,只要坚持,还是会有收获的. 12 月 15 日,以"新趋势.新 ...
最新文章
- spring boot logback_SpringBoot集成logback后访问日志端点
- python input和print,Python基础——输出[print()]与输入[input()]
- Unity3D研究院之与Android相互传递消息
- 2017-2-19 C#基础 基本数据类型的转换,转义字符,常量
- 分享一个现代的,免费的,简单而有效的编辑器Vis
- Vue—基础概念—实例
- 非常好用的轮播图插件
- php 应用程序错误,系统化PHP中的Web应用程序的错误代码?
- 20165302 学习基础和C语言基础调查
- eventemitter_节点JS事件模块和EventEmitter
- 用python快速开发一个实用的socket服务器
- 给控件做数字签名之二:生成证书文件
- 怎么提高文公写作水平?公文写作请示类模板
- iOS安装包瘦身小记
- imac 升级 ssd_如何在较旧的2007-2009 iMac中安装SSD
- Bezier曲线及其de casteljau算法 matlab实现
- 北大MBA夫妇不满现有教育系统 携女隐居终南山
- CROSSFORMER: A VERSATILE VISION TRANSFORMER BASED ON CROSS-SCALE ATTENTION
- java.lang.ClassNotFoundException问题的解决
- python爬取京东商品评价信息
热门文章
- 美国佐治亚大学计算机专业,美国佐治亚大学排名
- 汉字转拼音的c++实现
- (java.sql.SQLException: Cannot create com.entity.Book: com.entity.Book ...: [1]解决方案)
- 【Android】腾讯即时通讯SDK的初次接入的详细记录
- mysql tablespace is missing for table_Mysql报错:Tablespace is missing for table ‘db_rsk/XXX”
- 大学计算机科学与技术试题,大学计算机试题模拟卷3-大学教育计算机科学与技术类计算机及应用试卷与试题.pdf...
- 跨站漏洞解析-小韩网站编程安全系列一
- 图神经网络(GNNs)模型学习笔记与总结
- java-IO流(4)-对象流及其序列化介绍
- 英文原著词汇数量测量