基于PaddlePaddle的点击率的深度学习方法尝试

  • 时间:
  • 浏览:2
  • 来源:大发pk10_pk10神彩_大发pk10神彩

前言

当我们我们 在分享点击率相关的这人文章时,输出过一篇常见计算广告点击率预估算法总结,参考了这人广告点击率的文章,从最经典的Logistic Regression到Factorization Machined,FFM,FNN,PNN到今年的DeepFM,还有文章中间必须 讲的gbdt+lr类似,时不时想找时间实践下,正好这次在学习paddle的时候在它的models目录下看后了DeepFM的实现,原困 时候对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每段:

Deep每段:

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

本文相关代码每段全部都是来自于paddlepaddle/model, 我这里走一遍流程,学习下,另外想要了解算法原理的能必须仔细再看看中间的文章,今天当我们我们 来paddlepaddle上做下实验,来从代码程度学习下DeepFM为什么会么会实现的:

数据集说明(关注知乎专栏作者:想飞的石头 https://zhuanlan.zhihu.com/burness-DL 查看源代码)

criteo Display Advertising Challenge,数据主要来criteolab一周的业务数据,用来预测用户在访问页面时,是是不是会点击某广告。

wget --no-check-certificate https://s3-eu-west-1.amazonaws.com/criteo-labs/dac.tar.gz tar zxf dac.tar.gz rm -f dac.tar.gz  mkdir raw mv ./*.txt raw/

数据有点儿大, 最少4.26G,慢慢等吧,数据下载完成时候,解压出train.csv,test.csv,其中训练集 45840617 条样本数,测试集 45840617 条样本,数据量还是蛮大的。 数据主要有三每段组成:

  • label: 广告是是不是被点击;

  • 连续性价值形式: 1-13,为各维度下的统计信息,连续性价值形式;

  • 离散型价值形式:这人被脱敏出理 的类目价值形式

Overview

整个项目主要由十几条 每段组成:

数据出理

这里数据出理 主要包括另有六个每段:

  1. 连续值价值形式值出理 :

  • 滤除统计次数95%以上的数据,那我能必须滤除大每段异值数据,这里的出理 办法和时候我在 1 号店做相关工作时一致,代码中间原困 做了这每段工作,直接给出了这每段的价值形式阈值;

  • 归一化出理 ,这里andnew ng的课程有张图很明显,表明不同的价值形式的值域范围,会使得模型寻优走『之』字形,从还会增加收敛的计算和时间;

2.离散价值形式值出理 :

  1. one-hot: 对应价值形式值映射到指定维度的必须另有六个值为 1 的稀疏变量;

  2. embedding: 对应价值形式值映射到指定的价值形式维度上;

具体当我们我们 来研究下代码:(关注知乎专栏作者:想飞的石头 https://zhuanlan.zhihu.com/burness-DL 查看源代码)

连续价值形式是在1- 13 的位置,读取文件,原困 值大于对应维度的价值形式值的95%阈值,则该价值形式值置为该阈值,并计算价值形式维度的最大、最小值,在gen时归一化出理 。

类目价值形式的出理 相对比较麻烦,都要遍历,或者得到对应维度上所有老出 值的所有情况,对打上对应id,为后续类目价值形式赋予id。这每段耗时好大,另外强烈希望paddlepaddle的小伙伴能在输出出理 期间打印下提示信息,我时候有时间看看能必须提提pr。

经过中间的价值形式出理 时候,训练集的值变为:

reader

paddle中间reader的文件,自由度很高,当时人能必须写生成器,或者使用batch的api,完成向网络传入batchsize大小的数据:

主要逻辑在兑入文件,或者yield对应的网络数据的输入格式。

模型构造

模型构造,DeepFM在paddlepaddle中间比较简单,原困 有专门的fm层,这人据我所知在TensorFlow或MXNet中间必须 专门的fm层,或者值得注意的是,在paddlepaddle中间的fm层,只建模二阶关系,都要加在入fc才是全部的fm,实现代码如下:

或者就说 构造DeepFM,这里根据下面的代码画出前面的图,除去数据出理 的每段,就说 DeepFM的网络价值形式:(关注知乎专栏作者:想飞的石头 https://zhuanlan.zhihu.com/burness-DL 查看源代码)

其中,主要包括另有六个每段,另有六个是多个fc组成的deep每段,第六个是sparse fm每段,或者是dense fm每段,如图:

这里蛮简单的,具体的api去查下文档就能必须了,这里稍微说明一下的是,sparse feature这块有两每段一块是embedding的出理 ,这里是先生成对应的id,或者用id来做embedding,用作中间fc的输出,或者sparse_input是onehot表示用来作为fm的输出,fm来计算一阶和二阶隐变量关系。

模型训练

数据量太满,单机上跑是必须 问題,能必须正常运行成功,在我內部机器上,能必须运行成功,或者有另有六个问題:

  • fm原困 出理 的价值形式为稀疏表示,而paddlepaddle在这块的FM层的支持必须在cpu上,效率单位那么来越快,分析原困 人太好全部都是fm的效率单位的问題,原困 deepfm有设计多个fc,应该是这里的效率单位影响, 在paddlepaddle github上有提另有六个issue,得知暂时paddlepaddle必须把每段装到gpu中间跑,给了另有六个出理 方案把所有的sparse改成dense,发现在这里gpu显存hold不住;

  • 机器太渣,原困 有开发任务必须长期占用;

什么都综上,我打算研究下在百度云上为什么会么会通过k8s来布置paddlepaddle的分布式集群。

文档https://cloud.baidu.com/doc/CCE/GettingStarted.html#.E9.85.8D.E7.BD.AEpaddlecloud

提了另有六个issue: https://github.com/PaddlePaddle/cloud/issues/542,等中间出理 了再来更新分布式训练的每段。

单机的训练没哪些地方地方大的问題,由中间所说,原困 fm的sparse不支持gpu,什么都那么来越快,拉的百度云上 16 核的机器,最少36s/50 batch,总共样本 500 多w,另有六个epoch预计 4 个小时,MMP,等吧,分布式的必要性就在这里。

另外有在paddlepaddle中间提另有六个issue:

https://github.com/PaddlePaddle/Paddle/issues/7010,说把sparse转成dense说说能必须直接在gpu上跑起来,这人看起来不值得去尝试,sparse整个维度还是挺高的,期待对sparse op 有更好的出理 方案,更期待在无需能不能 把单层单层的装到gpu,多设备同时跑,这方面,TensorFlow和MXNet要好太满。

这里我遇到另有六个问題,我使用paddle的docker镜像的时候,能必须很稳定的占用 16 个cpu的大每段计算力,或者我在云主机上当时人装的时候,cpu占用率很低,原困 是和我环境配置有点儿问題,这人问題不大,时候为了不污染环境主要用docker来做相关的开发工作,什么都这里问題不大。

cpu占有率有比较明显的跳动,这里从主观上比TensorFlow稳定性要差这人,不排除是sparse op的影响,印象中,TensorFlow cpu的占用率很稳定。

到发这篇文章位置,跑到 1750 个batch,基本能达到auc为0. 8 左右,loss为0. 208 左右。

预测

预测代码和前一篇将paddle中间的demo一样,只都要,重新定义一下网络,或者绑定好模型训练得到的参数,或者传入数据即可完成inference,paddle,有专门的Inference接口,若果传入output_layer,和训练学习到的parameters,就能必须很容易的新建另有六个模型的前向inference网络。

总结

DeemFM是 17 年高度学习在点击率预估、推荐这块的新的办法,有点儿类似deep and wide的思想,将传统的fm来nn化,利用神经网络强大的建模能力来挖掘数据中的有效信息,paddlepaddle在这块有现成的deepfm模型,单机部署起来比较容易,分布式,这里我按照百度云上的教程还未成功,后续会持续关注。另外,原困 最近在做大规模机器学习框架相关的工作,越发人太好别说性性成熟期图片 的句子的句子期期图片 是什么图片 的句子的,仅仅无需能不能 work的框架就很不错了,而比较好用的如现在的TensorFlow\MXNet,开发起来真的难加在难,时候光是做调包侠时必须 体验,现在深入到这块的工作时,才知道其中的难度,也从那我高度时候刚开始审视现在的各种大规模机器学习框架,比如TensorFlow、MXNet,在高度学习的支持上,人太好很棒,或者全部都是瓶颈,对于大规模海量的feature,尤其是sparse op的支持上,最少现在还未看后有点儿好的支持,就比如这里的FM,原困 当我们我们 还会吐槽为什么会么会必须 慢,没做框架时候,我也会吐槽,或者时候刚开始接触了这人的时候,才知道FM,主要focus在sparse相关的数据对象,而这每段数据很难在gpu上完成比较高性能的计算,所时候面经过paddle的开发者解释sparse相关的计算不支持gpu的时候,才感同身受,另有六个好的大规模机器学习框架都要要无须同目标来评价,原困 需求是大规律数据,那稳定性、可扩展性是重点,原困 是更多算法、模型的支持,原困 现在的TensorFlow、MXNet才是标杆,多么希望现在大规模机器学习框架无需能不能 多元化的发展,有高度学习支持力度大的,全部都是传统算法上,把数据量、训练规模、并行化加速并做到极致的,那我的发展才或许称得上百花齐放,人太好当我们我们 不都要太满不同长相的TensorFlow、MXNet锤子,有时候当我们我们 就都要把镰刀而已,希望大规模机器学习框架的发展,不应该仅仅像TensorFlow、MXNet一样,希望有另有六个专注把做大规模、大数据量、极致并行化加速作为roadmap的新标杆。

(关注知乎专栏作者:想飞的石头 https://zhuanlan.zhihu.com/burness-DL 查看源代码)

本文由站长之家用户投稿,未经站长之家同意,严禁转载。如广大用户当我们我们 ,发现稿件处于不实报道,欢迎读者反馈、纠正、举报问題(反馈入口)。

免责声明:本文为用户投稿的文章,站长之家发布此文仅为传递信息,不代表站长之家赞同其观点,不对对内容真实性负责,仅供用户参考之用,不构成任何投资、使用建议。请读者自行核实真实性,以及原困 处于的风险,任何后果均由读者自行承担。