周围总结广告点击率预臆度法计算,CT猎豹CS陆的局地模子方案

原标题:互联网广告CTR预估新算法:基于神经网络的DeepFM原理解读

新浦京www81707con 1

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~

大家好,我是为人造的智能操碎了心的智能禅师。

最近小弟参加了腾讯广告算法竞赛,虽然之前做了一次总结。但我觉得之前那个可能有点泛泛而谈,因此本次想仔细的讲讲关于CTR\周围总结广告点击率预臆度法计算,CT猎豹CS陆的局地模子方案。推荐算法常用的一些模型。对于CTR预测或者推荐算法,数据大多主要是用户数据和推荐的商品,广告数据。这些数据都有一个很大的特点:稀疏。在机器学习上面。我们通常把这些问题使用有监督学习算法做二分类预测,我们将其看作一个概率模型P(click|
product data, user
data)。CTR在很多互联网公司都是及其重要的,因为提高点击率带来流量和收益。无论是工程上还是数据分析上,CTR问题都是很有挑战性:

作者: class=”info-item”>高航 

作者:段石石
导语:
本文讨论了CTR预估模型,包括工业界使用比较广的比较经典模型和学术界最新的结合DeepLearning的一些工作。

全文大约2500字。读完可能需要下面这首歌的时间

  1. 数据量巨大:像一些大型的电商网站,游戏app,我们都会收集到大量的用户的数据和商品信息(上亿万级,可能上百G)。对于如此大量的数据,我们就应该考虑如何将所拥有的数据放入模型中训练。
  2. 特征维度高且稀疏:像电商平台里面,商品数据大多是都category,one
    label。当我们将其转化为one-hot并合并时,数据维度有可能爆炸。因此我们需要考虑如何处理好这些one
    label问题
  3. 存在时间序列:这些数据不是一成不变的,点击事件是不停产生。所以我们需要处理点击事件的时间序列问题。

一. Wide&&Deep 模型

首先给出Wide && Deep [1] 网络结构:

新浦京www81707con 2

本质上是线性模型(左边部分, Wide model)和DNN的融合(右边部分,Deep Model)。

推荐系统需要解决两个问题:

记忆性: 比如通过历史数据知道”麻雀会飞”,”鸽子会飞”

泛化性: 推断在历史数据中从未见过的情形,”带翅膀的动物会飞”

WideDeep是怎么解决这两个问题呢?

前言

谈到CTR,都多多少少有些了解,尤其在互联网广告这块,简而言之,就是给某个网络服务使用者推送一个广告,该广告被点击的概率,这个问题难度简单到街边算命随口告诉你今天适不适合娶亲、适不适合搬迁一样,也可以复杂到拿到各种诸如龟壳、铜钱等等家伙事,在沐浴更衣、净手煴香后,最后一通预测,发现完全扯淡,被人暴打一顿,更有甚者,在以前关系国家危亡、异或争国本这种情况时,也通常会算上一卦,国家的兴衰、。其实CTR和这个一样,以前经常和小伙伴吐槽,其实做机器学习、无论是推荐还是计算广告,都和以前的算命先生没什么差别,做的好的官至国师,不好的吃不了饱饭也是有的。要想把你CTR模型做的好好的,必须要先了解那些前辈们都是怎么玩的。

什么是CTR预估

CTR预测需要很强的业务思考能力,找出一些强特征。有强特征,一切都好办。在机器学习里面,我们都认为我们手上的特征和数据决定我们预测的上面,而模型只是不同的逼近这个上限。所以业务能力和特征工程在CTR上是及其重要的一环。有了好的特征,我们用LR也能得到很好的结果。当然现在我们在工程上面,希望能降低data
mining的能力,快速得到很好的结果(这不是说data
mining不重要,而是我们希望能够弱化其难度但也能得到很好结果)。随着NN的快速发展,业界出现了很多效果棒且不需很强data
mining能力的,例如GBDT +
LR,FM,FFM,FNN,PNN,deepFM,NFFM等等。这里我介绍一些我用过的模型。

Wide模型:

比如现在有一个点餐推荐APP,我输入炸鸡(query),那么会给我进行推荐其他相关的食物(item),那么模型目地就是为了希望知道给定了query,
消费item的概率, 即: P(消费| query, item).
那我们就可以通过构建出一系列(query, item)的cross 特征,
通过LR去学习到这些不同的cross特征与target = 消费 的相关性。比如(query =
“炸鸡”, item = “啤酒”) 与target = 消费
,通过历史数据学习到有很强的相关性,那么就推荐给炸鸡。

