1,前言

Wide&Deep模型开启深度学习时代的组合模型之后,后面的模型都是在Wide&Deep的基础上进行各种方式的模型组合,以应对不同的模型任务。从大的角度看,模型的改进方向主要有两点:
1,特征交互上要进一步加强学习,来增强模型的表达能力。
2,尽量避免人工构造特征工程,尽量实现端到端。
FNN,DeepFM,NFM模型的发展逻辑:
FNN模型是2016年提出的一个FM和DNN模型的组合。这个模型底层是FM,上层是DNN,该模型提出的目的是特征之间的交叉和表达能力的增强。
2017年DeepFM模型出现,相比较FNN模型,该模型仍然是FM和DNN的组合,但不是串行,而是基于Wide&Deep模型的架构,换成并行的方式。让FM充当W&D中的Wide部分。这样既考虑了低阶交叉,也考虑高阶交叉,并且实现了端到端,避免了W&D中的特征工程。但是该模型的FM仍然是二阶交叉,无可避免的会限制模型表达能力。
2017年,NFM也被提出,这个模型也可以看成是W&D的计划模型,它改进了FM的二阶隐向量内积部分,换成一个表达能力更强的函数,并且Deep部分也完成了特征交叉池化层。

2,FNN模型

2.1FNN模型简介

CTR任务中,传统的线性模型,比如LR模型不能利用特征之间的交互信息,而一些非线性模型,如FM,表达能力又不够强。因此,在深度学习时代,提出了FM与DNN的组合模型:基于因子分解机的神经网络模型(Factorization Machine supported Neural Network,FNN)模型,该模型的灵感在于图像领域CNN通过相邻层连接扩大感受野的做法,使用DNN来对FM显示表达的二阶特征再交叉,从而产生更加高阶的特征组合,加强模型对数据模式的学习能力。

FNN模型的训练分成预训练和正式训练两个阶段。预训练阶段对FM模型进行训练,然后用FM训练好的特征隐向量对正式训练的模型进行embedding层的初始化操作。这样在正式训练的时候,就加速了模型的收敛过程。

2.2 FNN模型详解

1,底层FM模型


x是输入特征,它是高维稀疏的。可以分成N个Field。每个Field中,只有一个值为1,其余的都为0(即one-hot)。Field i可以表示成X[starti,endi]X[start_{i},end_{i}]X[starti,endi]W0iW_{0}^{i}W0i是Field i的embedding矩阵。W0i⋅X[starti,endi]]W_{0}^{i}\cdot X[start_{i},end_{i}]]W0iX[starti,endi]] 在代码实现中,就是对每个Field(比如性别),基于该Field域所有的可能取值进行LableEncoder,LableEncoder的值与W0iW_{0}^{i}W0i中的每一个embedding向量一一对应。对于每一个具体的样本,它的Field i域的值是LableEncoder 中的某一个值,然后根据LableEncoder的值,从W0iW_{0}^{i}W0i中找到对应的embedding层向量即可。ZiZ_{i}Zi是embedding后的向量,它由一次项WiW_{i}Wi,二次项 ViV_{i}Vi=(Vi1Vi2...Vik,)(V_{i}^{1}V_{i}^{2}...V_{i}^{k},)(Vi1Vi2...Vik,) 组成,其中K是FM中二次项的向量的维度。也就是说DNN的输入是Z,Z=Z1,Z2,...Zi,Zj,...Z_{1},Z_{2},...Z_{i},Z_{j},...Z1,Z2,...Zi,Zj,...组成。ZiZ_{i}Zi是一个embedding向量,它的值,其实是输入X,Field i域的值在FM中训练好的特征隐向量。
有了上面的解释,下面这段话就好理解了:
FNN模型用FM模型替换了传统的Embeding层,并且在模型正式训练之前,先提前训练好FM,然后用FM训练好的特征隐向量对正式训练的模型(DNN部分)进行Embedding层的初始化操作。这样在训练的时候,就加速了模型的收敛过程。
把FM输出的低维稠密特征向量进行简单拼接,作为全连接层的输入。之后就是DNN计算的常规操作了,计算过程如下:

