DeepFM原理及tensorflow代码实战
目录
1、背景
2、引入
FM挑战
DNN的局限
3、组件介绍
FM
Deep
4、代码解析
1、背景
之前说了wide&deepGoogle于 2016 年在DLRS上发表了一篇文章:2016-Wide & Deep Learning for Recommender Systems,模型的核心思想是结合线性模型的记忆能力(memorization)和 DNN 模型的泛化能力(generalization),在训练过程中同时优化 2 个模型的参数,从而达到整体模型的预测能力最优。
但是由于Wide & Deep的wide部分是一个LR模型,因此仍然需要大量的人工特征工程工作。但是Wide & Deep模型给整个学术界和工业界提供了一种框架思想。基于这种思想,华为诺叶方舟团队结合FM的特征交叉功能,将Wide & Deep的LR部分替换成FM来避免人工工程,提出了Deep FM模型。
整体的结构如图
2、引入
特征组合的挑战
对于一个基于CTR预估的推荐系统,最重要的是学习到用户点击行为背后隐含的特征组合。在不同的推荐场景中,低阶组合特征或者高阶组合特征可能都会对最终的CTR产生影响。
之前介绍的因子分解机(Factorization Machines, FM)通过对于每一维特征的隐变量内积来提取特征组合。最终的结果也非常好。但是,虽然理论上来讲FM可以对高阶特征组合进行建模,但实际上因为计算复杂度的原因一般都只用到了二阶特征组合。
那么对于高阶的特征组合来说,我们很自然的想法,通过多层的神经网络即DNN去解决。
DNN的局限
下面的图片来自于张俊林教授在AI大会上所使用的PPT。
对于离散特征的处理,我们使用的是将特征转换成为one-hot的形式,但是将One-hot类型的特征输入到DNN中,会导致网络参数太多:
如何解决这个问题呢,类似于FFM中的思想,将特征分为不同的field:
再加两层的全链接层,让Dense Vector进行组合,那么高阶特征的组合就出来了
但是低阶和高阶特征组合隐含地体现在隐藏层中,如果我们希望把低阶特征组合单独建模,然后融合高阶特征组合。
即将DNN与FM进行一个合理的融合:
二者的融合总的来说有两种形式,一是串行结构,二是并行结构
DeepFM,就是并行结构中的一种典型代表。
如下:
3、组件介绍
DeepFM包含两部分:神经网络部分与因子分解机部分,分别负责低阶特征的提取和高阶特征的提取。这两部分共享同样的输入。DeepFM的预测结果可以写为:
FM
FM部分是一个因子分解机。关于因子分解机可以参阅文章[Rendle, 2010] Steffen Rendle. Factorization machines. In ICDM, 2010.。因为引入了隐变量的原因,对于几乎不出现或者很少出现的隐变量,FM也可以很好的学习。
FM的输出公式为:
Deep
深度部分是一个前馈神经网络。与图像或者语音这类输入不同,图像语音的输入一般是连续而且密集的,然而用于CTR的输入一般是及其稀疏的。因此需要重新设计网络结构。具体实现中为,在第一层隐含层之前,引入一个嵌入层来完成将输入向量压缩到低维稠密向量。
嵌入层(embedding layer)的结构如上图所示。当前网络结构有两个有趣的特性,1)尽管不同field的输入长度不同,但是embedding之后向量的长度均为K。2)在FM里得到的隐变量Vik现在作为了嵌入层网络的权重。
这里的第二点如何理解呢,假设我们的k=5,首先,对于输入的一条记录,同一个field 只有一个位置是1,那么在由输入得到dense vector的过程中,输入层只有一个神经元起作用,得到的dense vector其实就是输入层到embedding层该神经元相连的五条线的权重,即vi1,vi2,vi3,vi4,vi5。这五个值组合起来就是我们在FM中所提到的Vi。在FM部分和DNN部分,这一块是共享权重的,对同一个特征来说,得到的Vi是相同的。
4、代码解析
整个模型是由FM + Deep组成,所以代码也是按照这个逻辑来做的
FM包括两个部分,一个是线性部分,另一个是Embedding
可以根据公示进行得到
Y_liner = tf.matmul(x, W) + bembeddings = tf.multiply(v, Input_x) # None * V * X
summed_features_emb = tf.reduce_sum(embeddings, 1) # sum(v*x) summed_features_emb_square = tf.square(summed_features_emb) # (sum(v*x))^2# square_sum part
squared_features_emb = tf.square(embeddings) # (v*x)^2
squared_sum_features_emb = tf.reduce_sum(squared_features_emb, 1) # sum((v*x)^2)Y_pair = 0.5 * tf.subtract(summed_features_emb_square, squared_sum_features_emb) # 0.5*((sum(v*x))^2 - sum((v*x)^2))
deep部分,就是将Embedding part的输出再经过两层全链接
input_size = n_features*fv
output_size = dnn_layer[0]
deep_inputs = tf.reshape(embeddings, shape=[-1, input_size]) # None * (F*K)
print("%s: %s" % ("lay1, deep_inputs", deep_inputs))# 全连接计算
deep_outputs = udf_full_connect(deep_inputs, input_size, output_size, dnn_active_fuc[0])for i in range(len(dnn_layer) - 1):with tf.variable_scope("deep_layer%d"%(i+2), reuse=tf.AUTO_REUSE):print("lay%s, input_size: %s, output_size: %s, active_fuc: %s" % (i+2, dnn_layer[i], dnn_layer[i+1], dnn_active_fuc[i+1]))# 全连接计算deep_outputs = udf_full_connect(deep_outputs, dnn_layer[i], dnn_layer[i+1], dnn_active_fuc[i+1])print("lay%s, deep_outputs: %s" % (i+2, deep_outputs))# 输出层计算
print("lay_last, input_size: %s, output_size: %s, active_fuc: %s" % (dnn_layer[-1], 2, dnn_active_fuc[-1]))
with tf.variable_scope("deep_layer%d"%(len(dnn_layer)+1), reuse=tf.AUTO_REUSE):deep_outputs = udf_full_connect(deep_outputs, dnn_layer[-1],2, dnn_active_fuc[-1])
最后把两部分输入进行结合
concat_input = tf.concat([Y_liner, Y_pair, Y_deep], axis=1)
Y_sum = tf.reduce_sum(concat_input, 1)
print("Y_sum",Y_sum)
score=tf.nn.sigmoid(Y_sum,name='score')
After 900 steps, loss_value is: 0.522057 After 900 trainging steps ,validation accuarcy is 77.1932% Testing Accuracyis 77.4728%
完整代码可以到GitHub进行查看
https://github.com/Andyszl/Recommendation_algorithm/tree/tensorflow
DeepFM原理及tensorflow代码实战相关推荐
- 【SemiDrive源码分析】【MailBox核间通信】51 - DCF_IPCC_Property实现原理分析 及 代码实战
[SemiDrive源码分析][MailBox核间通信]51 - DCF_IPCC_Property实现原理分析 及 代码实战 一.RTOS 侧 Property Service 初始化流程 1.1 ...
- 如何用Diffusion models做interpolation插值任务?——原理解析和代码实战
Diffusion Models专栏文章汇总:入门与实战 前言:很多Diffusion models的论文里都演示了插值任务,今天我们讲解一下如何用DDIM/DDPM做interpolation任务 ...
- 边框检测原理与Tensorflow代码
要学习目标检测算法吗?任何一个ML学习者都希望能够给图像中的目标物体圈个漂亮的框框,在这篇文章中我们将学习目标检测中的一个基本概念:边框回归/Bounding Box Regression.边框回归并 ...
- CGAN原理及tensorflow代码
1.首先说明一下CGAN的意义 GAN的原始模型有很多可以改进的缺点,首当其中就是"模型不可控".从上面对GAN的介绍能够看出,模型以一个随机噪声为输入.显然,我们很难对输出的结构 ...
- BART原理简介与代码实战
写在前面 最近huggingface的transformer库,增加了BART模型,Bart是该库中最早的Seq2Seq模型之一,在文本生成任务,例如摘要抽取方面达到了SOTA的结果. 本次放出了三组 ...
- 推荐算法DeepFM原理介绍及tensorflow代码实现
DeepFM 目标: 产生背景: 模型介绍: 善于处理特征交叉的机器学习模型 FM 如何优化FM的计算效率 深度学习模型和 FM 模型的结合 DeepFM 特征交叉新方法:元素积操作 技巧: 代码部分 ...
- tensorflow63 《深度学习原理与TensorFlow实战》03 Hello TensorFlow
00 基本信息 <深度学习原理与TensorFlow实战>书中涉及到的代码主要来源于: A:Tensorflow/TensorflowModel/TFLean的样例, B:https:// ...
- tensorflow72 《深度学习原理与TensorFlow实战》05 RNN能说会道 03 对话机器人(chatbot)
01 基本环境 #<深度学习原理与TensorFlow实战>05 RNN能说会道 # 书源码地址:https://github.com/DeepVisionTeam/TensorFlowB ...
- tensorflow71 《深度学习原理与TensorFlow实战》05 RNN能说会道 02语言模型
01 基本信息 #<深度学习原理与TensorFlow实战>05 RNN能说会道 # 书源码地址:https://github.com/DeepVisionTeam/TensorFlowB ...
最新文章
- (二)Linux命令使用
- linux 中断程序设计,Linux中断编程
- 无线局域网技术白皮书
- 将CAGradientLayer当做mask使用
- 设计模式-Factory Method Pattern
- 下一代大数据处理引擎,阿里云实时计算独享模式重磅发布
- 盘点数据处理工具,手把手教你做数据清洗和转换
- 如何手动实现C语言中的字符串操作
- js为lable和div赋值
- Windows autoKeras的下载与安装连接
- win7 用 Activation激活 重启 进入 Acer eRecovery Management 解决办法
- R语言迹检验协整关系式_【R语言】单位根检验、协整检验和格兰杰因果关系检验三者之间的关系...
- 对称矩阵(MIT课程)
- 企鹅撞冰块Java游戏_亲子桌面游戏玩具 拯救企鹅敲打冰块玩法
- linux下7z文件解压命令
- PHP+MYSQL【学生信息管理系统】(极简版)
- MySQL 字符串删除表情符_字符串中Emoji表情处理
- date日期格式 yyyy-MM-dd HH:mm:ss 大小写区别
- webrtc视频引擎之video_render(视频渲染)介绍
- 金仓数据库KingbaseES使用ksql连接认证失败
热门文章
- 无极性电容和有极性电容的爆炸
- 某粉丝网蓝色DZ论坛模板
- MC9S12XS128硬件底层驱动_set_bus_clk.h(总线时钟设置)
- 最大化参数 火车头_火车头采集器菜鸟使用手册
- Beyond Compare v3.3.13 中文版
- Hust oj 2125 钱多多(水题)
- 90后技术宅研发Magi一夜爆红,新一代知识化结构搜索新时代来了?
- Windows10 - 使用命令行批量修改文件后缀名
- MTBD 电影市场分析
- 设计一个程序,程序中有三个类,Triangle,Lader,Circle。