DeepFM对FM、FNN、PNN、wide&deep模型


1. CTR预估

CTR预估数据特点:
1. 输入中包含类别型和连续型数据。类别型数据需要one-hot,连续型数据可以先离散化再one-hot,也可以直接保留原值
2. 维度非常高
3. 数据非常稀疏
4. 特征按照Field分组

CTR预估重点在于学习组合特征。注意,组合特征包括二阶、三阶甚至更高阶的,阶数越高越复杂,越不容易学习。Google的论文研究得出结论:高阶和低阶的组合特征都非常重要,同时学习到这两种组合特征的性能要比只考虑其中一种的性能要好。

那么关键问题转化成:如何高效的提取这些组合特征。一种办法就是引入领域知识人工进行特征工程。这样做的弊端是高阶组合特征非常难提取,会耗费极大的人力。而且,有些组合特征是隐藏在数据中的,即使是专家也不一定能提取出来,比如著名的“尿布与啤酒”问题。

在DeepFM提出之前,已有LR,FM,FFM,FNN,PNN(以及三种变体:IPNN,OPNN,PNN*),Wide&Deep模型,这些模型在CTR或者是推荐系统中被广泛使用。

2. 模型演进历史
2.1 线性模型

最开始CTR或者是推荐系统领域,一些线性模型取得了不错的效果。比如:LR,FTRL。线性模型有个致命的缺点:无法提取高阶的组合特征。所以常用的做法是人为的加入pairwise feature interactions。即使是这样:对于那些出现很少或者没有出现的组合特征以及高阶组合特征依旧无法提取。

LR最大的缺点就是无法组合特征,依赖于人工的特征组合,这也直接使得它表达能力受限,基本上只能处理线性可分或近似线性可分的问题。

2.2 FM模型

线性模型差强人意,直接导致了FM模型应运而生(在Kaggle上打比赛提出来的,取得了第一名的成绩)。FM通过隐向量latent vector做内积来表示组合特征,从理论上解决了低阶和高阶组合特征提取的问题。但是实际应用中受限于计算复杂度,一般也就只考虑到2阶交叉特征。

后面又进行了改进,提出了FFM,增加了Field的概念。

2.3 FNN

随着DNN在图像、语音、NLP等领域取得突破,人们见见意识到DNN在特征表示上的天然优势。相继提出了使用CNN或RNN来做CTR预估的模型。但是,CNN模型的缺点是:偏向于学习相邻特征的组合特征。 RNN模型的缺点是:比较适用于有序列(时序)关系的数据。

FNN的提出,应该算是一次非常不错的尝试:先使用预先训练好的FM,得到隐向量,然后作为DNN的输入来训练模型。缺点在于:受限于FM预训练的效果。

FNN使用预训练的FM来初始化DNN,然后只有Deep部分,不能学习低阶组合特征。

FNN缺点:

  • Embedding的参数受FM的影响,不一定准确
  • 预训练阶段增加了计算复杂度,训练效率低
  • FNN只能学习到高阶的组合特征。模型中没有对低阶特征建模。

2.4  PNN

随后提出了PNN,PNN为了捕获高阶组合特征,在embedding layer和first hidden layer之间增加了一个product layer。根据product layer使用内积、外积、混合分别衍生出IPNN, OPNN, PNN*三种类型。 PNN竟然可以end-to-end的训练,不需要预训练也可以得到不错的效果。

PNN:为了捕获高阶特征。PNN在第一个隐藏层和embedding层之间,增加了一个product layer。

根据product的不同,衍生出三种PNN:IPNN,OPNN,PNN* 分别对应内积、外积、两者混合。

作者为了加快计算,采用近似计算的方法来计算内积和外积。内积:忽略一些神经元。外积:把m*k维的vector转换成k维度的vector。由于外积丢失了较多信息,所以一般没有内积稳定。

但是内积的计算复杂度依旧非常高,原因是:product layer的输出是要和第一个隐藏层进行全连接的。

PNN缺点:

  • 内积外积计算复杂度高。采用近似计算的方法外积没有内积稳定。
  • product layer的输出需要与第一个隐藏层全连接,导致计算复杂度居高不下
  • 和FNN一样,只能学习到高阶的特征组合。没有对于1阶和2阶特征进行建模。

关于更详细介绍请参考: https://zhuanlan.zhihu.com/p/33177517

2.5 wide&deep

Google意识到了这个问题,为了同时学习低阶和高阶组合特征,提出了Wide&Deep模型。它混合了一个线性模型(Wide part)和Deep模型(Deep part)。这两部分模型需要不同的输入,而Wide part部分的输入,依旧依赖人工特征工程。

Wide&Deep

Wide & Deep设计的初衷是想同时学习低阶和高阶组合特征,但是wide部分需要领域知识进行特征工程。

Wide部分可以用LR来替换,这样的话就和DeepFM差不多了。

