目录

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代码实战相关推荐

  1. 【SemiDrive源码分析】【MailBox核间通信】51 - DCF_IPCC_Property实现原理分析 及 代码实战

    [SemiDrive源码分析][MailBox核间通信]51 - DCF_IPCC_Property实现原理分析 及 代码实战 一.RTOS 侧 Property Service 初始化流程 1.1 ...

  2. 如何用Diffusion models做interpolation插值任务?——原理解析和代码实战

    Diffusion Models专栏文章汇总:入门与实战  前言:很多Diffusion models的论文里都演示了插值任务,今天我们讲解一下如何用DDIM/DDPM做interpolation任务 ...

  3. 边框检测原理与Tensorflow代码

    要学习目标检测算法吗?任何一个ML学习者都希望能够给图像中的目标物体圈个漂亮的框框,在这篇文章中我们将学习目标检测中的一个基本概念:边框回归/Bounding Box Regression.边框回归并 ...

  4. CGAN原理及tensorflow代码

    1.首先说明一下CGAN的意义 GAN的原始模型有很多可以改进的缺点,首当其中就是"模型不可控".从上面对GAN的介绍能够看出,模型以一个随机噪声为输入.显然,我们很难对输出的结构 ...

  5. BART原理简介与代码实战

    写在前面 最近huggingface的transformer库,增加了BART模型,Bart是该库中最早的Seq2Seq模型之一,在文本生成任务,例如摘要抽取方面达到了SOTA的结果. 本次放出了三组 ...

  6. 推荐算法DeepFM原理介绍及tensorflow代码实现

    DeepFM 目标: 产生背景: 模型介绍: 善于处理特征交叉的机器学习模型 FM 如何优化FM的计算效率 深度学习模型和 FM 模型的结合 DeepFM 特征交叉新方法:元素积操作 技巧: 代码部分 ...

  7. tensorflow63 《深度学习原理与TensorFlow实战》03 Hello TensorFlow

    00 基本信息 <深度学习原理与TensorFlow实战>书中涉及到的代码主要来源于: A:Tensorflow/TensorflowModel/TFLean的样例, B:https:// ...

  8. tensorflow72 《深度学习原理与TensorFlow实战》05 RNN能说会道 03 对话机器人(chatbot)

    01 基本环境 #<深度学习原理与TensorFlow实战>05 RNN能说会道 # 书源码地址:https://github.com/DeepVisionTeam/TensorFlowB ...

  9. tensorflow71 《深度学习原理与TensorFlow实战》05 RNN能说会道 02语言模型

    01 基本信息 #<深度学习原理与TensorFlow实战>05 RNN能说会道 # 书源码地址:https://github.com/DeepVisionTeam/TensorFlowB ...

最新文章

  1. (二)Linux命令使用
  2. linux 中断程序设计,Linux中断编程
  3. 无线局域网技术白皮书
  4. 将CAGradientLayer当做mask使用
  5. 设计模式-Factory Method Pattern
  6. 下一代大数据处理引擎,阿里云实时计算独享模式重磅发布
  7. 盘点数据处理工具,手把手教你做数据清洗和转换
  8. 如何手动实现C语言中的字符串操作
  9. js为lable和div赋值
  10. Windows autoKeras的下载与安装连接
  11. win7 用 Activation激活 重启 进入 Acer eRecovery Management 解决办法
  12. R语言迹检验协整关系式_【R语言】单位根检验、协整检验和格兰杰因果关系检验三者之间的关系...
  13. 对称矩阵(MIT课程)
  14. 企鹅撞冰块Java游戏_亲子桌面游戏玩具 拯救企鹅敲打冰块玩法
  15. linux下7z文件解压命令
  16. PHP+MYSQL【学生信息管理系统】(极简版)
  17. MySQL 字符串删除表情符_字符串中Emoji表情处理
  18. date日期格式 yyyy-MM-dd HH:mm:ss 大小写区别
  19. webrtc视频引擎之video_render(视频渲染)介绍
  20. 金仓数据库KingbaseES使用ksql连接认证失败

热门文章

  1. 无极性电容和有极性电容的爆炸
  2. 某粉丝网蓝色DZ论坛模板
  3. MC9S12XS128硬件底层驱动_set_bus_clk.h(总线时钟设置)
  4. 最大化参数 火车头_火车头采集器菜鸟使用手册
  5. Beyond Compare v3.3.13 中文版
  6. Hust oj 2125 钱多多(水题)
  7. 90后技术宅研发Magi一夜爆红,新一代知识化结构搜索新时代来了?
  8. Windows10 - 使用命令行批量修改文件后缀名
  9. MTBD 电影市场分析
  10. 设计一个程序,程序中有三个类,Triangle,Lader,Circle。