新浦京www81707con 3

CTR架构

一个典型的CTR流程如下图所示:

新浦京www81707con 4

如上图,主要包括两大部分:离线部分、在线部分,其中离线部分目标主要是训练出可用模型,而在线部分则考虑模型上线后,性能可能随时间而出现下降,弱出现这种情况,可选择使用Online-Learning来在线更新模型:

CTR(Click-Through-Rate)即点击通过率,是互联网广告常用的术语,指网络广告(图片广告/文字广告/关键词广告/排名广告/视频广告等)的点击到达率,即该广告的实际点击次数除以广告的展现量。

FM在线性模型上加入以下特性:

Deep模型:

现在我厌倦了推荐的结果,希望推一些让我惊喜的食物,上面的wide模型,我们构建的cross特征也是有限的,不能面面俱到,cross特征或许可以是三个类别,四个类别。所以,需要deep模型自动帮我们做一些特征。每个特征可以映射到一个低维空间去,学习到一个低维dense的表达(embedding
vector)。 那么给定一个query, 我们可以在embedding
space中找距离相近的item, 认为是潜在喜欢的item

新浦京www81707con 5

Wide模型与Deep模型的结合,目的是为了平衡记忆性和泛化性的结果.

新浦京www81707con 6

离线部分:

  1. ·
    数据收集:主要收集和业务相关的数据,通常会有专门的同事在app位置进行埋点,拿到业务数据;
  2. · 预处理:对埋点拿到的业务数据进行去脏去重;
  3. ·
    构造数据集:经过预处理的业务数据,构造数据集,在切分训练、测试、验证集时应该合理根据业务逻辑来进行切分;
  4. ·
    特征工程:对原始数据进行基本的特征处理,包括去除相关性大的特征,离散变量one-hot,连续特征离散化等等;
  5. ·
    模型选择:选择合理的机器学习模型来完成相应工作,原则是先从简入深,先找到baseline,然后逐步优化;
  6. ·
    超参选择:利用gridsearch、randomsearch或者hyperopt来进行超参选择,选择在离线数据集中性能最好的超参组合;
  7. · 在线A/B Test:选择优化过后的模型和原先模型(如baseline)进行A/B
    Test,若性能有提升则替换原先模型;

CTR是衡量互联网广告效果的一项重要指标。

  1. 考虑特征之间的关联性
  2. 将稀疏的特征用一个特征向量表示,使得特征从稀疏变得稠密

    新浦京www81707con 7FM模型数学表达

    在前面的w_0与w_i作为参数组成了线性模型,而后项考虑到特征之间的相关性。而v_i和v_j是x_i和x_j的代表向量特征。本来这个二项式的参数是w_ij代表两两特征之间的相关性。但这样的二项式参数有n
    /
    2,那就是半个矩阵的参数,而其实这个参数矩阵可能很稀疏的,因为不是每两维特征之间存在相关性。所以我们就将矩阵分解成latent
    vector,w_ij = v_i * v_j。这样一来,参数变少了(n *
    k,k为vector的长度,k << n),而且没必要训练的变量也变稠密了。

二. FNN,SNN 模型

和wide deep出发点一样, 一些线性模型LR很难学到非线性表达,
非线性模型比如FM,
GBDT又很难学到所有的特征组合方式。那么,如何利用DNN去自动学习到特征表达,自动去学习到特征之间的交叉呢?

FNN模型结构[2]:

新浦京www81707con 8

首先需要对category特征进行一个one-hot编码。

l1, l2层都是隐藏层,那么, dense real layer 就可以看作一个embedding层,
每个field 分别
对应一个embedding的过程。通常,使用FM去初始化这些参数往往能够更快地收敛,最大限制避免训练过程中陷入局部最小,以及得到更好的结果。可以看到,FNN其实就是widedeep模型的deep部分,但是FNN有用FM进行一个参数初始化的过程。

SNN模型结构:

新浦京www81707con 9

SNN和FNN模型区别于最底层的训练方法,
FNN最底层先用FM初始化,可以看到,SNN最底层是全连接的,不区分不同的field。
初始化采用RBM(限制玻尔兹曼机) 和 DAE(自动编码机)。

训练过程中,没有每轮迭代都会用到所有的特征,对为0的单元进行一个下采样操作,图中黑色的单元即是没有被选取到,不参与参数迭代。计算复杂度得到大量的减少。