在具体的训练中,作者对于FM和DNN都是先做了一个单独的预训练,前者使用SGD,后者采用RBM pre-training,然后进行统一的训练方式,类似于迁移学习的思路。从而大大加速模型的收敛程度。

2.3FNN模型的不足

1,两阶段的训练模型,应用过程不太方便,并且模型能力受限于FM表征能力的上限(embeding层参数可能受到FM的过度影响)
2,只关注高阶组合特征的交叉
3,两阶段训练方式也存在一些问题
1,FM中特征组合,使用的隐向量的点积计算。将FM得到的隐向量移植到DNN中作为DNN的输入,全连接层这时会将 输入向量的所有元素进行加权求和,并且不会对Field进行区分。这样其实就又回到了之前DeepCrossing存在的问题,全连接层把所有的特征进行了统一的交叉学习,这在很多场景下其实不太合理,没有针对性,从而使得模型的学习能力受到限制。所以之前的PNN中,采用一个专门研究特征交叉的Product-Layer来换掉FNN中的FM,以及换掉Deep crossing中的stacking-layer层,使得能够进行特征之间的两两交互,使得特征交叉的学习有了针对性(注意:虽然自己的博客里面对PNN模型整理的比FNN早,但它的出现是在FNN之后的)
2,FNN两阶段的训练方式给神经网络的调参带来了难题,因为FNN的底层参数是预训练得到的,所以在反向传播更新参数的时候,学习率不能过大,否则会将FM得到的信息抹去,所以底层的学习率要小一些。

针对FNN的以上这几个缺点,后面的PNN在特征交叉方式上对其进行了改进,但同时又引入了新的问题:
关于PNN, 强调了Embedding向量之间的交叉方式是多样化的, 相比于简单的交由全连接层无差别化的处理, PNN模型定义的内积和外积操作显然更有针对性的强调了不同特征之间的交互, 从而让模型更容易捕获特征的交叉信息。 But, PNN模型同样存在着局限, 比如外积操作在实际应用中, 为了优化训练效率进行大量的简化。 此外, 对所有特征无差别的交叉, 在一定程度上忽略了原始特征向量中包含的有价值信息。
基于模型组合的思想,2017年DeepFM的出现,使得下面的几大难题都得到了一定的解决。

3,DeepFM模型

3.1 前期模型总结

CTR预估中,高阶特征和低阶特征的学习都非常重要。推荐模型的发展基本上是从最简单的线性模型LR,到考虑低阶特征交叉的FM,到考虑高阶交叉的神经网络,再到两者都考虑的W&D模型。

  • 线性模型优点在于简单,但这同时也是它的不足,会限制模型的表达能力,并且随着数据的大而复杂,这种模型不能充分挖掘数据中的隐含信息,并且忽略了特征之间的交互,特征想要交互,需要复杂的特征工程。
  • FM模型考虑了特征的二阶交叉,但是这种交叉停留在了二阶层次。虽然理论上能够进行高阶组合,但是计算量和复杂度随着阶数的增加一下子就上来了。所以二阶是最常见的情况,会忽略高阶特征交叉的信息。
  • DNN适合天然的高阶交叉信息的学习,但是低阶的交叉会被忽略掉
  • W&D的基本思路是将上面几个结构进行组合。把简单的LR模型和DNN模型进行了组合,使得模型既能够学习高阶组合特征,也能学习低阶特征模式。但是W&D中的Wide部分使用了LR模型,这一块需要一些经验性的特征工程,并且Wide部分和Deep部分需要两种不同的输入模式,这个在实际具体应用中需要很强的业务经验。

3.2 DeepFM模型

DeepFM模型基于前面模型的不足进行了改进。下面介绍模型细节

3.2.1 Input和Embedding部分

关于输入,包括离散的分类特征域(如性别,地区等)和连续的数值特征域(如年龄等)。分类特征域一般通过one-hot或者multi-hot(如用户的浏览历史)进行处理后作为输入特征;数值特征域可以直接作为输入特征,也可以离散化进行one-hot编码后作为输入特征。
对于每一个特征域,需要单独的进行Embedding操作,因为每个特征域几乎没有任何关联,如性别和地区。数值域特征无需进行Embedding。
Embedding layer如图:

