深度学习在58同城智能推荐系统中的应用实践
58同城作为中国最大的分类信息网站,向用户提供房源、工作、二手车和黄页等多种生活信息。在这样的场景下,我们实现了58同城智能推荐系统以帮助用户发现对自己有价值的信息,提升用户体验。我们在推荐系统算法、架构和数据上的技术演进可以参看文章《58同城智能推荐系统的技术演进和实践》。本文将聚焦于算法,介绍深度学习在58同城智能推荐系统中的应用实践。
近年来,深度学习在图像、语音等应用领域取得了令人瞩目的进展。随着深度学习技术的发展,各大科研机构和企业也陆续将深度学习应用于推荐系统领域,相比传统推荐算法取得了一定的效果提升,但并未像在图像、语音领域那样取得显著的进展。58同城一直致力于站在科技前沿,我们也在深度学习技术上进行了探索,将深度学习算法应用于推荐系统召回和排序环节之中,并将深度学习工具平台化,打造了58同城深度学习平台,将深度学习技术优势赋能58集团各大事业群。本文将介绍FNN/Wide&Deep/CNN+DNN排序模型、DNN召回模型在推荐系统中的应用,并概述58同城深度学习平台的建设。
FNN
FNN(Factorization-machine supported Neural Networks)是张伟楠博士于2016年1月在ECIR发表的文章《Deep Learning over Multi-field Categorical Data: A Case Study on User Response Prediction》中提出的一种模型,它借助FM(Factorization Machine)来将稀疏特征预处理成稠密特征,然后输入神经网络(Neural Networks)做模型训练。
神经网络的优势是处理稠密特征,不适合处理离散特征。在互联网应用中往往会大量使用离散特征,例如通常会将帖子ID、用户ID等离散特征以One-Hot Encoding形式变换成稀疏向量,假设某个场景下用户数是500万,经过One-Hot处理后转化成500万维的向量,输入一个隐藏层是200个节点的神经网络,则输入层和隐藏层之间的全连接参数有10亿个,想要训练这样的神经网络,需要大量的样本数据并且执行缓慢。
FM模型能够解决大规模稀疏数据下的特征组合问题,FM模型公式如下图所示,公式前半部分其实就是LR(Logistic Regression),后半部分是两两特征的交叉形式(以二阶形式为例)。例如特征Xi和Xj的交叉后变成一个新特征,特征值为Xi*Xj,特征权重为Wij,这里的Wij又可以表示为两个K维向量Vi和Vj的乘积,FM模型在训练过程中能够自动学习出向量Vi和Vj,向量Vi称之为特征Xi的隐向量。这里的K是FM模型的参数,我们可以任意指定,针对500W维的用户ID类特征,若K设置为10,则可以得到每个用户ID对应的10维隐向量。由此可见,FM是一种有效的embedding 模型,它能将高维稀疏特征转化为稠密特征。
在我们的应用中,我们先使用分布式FM(DiFacto)训练出模型,得到每个特征的权重和隐向量,然后针对每个特征类别(Field,例如用户ID类特征)将特征权重和隐向量拼接起来,构成一个稠密的特征向量,输入到神经网络,这就是FNN,详细网络结构如下图所示。我们在2017年1月份在详情页相关推荐场景实验并上线了FNN模型,上线后相比base模型,帖子点击率有5%左右的提升。FNN的开源代码是使用Theano实现的,我们使用TensorFlow重新进行了实现,离线使用分布式TensorFlow进行训练,线上预测部分使用Java自主实现了神经网络的前向计算。
FNN模型结构图
Wide&Deep
Wide&Deep模型是Google于2016年6月发表的《Wide&Deep Learning for Recommender Systems》文章中提出的,目前被各大公司广泛使用。顾名思义,它是将Wide模型和Deep模型相结合。模型框架如下图所示:左边是Deep部分,首先将各类离散特征进行One-Hot编码并输入embedding层得到稠密向量,然后与连续特征拼接在一起得到特征向量作为神经网络的输入;右边Wide部分我们使用原始特征(离散特征的One-Hot编码)和人工交叉特征作为输入;将两个模型的输出相结合即可得到最终的结果。
Wide&Deep模型框架图
我们直接应用了TensorFlow中Wide&Deep的开源实现,离线使用分布式TensorFlow进行训练,相比base模型,离线AUC有0.026的提高。值得一提的是,与FNN需要借助FM模型预训练来做稀疏特征的embedding不同,Wide&Deep模型内部自主实现了embedding,稀疏特征对应的embedding稠密向量可以在整个网络训练过程中自动学习得到。
我们从Wide&Deep的模型结构可以看到,Deep部分其实就是自动学习出了高阶特征,然后输入给LR,而Wide部分需要依赖传统的人工特征工程,会使用原始离散特征和低阶交叉特征(例如二阶交叉)。我们可以理解为Wide&Deep模型将多阶特征的使用进行了拆分,Deep部分是用于生成更高阶的复杂特征,而Wide部分是使用较简单的低阶特征。
在深度学习之前,我们常用的是使用GBDT模型自动生成高阶特征,这一方法在Facebook提出GBDT+LR模型后被工业界广泛使用,它使用GBDT模型将每个样本映射到GBDT各棵树的叶子节点上,并拼接成一个稀疏向量,然后作为LR模型的输入特征。之后在Kaggle竞赛中,参赛者将GBDT生成的高阶特征输入到FM模型,取得了良好的效果,GBDT+FM模型也逐渐被工业界使用,下图是GBDT+LR/FM的模型框架图。
XGBoost +LR/FM模型框架图
Wide&Deep模型使用了Deep部分的更高阶复杂特征和Wide部分的人工特征工程得到的低阶特征,GBDT生成的高阶特征可以理解为介于二者之间,因此我们可以将GBDT生成的高阶特征也输入到Wide&Deep模型当中。我们使用XGBoost(GBDT)生成了高阶特征,然后输入到Wide模型构成了XGBoost+Wide&Deep模型,相比Wide&Deep模型,离线AUC有0.018的提升。我们也尝试了将GBDT高阶特征向量继续输入给Deep模型,离线AUC能有千分之一左右的提升,模型结构如下图所示。
XGBoost + Wide&Deep模型框架图
离线模型训练我们使用了分布式TensorFlow,线上预测部分我们使用了TensorFlow-Serving,并利用五八自研RPC框架SCF进行了封装,实现了一套通用的预测服务。模型上线后,相比base模型,帖子点击率有6%的提升。
我们可以看到,Wide&Deep模型的Wide部分的输入依赖人工特征工程,并非是一个端到端的学习过程。华为诺亚方舟实验室在2017年3月发表的文章《DeepFM: A Factorization-Machine based Neural Network for CTR Prediction》中提出了DeepFM模型,DeepFM的结构中包含了FM部分以及DNN部分,分别负责低阶特征和高阶特征的提取,实现了端到端的学习过程,我们正在尝试该模型。
CNN+DNN
在我们的部分推荐场景中帖子图片比较大,例如优质高清的房源大图对用户会有较强的吸引,因此我们考虑将图像特征引入到排序模型当中,例如将帖子图像转化成一个特征向量输入到排序模型。腾讯2015年在IJCIA上发表的文章《Image Feature Learning for Cold StartProblem in Display Advertising》中就提出了该思路,它首先利用CNN 对图像进行特征抽取得到特征向量,然后输入到LR 等常见模型。针对深度图像特征的应用,阿里广告团队在2016年9月于Multimedia会议上发表的文章《Deep CTR Prediction in Display Advertising》中提出了全新的端到端的思路(DeepCTR模型),模型结构是一部分利用CNN抽取出图像特征,一部分使用一个全连接层对连续和离散特征做embedding,两者拼接在一起输入神经网络进行训练。但在我们的场景下,每天有数百万的发帖,样本中图片数量大,DeepCTR模型离线训练受CNN限制会很缓慢,并且线上预测时CNN部分也有较大的性能压力。因此我们转变了一下思路,尝试了下图所示的CNN+DNN模型,在这个模型中,我们使用CNN图像分类模型来做预训练,生成了每张图片的特征向量,然后将图像特征、离散特征、连续特征一起输入至Wide&Deep中的Deep模型。在我们的场景下,该模型离线AUC相比base模型有0.01的提升。
CNN+DNN模型结构图
DNN召回模型
近些年在推荐排序上涌现出了很多深度学习模型,在推荐召回上的深度模型相对偏少,比较有名的是YouTube于2016年9月在RecSys上发表的文章《Deep Neural Networks for YouTube Recommendations》中提出的DNN召回模型(后文称作YouTube DNN召回模型)。我们也引入了该模型,模型结构如下图所示。
YouTube DNN召回模型结构图
YouTube DNN召回模型将推荐当做一个超大规模的多分类问题,用户点击过的帖子即为一个分类,模型就是预测用户U在时刻t和当前上下文C下对帖子i的点击概率P(Wt=i|U,C),模型输出层是一个softmax,类别数量即帖子数量。模型会将用户历史浏览记录做embedding处理,并与用户人口属性特征、上下文特征等一起作为神经网络的输入。
在训练出来的模型中,最后一层隐藏层与输出层帖子结点之间的连接权重可以当做帖子的向量,例如图中的帖子V1的向量就是(w1, w2, w3),这样每个帖子都会得到一个向量。最后一层隐藏层的输出可以当做用户的向量,当线上推荐服务收到请求时,将特征向量输入网络,最后一层隐藏层的输出结果便是用户向量,如图中的向量(x1,x2,x3),这样推荐逻辑就变成计算与用户向量最相近的K个帖子向量。
在我们的应用中,我们借助Facebook 人工智能实验室(FAIR)提出的最邻近搜索(nearest neighbor search)算法FAISS(Facebook AI similarity search)实现了用户向量的最近邻帖子向量的实时计算,当推荐服务接收到推荐请求时便实时计算用户感兴趣的帖子候选集合。该召回模型上线后,相比base召回模型,我们的点击率有1%左右的稳定提升。YouTube DNN召回模型相比传统协同过滤模型,可以引入更多的特征,有更多的优化空间,后续我们将继续调优该模型,提高推荐效果。
58深度学习平台
我们构建了包括深度学习、机器学习和在线学习功能的五八人工智能平台WPAI(Wuba Platform of AI),深度学习平台是WPAI的重要组件之一,其架构如下图所示。
58深度学习平台架构图
平台包括硬件资源层、集群管理层、算法应用层和Web管理层:
平台硬件层主要由GPU和CPU机器构成,用作离线训练作业和线上预测服务。
集群管理层由Kubernetes、Docker/Nvidia-Docker、Calico、etcd等组成,实现了对GPU和CPU资源的统一管理、集群内部的通信以及集群与五八Hadoop数据平台的通信。
在算法应用层,支持主流的Tensorflow和Caffe两种深度学习框架,在框架之上我们对部分主流的模型例如DNN(Wide&Deep)、CNN、RNN等进行了封装,方便业务方简低成本接入。
镜像中心为集群提供各种镜像,如不同版本或环境的Tensorflow、Tensorflow-Serving、Caffe镜像。
日志中心负责收集离线训练任务的日志,方便用户跟踪Debug。
监控中心负责对集群机器状态和资源使用率进行监控和告警。
我们基于TensorFlow-Serving和五八自研RPC框架SCF实现了一套通用的线上预测服务,方便用户上线离线训练得到的模型。
在Web管理层,我们实现了一套Web系统,对外提供硬件资源申请、任务管理和模型管理等功能,方便用户低成本使用深度学习平台。
目前,我们所有的深度学习任务都基于该平台来开展,集团内部也有多个业务部门陆续使用该平台,我们也在不断完善平台的功能,使得其更加易用,提高算法效率。
总结
本文介绍了深度学习在58同城智能推荐系统中的应用实践,我们将FNN、Wide&Deep、CNN+DNN模型应用到了推荐排序当中,将YouTube DNN召回模型应用到了推荐召回当中,一定程度上提高了推荐效果。未来我们将继续调优这些深度学习模型,并引入深度强化学习提高推荐效果。
最后,欢迎各路人才加入58集团~
职位1:推荐算法高级/资深工程师
岗位职责:负责58同城智能推荐系统算法研发。
职位2:Java高级/资深后台开发工程师
岗位职责:负责智能客服对话机器人后台系统研发。
职位3:对话系统高级/资深算法工程师
岗位职责:负责智能客服对话机器人算法研发。
简历投递邮箱:zhankunlin@58ganji.com