文章在iPinYou数据集上进行评测,可以看到FNN效果优于FM,LR。

新浦京www81707con 10

文章对调参也给出了一些经验

  1. 网络结构,通常,钻石型的网络结构往往优于其他结构

    1. 隐藏层单元数不是越高越好,中间有一个临界值达到最优.
  2. Dropout在数据量本来就很稀疏的情况下尽量不用,不同的数据集dropout表现差距比较大。

在线部分

  1. · Cache & Logic:设定简单过滤规则,过滤异常数据;
  2. · 模型更新:当Cache &
    Logic收集到合适大小数据时,对模型进行pretrain+finetuning,若在测试集上比原始模型性能高,则更新model
    server的模型参数;
  3. · Model Server:接受数据请求,返回预测结果;

CTR预估数据特点:

显然FFM是FM的升级版本。相对于FM,FFM加入的就是field这个概念,field就是原始数据当中的每个字段。在FM当中,我们只考虑到特征的相关性,而没有考虑到field之间的相关性。FFM就是考虑到特征向量对field敏感的。在FM中,向量的个数是n,在FFM中,向量的个数的n
* f。

三. PNN 模型

PNN[3]的网络结构:

新浦京www81707con 11

PNN的结构的思想相比于WideDeep模型核心改动地方在对于embedding后的dense
feature,增加了两两交叉的功能,widedeep是embedding
feature全部输入到隐藏层了。不同field经过Embedding后的特征做点击运算其实就相当于FM,那么PNN认为首先需要确保学习到这些交叉特征,再去额外交给DNN去学习更复杂的交叉特征。那么PNN结构其实相当于FM+DEEP。

再说下网络细节: Embedding layer 和Wide Deep模型是一样的, 不同field特征映射到了一个embedding的空间上,这时,不是所有的特征直接送到一个NN网络里面去,这里分成两个部分z 和p。 z部分直接就是原始的embedding特征不变; P部分是embedding特征两两做内积运算,达到FM的效果,接下来z和p拼接成一个vector, 送到一个NN网络里面,最后softmax输出概率值。

Logistic Regression

最简单的模型也应该是工业界应用最广的方法,Logistic
Regression算法简单易于调参,属于线性模型,原理如下图:

新浦京www81707con 12

将CTR模型建模为一个分类问题,利用LR预测用户点击的概率;通常我们只需要离线收集好数据样本构造数据集,选择好合适的特征空间,离线训练好模型,测试在离线数据集上的性能之后,即可上线,也可以适应数据分布随时间突变严重的情况,采用online-learning的策略来对模型进行相对频繁的更新,模型的简单能够保证这部分的需求能够得到保障。

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

新浦京www81707con 13FFM的二项式

四. DeepFM 模型

DeepFM[4]的网络结构:

新浦京www81707con 14

可以看到,很像PNN结构,只是在这里FM没有和原始特征一起送到NN中去训练,而是单独拿出来类似于WIDE模型。其实就是WideDeep模型中Wide侧替换为FM。

PLOY2

LR优点是简单高效,缺点也很明显,它太简单,视特征空间内特征之间彼此独立,没有任何交叉或者组合关系,这与实际不符合,比如在预测是否会点击某件t恤是否会点击,如果在夏天可能大部分地区的用户都会点击,但是综合季节比如在秋天,北方城市可能完全不需要,所以这是从数据特征维度不同特征之间才能体现出来的。因此,必须复杂到能够建模非线性关系才能够比较准确地建模复杂的内在关系,而PLOY2就是通过特征的二项式组合来建模这类特征的复杂的内在关系,二项式部分如下图公式:

新浦京www81707con 15

然而理想是美好的,现实却是残酷的,PLOY2有一个明显的问题,就是在实际场景中,大部分特征都是稀疏的,即大部分特征值为0,对这些稀疏的特征做二项式组合,会发现最后大部分特征值都是0,而在梯度更新时,当大部分feature为0时,其实梯度并不更新,所以PLOY2的方法在实际场景中并不能比较好地解决这类特征组合来建模更复杂线性关系的问题。

与FM不同,FFM的二项式考虑的是特征对应的Field。相对于FM不断增加latent
vector长度来提高精度,FFM效果更好。

五. NFM 模型

NFM模型[5]的网络结构:

新浦京www81707con 16

首先,也是经过全连接得到embedding层,输入是新浦京www81707con 17