Wide&Deep缺点:

  • 需要特征工程提取低阶组合特征

但是,以上 这些模型普遍都存在两个问题:
1. 偏向于提取低阶或者高阶的组合特征。不能同时提取这两种类型的特征。
2. 需要专业的领域知识来做特征工程。

2.6 DeepFM

DeepFM在Wide&Deep的基础上进行改进,成功解决了这两个问题,并做了一些改进,其优势/优点如下:

1. 不需要预训练FM得到隐向量
2. 不需要人工特征工程
3. 能同时学习低阶和高阶的组合特征
4. FM模块和Deep模块共享**Feature Embedding**部分,可以更快的训练,以及更精确的训练学习

这里写图片描述

模型对比图

3. DeepFM

DeepFM闪亮登场!

主要做法如下:
1. FM Component + Deep Component。FM提取低阶组合特征,Deep提取高阶组合特征。但是和Wide&Deep不同的是,DeepFM是端到端的训练,不需要人工特征工程。
2. 共享feature embedding。FM和Deep共享输入和feature embedding不但使得训练更快,而且使得训练更加准确。相比之下,Wide&Deep中,input vector非常大,里面包含了大量的人工设计的pairwise组合特征,增加了他的计算复杂度。

DeepFM架构图:

这里写图片描述


3.1 FM Component

FM部分的输出由两部分组成:一个Addition Unit,多个内积单元。

这里的d是输入one-hot之后的维度,我们一般称之为feature_size。对应的是one-hot之前的特征维度,我们称之为field_size。

FM架构图:

这里写图片描述

 

3.2 Deep Component

Deep Component架构图:

这里写图片描述


Deep Component是用来学习高阶组合特征的。网络里面黑色的线是全连接层,参数需要神经网络去学习。

由于CTR或推荐系统的数据one-hot之后特别稀疏,如果直接放入到DNN中,参数非常多,我们没有这么多的数据去训练这样一个网络。所以增加了一个Embedding层,用于降低纬度。

这里继续补充下Embedding层,两个特点:
1. 尽管输入的长度不同,但是映射后长度都是相同的.embedding_size 或 k
2. embedding层的参数其实是全连接的Weights,是通过神经网络自己学习到的。

Embedding层的架构图:

这里写图片描述


值得注意的是:FM模块和Deep模块是共享feature embedding的(也就是V)。

好处:
1. 模型可以从最原始的特征中,同时学习低阶和高阶组合特征
2. 不再需要人工特征工程。Wide&Deep中低阶组合特征就是同过特征工程得到的。

DeepFM

优点:

  • 没有用FM去预训练隐向量V,并用V去初始化神经网络。(相比之下FNN就需要预训练FM来初始化DNN)
  • FM模块不是独立的,是跟整个模型一起训练学习得到的。(相比之下Wide&Deep中的Wide和Deep部分是没有共享的)
  • 不需要特征工程。DeepFM包括FM部分和Deep部分。FM用于学习低阶特征交叉,Deep部分用于学习高阶特征交叉。相比于Wide & Deep的LR是需要人工完成特征交叉特征工程,DeepFM可以不经过特征工程直接进行端到端的训练。
  • 训练效率高。(相比PNN没有那么多参数)

DeepFM共享feature embedding 这个特性使得在反向传播的时候,模型学习feature embedding,而后又会在前向传播的时候影响低阶和高阶特征的学习,这使得学习更加的准确。

什么?太多了乱七八糟记不住?OK,那就记住最核心的:

记忆宝典:从DeepFM的底层-->顶层:不需要预训练,直接Embedding,隐向量共享,同时学习低阶和高阶。

  • 没有预训练,直接端到端训练,简单、高效。
  • 共享Feature Embedding,模型学习的更准确。
  • 同时学习低阶和高阶组合特征,不需要人工特征工程。

3.4 超参数建议
论文中还给出了一些参数的实验结果,直接给出结论,大家实现的时候可以参考下。

面试题:

1. 为什么DeepFM理论上不需要特征工程了,实际工作中还需要做特征工程?

DeepFM最核心的想法是让deep和wide部分共享参数,具体来说,他们用FM作为wide部分用于学习低阶特征交叉,DNN或者PNN作为deep部分用于学习高阶特征交叉,但是把FM的部分放到NN的embedding层之后,从而让它们共享embedding。这样做的主要好处是:原始的wide&deep 的wide的部分没有特征交叉,仅相当于FM的一次项,其输入仍要靠特征工程来确定,但deepFM让两部分共享embedding,FM的二次项进行特征交叉,所以就不再需要特征工程了。

为什么理论上不需要特征工程了,实际工作中还需要做特征工程。因为理论上FM,DNN能兼顾低阶和高阶特征,但是在具体业务场景中,模型到底能不能学习到相应的特征交叉,不知道,所以还是需要尽可能多的人工特征交叉,让这些交叉特征作为模型的输入,进一步提高模型的表达能力。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章