FM/FFM/wide&deep/deepFM笔记

一,FM

FM在LR的基础上,增加了交叉特征,表达能力更强。FM为每个特征学习一个隐向量,在特征交叉时,使用两个特征隐向量的内积作为交叉特征的权重。FM的模型是:
y ~ = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n < v i v j > x i x j \widetilde{y}=w _{0}+\sum_{i=1}^{n}w _{i}x _{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}<v_{i}v_{j}>x_{i}x_{j} y =w0+i=1nwixi+i=1nj=i+1n<vivj>xixj
这点与矩阵分解类似。

在回归问题中,用预测值Y作为最终的预测结果,再使用均方根误差作为优化目标。在分类问题中,通过映射函数,如sigmoid将y映射到不同的类别范围上,再使用交叉熵损失函数作为优化目标。
FM虽然舍弃了一些精确性,但是大大提升了泛化能力,对于稀疏数据尤其适合。
FM的训练参数有n*k个。经过简化FM在使用梯度下降训练过程中的复杂度为O(k*n)。

二,FFM

FFM引入了特征域,每个特征对应的不是唯一一个隐向量,而是一组隐向量。在Xi和Xj做特征交叉的时候,Xi和Xj会各自从一组隐向量中挑出与对方特征域对应的隐向量进行交叉。
y ~ = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n < v i , f j ∗ v j , f i > x i x j \widetilde{y}=w _{0}+\sum_{i=1}^{n}w _{i}x _{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}<v_{i,f_{j}}*v_{j,f_{i}}>x_{i}x_{j} y =w0+i=1nwixi+i=1nj=i+1n<vi,fjvj,fi>xixj

每个特征都是一个域,比如性别域,年龄域等。在实际的训练过程中需要学习n个特征在f个域上的k维隐向量,参数数量总共nnf个。

FFM的训练参数有nnk个,在使用梯度下降训练时其复杂度为O(nnk)。

三,wide&&deep

记忆能力与泛化能力的综合
是由单层wide部分和多层deep部分组成的混合模型。
wide部分

part 侧重 层级 处理特征 得到特征
wide 记忆能力 单层 稀疏的特征 强特征
deep 泛化能力 多隐层 全部特征 交叉特征,挖掘特征的数据模式

记忆能力:模型直接学习并利用历史数据中物品或者特征的“共现频率”的能力。
泛化能力:模型传递特征的相关性,以及发掘稀疏甚至从未出现过的稀有特征与最终标签相关性的能力。
wide&deep的架构图如下所示:
在这里插入图片描述
Wide部分是广义线性模型,即
y = w T [ x , ϕ ( x ) ] + b y = w^T[x,\phi{(x)}]+b y=wT[x,ϕ(x)]+b
其中x和 ϕ ( x ) \phi{(x)} ϕ(x)表示原始特征和交叉特征。
Deep部分是前馈网络,网络会对一些sparse(如ID类特征)学习一个低维dense Embedding,然后和一些原始dense特征一起作为网络的输入。每一层计算:
a l + 1 = f ( W l a l + b l ) a^{l+1} = f(W^la^l+b^l) al+1=f(Wlal+bl)
其中 a l , b l , W l a^l,b^l,W^l al,bl,Wl是第l层**值、偏置和权重。f是**函数。
损失函数模型选取log-loss,wide&deep最后的预测输出为:
p ( y = 1 ∣ x ) = σ ( w w i d e T [ x , ϕ ( x ) ] + w w i d e T a l f + b ) p(y=1|x)=\sigma(w^T_{wide}[x,\phi{(x)}]+w^T_{wide}a^{l_f}+b) p(y=1x)=σ(wwideT[x,ϕ(x)]+wwideTalf+b)

其中 σ \sigma σ表示sigmoid函数, ϕ ( x ) \phi{(x)} ϕ(x)表示叉乘特征, a l f a^{l_f} alf表示NN最后一层**值。
通过交叉积变换层完成特征组合之后,wide部分将组合特征输入最终的LogLoss输出层,与deep部分的输出一同参与最后的目标拟合。

联合训练
联合训练(Joint Training)和集成(Ensemble)是不同的,集成是每个模型单独训练,再将模型的结果汇合。相比联合训练,集成的每个独立模型都得学得足够好才有利于随后的汇合,因此每个模型的model size也相对更大。而联合训练的wide部分只需要作一小部分的特征叉乘来弥补deep部分的不足,不需要 一个full-size 的wide 模型。

在论文中,作者通过梯度的反向传播,使用 mini-batch stochastic optimization 训练参数,并对wide部分使用带L1正则的Follow- the-regularized-leader (FTRL) 算法,对deep部分使用 AdaGrad算法。

四,deepFM

用FM代替wide&&deep中的wide部分。
左边的FM部分对不同的特征域的Embedding进行了两两交叉,也就是将Embedding向量当作原FM的特征隐向量。最后将FM的输出和Deep部分的输出一起输入到最后的输出层,参与最后的目标拟合。
框架如下所示:
在这里插入图片描述
DeepFM 的结构与Wide & Deep的框架相似,差异在于将Wide部分的LR替换为了FM,从而自动构造二阶特征叉乘,而非手工设计叉乘。
DeepFM中FM模型可以抽取low-order特征,DNN可以抽取high-order特征。无需Wide&Deep模型人工特征工程。
FM部分的图如下所示:
在这里插入图片描述
FM层与NN层 共享 embedding 层,而非各自学习各自部分的embedding。这么做的好处是:
1)降低模型复杂度;
2)在embedding的学习中同时接收与来自“low & high order interaction”部分的反馈,从而学到更好的特征表示。
Deep部分
该部分和Wide&Deep模型类似,是简单的前馈网络。在输入特征部分,由于原始特征向量多是高纬度,高度稀疏,连续和类别混合的分域特征,为了更好的发挥DNN模型学习high-order特征的能力,文中设计了一套子网络结构,将原始的稀疏表示特征映射为稠密的特征向量。
在这里插入图片描述
不同field特征长度不同,但是子网络输出的向量需具有相同维度.
假设子网络的输出层为:
a ( 0 ) = [ e 1 , e 2 , . . . , e m ] a^{(0)}=[e_1,e_2,...,e_m] a(0)=[e1,e2,...,em]
DNN网络第i层表示为:
a l + 1 = σ ( W ( l ) a ( l ) + b ( l ) ) a^{l+1}=\sigma(W^{(l)}a^{(l)}+b^{(l)}) al+1=σ(W(l)a(l)+b(l))
假设一共有H个隐藏层,DNN部分对CTR预测结果可以表示为:
y D N N = σ ( W ∣ H ∣ + 1 a H + b ∣ H ∣ + 1 ) y_{DNN}=\sigma({W^{|H|+1}a^H+b^{|H|+1}}) yDNN=σ(WH+1aH+bH+1)
其中 σ \sigma σ表示**函数relu。

FM模型获得特征的2阶表示,与DNN模型得到high-order高阶特征,输入到模型联合去训练,结果可表示为:
y ^ = s i g m o i d ( y F M + y D N N ) \hat{y} = sigmoid(y_{FM}+y_{DNN}) y^=sigmoid(yFM+yDNN)

参考链接:
FM与FFM:
深入理解FFM原理与实践
FM以及优化公式推导:

wide&deep原理:
详解 Wide&Deep 推荐框架
详解 Wide & Deep 结构背后的动机-更细致

DeepFM原理:
深度推荐模型之DeepFM