新浦京www81707con 18分别是不同特征对应的相同维数的embedding向量。接下来,这些embedding向量两两做element-wise的相乘运算得到B-interaction
layer。(element-wide运算举例:
(1,2,3)element-wide相乘(4,5,6)结果是(4,10,18)。)

新浦京www81707con 19

该B-interaction Layer
得到的是一个和embedding维数相同的向量。然后后面接几个隐藏层输出结果。

为什么这么做呢?首先看如果B-interaction
layer后面不接隐藏层,直接把向量的元素相加输出结果(对应下面的公式h=(1,1,1,…,1))
, 就是一个FM, 就好比一个线性模型,权重都是1 :

新浦京www81707con 20

现在后面增加了隐藏层,相当于做了更高阶的FM,更加增强了非线性表达能力。

Factorization Machine

上面PLOY2虽然理论上能够建模二项式关系,但是在实际场景下稀疏数据时,无法使用,而FM就是为了解决这里PLOY2的短板的,FM的基本原理是将这些二项式矩阵做矩阵分解,将高维稀疏的特征向量映射到低维连续向量空间,然后根据内积表示二项式特征关系:

新浦京www81707con 21

复杂度为$O(kn^2)$,作者提出了一种简化的算法:

新浦京www81707con 22

将复杂度简化为$O(kn)$
然后就是SGD来更新模型参数,使模型收敛(这里还有很多其他替代SGD的方法,在FFM中有提到):

新浦京www81707con 23

训练时间复杂度也是$O(kn)$,也就是线性时间,FM通过对二项式稀疏进行低维连续空间的转换,能够有效地解决PLOY2中存在的二次项系数在大规模系数数据下不更新的问题,另外由于训练预测复杂度均为线性,PLOY2+SVM这样逻辑下由于要计算多项式核,复杂度是n^2,由于FM的这几个特征,在实际场景中,FM也大规模的应用在CTR中,尤其是在数据极其系数的场景下,FM效果相对于其他算法有很明星的改善。

CTR预估重点在于学习组合特征。注意,组合特征包括二阶、三阶甚至更高阶的,阶数越高越复杂,越不容易学习。

新浦京www81707con 24structure
of DeepFM

六. AFM 模型

AFM模型[6]的网络结构:

新浦京www81707con 25

AFM是NFM模型的一个改进,
在传统FM模型中,使用二阶交叉特征得到非线性表达能力,但是不是所有的特征交叉都会有预测能力,很多无用的特征交叉加入后反而会相当于加入了噪声。

因此,在这个模型中,加入了Attention Net
机制,aij表示特征i,j交叉的权重。计算方式如下: 经过一个attention
net的隐藏层,得到该特征交叉的权重

新浦京www81707con 26

最后的预测方式和NFM类似, 当P=(1,1,1,…,1),是加了权重的FM,
后面也可以和NFM一样增加隐藏层,得到更高阶特征的表达能力。

新浦京www81707con 27

结语:
没有万能的模型,针对不同的业务可能需要选择不同的模型,比如如果需要解释能力强的,那么不妨选择AFM模型,
Wide
Deep实际中应用比较广,效果也可以,但是很难定位问题,也难分析Deep侧的特征重要性。同时网络结构需要不断尝试,或许我们都可以embedding到一个固定的维数后,可以把这个embedding特征当作图像来做,做卷积,pooling,
说不定有惊喜,达到去噪声的目的。

Field-aware FM

FMM全程是 Field-aware
FactorizationMachine,相对于FM增加了Field信息,每个特征属于一个field,举个例子:

新浦京www81707con 28

而相对于FM,只有Feature_index相同个数的低维连续表示,而FFM则不同,每一个feature对不同的field有不同的表示,所以有#Field_index*#Feature_index个不同的表示:

新浦京www81707con 29

通常由于每个低维隐变量表示只学习特定field的表示,所以FFM的隐变量长度相对于FM的隐变量维度要小的多。FFM的优化问题相对其比较简单,可以看看FFM这篇paper,里面比较详细地描述优化过程,还有相关的伪代码
https://www.andrew.cmu.edu/user/yongzhua/conferences/ffm.pdf

Google的论文研究得出结论:高阶和低阶的组合特征都非常重要,同时学习到这两种组合特征的性能要比只考虑其中一种的性能要好。

DeepFM对PNN和FM做了整合,它认为FM训练的较为浅层的特征,而PNN训练得到较为深层的特征,于是将其两种整合一齐。因此作者称其为DeepFM。

参考文献

