吃透论文——推荐算法不可不看的DeepFM模型
大家好,我们今天继续来剖析一些推荐广告领域的论文。
今天选择的这篇叫做DeepFM: A Factorization-Machine based Neural Network for CTR Prediction,翻译过来就是DeepFM:一个基于深度神经网络的FM模型。这篇paper的作者来自哈工大和华为,不得不说在人工智能领域的很多论文都是国产的,作为从业者还是非常欣喜能看到这点的。
通过名字我们也能看得出来,今天的这篇paper本质上其实是FM模型的一个进阶或者说是优化版本。如果对FM模型不太了解的同学可以通过下方传送门回顾一下:
本文同样很长,建议先马后看。
摘要
对于CTR预估的模型来说,一个很重要的点就是学习用户行为对应的特征背后的潜在联系。虽然目前在这个领域已经取得了一些进展(截止2017年),但是目前的做法要么在低维或者高维的特征上存在很大的偏差,要么需要大量的专家级的特征工程。
在本篇paper当中,我们设计了一种新的模型DeepFM,从而找到了一种可能性,可以同时提升低维和高维的特征。它结合了FM和神经网络模型的长处,和Google最新的Wide & Deep模型的做法相比,取得了更大的进步,并且还免去了特征工程的部分。
摘要里面内容不多,主要是拉踩了一下同行。
简介
对推荐场景来说,CTR是最关键的指标,除了广告系统会按照CTR x bid来进行排序之外,推荐系统一般都会严格地按照预估的CTR进行排序。所以这其中的关键问题就是准确地预估CTR。
为了方便大家地理解,简单介绍一下目前常规的做法。一般来说常规的推荐系统当中的特征分为四个部分,第一个部分是用户特征,是关于用户的一些信息。比如是男是女,是否是高收入群体,是否是高消费群体,成为平台的用户多久了,偏好平台当中什么类目的商品等等。第二个部分是商品特征,就是关于item的一些信息,比如价格、类目、折扣、评价等等。第三个部分是上下文特征,比如当前的时间,是早上还是晚上,比如item展示的位置等等。最后一个部分是用户实时的行为,比如用户在浏览这个商品之前还看过哪些其他的商品,他登陆平台多久了,等等。
显然用户是否会点击某一个item是由以上这四个部分的信息共同作用的,比如给一个高富帅推兰博基尼或者是百达翡丽就是有吸引力的,给一个连听都没听说过的屌丝推同样的内容显然就屁用没有。也就是说商品的特征和用户的特征之间是存在逻辑上的关联的,我们一般称为特征的交叉。
这些交叉信息往往是隐式的,也就是我们不能直接描述和形容出来的。举个简单的例子,可能并不是所有富人都喜欢奢侈品,有些可能就喜欢电子消费品,还有些可能喜欢服装或者是旅行。人的喜好是很复杂的,我们很难用固定的规则去描述。所以这就需要模型能有这样的能力去学习这些特征之间的潜在联系,对这些潜在交叉信息把握越好的模型,一般也都拥有越好的效果。
比如我们分析了主流的app store市场之后发现,在饭点的时候,用户经常会下载外卖类的app,这说明了app的类别和时间之间存在交叉关系。再比如我们发现年轻的男生往往喜欢设计类游戏,这说明了app的类别与用户的性别之间也存在交叉关系。像是这样的交叉信息还有很多,从Wide & Deep模型的经验当中我们可以学到考虑低维和高维交叉特征之后,模型的效果会更好。
这里面的一个关键挑战是如何高效地对特征之间的交叉信息进行建模,其中的一些比较容易理解,也比较容易做出特征来,然而大部分的交叉信息是隐式的,难以直观理解的,比如啤酒和尿布的例子就是一个,只有大数据挖掘才能发现。即使是直观上容易理解的部分,由于涉及的数量太大,也不可能通过手工来全部处理。
之后paper当中拉踩了一下同行,首先说明了单纯的CNN以及RNN效果不好,这个比较容易想明白,RNN主要应用场景是序列场景,比如文本、音频等,用在CTR预估上并不合适。CNN也是一样,主要应用在图片等高维度的数据当中,也不太适合推荐场景。
然后还比较了一下同年发表的其他三篇论文,FNN、PNN以及Wide & Deep。也是一些常规套话,没有太多的分析,比如在低维高维特征的交叉上表现不足啦,比如需要过多的特征工程啦等等。其中Wide & Deep我们之前写文章剖析过了,FNN和PNN大家感兴趣可以去读一下paper,在业内用的不多,应该是效果不太理想。经过了一番比较之后提出了本文的观点,我们可以设计出一种效果更好并且会自动学习特征之间交叉信息的模型。
方案
我们假设训练集当中一共有n条样本,每一条样本可以写成。其中的是一个m个field组成的向量,包含了用户和item组成的特征。,y=0表示用户没有点击,相反,y=1表示用户点击。
我们再来看样本的特征,这m维特征可以看成两部分组成,第一部分是类别特征,比如性别、地理位置、收入情况等等。第二种是连续性特征,比如平均花费、平均停留时间等等。类别特征(categorical feature)一般被表示成一个one-hot之后的向量,而一个连续特征,一般就是表示它自己,当然也可以离散化成one-hot向量。
我们把这些特征全部处理完之后,整个向量会转化成,这里的每一个field和向量一一对应。由于这当中做了一些离散化的处理,会使得x向量变得非常稀疏。所以我们要做的就是在这样特征比较稀疏的样本上简历一个CTR预测模型。
DeepFM
我们希望能够设计模型能够更好地学习低维和高维特征之间的交互,基于这点,我们在深度模型的基础上结合了FM,推出了DeepFM模型。它的整体结构如下图:

这张图看起来可能会有点乱,我们可以先忽略一些局部的细节,先从整体上把握。这个模型可以分成两个部分,分别是FM部分以及Deep部分。这两个部分的输入是一样的,并没有像Wide & Deep模型那样做区分。
其实这个模型还是比较好理解的,神经网络也就是Deep的部分用来训练这些特征的一维的关联以及联系,而FM模型会通过隐藏向量V的形式来计算特征之间的二维交叉的信息。最后一维和二维的信息汇总到一起,进入sigmoid层,获得最终的结果。
用公式来表达的话,大概是这样:
FM部分

FM部分其实就是因子分解机,我们在之前的文章当中曾经专门剖析过。FM会考虑所有特征之间两两交叉的情况,相当于人为对左右特征做了交叉。但是由于n个特征交叉的组合是这个量级,所以FM设计了一种新的方案,对于每一个特征i训练一个向量,当i和j两个特征交叉的时候,通过来计算两个特征交叉之后的权重。这样大大降低了计算的复杂度。
这当中涉及一些公式的推导和计算,我们在之前的文章当中已经详细推导过了,这里就不多赘述了。
最终我们可以得到这部分的公式:

Deep部分
Deep部分就是经典的前馈网络,用来学习特征之间的高维交叉。

图3展示的就是模型当中Deep这个部分,从图中我们可以看到,所有的特征都会被转化成embedding向量作为Deep部分的输入。CTR预估的模型和图片以及音频处理的模型有一个很大的不同,就是它的维度会更大,并且特征会非常稀疏,还伴有类别连续、混合、聚合的特点。在这种情况下,使用embedding向量来把原始特征当中的信息压缩到低维的向量就是一种比较好的做法了,这样模型的泛化能力会更强,要比全是01组成的multi-hot输入好得多。

这张图展示了这个部分局部的结构,我们可以看到所有特征转成的embedding向量拥有相同的维度k。并且和FM模型当中的维度也是一样的,并且这个embedding的初始化也是借用FM当中的二维矩阵V来实现的。我们都知道V是一个d x k的二维矩阵,而模型原始输入是一个d维的01向量,那么和V相乘了之后,自然就转化成了d x k的embedding了。
这里要注意的一点是,在一些其他DNN做CTR预估的论文当中,会使用预训练的FM模型来进行Deep部分的向量初始化。但这里的做法略有不同,它不是使用训练好的FM来进行初始化,而是和FM模型的部分共享同样的V。这样做会有两个非常重要的好处:
它可以同时学习到低维以及高维的特征交叉信息,预训练的FM来进行向量初始化得到的embedding当中可能只包含了二维交叉的信息。 这样可以避免像是Wide & Deep那样多余的特征工程。
实验结果
数据选择
我们选择了两份数据用来评估DeepFM与其他模型的性能,一份是Criteo数据集,其中包含了4500w用户的点击数据,由13个连续型特征以及26个类别特征组成。我们把90%做成训练数据,10%做成测试数据。第二份数据是公司内部(华为)的数据,由连续7天用户在华为app store游戏中心的点击数据组成训练数据(约10亿条),1天的数据作为测试数据。
评估指标
我们主要评估模型的指标有两个,一个是AUC另一个是Logloss(交叉熵)。从这个评估指标上来看是比较中肯的,没有像有一些paper当中自己定义一种新的评估指标。
模型选择
一共选择了LR、FM、FNN、PNN、Wide & Deep以及DeepFM这7个模型来一起进行比较。对于Wide & Deep模型来说,为了消除特征预处理的影响,我们把Wide & Deep模型当中的LR部分换成了FM部分,为了避免歧义,我们把替换之后的模型称为FM & DNN,替换之前的称为LR & DNN。
表现评估
性能比较
深度学习模型的性能非常重要,因为深度学习模型的复杂度很大,非常吃计算资源。我们采用如下的公式比较了各个模型的计算效率:。也就是以LR模型的训练时间为基准来进行比较。
最终的结果如下图所示,其中左侧的部分是在CPU上的表现,右侧部分是GPU上的表现。

