Wide & Deep、DeepFM系列算法原理与优缺点对比

一、Wide & Deep模型

Wide & Deep Learning 模型的核心思想是结合广义线性模型的记忆能力(memorization)和深度前馈神经网络模型的泛化能力(generalization)。利用广义线性模型从历史数据中学习特征相关性,利用深度前馈神经网络揭示隐式特征之间的相互作用。在训练过程中同时优化 2 个模型的参数,从而达到整体模型的预测能力最优。

Wide & Deep模型结构如下图,左边是wide部分,右边是deep部分。
Wide & Deep、DeepFM系列算法原理与优缺点对比_第1张图片

1、Wide部分

Wide模型的实质是一个广义线性模型:
y = w 0 + W T x y = w_{0}+\textbf{W}^T\textbf{x} y=w0+WTx
其中,特征 x = [ x 1 , x 2 , ⋯ , x d ] \textbf{x}=[x_1,x_2,⋯,x_d] x=[x1,x2,,xd]是一个d维的向量, W \textbf{W} W为模型的参数。最终再使用一个Sigmoid变换,使得输出的y值在0-1之间。——换言之,Wide部分实际上就是一个LR模型。

2、Deep部分

这一部分就是一个前馈神经网络——原始特征会先进行One-hot编码,得到高维稀疏特征,再将高维稀疏特征做Dense Embedding,转换为低维稠密向量,然后将这些低维密集嵌入矢量馈送到前向通道中的神经网络的隐藏层中。每个隐藏层执行以下计算:
a ( l + 1 ) = f ( W ( l ) a ( l ) + b ( l ) ) a^{(l+1)} = f(W^{(l)}a^{(l)} + b^{(l)}) a(l+1)=f(W(l)a(l)+b(l))

  • a ( l ) a^{(l)} a(l): 第 l l l层的计算值(输出值)
  • f f f: 是激活函数,通常是ReLUs
  • b ( l ) b^{(l)} b(l) W ( l ) W^{(l)} W(l): 分别是第 l l l层的偏差项和权重参数

关于深度前馈网络的基本原理可以参考这里
在此解释一下Dense Embedding
是针对稀疏特征的一种降维方式,它降维的方式可以类比为一个全连接层(没有激活函数),通过 embedding 层的权重矩阵计算来降低维度。假设:

  • feature_num : 原始特征数
  • embedding_size: embedding之后的特征数
  • [feature_num, embedding_size] 权重矩阵shape
  • [m, feature_num] 输入矩阵shape,m为样本数
  • [m, embedding_size] 输出矩阵shape,m为样本数

那么降维过程可以用下图来描述:
Wide & Deep、DeepFM系列算法原理与优缺点对比_第2张图片

3、联合训练

通过将Wide模块和Deep模块的对数加权输出作为预测值,然后送入逻辑损失函数中,用于联合训练。模型的联合训练通过反向传播将输出值的误差梯度通过最小批随机梯度同时传送给Wide和Deep模块。

二、FM

DeepFM相当于将Wide & Deep模型中的Wide部分的LR换成了FM,因此下面先介绍FM。
FM解决的问题:大规模稀疏数据下的特征组合问题。
在LR的基础上引入交叉项,于是FM的雏形(二阶多项式模型)可以表示为:
y = w 0 + Σ i = 0 n w i x i + Σ i = 1 n − 1 Σ j = i + 1 n w i j x i x j y=w_0 + \Sigma_{i=0}^{n}\textbf{w}_i\textbf{x}_i+\Sigma_{i=1}^{n-1}\Sigma_{j=i+1}^n\textbf{w}_{ij}\textbf{x}_i\textbf{x}_j y=w0+Σi=0nwixi+Σi=1n1Σj=i+1nwijxixj
其中,n 代表样本的特征数量。
从这个式子中可以看出,组合特征的参数一共有1+2+….+(n-1) =n(n−1)/2 个,其中的n是特征维度(这里的特征是指离散化后的特征,如city=‘北京’),任意两个参数都是独立的。然而,在数据稀疏性普遍存在的实际应用场景中,交叉项参数的训练是很困难的。其原因是,每个参数 Wij 的训练需要大量 Xi 和Xj特征同时非零的样本;由于样本数据本来就比较稀疏,满足“Xi 和 Xj 都非零”的样本将会非常少。训练样本的不足,很容易导致参数 Wij 不准确,最终将严重影响模型的性能。

Wij求解的思路是通过矩阵分解的方法。所有的二次项参数Wij可以组成一个对称阵W(为了方便说明FM的由来,对角元素可以设置为正实数),那么这个矩阵就可以分解为 W=VTV,V 的第 i 列便是第 i 维特征的隐向量。换句话说,特征分量Xi与Xj的交叉项系数就等于Xi对应的隐向量与Xj对应的隐向量的内积,即每个参数 wij=⟨vi,vj⟩,这就是FM模型的核心思想。V i表示 X i 的隐向量, V j 表示 X j 的隐向量 ,为了求出 Wij, 我们需要求出特征分量 X_i 的辅助向量 Vi=(Vi1……Vik), X_j 的辅助向量 Vj=(Vj1……Vjk),k表示隐向量长度( 实际应用中k<< n),转换过程如下图所示.1
Wide & Deep、DeepFM系列算法原理与优缺点对比_第3张图片
对于交叉项的求解可以利用这一原理:
A B = 1 2 [ ( A + B ) 2 − ( A 2 + B 2 ) ] AB = \frac{1}{2}[(A+B)^2-(A^2+B^2)] AB=21[(A+B)2(A2+B2)]