[1] Cheng H T, Koc L, Harmsen J, et al. Wide & Deep Learning for
Recommender Systems[J]. 2016:7-10.

[2] Zhang, Weinan, T. Du, and J. Wang. “Deep Learning over Multi-field
Categorical Data: A Case Study on User Response Prediction.” (2016).

[3] Qu Y, Cai H, Ren K, et al. Product-Based Neural Networks for User
Response Prediction[J]. 2016:1149-1154.

[4] Guo H, Tang R, Ye Y, et al. DeepFM: A Factorization-Machine based
Neural Network for CTR Prediction[J]. 2017.

[5] He X, Chua T S. Neural Factorization Machines for Sparse
Predictive Analytics[J]. 2017.

[6] Xiao J, Ye H, He X, et al. Attentional factorization machines:
Learning the weight of feature interactions via attention networks[C].
IJCAI, 2017.

FNN

从12年在ImageNet上深度学习超过经典模型之后,在计算机视觉、语音、NLP都有很多相关的工作,而在CTR上,深度学习的建模能力也有一些应用,FNN和SNN就是其中的一些尝试,来源于Deep
Learning over Multi-field Categorical Data – A Case Study on User
Response Prediction,这里稍微描述下相关的做法:

新浦京www81707con 30

网络底层由FM来进行参数初始化,W的元素由FM中的低维连续空间向量表示来做初始化:

新浦京www81707con 31

而构成W的低维连续空间向量表示预先由FM在数据集上生成,模型在训练过程中,会通过BP来更新FM层参数,其他步骤和常见的MLP没有什么区别,这里重点就是底层如何介入FM层参数的问题;

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

新浦京www81707con 32左侧FM
structure

相关阅读

基于 word2vec 和 CNN 的文本分类 :综述 &
实践

深度学习的异构硬件加速:TPU 特性与数据中心的 ASIC
应用(概述篇)

基于深度学习的图像真实风格迁移


此文已由作者授权腾讯云技术社区发布,转载请注明文章出处

原文链接:

CCPM

CCPM利用卷积网络来做点击率预测,看了文章,没有太明白其中的所以然,贴下网络结构的图吧:

新浦京www81707con 33

有弄清楚这篇文章的小伙伴可以讨论下。

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

作者认为FM中线性组合为一阶特征,交叉组合是二阶特征。所以这部分就是一个FM模型。

PNN

PNN主要是在深度学习网络中增加了一个inner/outer product
layer,用来建模特征之前的关系,如下图,Product
layer部分Z是weightfeature,P部分weightI(feature_i,feature_j)用来建模二项式关系:

新浦京www81707con 34

PNN按product层的功能分为inner product layer和outer product
layer,区别如下:

新浦京www81707con 35

和FM类似,构造好网络之后,对输入数据做embedding处理之后得到低维的连续向量表示,经过任意两个feature的进行inner
product or outer
product(1也为feature的一部分,所以可以建模线性关系),这里很容易发现,这部分特征大小会变大很多(二次项数量级),尤其是稀疏空间,和PLOY2遇到的问题类似,变得很难训练,受FM启发,可以把这个大矩阵转换矩阵分解为小矩阵和它的转置相乘,表征到低维度连续向量空间,来减少模型复杂度:

新浦京www81707con 36

CTR模型演进历史

新浦京www81707con 37FM公式新浦京www81707con 38右侧Deep
Component

DeepFM

DeepFM更有意思的地方是WDL和FM结合了,其实就是把PNN和WDL结合了,PNN即将FM用神经网络的方式构造了一遍,作为wide的补充,原始的Wide
and
Deep,Wide的部分只是LR,构造线性关系,Deep部分建模更高阶的关系,所以在Wide
and Deep中还需要做一些特征的东西,如Cross
Column的工作,而我们知道FM是可以建模二阶关系达到Cross
column的效果,DeepFM就是把FM和NN结合,无需再对特征做诸如Cross
Column的工作了,这个是我感觉最吸引人的地方,其实FM的部分感觉就是PNN的一次描述,这里只描述下结构图,PNN的部分前面都描述,
FM部分:

新浦京www81707con 39

Deep部分:

新浦京www81707con 40

DeepFM相对于FNN、PNN,能够利用其Deep部分建模更高阶信息(二阶以上),而相对于Wide
and
Deep能够减少特征工程的部分工作,wide部分类似FM建模一、二阶特征间关系,算是NN和FM的一个更完美的结合方向,另外不同的是如下图,DeepFM的wide和deep部分共享embedding向量空间,wide和deep均可以更新embedding部分,虽说wide部分纯是PNN的工作,但感觉还是蛮有意思的。

