论文地址
Wide & Deep Learning for Recommender Systems
前言
上一篇更新了DCN,觉得还是有必要更新一下Wide&Deep,毕竟这是许多企业实际落地使用的算法(可能不少使用的是DeepFM,但是思想都是一致的),这篇就给了google2016年发表的Wide&Deep,下面来看一下Wide&Deep的主要内容与思想。
Abstract
广义线性模型在工业界被广泛使用,而线性模型的缺点之前也已经分析过了,只能利用超平面进行切分,模型的效果全依赖特征工程,当然可以通过一些非线性变换等手段来为模型引入非线性,并且由于广义线性模型简单、训练速度快、可扩展方便并行、可解释等优点所以被广泛地用于工业界。
逻辑回归中,使用的特征通常都是离散化的,一方面特征本身就是Category的特征,直接进行onehot编码,另一方面特征本身是连续值,通过分位数分桶、等宽离散等方式将连续值映射到一段段离散区间,这种做法有几个好处,一是可以使得快速变化的特征获得一定的稳定性,二离散的特征可以有效处理异常点,增强系统的鲁棒性,三是离散特征可以更加方便进行特征组合来融入非线性以及为模型带来记忆效果。
通常,在线性模型中,需要通过增加cross feature来增加模型的记忆性,例如将男与篮球进行组合生成一维新特征并单独赋予一个权重位进行学习,模型就可以通过这种组合方式来学习到二者是经常组合出现的频繁项而这是广义线性模型无法做到的,用论文中的话来说cross feature赋予了模型Memorization,组合特征通常是有效且可解释强,但是十分依赖人工的先验知识,当然某些组合特征较难训练(FM了解一下),而DNN则很好地解决了人工组合特征的困难之处。
DNN利用Embedding来处理Category特征,并且利用DNN组合隐式的高阶非线性特征组合,这有点像MF方式,我们通过MF可以获得每个user、item的向量表示,从而可以预测user对未评分的item的预测打分结果,这种方式可以为模型带来很强的泛化能力,即在训练数据上似乎看不出有什么明显关联的user与item也获得了较客观的预测结果,论文将这种能力称之为Generalization。
那么Wide&Deep做的事情是什么呢?就是即希望模型既拥有记忆能力,可以记住那些频繁项组合又拥有泛化能力,可以获得更为新奇的推荐,而这一切都是通过Wide&Deep将LR与DNN进行join train而获得的。
Introduction
这篇论文属于短小精悍型,内容比较少,我也不打算花很大的篇幅来说,前面既然已经交代了Wide&Deep的思想,那么下面来看一下模型结构。
![](https://i-blog.csdnimg.cn/blog_migrate/7389d68816219905942d2a8d655a03ed.png)
可以看到模型的结构是,左边是Wide部分,也就是线性模型,右侧是Deep部分即DNN,结构和上一篇的DCN是不是很像?DNN中使用了Embedding层将输入进行映射到连续的Dense Vector从而进行训练。
这里抛出个问题,大家可以想一下join train的好处是什么。
Recommender System Overview
Wide&Deep用于google play即andriod的应用市场之中,下面看一下其推荐系统整体架构。
![](https://i-blog.csdnimg.cn/blog_migrate/7d17d1cd4b28e7a18254211dfe416466.png)
- 用户的query进入推荐系统中
- 通过query词从数据库中通过检索出100个匹配项
- 利用Wide&deep对召回的100的item进行排序输出并返回结果
- 通过用户实际的点击反馈重新构造正负样本(例如第三位点击,则可以将一二作为负样本)
- 把通过用户行为获得的正负样本重新加入模型的训练之中
Wide&Deep learning
wide与deep部分不太需要多解释,就是普通的LR以及DNN,不过这里提到了我上面提的问题,为什么是用join train而不是分别训练lr与DNN最后做ensemble,论文总结如下:
- join train在达到相同效果时需要的模型结构可以更小从而可以更加快速地训练预测,虽然wide&deep中没有参数共享,但是通过join train有点像多任务学习,通过共享底层参数来共同提升权重的学习。
- 通过join train,LR部分不需要使用所有的特征,而只需要通过人工的特征组合取获得记忆性来填补DNN的缺点。
实际的训练中Wide部分使用的是FTRL来进行更新,Deep部分基于AdaGrad优化器来进行优化。
模型参数如下:
可以看到DNN部分,通过Embedding将category特征进行映射,并且与连续值特征进行concat最终获得一个1200维度的输入特征,经过三层全连接使用relu作为激活函数获得输出值,Wide部分只对精心设计的cross feature进行学习,最终将二者部分的输出经过concat输入到一层全连接使用logloss作为损失函数进行学习。
tips:cross feature进行组合的特征选择的是用户的特征以及app的特征进行的拼接。
Model Serving
对于有着这么多的输入参数以及神经网络的连接数量,论文中没有提到如何对这部分的serving进行优化,而是讲述了对于输入的100个item,并不是以一个batch进行预算并返回,而且通过调用多线程将输入分成若干个小batch后再进行预测返回从而在可靠时延内获得结果。
总结
这篇论文整体上比较短,虽然现在基于这种架构的结果很多,如DeepFM等,但是该篇相当于提供了思路,后续许多也只是在这个架构上进行替换。今天的就先到这里吧,后续可能会更新一下FTRL或者一些,看心情吧。