Wide & Deep、DeepFM系列算法原理与优缺点对比_第4张图片
Wide & Deep、DeepFM系列算法原理与优缺点对比_第5张图片
对于度 k=2 的因子分解机 FM 模型来说,其主要的参数就一次项和常数项的参数 w0,w1…,wn 以及交叉系数矩阵 V ,在利用随机梯度对模型的参数进行学习的过程中,主要是对损失函数 loss 的求导。
在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

Wide & Deep、DeepFM系列算法原理与优缺点对比_第6张图片
FM完整的python实现脚本在这里

此外,主要考虑到,FM模型是SVM模型与factorization模型的结合,其优点为:

  • FM模型可以在非常稀疏的数据中进行合理的参数轨迹,而SVM做不到这点。
  • FM模型的复杂度是线性的,优化效果很好,而且不需要像SVM一样依赖于支持向量。
  • FM是一个通用模型,它可以用于任何特征值为实值的情况。而其他因式分解模型只能用于一些输入数据比较固定的情况。

SVM和FM的主要区别在于:

  • SVM的二元特征交叉参数是独立的,而FM的二元特征交叉参数是两个k维的向量vi、vj,交叉参数就不是独立的,而是相互影响的。
  • FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行
  • FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量 2

三、DeepFM

1、FM的结构

Wide & Deep、DeepFM系列算法原理与优缺点对比_第7张图片

2、DNN结构

Wide & Deep、DeepFM系列算法原理与优缺点对比_第8张图片

3、DeepFM结构

Wide & Deep、DeepFM系列算法原理与优缺点对比_第9张图片
DeepFM目的是同时学习低阶和高阶的特征交叉,主要由FM和DNN两部分组成,底部共享同样的输入。模型可以表示为:
y p r e d = s i g m o i d ( y F M + y D N N ) y_{pred} = sigmoid(y_{FM}+y_{DNN}) ypred=sigmoid(yFM+yDNN)

四、优缺点对比

在CTR预估以及推荐系统等场合下:

  • LR: LR最大的缺点就是无法组合特征,依赖于人工的特征组合,这也直接使得它表达能力受限,基本上只能处理线性可分或近似线性可分的问题。
  • FM: FM通过隐向量latent vector做内积来表示组合特征,从理论上解决了低阶和高阶组合特征提取的问题。但是实际应用中受限于计算复杂度,一般也就只考虑到2阶交叉特征。后面又进行了改进,提出了FFM,增加了Field的概念。
  • CNN: CNN模型的缺点是:偏向于学习相邻特征的组合特征。
  • RNN: RNN模型的缺点是:比较适用于有序列(时序)关系的数据。
  • FNN: 先使用预先训练好的FM,得到隐向量,然后作为DNN的输入来训练模型。缺点在于:受限于FM预训练的效果,Embedding的参数受FM的影响,不一定准确;预训练阶段增加了计算复杂度,训练效率低; FNN只能学习到高阶的组合特征。模型中没有对低阶特征建模。
  • PNN: PNN为了捕获高阶组合特征,在embedding layer和first hidden layer之间增加了一个product layer。但是内积的计算复杂度依旧非常高,原因是:product layer的输出是要和第一个隐藏层进行全连接的;product layer的输出需要与第一个隐藏层全连接,导致计算复杂度居高不下;和FNN一样,只能学习到高阶的特征组合。没有对于1阶和2阶特征进行建模。
  • Wide&Deep:同时学习低阶和高阶组合特征,它混合了一个线性模型(Wide part)和Deep模型(Deep part)。这两部分模型需要不同的输入,而Wide part部分的输入,依旧依赖人工特征工程。

但是,这些模型普遍都存在一个问题:偏向于提取低阶或者高阶的组合特征。不能同时提取这两种类型的特征。 需要专业的领域知识来做特征工程。无论是FNN还是PNN,他们都有一个绕不过去的缺点:对于低阶的组合特征,学习到的比较少。

  • DeepFM:在Wide&Deep的基础上进行改进,不需要预训练FM得到隐向量,不需要人工特征工程,能同时学习低阶和高阶的组合特征;FM模块和Deep模块共享Feature Embedding部分,可以更快的训练,以及更精确的训练学习。

  1. 参考自:https://blog.csdn.net/tiangcs/article/details/76601643 ↩︎

  2. 参考自:https://blog.csdn.net/vivian_ll/article/details/90371159 ↩︎

你可能感兴趣的:(机器学习,推荐系统,深度学习)