新浦京www81707con 41

其他的一些方法

  • GBDT+LR:Facebook提出利用GBDT探索海量特征空间的特征组合,减少特征工程工作量,性能很好;

  • MLR:阿里妈妈前端时间提出的一种增强LR模型,将region的划分考虑进去来建模非线性关系,感觉类似于深度学习的Attention机制,据说在阿里妈妈相关业务提升很多;

1. 线性模型

我们将raw feature做embeddings,将其映射到一个稠密的特征向量当中。因为raw
feature太稀疏了,在神经网络中是很难训练好的。我们将这些特征映射好以后就将其合并在一齐做DNN,这样我们就得到了高阶特征。

总结

前面讨论了一些CTR常见的方法,重点介绍了Factorization
Machine及其变种Field-Aware Factorization
Machine,还有和深度学习的结合,个人感觉PNN的逻辑比较有意思,完全使用神经网络的思维模型重塑了FM,为后面DeepFM扩展wide
and deep的工作打下基础,减少了wide and
deep中需要的一些基本的特征工程工作(wide部分二次项工作),上面只是涉及到模型的算法部分,在实际中可以去探讨,并不能说明一定性能就好,另外由于架构的限制,综合考虑其他方面的因素,如请求时间、模型复杂度,也是最终是否采用相关算法的考虑因素,各位对此有兴趣讨论的小伙伴,欢迎回复讨论。

最开始CTR或者是推荐系统领域,一些线性模型取得了不错的效果。比如:LR,FTRL。

最后如第一副图所示,FM和DNN的输出做多一层NN就在用sigmoid代表其输出概率。而FM和DNN是共享这个embeddings层。embeddings是对Field做的,也就是说基本每个特征都必须是category。相对于FNN和PNN来说,DeepFM无需用FM预训练embedding,也不像PNN那样只有高阶特征。

相关阅读

机器学习优化算法:梯度下降(Gradient
Descent)
机器学习优化算法:牛顿法 ( Newton Method
)
CTR
预估模型的进化之路

此文已由作者授权腾讯云技术社区发布,转载请注明文章出处
原文链接:https://cloud.tencent.com/community/article/205108

线性模型有个致命的缺点:无法提取高阶的组合特征。所以常用的做法是人为的加入pairwise
feature interactions。

新浦京www81707con 42CTR模型之间的对比

即使是这样:对于那些出现很少或者没有出现的组合特征以及高阶组合特征依旧无法提取。

可见DeepFM不需要pre-training,不需要feature
engineering,同时既有低阶特征,也有高阶特征。

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

新浦京www81707con 43GBDT

2. FM模型

  • LR/FM

线性模型差强人意,直接导致了FM模型应运而生(在Kaggle上打比赛提出来的,取得了第一名的成绩)。

看图就能理解了。我们先训练好GBDT,每个叶子节点都有一个权值。那么我们利用这些权值作为特征训练一个LR模型作为我们的输出结果。这个样子有点像迁移学习。代码如下

FM通过隐向量latent
vector做内积来表示组合特征,从理论上解决了低阶和高阶组合特征提取的问题。

# -*- coding: utf-8 -*-from scipy.sparse.construct import hstackfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import load_breast_cancerfrom sklearn.linear_model.logistic import LogisticRegressionfrom sklearn.metrics.ranking import roc_auc_scorefrom sklearn.preprocessing.data import OneHotEncoderimport numpy as npimport lightgbm as lgbimport xgboost as xgbdef xgb_lr_train(): data = load_breast_cancer() X_train, X_valid, y_train, y_valid = train_test_split(data.data, data.target, test_size=0.3) xgboost = xgb.XGBClassifier(nthread=4, learning_rate=0.08, n_estimators=200, max_depth=5, gamma=0, subsample=0.9, colsample_bytree=0.5) xgboost.fit(X_train, y_train) xgb_valid_auc = roc_auc_score(y_valid, xgboost.predict print("XGBoost valid AUC: %.5f" % xgb_valid_auc) X_train_leaves = xgboost.apply X_valid_leaves = xgboost.apply all_leaves = np.concatenate((X_train_leaves, X_valid_leaves), axis=0) all_leaves = all_leaves.astype xgbenc = OneHotEncoder() X = xgbenc.fit_transform(all_leaves) (train_rows, cols) = X_train_leaves.shape lr = LogisticRegression() lr.fit(X[:train_rows, :], y_train) xgb_lr_valid_auc = roc_auc_score(y_valid, lr.predict_proba(X[train_rows:, :])[:, 1]) print("XGBoost-LR valid AUC: %.5f" % xgb_lr_valid_auc) # X_train_leaves = lgb_model.apply # X_valid_leaves = lgb_model.applyif __name__ == '__main__': xgb_lr_train()

