大家好,我们今天继续来剖析一些推荐广告领域的论文。

今天选择的这篇叫做DeepFM: A Factorization-Machine based Neural Network for CTR Prediction,翻译过来就是DeepFM:一个基于深度神经网络的FM模型。这篇paper的作者来自哈工大和华为,不得不说在人工智能领域的很多论文都是国产的,作为从业者还是非常欣喜能看到这点的。

通过名字我们也能看得出来,今天的这篇paper本质上其实是FM模型的一个进阶或者说是优化版本。如果对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。这样做会有两个非常重要的好处:

  1. 它可以同时学习到低维以及高维的特征交叉信息,预训练的FM来进行向量初始化得到的embedding当中可能只包含了二维交叉的信息。
  2. 这样可以避免像是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模型的更多相关文章

  1. (读论文)推荐系统之ctr预估-DeepFM模型解析

    今天第二篇(最近更新的都是Deep模型,传统的线性模型会后面找个时间更新的哈).本篇介绍华为的DeepFM模型 (2017年),此模型在 Wide&Deep 的基础上进行改进,成功解决了一些问 ...

  2. 推荐算法之: DeepFM及使用DeepCTR测试

    算法介绍 左边deep network,右边FM,所以叫deepFM 包含两个部分: Part1: FM(Factorization machines),因子分解机部分 在传统的一阶线性回归之上,加了 ...

  3. CTR预估算法之FM, FFM, DeepFM及实践

    https://blog.csdn.net/john_xyz/article/details/78933253 目录目录CTR预估综述Factorization Machines(FM)算法原理代码实 ...

  4. Mahout推荐算法API详解

    转载自:http://blog.fens.me/mahout-recommendation-api/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...

  5. 转】Mahout推荐算法API详解

    原博文出自于: http://blog.fens.me/mahout-recommendation-api/ 感谢! Posted: Oct 21, 2013 Tags: itemCFknnMahou ...

  6. [转]Mahout推荐算法API详解

    Mahout推荐算法API详解 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeepe ...

  7. Youtube推荐算法的前世今生

    第一阶段,基于User-Video图游历算法,2008年[1]. 在这个阶段,YouTube认为应该给用户推荐曾经观看过视频的同类视频,或者说拥有同一标签的视频.然而此时,YouTube的视频已是数千 ...

  8. 推荐算法——距离算法

    本文内容 用户评分表 曼哈顿(Manhattan)距离 欧式(Euclidean)距离 余弦相似度(cos simliarity) 推荐算法以及数据挖掘算法,计算"距离"是必须的~ ...

  9. 将 Book-Crossing Dataset 书籍推荐算法中 CVS 格式测试数据集导入到MySQL数据库

    本文内容 最近看<写给程序员的数据挖掘指南>,研究推荐算法,书中的测试数据集是 Book-Crossing Dataset 提供的亚马逊用户对书籍评分的真实数据.推荐大家看本书,写得不错, ...

随机推荐

  1. PostMan设置环境变量&全局变量

    一.设置环境变量 1.点击右上角Manage Environment,进入环境变量设置界面 2.定义环境名称,参数名及参数值 3.将接口地址中服务器地址进行参数化,并选择对应的环境执行 二.设置全局变 ...

  2. 查询满足条件的最新数据(逐步优化,mysql、达梦数据库)

    1.条件:报警信息表sensor_warning 2.需求: 查询当前车厢的.不同设备的.所有处理未完成的.不同报警原因的.时间最新的数据集合,最后按设备id或报警时间排序 3.原始sql,不满足实际 ...

  3. SQL直接生成实体属性,简单粗暴型

    在java开发中,不可避免的要碰到根据表生成对应的实体,这个过程是比较机器且繁琐的,我也用过一些逆向工程的工具,比如IDEA自带的生成实体,还有网上开源的工具,用起来也是可以的. 我现在开发用的持久层 ...

  4. redis学习之——redis.conf配置(基本)文件学习

    # Redis configuration file example # Note on units: when memory size is needed, it is possible to sp ...

  5. tensorflow学习笔记——DenseNet

    完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和De ...

  6. 【Pyhton 】 装饰器

    # -*- coding:utf8 -*-# Author : Mr·Yang''' 装饰器,带参数装饰器,装饰器中带参数''' import time# 普通装饰器'''def time_decor ...

  7. AWT08-绘图

    1.组件绘图原理 Java GUI能展示出不同对话框.窗口等等组件外观的本质其实就是绘图. 在AWT中,真正提供绘图功能的是Graphics对象,在Component中提供了三个方法来完成组件图形的绘 ...

  8. AWT02-ContainerAPI

    1.体系 Object -Component -Container Window:窗口容器 Frame:创建窗口 Dialog:创建对话框 Panel:内嵌容器 Applet ScrollPane:含 ...

  9. Maven项目中配置jdk版本

    <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  10. 【QT】多个槽函数绑定同一个信号的触发顺序

    目录 一.Qt 3.0(包含3.0) - Qt 4.5(包含4.5)版本之前 二.Qt 4.6(包含4.6)版本之后 一.Qt 3.0(包含3.0) - Qt 4.5(包含4.5)版本之前 「多个槽函 ...