关于排序模型,可以采用传统的GBDT+LR模型,也可以采用FM系列算法,这两种模型笔者先前也有介绍,读者如有疑问,可花点时间前去回顾下。本文主要针对排序任务,介绍两种排序模型:Wide & Deep 和 DeepFM。原本打算将两个模型分开单独成文,后来考虑到内容上的相关性,就将这两种模型写在一起了。文章编写时间紧凑,文中如有不对的地方,还请读者指出。另外,本文的所有截图和数据均来自DeepFM的相关paper。
推荐系统结构
图一是Google app推荐系统的整体结构,当用户在app store上进行浏览的时候,就会产生相应的行为,包括用户、item、behavior等信息,这些信息都会逐一地写入log中。与此同时,这些用户行为也会伴随着queries和impression的产生。针对这些queries,首先app会针对用户的行为进行检索(Retrieval)。检索的结果是将相关的item list放入候选池(candidate pool),这一步通常是不同的机器学习模型+人为规则产生。接下来,优于候选池的结果是要大于我们推荐的item数量的,因此需要一个ranking系统对这些item进行打分。通常分数都是以概率的形式表示,即$p(y|x)$,其中$x$表示用户的特征,通常有用户特征、item特征、上下文特征等。$y$表示用户做出的某种动作,如购买或者下载等行为,$p$表示产生这种行为的概率。本文介绍的模型主要应用于第二阶段:ranking。
Wide & Deep
2016年,Google针对Google Play的业务场景,提出了Wide & Deep模型。Paper开篇表示:广义线性模型结合非线性变换广泛的应用在大规模的输入数据稀疏的分类和回归任务中,特征交叉构建新特征的方法的确非常有效,但是却需要大量的特征工程。另外,基于DNN的方法虽然可以生成更多无法预见的高维特征,但是这种方法预测结果过于泛化,以至于推荐出来的物品相关性太弱。所以,Wide & Deep也就相应的诞生了。实验结果也表明,Wide & Deep方法要显著的优于wide-only和deep-only方法。下面来看看Wide & Deep内部细节。
推荐系统与搜索排序面临的一大共同挑战就是:如何让模型的结果具有更好的memorization 和 generalization。也就是说,模型需要对用户的历史行为有记忆性,同时模型也要具有更好的泛化能力。记忆性可以通过主题信息或者与已有item更相关的信息进行反馈,泛化能力则是让推荐结果更具多样性。那么,有没有一种方法能够同时让模型具备这两个优点呢?当然,Wide & Deep就是很好的模型。结构上,Wide & Deep其实是LR和DNN的结合,其LR部分仍然需要人工特征工程以体现特征的组合,Deep部分属于DNN。
Wide & Deep的层次结构图如Fig 2所示,左边为Wide部分$y=w^Tx$,输入不仅包括原始特征,还包括特征工程得来的转换特征(如cross-product transformation),右侧为Deep部分,本质上是一个feed-forward neural network。Wide部分为低阶特征(LR)模型,Deep部分属于带embedding的DNN模型,内部是独立的,但在output阶段再将Wide和Deep进行joint training,整个模型同时训练wide和deep部分。训练阶段的时候采用的是FTRL+L1来优化wide部分,deep部分则采用AdaGrad。
$$
P(Y =1|x)=σ(\underbrace{w^T_{wide} [x,\phi(x)]}_{wide部分}+ \underbrace{w^T_{deep} a^{(lf)} }_{deep部分}+b)
\tag{1}\label{1}
$$
公式\eqref{1}中的$Y$为label,$\sigma$为sigmoid函数,$x$为原始特征,$\phi(x)$为cross product transformations特征,$b$为偏置项。$w_{wide}$为wide部分的权重,$w_deep$为应用于最终激活函数$a^{(lf)}$的权重。
Deep & Wide确实是一大进步,但是对于wide部分,需要大量的人工进行特征工程,对于“想偷懒”的程序员来说,特征工程真的太麻烦了,为此DeepFM就随之诞生了。
DeepFM
DeepFM源自华为,设计上主要源自2016年Wide & Deep的启发。关于DeepFM的paper,2017年和2018年都发表了一篇,不过本文主要介绍DeepFM的结构,其他的暂且不论吧。其结构如Fig 3所示:
DeepFM属于Wide & Deep的变形,原始的Wide & Deep模型Wide部分集成了人工特征工程得到的特征,DeepFM为了优化这一复杂的人工操作,将Wide部分替换成了FM,使其可以自动学习特征间的2阶组合。首先,有一个Dense Embedding层,对每个filed通过FM训练得到embedding的权值向量V,其中$V_{ij}$表示第$i$个特征embedding之后的隐向量的第$j$维值。FM部分和Deep部分共享相同的输入。Wide & Deep中LR部分和Deep部分是完全独立的,LR部分的输入是稀疏特征,Deep部分稀疏特征先经过embeding层变成embeding向量,再传入隐层。DeepFM中每一个feature field经过embeding层转化为一个隐向量,多个特征field concat成一个密集向量分别作为FM部分和Deep部分的输入。FM部分将每个field的隐向量两两组合,最后在输出层和Deep部分输出concat成最终的输出层。整体上来说,DeepFM有以下三大优点:
- DeepFM可以end-to-end训练,不需要任何的特征工程。FM作为低阶特征,DNN作为高阶特征。
- 训练更加高效,Wide和Deep两者共享同一个输入和embedding向量。与Wide & Deep相比,由于Wide & Deep需要人工的进行特征工程,因此增加了模型的复杂度。
- CTR预测结果更准确。
在预测结果上,表达式如下:
$$
\hat{y}=sigmoid(y_{FM}(x) +y_{DNN}(x))
\tag{2}\label{2}
$$
其中$\hat{y}$为label,$y{FM}$为FM部分,$y_{DNN}$为DNN部分,下面分别介绍下FM和Deep部分。
FM部分
deepFM的wide部分是FM,即factorization machine,Rendle于2010年提出,用于构建推荐场景的相互作用特征,具体细节可以参考笔者之前的一片文章FM算法原理分析与实践。在deepFM中,FM主要用于学习低阶特征,其目标表达式如下:
$$
y_{FM}(x) = <w, x> + \sum_{i=1}^{d} \sum_{j=i+1}^{d} <V_i, V_j> x_i \cdot x_j
\tag{3}\label{3}
$$
Deep部分
deepFM中的deep部分是一个前馈神经网络,主要用于学习高阶特征。但是与2016年原生的Wide & Deep相比,其输入大有不同,原生的Wide & Deep中DNN的输入可能极度稀疏,同时连续特征和类别特征夹杂在一起,并以field进行分组,在deepFM里,DNN的输入时连续的数值,并且与Wide部分共享输入。
其输出表达式如下:
$$
y_{DNN}(x) = W^{|H|+1} · a^{|H|} + b^{|H|+1}
\tag{4}\label{4}
$$
模型对比
本文的核心在于DeepFM,那么DeepFM与其他模型相比,性能究竟如何呢?如Fig 5所示,DeepFM与Wide & Deep的区别在上面已经概括的差不多了,那么与FNN和PNN相比又有什么不同呢?首先简单介绍下什么是FNN和PNN。FNN是一个使用FM进行初始化的前馈神经网络,它采用FM进行pre-training,因此其精度和性能必然收到了FM阶段参数的影响,除此之外,FNN只能学习高阶特征,无法学习低阶特征。对于PNN,全称为Product-based Neural Network,为了获取高阶特征,PNN在embedding层和hidden layer之间增加了product layer。根据不同的product type,将其又划分为IPNN,OPNN,PNN*。与FNN一样,PNN忽略了低阶特征的信息,不过PNN不需要预排序。整体的对比结果如TABLE 1所示。
Conclusion
本文主要介绍了Wide & Deep 和DeepFM,并对两者的结构进行了分析。从大的方向来看,两者都集成了低阶特征,相比之下,DeepFM少了人工构建特征的步骤,则显得更加地灵活。如果读者在细节上有疑问,可以参考原始paper,参考文献中均已给出。后续的文章中,将逐步增加相应模型的实践案例,敬请期待。