与Wide&Deep不同的是,DeepFM中wide部分FM和Deep部分共享了输入特征,也就是Embeding向量。这一点需要再进一步解释下:
比如Field_1域是性别,有一个样本,在Field1域的input值是[0,1],经过embeding层,[0,1]这个向量变成[0.1,0.8,0.3,0.2]这个embeding 向量。那在embeding层,Filed_1 域[0.1,0.8,0.3,0.2]这个embeding 向量,会与Field_2域,Field_3域,Filed_N域的特征向量进行拼接,变成[0.1,0.8,0.3,0.2,…,]作为embeding层的输出,这个embeding层的输出,会分别作为FM 和DNN的输入。也就是说对于FM的输入X,是[0.1,0.8,0.3,0.2,…,],其中0.1 是输入X中的一个特征值,0.8是另一个特征值…

3.2.2 FM部分


这就是一个标准的FM模型,负责特征之间的低阶交叉过程,FM的输出是Addition单元和Inner Product Units 的加和。Addition单元反映1阶特征各自的影响,Inner product 代表2阶特征交互的影响。

与FNN不同,FM这里的隐向量参数是直接跟神经网络参数一样,都是当做学习参数一起学习的,这样就省去FNN中FM需要预训练的过程,而是以端到端的方式来训练整个网络。FNN模型能力受限于FM表征能力的上限。但是在DeepFM中,作者发现通过高阶和低阶交互特征一起进行反向传播更新参数反而会使得模型表现能力更佳,当然,这个也依赖于共享Embeding输入的策略。
这里我先记录一下自己的一个疑问:
虽然小强大神说:是embeding层的输出作为FM的输入,但是DeepFM论文里面FM部分框架图中,红色线和黑色线又代表什么含义?感觉两者有点冲突。这个疑问,要等到真正用到代码的时候来进行答疑了。不过我目前学习模型的重点,在于学习不同模型的发展思想,创新点,解决了什么问题。而不是把每一个字都搞懂,每一个细节都搞懂。不要完美主义,抓住重点,有计划地来

3.2.3 Deep部分

Deep部分是一个DNN,负责学习高阶特征之间的交互

原始特征经过embedding之后,会从高维稀疏性特征转成低维稠密型特征,这时,就可以直接作为DNN的输入,假设离散特征的个数是m,最后得到的a(0)a^{(0)}a(0)如下:
a(0)=[e1,e2,...,em]a^{(0)}=[e_{1},e_{2},...,e_{m}]a(0)=[e1,e2,...,em]
如果隐向量的维度是k维的话,Deep部分的输入将是一个n×m×kn\times m\times kn×m×k三维矩阵,神经网络前向传播公式是:

|H|代表神经网络的层数。
FM与DNN 使用相同的输入(embeding层的输出作为FM和DNN的输入),好处在于:
1,同时学习低阶和高阶特征交互。
2,不需要专业的特征工程。

3.2.4 FNN,PNN,Wide&Deep,DeepFM模型对比


FNN模型:预训练方式增加计算开销,模型能力受限于FM表征能力的上限,且只考虑了高阶交互
PNN模型:IPNN的内积计算非常复杂,OPNN的外积近似计算损失了很多信息,结果不稳定,且同样忽视了低阶交互
Wide&Deep:考虑了低阶和高阶特征交互,兼顾模型的记忆和泛化能力,但是Wide部分输入需要专业的特征工程经验。
DeepFM:用FM作为Wide部分,并且Wide和Deep部分共享相同的输入,不需要预训练,从而解决了上面三个模型存在的一些问题。一个图进行总结:

DeepFM是一个重要的模型,也是工业界经常使用的一个。但是工业上,真实场景下的数据,会有特征稀疏,一列多值,以及共享权重的需求,所以DeepFM工程化时还需要做很多操作。
此外,DeepFM也只是提供了一种提升FM模型的思路,模型对于高阶特征以及高阶特征交互学习的探索,还有很多思路。

4,NFM模型

NFM模型结构如下:

4.1 Input 和Embedding 层

