广告行业中那些趣事系列52:一个超好用的CTR开源项目FuxiCTR

网友投稿 293 2022-09-07


广告行业中那些趣事系列52:一个超好用的CTR开源项目FuxiCTR

摘要:本篇从理论到实践介绍了华为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地址如下: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:构建特征处理器并处理数据

对于实际业务中的CTR模型来说,挖掘更多更有效的特征有时候比模型结构更有效。这里特征包括类别特征、连续值特征、序列特征和时间类特征等。

构建特征处理器并处理数据代码如下所示:

# step2:Set up feature encoderfeature_encoder = FeatureEncoder(**params)feature_encoder.fit(train_data=params['train_data'], min_categr_count=params['min_categr_count']) # Build train/validation/test datageneratorstrain_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 trainmodelmodel = 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 testmodel.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,从而可以根据样本特征调整特征权重;

04

总结及反思

本篇从理论到实践介绍了华为CTR开源项目FuxiCTR。首先是背景介绍,然后重点详解开源项目FuxiCTR,包括项目架构、支持的主流CTR算法以及在公共数据集上的效果和代码处理流程及源码介绍;最后分别简单介绍了传统CTR模型发展进程和深度学习CTR模型发展进程。对CTR模型感兴趣并希望快速应用到项目实践的小伙伴可以一起沟通交流。

码字不易,欢迎小伙伴们点赞和分享。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Logback与Log4j2日志框架性能对比与调优方式
下一篇:《Python开发 - Python杂记》Linux安装Python(python开发工具)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~