ITPub博客

首页 > 数据库 > 数据库开发技术 > 基于deepFM的实时在线广告预测

基于deepFM的实时在线广告预测

原创 数据库开发技术 作者:Agent的潜意识 时间:2019-05-12 21:36:12 0 删除 编辑

 

 

 

最近活有点多,公司也在调整,没办法,顺手把广告算法的任务给接了。之前也做过大数据挖掘,算是重操旧业了。

 

广告算法的业务需求就是:

1)提高GMV。

2)提高点击量。

这个跟一般的CTR预估还不太一样,难度系数大一些。

 

技术上呢,存在以下难点:

1)算法建模的目标函数如何确定。之前一直是点击率预估的,业务不满意,卖家也不满意,花了钱结果没多少成单的。感觉是被骗。如果提升GMV?同时提升点击量。

2)服务的响应时间如何做到50ms内?特征维数越来越多,存储读取都是难题。模型也是越来越复杂,实时性的要求压力大。

3)Python or java?python做实时服务有不少的短板,但是,java在算法层面又有诸多不便,如何选择语言?

4)Spark  or  tensorflow?数据存储在hadoop集群里面,用spark挖掘也是很方便,但spark的mllib算法包有点简陋,同时用spark模型构建实时服务也有一定挑战;tensorflow做机器学习是没有问题的,但大数据集群里的数据如何跟GPU服务器之间交互也是一个议题。

 

基于以上种种情况,下面讲我们的解决方案。

 

1)目标函数重建。我们的目标函数将GMV和点击量两者都糅合了进去,同时,对于曝光没有点击的,或者点击少的,进行了惩罚。把是否点击的二分类问题转换成了回归问题。


2)算法模型的选取和优化。综观了各类时下热门的推荐或者广告算法,包括wide deep,FNN 、PNN等等这些,部署环境整理数据跑了跑,最后决定选取deepFM 了。

选择deepFM有两个方便的地方,一是可以保存较少的特征数据,因为他自带组合提取高级特征的功能,把一些基础特征数据保存下来存进redis,事实上,用户和商品之间的交互信息数据量很大的,我们糅合了下,才存进redis。方便做在线服务。这一块需要平台架构师再重新好好设计一个存储模式,redis存特征数据太low。

二是方便设计神经网络。我们估摸估摸了特征和响应变量之间的线性和非线性的算子层级,事实上咋估摸的完全凭的是数学直觉和数据嗅觉。设计了几个模型跑了跑,选择了其中一个。

这里要提醒下大家,deepFM做回归,模型参数的大小不稳定,随着训练集特征分布情况而变化,数据量大甚至到了2个G的模型大小。里面还有很多优化空间。时间太短暂,我们搞了个投机取巧的办法避开了这个问题。办法有点low,就不扯了。


3)我们用spark抽取特征,存入hive,然后用pyhive读取数据,转成DataFrame,送入tensorflow中训练模型。


4)Python构建实时服务有以下几个点需要注意,也许对大家有帮助。

其一,mutiprocess不适合tensorflow的session。会卡住不动。Python多进程应该用gevent。怎么用就不扯了。自己查去。

其二,python list的append很慢的,正常的写法应该是[i  for  f  in  wlist]这样。

其三,多用numpy pandas的现成数据结构,这里有很多巧妙的地方。例如,w=[1,2,3],

W*2=[1,2,3],[w]*2=[[1,2,3],[1,2,3]]。这些玩意都是工程化的东西,稍微动动脑筋就能玩得转,但玩好了对速度提升是巨大的。

   

最后,我们构建了一个稳定的python实时服务,响应时间在50ms以内,同时 ,通过多进程处理,单张GPU卡能支撑一秒600个请求左右。

还有很多工作要做,例如如何构建一个稳定服务的GPU集群,其次,如何热更新模型,虽然tf-serving可以支持热更新,但这样的话相当于把模型单独拎出来当一个httpserver了,肯定有网络IO开销,会增加实时服务的压力。

 

粗略的给大家讲了讲,讲的比较简单。实际工作中会复杂不少。

如果你觉得有用,请点赞,如果你觉得很low,请留言,不吝赐教。

 

 

 


原文作者:Agent的潜意识;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-03-21

  • 博文量
    187
  • 访问量
    82306