输入层的特征分成两大类:稀疏离散特征(类别特征)和稠密特征。对于稀疏离散特征,一般是先one-hot,然后通过embedding处理成低维稠密特征。在真正实现的时候,对于一个field域的稀疏离散特征,一般是先进行Label Encoder,然后直接找到取值非零的特征对应的embeding向量。embeding层的输出是 VX={x1v1,...,xnvn}V_{X} = \left \{ x_{1}v_{1},...,x_{n}v_{n} \right \}VX={x1v1,...,xnvn}.这里面 VXV_{X}VX是样本X所有特征值embeding的集合,x1x_{1}x1XXX第i域特征值转换成one-hot 之后的值,只有一个是1,其余全为0,x1v1x_{1}v_{1}x1v1是一个k维向量,代表的是XXX第i域特征值对应的embeding向量,k是embeding 向量的维度。这里是embeding层的常规操作。

4.2 Bi-interaction Pooling Layer

这一层是NFM 最大的创新点。这一层实现了FM 与DNN的无缝连接,组成一个大的网络,并且能够正常的反向传播。前面提到,embeding层的输出是VX={x1v1,...,xnvn}V_{X} = \left \{ x_{1}v_{1},...,x_{n}v_{n} \right \}VX={x1v1,...,xnvn}VXV_{X}VX是样本X所有特征值embeding的集合。那么embeding层的输出送入到Bi-interaction Pooling Layer(特征交叉池化层)之后进行如下操作:

⊙\odot 代表两个向量的元素积操作,也就是两个K维的向量,对应维度 相乘得到的元素积向量,得到的结果也是一个K维的向量。注意这就是与FM不同的地方,FM二阶特征交叉组合处是内积,最终会得到一个数。
参考FM,上面的公式可以化简为如下:

再次强调,这里的输出是K维的向量。
Bi-interaction Pooling Layer层, fBI(Vx)f_{BI}(V_{x})fBI(Vx)中,还进行了dropout技术和BatchNormalization技术。前者是为了防止过拟合,后者是为了避免embeding向量更新会更改输入层的数值分布。

Bi-interaction Pooling Layer(特征交叉池化层)的目的是将二阶交互信息进行合并。之后改成的输出送入到DNN网络中来进一步进行特征的多阶以及非线性组合。特征交叉池化层把二阶信息学习好了,DNN模型进一步学习起来也会更加容易。

4.3 隐藏层

就是常规的DNN网络:

4.4 预测层

该层就是最后一层的结果直接加一个隐藏层。由于这里是回归问题,所以没有加sigmoid激活:

NFM 模型的前向传播过程总结如下:

以上就是NFM模型的全部流程。

5,总结

FNN:
底层FM,上层DNN。用FM模型替换了传统的Embeding层,并且在模型正式训练之前,先提前训练好FM,然后用FM训练好的特征隐向量对正式训练的模型(DNN部分)进行Embedding层的初始化操作。这样在训练的时候,就加速了模型的收敛过程。特点在于:预训练的思想
DeepFM:
是多模型组合方式的探究之一。是基于FNN,到PNN,再到wide&deep之后的又一次改进。用FM作为Wide部分,并且Wide和Deep部分共享相同的输入,不需要预训练。
NFM:
与DeepFM 类似,一个是串联,一个是并联。与FNN相比,不需要预训练。

从特征自动化组合的角度。FNN,PNN,wide&Deep,DeepFM,NFM 这些模型从特征交叉组合角度进行了很多尝试。后面的模型,开始尝试新的角度来挖掘模型的表现能力,比如attention机制,序列模型,强化学习等。后面也会一一进行了解。

