导读:本文是“数据拾光者”专栏的第五十二篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇从理论到实践介绍了华为CTR开源项目FuxiCTR,对CTR模型感兴趣并希望快速应用到项目实践的小伙伴可以一起沟通交流。
摘要:本篇从理论到实践介绍了华为CTR开源项目FuxiCTR。首先是背景介绍,然后重点详解开源项目FuxiCTR,包括项目架构、支持的主流CTR算法以及在公共数据集上的效果和代码处理流程及源码介绍;最后分别简单介绍了传统CTR模型发展进程和深度学习CTR模型发展进程。对CTR模型感兴趣并希望快速应用到项目实践的小伙伴可以一起沟通交流。
下面主要按照如下思维导图进行学习分享:
01
背景介绍
最近在做CTR模型相关项目,网上查阅了很多资料,比较靠谱的是华为论文《Open Benchmarking for Click-Through Rate Prediction》以及对应的开源github项目FuxiCTR。论文做了一个CTR模型的benchmark,在公共数据集Criteo和Avazu对比了主流CTR模型的效果。通过这个开源项目我们可以了解主流CTR模型的效果,同时很方便的学习和使用各种主流CTR模型,对于又好又快的构建线上CTR模型有很大的帮助。
02
详解开源项目FuxiCTR
2.1 FuxiCTR项目架构
FuxiCTR项目github地址如下:https://github.com/xue-pai/FuxiCTR
项目整体架构如下图所示,其中features.py是特征处理模块,models和layers主要负责模型构建,models支持目前大多数主流的CTR模型。下面是FuxiCTR项目整体架构图:
图1 FuxiCTR项目整体架构
2.2 FuxiCTR支持主流的CTR算法以及在公共数据集效果
论文在公共数据集Criteo和Avazu对比了主流CTR模型的效果,下面是Criteo数据集上的效果展示图:
图2 Criteo数据集上的效果展示图
可以看出Criteo数据集上表现效果较好的是Wide&Deep、IPNN、DeepFM、DCN、xDeepFM和ONN。接下来是Avazu数据集上的效果展示图:
图3 Avazu数据集上的效果展示图
可以看出Avazu数据集上表现效果较好的是IPNN、HFM+、FGCNN、ONN和FiBiNET。
结合Criteo数据集和Avazu数据集模型效果来看,LR模型作为早期主流的CTR模型效果会差于其他CTR模型。同时我们还发现同一个模型在不同数据集上的表现效果差异较大,选择适合自己任务的模型才是最重要的。实际工作中想又快又好的上线CTR项目,一个不错的建议就是可以优先尝试那些在公共数据集上表现效果好的CTR模型,毕竟那么多模型想挨个跑一遍是需要很多时间成本和人力研发成本的。
2.3 代码处理流程及源码介绍
将FuxiCTR项目通过github下载到本地,项目是基于python3.6和pytorch构建,下面是FuxiCTR项目相关依赖的包:
图4 FuxiCTR项目相关依赖的包
FuxiCTR项目提供了很多demo示例,这里我们以DeepFM_with_config.py介绍CTR模型构建流程:
图5 CTR模型流程图
整体来看构建CTR模型需要以下四个流程:
S1:配置数据集和模型相关信息
数据集相关信息配置在dataset_config.yaml文件中,主要包括训练集、验证集和测试集文件位置以及数据存储格式,还包括特征列和标签列等信息。下面是数据集相关配置信息:
图6 数据集相关信息
模型相关信息配置在model_config.yaml文件中,主要包括模型名、损失函数、评估metrics、优化器等等。下面是DeepFM模型相关配置项:
图7 DeepFM模型相关信息
FuxiCTR项目封装的非常好,仅通过如下几行代码即可完成配置文件导入:
config_dir = 'demo_config'
experiment_id = 'DeepFM_test'
params = load_config(config_dir,experiment_id)
S2:构建特征处理器并处理数据
这里先看下用户点击广告示例数据,里面包括用户user在哪个时间点击了某个广告ad、广告ad相关信息、用户user相关信息以及用户点击广告序列等信息,下面是示例数据:
图8 用户点击广告示例数据
对于实际业务中的CTR模型来说,挖掘更多更有效的特征有时候比模型结构更有效。这里特征包括类别特征、连续值特征、序列特征和时间类特征等。
类别特征比较容易理解,分成稠密特征和稀疏特征。比如用户user性别主要男/女/其他三类,类别数目比较少,这类属于稠密特征,稠密特征一般通过one-hot编码处理。比如广告ad所属的广告组特征类别数目非常大,通常达到几十万种,这类属于稀疏特征,如果直接通过one-hot编码可能一个特征就达到几十万维,直接将这种高维稀疏特征放到模型中去训练使得计算代价非常大。处理稀疏特征常用的做法是通过embedding技术将高维稀疏向量转化成低维稠密向量。连续值特征比如价格price等,通常的处理办法是进行分桶等操作。序列特征比如用户历史点击广告序列click_sequence等,通常的处理办法是进行embedding后sum/avg操作。时间类特征可以抽取出周几、当年的第几天、当月的第几天、当季度的第几天、时分秒等等特征。
构建特征处理器并处理数据代码如下所示:
# step2:Set up feature encoder
feature_encoder = FeatureEncoder(**params)
feature_encoder.fit(train_data=params['train_data'],
min_categr_count=params['min_categr_count'])
# Build train/validation/test datagenerators
train_gen, valid_gen, test_gen =data_generator(feature_encoder,
train_data=params['train_data'],
valid_data=params['valid_data'],
test_data=params['test_data'],
batch_size=params['batch_size'],
shuffle=params['shuffle'],
use_hdf5=params['use_hdf5'])
S3:模型构建和训练
FuxiCTR项目中模型构建也封装的很好,模型和网络层主要封装在fuxictr/pytorch目录下,其中layers主要包括抽象出来的各种层,models主要包括当前主流的CTR模型。下图中右边部分是DeepFM源码,通俗易懂非常友好:
图9 FuxiCTR项目中的模型封装
模型构建和训练代码如下所示:
# step3:Build a DeepFM model and trainmodel
model = DeepFM(feature_encoder.feature_map,**params)
model.fit_generator(train_gen,validation_data=valid_gen, epochs=params['epochs'],
verbose=params['verbose'])
S4:模型导入并评估效果
最后一个流程是导入最优模型并在验证集和测试集上评估效果,代码如下所示:
# step4:Reloading weights of the bestcheckpoint,Evalution on validation and test
model.load_weights(model.checkpoint)
model.evaluate_generator(valid_gen)
model.evaluate_generator(test_gen)
03
CTR模型发展进程
上面了解了华为开源项目FuxiCTR,这里还需要对CTR模型的发展进程有详细的了解,这里主要从传统CTR模型和深度学习CTR模型进行简单的介绍,后续会进行深入的学习并整理成系列文章和大家分享。
3.1 传统CTR模型发展进程
图10 传统CTR模型发展进程
传统CTR模型发展进程可以参考王喆写的这篇文章《前深度学习时代CTR预估模型的演化之路》。首先是LR模型,作为CTR模型的核心和基础,2012年之前各大中小公司主流的CTR模型主要是LR模型,主要流行的原因有三个:有数学形式和含义上的支撑、符合人类直觉并具有可解释性、线上工程化友好;然后是POLY2模型,因为LR模型只能使用单一特征,无法使用高阶特征,所以模型表达能力有限。POLY2模型可以进行特征的暴力组合从而开启了CTR模型特征交叉的新时代;2010年德国康斯坦茨大学提出了FM(Factorization Machine)模型,通过引入特征隐向量降低FM模型训练复杂度,同时可以很好的解决数据稀疏性的问题;接着2015年基于FM提出了FFM(Field-aware Factorization Machine)模型,通过引入Field-aware特征域概念从而使模型的表达能力进一步提升;2014年Facebook提出了GBDT+LR组合模型的解决方案,通过GBDT自动进行特征筛选和组合从而生成新的离散特征向量,再把特征向量作为LR模型的输入进行CTR预估,开启了特征工程模型化的开端;2010年google提出了FTRL模型,主要通过在线实时训练从而提升模型效果;最后2017年阿里的MLR模型公之于众(实际上MLR在2012年就是阿里主流的CTR模型),MLR模型非常适合工业级的广告和推荐等大规模稀疏数据场景问题,通过端到端的非线性学习从而表达能力很强,同时因为引入了L1和L2范数使得模型具有较高的稀疏度,模型的学习和在线预测性能都很好。
3.2 深度学习CTR模型发展进程
图11 深度学习CTR模型发展进程
深度学习CTR模型发展进程可以参考王喆写的这篇文章《谷歌、阿里、微软等10大深度学习CTR模型最全演化图谱【推荐、广告、搜索领域】》。首先是2016年微软提出的Deep Crossing模型,这是深度学习领域最有代表性的CTR模型,可以说开启了CTR模型在深度学习的新时代。Deep Crossing模型涵盖了深度学习CTR模型的主要元素,先通过embedding层将稀疏特征转化为稠密特征,然后通过concat操作将特征向量拼接起来,再通过多层神经网络进行特征的组合和转换,最后用scoring layer完成CTR计算;
然后2016年提出了FNN模型,主要是用FM的隐向量完成embedding的初始化;接着2016年提出了PNN模型,在embedding层和全连接层添加了product layer从而增强了模型表征不同数据模型的能力;
接着2016年谷歌提出了Wide&Deep模型,把单输入层的Wide部分和经过多层感知机的Deep部分连接起来一起输出最终的输出层,其中Wide部分主要作用是让模型具有记忆性,Deep部分主要作用是让模型具有泛化性,最后利用LR输出层将Wide部分和Deep部分组合形成统一的模型,实现记忆能力和泛化能力的综合权衡。
下面分别是基于Wide&Deep模型对wide部分和deep部分的改进。对Wide部分的改进主要是DeepFM和DCN模型。2017年华为提出了DeepFM模型,相比于Wide&Deep的改进之处在于用FM替换掉了原来的Wide部分,加强了浅层网络部分特征组合的能力。2017年google提出了DCN(Deep&CrossNetwork), 对Wide&Deep的改进思路是使用Cross网络替代了原来的Wide部分,通过设计Cross网络来增加特征之间的交互力度,使用多层cross layer对输入向量进行特征交叉。
对Deep部分的改进主要是NFM和AFM模型。2017年提出了NFM(Neural Factorization Machines)模型,NFM模型用一个带Bi-interaction Pooling层的DNN替换了FM的特征交叉部分,形成了独特的Wide&Deep架构。2017年提出了AFM(Attentional Factorization Machines)模型,将NLP领域的Attention机制引入到CTR预估中,实现了Attention机制的FM,从而可以根据样本特征调整特征权重;
最后是2018年阿里的DIN模型,阿里将Attention机制引入到深度学习网络,关于DIN模型的详细介绍小伙伴可以看下我之前写过的一篇文章《广告行业中那些趣事系列12:推荐系统中融合注意力机制的DIN模型》,DIN模型实质是解决推荐领域中用户历史行为中包含大量的用户兴趣信息,但是只有一小部分用户兴趣信息会最终影响用户点击行为的问题。后来阿里提出了DIEN模型,作为DIN模型的优化版本,引入序列模型AUGRU模拟用户兴趣进化过程进一步提升了模型效果。
04
总结及反思
本篇从理论到实践介绍了华为CTR开源项目FuxiCTR。首先是背景介绍,然后重点详解开源项目FuxiCTR,包括项目架构、支持的主流CTR算法以及在公共数据集上的效果和代码处理流程及源码介绍;最后分别简单介绍了传统CTR模型发展进程和深度学习CTR模型发展进程。对CTR模型感兴趣并希望快速应用到项目实践的小伙伴可以一起沟通交流。