基本上DeepFM模型在CPU和GPU上都是性能最佳。
预测结果
我们常规使用AUC来评估CTR预估场景下模型的准确性,我们也整理出了一个结果,如下图所示:

从上图我们一样可以看得出来,无论是在AUC上还是LogLoss上,DeepFM模型都是这几个模型当中最好的。从我了解到的实际情况来看,虽然DeepFM已经是4年前的提出的模型了,但是至今仍然还有非常多的公司还在使用它。所以如果有兴趣从事推荐领域的研究和工作的话,对这个模型的了解也是必不可少的。
今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发)
吃透论文——推荐算法不可不看的DeepFM模型的更多相关文章
- (读论文)推荐系统之ctr预估-DeepFM模型解析
今天第二篇(最近更新的都是Deep模型,传统的线性模型会后面找个时间更新的哈).本篇介绍华为的DeepFM模型 (2017年),此模型在 Wide&Deep 的基础上进行改进,成功解决了一些问 ...
- 推荐算法之: DeepFM及使用DeepCTR测试
算法介绍 左边deep network,右边FM,所以叫deepFM 包含两个部分: Part1: FM(Factorization machines),因子分解机部分 在传统的一阶线性回归之上,加了 ...
- CTR预估算法之FM, FFM, DeepFM及实践
https://blog.csdn.net/john_xyz/article/details/78933253 目录目录CTR预估综述Factorization Machines(FM)算法原理代码实 ...
- Mahout推荐算法API详解
转载自:http://blog.fens.me/mahout-recommendation-api/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...
- 转】Mahout推荐算法API详解
原博文出自于: http://blog.fens.me/mahout-recommendation-api/ 感谢! Posted: Oct 21, 2013 Tags: itemCFknnMahou ...
- [转]Mahout推荐算法API详解
Mahout推荐算法API详解 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeepe ...
- Youtube推荐算法的前世今生
第一阶段,基于User-Video图游历算法,2008年[1]. 在这个阶段,YouTube认为应该给用户推荐曾经观看过视频的同类视频,或者说拥有同一标签的视频.然而此时,YouTube的视频已是数千 ...
- 推荐算法——距离算法
本文内容 用户评分表 曼哈顿(Manhattan)距离 欧式(Euclidean)距离 余弦相似度(cos simliarity) 推荐算法以及数据挖掘算法,计算"距离"是必须的~ ...
- 将 Book-Crossing Dataset 书籍推荐算法中 CVS 格式测试数据集导入到MySQL数据库
本文内容 最近看<写给程序员的数据挖掘指南>,研究推荐算法,书中的测试数据集是 Book-Crossing Dataset 提供的亚马逊用户对书籍评分的真实数据.推荐大家看本书,写得不错, ...
随机推荐
- Java面试专题-多线程(3)-原子操作
- 图论-zkw费用流
图论-zkw费用流 模板 这是一个求最小费用最大流的算法,因为发明者是神仙zkw,所以叫zkw费用流(就是zkw线段树那个zkw).有些时候比EK快,有些时候慢一些,没有比普通费用流算法更难,所以学z ...
- Vulnhub实战靶场:ME AND MY GIRLFRIEND: 1
一.环境搭建 1.官网下载连接:https://www.vulnhub.com/entry/me-and-my-girlfriend-1,409/ 2.下载之后,使用Oracle VM Virtual ...
- STL——容器(List)List 的构造函数
list<T> lstT -- list 对象的默认构造 list 与 vector 一样,同样采用模板类实现,对象的默认构造形式:list<T> lstT 如: 1 #in ...
- GaussDB(DWS)磁盘维护:vacuum full执行慢怎么办?
摘要:在数据库中用于维护数据库磁盘空间的工具是VACUUM,其重要的作用是删除那些已经标示为删除的数据并释放空间. vacuum的功能 回收空间 数据库总是不断地在执行删除,更新等操作.良好的空间管理 ...
- vue 事件函数传参
事件函数传参 在元素绑定事件时候,如果我们的函数没有传参,他也会有一个默认的传参值 event 但是如果我们的函数有传参,那么它必须作为做为最后一个传参值显示传递,且必须为$event 通过代码打印我 ...
- 用php简单区别泛解析
<?php header('content-type:text/html; charset=utf-8'); $host = '58.com'; $hosts = gethostbyname(' ...
- angular8 在componet里面跳转新的地址页面
this.router.navigate(['/teacher/course/detail/' + id]);
- mysql 查询出来的内容无法显示全部
前几天在做查询的时候,由于使用了字段拼接,所以查出来的其中一列,数据很长,但是每次显示一定的长度后,后面的就无法显示 原因是因为mysql设置查询出来的长度,好像默认是1024,因为我使用的是yii2 ...
- IphoneX适配正确姿势
IphoneX适配正确姿势 写在前面 距离18年9月iphonex发布以来已经快两年了(所以对于iphonex机型的头部刘海(sensor housing)和底部小黑条(Home Indicator) ...