但是实际应用中受限于计算复杂度,一般也就只考虑到2阶交叉特征。

其实我觉得这些模型都挺实在的,尤其DeepFM,它弱化了特征工程的,让我们可以轻松的把指标提上去。虽然有好的模型,但我这里还是要跟大家讲一句,特征才是重点当中的重点。在CTR,我们要让模型做到更好的个性化,就必须把特征做细粒度,特征越细越具备个性化。这大概是我这段时间做CTR预测的一些想法吧。

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

3. 遇上深度学习

随着DNN在图像、语音、NLP等领域取得突破,人们见见意识到DNN在特征表示上的天然优势,相继提出了使用CNN或RNN来做CTR预估的模型。

但是,CNN模型的缺点是:偏向于学习相邻特征的组合特征。
RNN模型的缺点是:比较适用于有序列(时序)关系的数据。

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

随后提出了PNN,PNN为了捕获高阶组合特征,在embedding layer和first hidden
layer之间增加了一个product layer。

根据product layer使用内积、外积、混合分别衍生出IPNN, OPNN,
PNN*三种类型。

无论是FNN还是PNN,他们都有一个绕不过去的缺点:对于低阶的组合特征,学习到的比较少。而前面我们说过,低阶特征对于CTR也是非常重要的。

Google意识到了这个问题,为了同时学习低阶和高阶组合特征,提出了Wide&Deep模型。

它混合了一个线性模型(Wide part)和Deep模型(Deep
part)。这两部分模型需要不同的输入,而Wide
part部分的输入,依旧依赖人工特征工程。

但是,这些模型普遍都存在两个问题:

偏向于提取低阶或者高阶的组合特征。不能同时提取这两种类型的特征。
需要专业的领域知识来做特征工程。

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

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

下面,就让我们走进DeepFM的世界,一起去看看它到底是怎么解决这些问题的!

DeepFM

主要做法如下:

首先,使用FM Component + Deep
Component。FM提取低阶组合特征,Deep提取高阶组合特征。但是和Wide&Deep不同的是,DeepFM是端到端的训练,不需要人工特征工程。

其次,共享feature embedding。FM和Deep共享输入和feature
embedding不但使得训练更快,而且使得训练更加准确。

相比之下,Wide&Deep中,input
vector非常大,里面包含了大量的人工设计的pairwise组合特征,增加了他的计算复杂度。

DeepFM架构图:

新浦京www81707con 44

1. FM Component

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

新浦京www81707con 45

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

FM架构图:

新浦京www81707con 46

Addition
Unit反映的是1阶的特征。内积单元反映的是2阶的组合特征对于预测结果的影响。

注意:

虽然公式上Y_fm是所有部分都求和,是一个标量。但是从FM模块的架构图上我们可以看到,输入到输出单元的部分并不是一个标量,应该是一个向量。

实际实现中采用的是FM化简之后的内积公式,最终的维度是:field_size +
embedding_size

这里分别展开解释下维度的两部分是怎么来的,对于理解模型还是很重要的:

第一、field_size对应的是

这里的X是one-hot之后的,one-hot之后,我们认为X的每一列都是一个单独的维度的特征。

这里我们表达的是X的1阶特征,说白了就是单独考虑X的每个特征,他们对最终预测的影响是多少。

是多少那?是W!W对应的就是这些维度特征的权重。假设one-hot之后特征数量是feature_size,那么W的维度就是
(feature_size, 1)。

这里
是把X和W每一个位置对应相乘相加。由于X是one-hot之后的,所以相当于是进行了一次Embedding!X在W上进行一次嵌入,或者说是一次选择,选择的是W的行,按照X中不为0的那些特征对应的index,选择W中row=index的行。

这里解释下Embedding:
W是一个矩阵,每一行对应X的一个维度的特征(这里是one-hot之后的维度,一定要注意)。W的列数为1,表示嵌入之后的维度是1。

W的每一行对应一个特征,相当于是我们拿输入Xi作为一个index,
Xi的任意一个Field
i中只有1个为1,其余的都是0。哪个位置的特征值为1,那么就选中W中对应的行,作为嵌入后这个Field
i对应的新的特征表示。