推荐系统8---FNN、DeepFM与NFM(FM在深度学习中的身影重现)相关推荐

  1. Python黑马头条推荐系统第四天 TensorFlow框架介绍和深度学习

    深度学习与推荐系统 6.1 推荐系统与深度学习关联 学习目标 目标 无 应用 无 6.1.1 深度学习到推荐系统 深度学习发展成功与局限 最近几年深度学习的流行,大家一般认为是从2012年 AlexN ...

  2. FM与深度学习模型的结合--FNN

    一:FNN–用FM的隐向量完成Embedding层的初始化. 1,提出背景: (1)基于FM的特征组合受到计算复杂度的影响因而只能进行二阶特征交叉,但当面对海量高度稀疏的用户行为反馈数据时,二阶交叉是 ...

  3. 推荐中使用FNN/PNN/ONN/NFM优化特征交叉

    文 | 水哥 源 | 知乎 saying DNN时代来临的时候,LR没打过,也很难加入.FM打不过,但他可以加入 FM的精髓,最上在于latent embedding,有了它才能把交互拆解到基底上:居 ...

  4. 【更新】深度学习推荐系统

    其他博客:笔记1.博客2 文章目录 第一章.互联网的增长引擎--推荐系统 第二章.前深度学习时代--推荐系统的进化之路 第三章.浪潮之巅--深度学习在推荐系统中的应用 3.1 深度学习推荐模型的演化关 ...

  5. 《深度学习推荐系统》读书笔记之推荐系统的进化之路

    来源:https://zhuanlan.zhihu.com/ p/138446984 作者:一块小蛋糕 编辑:深度传送门 最近读完了王喆老师的新作--<深度学习推荐系统>,拿到书之前,期待 ...

  6. 深度学习推荐系统实战总结

    https://time.geekbang.org/column/article/294382 推荐系统要处理的问题可以被形式化地定义为:在特定场景C(Context)下,针对海量的"物品& ...

  7. 【深度学习推荐系统-王喆】笔记系列 3 浪潮之巅——深度学习在推荐系统中的应用

    第 3 章 浪潮之巅 -- 深度学习在推荐系统中的应用 概述 与传统机器学习模型相比,深度学习模型的优势 1.表达能力更强 能够挖掘出更多数据中潜藏的模式 2.结构非常灵活 能够根据业务场景和数据特点 ...

  8. 超全大厂算法岗百问百答(推荐系统/机器学习/深度学习/C++/Spark/python)

    之前在准备秋招的时候,每次看到牛客网上那些大神手握七八个大厂的offer,就羡慕到不行,那会儿自己的机器学习算法水平还没法搬上台面,顶多也就是看了几个课程.做了两个比赛的水平,然后比赛还没得到任何的名 ...

  9. 推荐系统 (三): 浪潮之巅 -- 深度学习在推荐系统中的应用

    目录 深度学习推荐模型的演化关系图 AutoRec -- 单隐层神经网络推荐模型 AutoRec 模型的基本原理 AutoRec 模型的结构 基于 AutoRec 模型的推荐过程 U-AutoRec ...

最新文章

  1. [转]几种最短路径算法的比较
  2. 一文解决图片数据集太少的问题:详解KerasImageDataAugmentation各参数
  3. ubuntu 设置root启动
  4. 贝叶斯学习--极大后验概率假设和极大似然假设
  5. 【转载】COM 连接点
  6. MySQL整理(三)
  7. 二叉树的三种遍历(递归与非递归) + 层次遍历
  8. *【CodeForces - 859C 】Pie Rules (博弈dp,时光倒流)
  9. Java 算法 寂寞的数
  10. SWAP Detector:GrammaTech 开源 DevOps 应用安全测试工具
  11. cocos2d-x内存自动释放机制
  12. 30分钟学习掌握springmvc、SSM
  13. dicom worklist下载病例程序/dicom worklist scu (c#版本)
  14. 有DMX512协议控制的整套硬件解决方案吗?来看一下,舞台灯光同步视频播放DMX控制台
  15. 优思学院|一文读懂SFMEA、DFMEA、PFMEA的关系
  16. Java计算时间,可以像微信朋友圈那样显示发布的时间
  17. html等待,休眠代码,HTML DOM closest()用法及代码示例
  18. shell script 自动化测试框架 - shUnit2
  19. 区块链学习8:超级账本项目Fabric中的背书、背书节点、背书策略、背书签名
  20. 云讯健身管理系统-11--NUXT和Redis

热门文章

  1. matlab 判断大小写,匹配正则表达式(区分大小写)
  2. iOS通讯录复制的手机号码字符串多了奇怪的unicode码\u0000202d-\u0000202c
  3. win10显示rpc服务器不可用,win10系统RPC服务器不可用如何处理?
  4. DOS批处理简明高级教程
  5. UCI、KEEL下载数据集
  6. 爱情在患得患失时最美丽
  7. SAP ABAP 业务开关和 SAP 电商云的 Feature Level
  8. ping命令英文全称
  9. CPU频率调节模式以及降频方法简介
  10. v4l2架构专题模块handler分析 -- handler ctrl的注册2