对于每一个Field都执行这样的操作,就选出来了X_i
Embedding之后的表示。注意到,每个Field都肯定会选出且仅选出W中的某一行(想想为什么?),因为W的列数是固定的,每一个Field都选出W.cols作为对应的新特征。

把每个Field选出来的这些W的行,拼接起来就得到了X
Embedding后的新的表示:维度是num(Field) *
num(W.cols)。虽然每个Field的长度可能不同,但是都是在W中选择一行,所以选出来的长度是相同的。

这也是Embedding的一个特性:虽然输入的Field长度不同,但是Embedding之后的长度是相同的。

什么?Embedding这么复杂,怎么实现的?非常简单!直接把X和W做内积即可。是的,你没看错,就是这么简单(tensoflow中封装了下,改成了tf.nn.embedding_lookup(embeddings,
index),原理就是不做乘法,直接选出对应的行)。

自己写个例子试试:X.shape=(1, feature_size), W.shape = (feture_size,
embedding_size)就知道为什么选出1对应W的行和做内积结果是一样的是怎么回事了。

所以:FM模块图中,黑线部分是一个全连接!W就是里面的权重。把输入X和W相乘就得到了输出。至于Addition
Unit,我们就不纠结了,这里并没有做什么加法,就把他当成是反应1阶特征对输出的影响就行了。

新浦京www81707con 47

FM论文中给出了化简后的公式:

新浦京www81707con 48

这里最后的结果中是在[1,K]上的一个求和。
K就是W的列数,就是Embedding后的维度,也就是embedding_size。也就是说,在DeepFM的FM模块中,最后没有对结果从[1,K]进行求和。而是把这K个数拼接起来形成了一个K维度的向量。

FM Component总结:

  1. FM模块实现了对于1阶和2阶组合特征的建模。
  2. 没有使用预训练
  3. 没有人工特征工程
  4. embedding矩阵的大小是:特征数量 * 嵌入维度。
    然后用一个index表示选择了哪个特征

需要训练的有两部分:

  1. input_vector和Addition Unit相连的全连接层,也就是1阶的Embedding矩阵
  2. Sparse Feature到Dense
    Embedding的Embedding矩阵,中间也是全连接的,要训练的是中间的权重矩阵,这个权重矩阵也就是隐向量V

Deep Component

Deep Component架构图:

新浦京www81707con 49

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

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

这里继续补充下Embedding层,两个特点:

  1. 尽管输入的长度不同,但是映射后长度都是相同的.embedding_size 或 k
  2. embedding层的参数其实是全连接的Weights,是通过神经网络自己学习到的

新浦京www81707con,Embedding层的架构图:

新浦京www81707con 50

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

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

对比其他模型

模型图:

新浦京www81707con 51

[FNN]

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

FNN缺点:

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

[PNN]

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

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

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

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

PNN缺点:

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

[Wide&Deep]

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

Wide部分可以用LR来替换,这样的话就和DeepFM差不多了。
但是DeepFM共享feature embedding
这个特性使得在反向传播的时候,模型学习feature
embedding,而后又会在前向传播的时候影响低阶和高阶特征的学习,这使得学习更加的准确。

Wide&Deep缺点:

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

[DeepFM]

优点:

  1. 没有用FM去预训练隐向量V,并用V去初始化神经网络。(相比之下FNN就需要预训练FM来初始化DNN)
  2. FM模块不是独立的,是跟整个模型一起训练学习得到的。(相比之下Wide&Deep中的Wide和Deep部分是没有共享的)
  3. 不需要特征工程。(相比之下Wide&Deep中的Wide部分需要特征工程)
  4. 训练效率高。(相比PNN没有那么多参数)

总结

知识点:

  1. 没有预训练(no pre-training)
  2. 共享Feature Embedding,没有特征工程(no feature engineering)
  3. 同时学习低阶和高阶组合特征(capture both low-high-order interaction
    features)

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

超参数 建议 备注
激活函数 1. IPNN使用tanh 2. 其余使用ReLU
学习方法 Adam
Dropout 0.6~0.9
隐藏层数量 3~5 根据实际数据大小调整
神经元数量 200~600 根据实际数据大小调整
网络形状 constant 一共有四种:固定、增长、下降、菱形。

最后,模型对比图:

新浦京www81707con 52返回搜狐,查看更多

责任编辑:

相关文章