文章目录
-
-
-
- 前言
- LR
- POLY2
- FM(Factorization Machine)
- FFM(Field-aware Factorization Machine)
- AFM(Attention Factorization Machine)
- NFM(Neural Factorization Machine)
- WDL(wide & deep learning)
- DeepFM(Deep Factorization Machine)
- DCN(Deep and Cross Networks)
- xDeepFM
- FwFM(Field-weighted Factorization Machine)
- FLEN(Field-Leveraged Embedding Network)
-
- Reference
-
-
前言
FM系列模型目前已经普遍应用于推荐系统中,网上相关文章和介绍也很多,本文将FM系列论文做一次总结,将近几年FM系列模型中常用或有效的模型都介绍一下,包括FM、FFM、AFM、NFM、WDL、DeepFM、DCN、xDeepFM、FwFM、FLEN。
LR
在FM模型出现之前 ,工业界做推荐算法最广泛使用LR做点击率预估,利用sigmoid函数将自变量映射到 ( 0 , 1 ) (0, 1) (0,1) 之间,函数形式为: g ( z ) = 1 1 + e ? z (1) g(z)=\frac{1}{1+e^{-z}} \tag{1} g(z)=1+e?z1?(1)
为什么使用sigmoid函数?
- sigmoid函数的定义域是 ( ? ∞ , + ∞ ) (-\infty, +\infty) (?∞,+∞) ,而值域为 ( 0 , 1 ) (0, 1) (0,1) 。
- sigmoid函数是可导的。
- sigmoid函数对于给定的输入变量,会根据选择的参数计算输出变量=1的可能性,也就是说它的输出表示概率,都是0到1之间。
因此最基本的LR分类器适合于对两分类(类0,类1)目标进行分类。
Sigmoid 函数是个很漂亮的“S”形,如下图所示:
在很久之前的一篇博客中详细介绍过LR算法:【ML算法】监督学习——逻辑回归,感兴趣的自行查看,这里不展开介绍了。
LR模型简单方便,对于推荐系统中大规模系数特征可以进行较好的建模,因此被广泛应用。其函数形式: Φ L R ( w , x ) = w 0 + ∑ i = 1 m w i x i (2) \Phi_{LR}(w,x)=w_0+\sum_{i=1}^m w_ix_i \tag{2} ΦLR?(w,x)=w0?+i=1∑m?wi?xi?(2)
但细究LR本身,我们就会发现,LR都是对单个特征进行的建模,并没有考虑特征之间的交互关系。所以通常情况下,使用LR时需要大量进行人工特征交叉,以保证模型的效果,但这又会给算法人员带来很大的工作量,每次调研新特征时,需要考虑新特征与现有特征的交叉特征。
POLY2
POLY2模型在LR的基础上,增加对交叉特征的建模,省去人工进行特征交叉的环节。对特征进行两两交叉,每个交叉特征分配一个权重,如下:
Φ P o l y 2 ( w , x ) = w 0 + ∑ i = 1 m x i w i + ∑ i = 1 m ∑ j = i + 1 m x i x j w h ( i , j ) (3) \Phi_{Poly2}(w,x)=w_0+\sum_{i=1}^m x_iw_i + \sum_{i=1}^m \sum_{j=i+1}^mx_ix_jw_{h(i,j)} \tag{3} ΦPoly2?(w,x)=w0?+i=1∑m?xi?wi?+i=1∑m?j=i+1∑m?xi?xj?wh(i,j)?(3)
可以看到,POLY2对于每个交叉项都分配一个weight,复杂度可以达到 m 2 m^2 m2 ,当特征量较大时,weight的维度也会暴增,而推荐系统的特征特点就是高维稀疏,因此POLY2的实用性也会大打折扣。
FM(Factorization Machine)
Factorization Machines
FM解决了上面POLY2存在的问题。在推荐系统中,特征高维稀疏,所以绝大部分的 x i x j x_ix_j xi?xj? 的结果都是0,只有少部分weight会学到东西,于是FM引入隐向量来学习交叉特征的权重:
Φ F M s ( w , x ) = w 0 + ∑ i = 1 m x i w i + ∑ i = 1 m ∑ j = i + 1 m x i x j < v i , v j > (4) \Phi_{FMs}(w,x)=w_0+\sum_{i=1}^m x_iw_i + \sum_{i=1}^m \sum_{j=i+1}^mx_ix_j<v_i, v_j> \tag{4} ΦFMs?(w,x)=w0?+i=1∑m?xi?wi?+i=1∑m?j=i+1∑m?xi?xj?<vi?,vj?>(4)
看FM的公式,特征交叉项的复杂度貌似也是 m 2 m^2 m2 ,但实际上,可以通过一些trick将复杂度降低,推导过程如下:
∑ i = 1 m ∑ j = i + 1 m < v i , v j > x i x j = 1 2 ∑ i = 1 m ∑ j = 1 m < v i , v j > ? 1 2 ∑ i = 1 m < v i , v j > x i x j = 1 2 ( ∑ i = 1 m ∑ j = 1 m ∑ f = 1 k v i , f v j , f x i x j ? ∑ i = 1 m ∑ f = 1 k v i , f v i , f x i x i ) = 1 2 ∑ f = 1 k ( ( ∑ i = 1 m v i , f x i ) ( ∑ j = 1 m v j , f x j ) ? ∑ i = 1 m v i , f 2 x i 2 ) = 1 2 ∑ f = 1 k ( ( ∑ i = 1 m v i , f x i ) 2 ? ∑ i = 1 m v i , f 2 x i 2 ) (5) \begin{aligned} &\ \ \ \ \sum_{i=1}^m \sum_{j=i+1}^m<v_i,v_j>x_ix_j \\ &=\frac{1}{2}\sum_{i=1}^m\sum_{j=1}^m<v_i,v_j>-\frac{1}{2}\sum_{i=1}^m<v_i,v_j>x_ix_j \\ &=\frac{1}{2}(\sum_{i=1}^m\sum_{j=1}^m\sum_{f=1}^kv_{i,f}v_{j,f}x_ix_j - \sum_{i=1}^m\sum_{f=1}^kv_{i,f}v_{i,f}x_ix_i) \\ &=\frac{1}{2}\sum_{f=1}^k((\sum_{i=1}^m{v_{i,f}x_i})(\sum_{j=1}^m{v_{j,f}x_j}) - \sum_{i=1}^m{v_{i,f}^2}x_i^2) \\ &=\frac{1}{2}\sum_{f=1}^k((\sum_{i=1}^mv_{i,f}x_i)^2-\sum_{i=1}^m{v_{i,f}^2x_i^2}) \end{aligned} \tag{5} ? i=1∑m?j=i+1∑m?<vi?,vj?>xi?xj?=21?i=1∑m?j=1∑m?<vi?,vj?>?21?i=1∑m?<vi?,vj?>xi?xj?=21?(i=1∑m?j=1∑m?f=1∑k?vi,f?vj,f?xi?xj??i=1∑m?f=1∑k?vi,f?vi,f?xi?xi?)=21?f=1∑k?((i=1∑m?vi,f?xi?)(j=1∑m?vj,f?xj?)?i=1∑m?vi,f2?xi2?)=21?f=1∑k?((i=1∑m?vi,f?xi?)2?i=1∑m?vi,f2?xi2?)?(5)
于是,FM的复杂度从原来的 O ( m 2 ) O(m^2) O(m2) 变成 O ( m k ) O(mk) O(mk),其中, m m m 为特征维度, k k k 为隐向量维度。
FM模型可以使用梯度下降法进行学习,模型的梯度为:
? y ( x ) ? θ = { 1 i f θ i s w 0 x i i f θ i s w i x i ∑ j = 1 m v i , f x i ? v i , f x i 2 i f θ i s v i , f (6) \frac{\partial y(x)}{\partial \theta} = \begin{cases} 1 & if\ \theta \ is\ w_0 \\ x_i & if \ \theta \ is \ w_i \\ x_i \sum_{j=1}^m {v_{i,f}x_i - v_{i,f}x_i^2} & if \ \theta \ is \ v_{i,f} \end{cases} \tag{6} ?θ?y(x)?=??????1xi?xi?∑j=1m?vi,f?xi??vi,f?xi2??if θ is w0?if θ is wi?if θ is vi,f??(6)
式中, ∑ j = 1 m v i , f x i \sum_{j=1}^m {v_{i,f}x_i} ∑j=1m?vi,f?xi? 只与 f f f 有关而与 i i i 无关,在每次迭代过程中,可以预先对所有 f f f 的 ∑ j = 1 m v i , f x i \sum_{j=1}^m {v_{i,f}x_i} ∑j=1m?vi,f?xi? 进行计算,复杂度为 O ( m k ) O(mk) O(mk) ,就能在常数时间 O ( 1 ) O(1) O(1) 内得到 v v v 的梯度。而对于其他参数 w 0 w_0 w0? 和 w i w_i wi? ,显然也是在常数时间内计算梯度。此外,更新参数只需要 O ( 1 ) O(1) O(1) ,一共有 1 + m + m k 1+m+mk 1+m+mk 个参数,因此FM参数训练的复杂度也是 O ( m k ) O(mk) O(mk) 。所以说,FM模型是一种高效的模型,是线性时间复杂度的,可以再线性的时间做出训练和预测,这也是FM模型被广泛应用在推荐领域的重要原因。
FM的优点:
- FM降低了因数据稀疏,导致交叉项参数学习不充分的影响。直接用one-hot进行多项式建模,DataSet中没有出现的特征组合的权重是学不出来的,而FM是基于MF的思想或者说是基于latent factor model的思想进行的“曲线救国”:
- 通过先学习每个特征的隐向量,然后通过隐向量之间的内积来刻画交互项的权重。
- 一个组合特征的样本数一定比单特征的样本数少 <=> 直接学习交互项的特征一定比学习隐向量要难。且学习隐向量可以避免因数据稀疏导致的学习不充分的缺点。
- FM提升了参数学习效率,因为FM需要训练的参数更少,一般情况下,隐向量的维度都是比较短的,且肯定原小于直接学习交互项的参数个数。
- FM模型对稀疏数据有更好的学习能力,通过交互项可以学习特征之间的关联关系,并且保证了学习效率和预估能力。
FM能玩得通的一些巧妙性:
- FM求解latent factor vector的套路,是基于MF的latent factor model方法来做。
- 矩阵分解大法用在FM上,以缩减参数个数,处理数据稀疏带来的学习不足问题,还能做embedding;
- FM 可以看做是 MF 的 generalized 版本,不仅能够利用普通的用户反馈信息,还能融合情景信息、社交信息等诸多影响个性化推荐的因素。
FFM(Field-aware Factorization Machine)
Field-aware Factorization Machines for CTR Prediction
在CTR预估中,通常会遇到one-hot类型的变量,会导致数据特征的稀疏。为解决这个问题,FFM在FM的基础上进一步改进,在模型中引入Field的概念,将同一个field的特征单独进行one-hot,因此在FFM中,每一维特征都会针对其他特征的每个field,分别学习一个隐变量,该隐变量不仅与特征相关,也与field相关。
假设样本的m个特征属于f个field,那么FFM的二次项有,mf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。FM可以看做FFM的特例,把所有特征都归属到一个field的FFM模型。其模型方程为: Φ F F M s ( ( w , v ) , x ) = w 0 + ∑ i = 1 m x i w i + ∑ i = 1 m ∑ j = i + 1 m x i x j < v i , F ( j ) , v j , F ( i ) > (7) \Phi_{FFMs}((w,v),x)=w_0+\sum_{i=1}^mx_iw_i+\sum_{i=1}^m\sum_{j=i+1}^m{x_ix_j<v_{i,F(j)}, v_{j,F(i)}>} \tag{7} ΦFFMs?((w,v),x)=w0?+i=1∑m?xi?wi?+i=1∑m?j=i+1∑m?xi?xj?<vi,F(j)?,vj,F(i)?>(7)
如果隐向量的长度为k,那么FFM的二次参数有mfk个,远多于FM模型的mk个,所以,当m足够大时,FFM的复杂度也会变得非常大。
为了方便推导,这里省略FFM的一次项和常数项,公式为:
? ( w , x ) = ∑ i m ∑ j = i + 1 m ( w i , f j ? w j , f i ) x i x j (8) \phi(w,x)=\sum_{i}^m \sum_{j=i+1}^m {(w_{i,f_j} \cdot w_{j,f_i}) x_i x_j} \tag{8} ?(w,x)=i∑m?j=i+1∑m?(wi,fj???wj,fi??)xi?xj?(8)
FFM模型使用logistic loss作为损失函数,并加上 L 2 L_2 L2? 正则项:
L = ∑ i = 1 N l o g ( 1 + e x p ( ? y i ? ( w , x i ) ) ) + λ 2 ∣ ∣ w ∣ ∣ 2 (9) L=\sum_{i=1}^N{log(1+exp(-y_i \phi(w,x_i))) + \frac{\lambda}{2} ||w||^2} \tag{9} L=i=1∑N?log(1+exp(?yi??(w,xi?)))+2λ?∣∣w∣∣2(9)
采用随机梯度下降来优化损失函数,因此损失函数只采用单个样本的损失:
L = l o g ( 1 + e x p ( ? y i ? ( w , x i ) ) ) + λ 2 ∣ ∣ w ∣ ∣ 2 (10) L=log(1+exp(-y_i \phi(w,x_i))) + \frac{\lambda}{2} ||w||^2 \tag{10} L=log(1+exp(?yi??(w,xi?)))+2λ?∣∣w∣∣2(10)
对于每次迭代,选取一条数据 ( x , y ) (x,y) (x,y) ,然后让 L L L 对 w i , f j w_{i,fj} wi,fj? 和 w j , f i w_{j,f_i} wj,fi?? 求偏导,得到:
g i , f j ≡ ? L ? w i , f j = κ ? w j , f i x i x j + λ w i , f j 2 (11) g_{i,f_j} \equiv \frac{\partial L}{\partial w_{i,f_j}} = \kappa \cdot w_{j,f_i} x_i x_j +\lambda w_{i,f_j}^2 \tag{11} gi,fj??≡?wi,fj???L?=κ?wj,fi??xi?xj?+λwi,fj?2?(11) g j , f i ≡ ? L ? w j , f i = κ ? w i , f j x i x j + λ w j , f i 2 (12) g_{j,f_i} \equiv \frac{\partial L}{\partial w_{j,f_i}} = \kappa \cdot w_{i,f_j} x_i x_j +\lambda w_{j,f_i}^2 \tag{12} gj,fi??≡?wj,fi???L?=κ?wi,fj??xi?xj?+λwj,fi?2?(12)
其中, κ = ? y 1 + e x p ( y ? ( w , x ) ) \kappa = \frac{-y}{1+exp(y \phi(w,x))} κ=1+exp(y?(w,x))?y?.
在具体实现中,这里有两个trick,第一个trick是梯度的分布计算:
L = L e r r + L r e g = l o g ( 1 + e x p ( ? y i ? ( w , x i ) ) ) + λ 2 ∣ ∣ w ∣ ∣ 2 (13) L=L_{err} + L_{reg}=log(1+exp(-y_i \phi(w,x_i))) + \frac{\lambda}{2} ||w||^2 \tag{13} L=Lerr?+Lreg?=log(1+exp(?yi??(w,xi?)))+2λ?∣∣w∣∣2(13)
? L ? w = ? L e r r ? ? ? ? ? ? w + ? L r e g ? w (14) \frac{\partial L}{\partial w}=\frac{\partial L_{err}}{\partial \phi} \cdot \frac{\partial \phi}{\partial w} + \frac{\partial L_{reg}}{\partial w} \tag{14} ?w?L?=???Lerr????w???+?w?Lreg??(14)
注意到 ? L e r r ? ? \frac{\partial L_{err}}{\partial \phi} ???Lerr?? 和参数无关,每次更新模型时,只需要计算一次,之后直接调用结果即可。对于总共有 m f k mfk mfk 个模型参数的计算来说,使用这种方式能极大提升运算效率。
第二个trick是FFM的学习率是随迭代次数变化的,具体的是采用AdaGrad算法。Adagrad算法能够在训练中自动的调整学习率,对于稀疏的参数增加学习率,而稠密的参数则降低学习率。因此,Adagrad非常适合处理稀疏数据。
设gt,j第t轮第j个参数的梯度,则SGD和采用Adagrad的参数更新公式分别如下:
S G D : w t + 1 , j = w t , j ? η ? g t . j (15) SGD:\ w_{t+1,j}=w_{t,j}-\eta \cdot g_{t.j} \tag{15} SGD: wt+1,j?=wt,j??η?gt.j?(15) A d a g r a d : w t + 1 , j = w t , j ? η G t , j j + ? ? g t , j (16) Adagrad:\ w_{t+1,j}=w_{t,j} - \frac{\eta}{\sqrt{G_{t, jj}+\epsilon}} \cdot g_{t,j} \tag{16} Adagrad: wt+1,j?=wt,j??Gt,jj?+??η??gt,j?(16)
可以看出,Adagrad在学习率 e t a eta eta 上还除以一项 G t , j j + ? \sqrt{G_{t, jj}+\epsilon} Gt,jj?+?? ,其中 e p s i l o n epsilon epsilon 为平滑项,防止分母为0, G t , j j = ∑ l = 1 t g l , j j 2 G_{t,jj}=\sum_{l=1}^t g_{l,jj}^2 Gt,jj?=∑l=1t?gl,jj2? ,即 G t , j j G_{t,jj} Gt,jj? 为对角矩阵,每个对角线位置 j , j j,j j,j 的值为参数 w j w_j wj? 每一轮的平方和。随着迭代的进行,每个参数的历史梯度加到一起,使得每个参数的学习率逐渐减小。
计算完梯度后,下一步就是更新分母的对角矩阵:
G i , f j ← G i , f j + ( g i , f j ) 2 (17) G_{i, f_j} \leftarrow G_{i, f_j} + (g_{i, f_j})^2 \tag{17} Gi,fj??←Gi,fj??+(gi,fj??)2(17) G j , f i ← G j , f i + ( g j , f i ) 2 (18) G_{j, f_i} \leftarrow G_{j, f_i} + (g_{j, f_i})^2 \tag{18} Gj,fi??←Gj,fi??+(gj,fi??)2(18)
最后,更新模型参数:
w i , f j ← w i , f j ? η G i , f j + 1 ? g i , f j (19) w_{i, f_j} \leftarrow w_{i, f_j} - \frac{\eta}{\sqrt{G_{i, f_j} + 1}} \cdot g_{i, f_j} \tag{19} wi,fj??←wi,fj???Gi,fj??+1?η??gi,fj??(19) w j , f i ← w j , f i ? η G j , f i + 1 ? g j , f i (20) w_{j, f_i} \leftarrow w_{j, f_i} - \frac{\eta}{\sqrt{G_{j, f_i} + 1}} \cdot g_{j, f_i} \tag{20} wj,fi??←wj,fi???Gj,fi??+1?η??gj,fi??(20)
AFM(Attention Factorization Machine)
Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks
AFM 首先对 FM 做了神经网络改造,而后加入了注意力机制,为不同特征的二阶组合分配不同的权重。在传统的FM中进行特征组合时两两特征之间的组合都是等价的(只能通过隐向量的点积来区别),这里趁着Attention的热度走一波,因为AFM的最大的贡献就是通过Attention建立权重矩阵来学习两两向量组合时不同的权重。下面就是AFM的框架图:
从图中可以很清晰的看出,AFM比FM就是多了一层Attention-based Pooling,该层的作用是通过Attention机制生成一个αij权重矩阵,该权重矩阵将会作用到最后的二阶项中,因此这里αij的生成步骤是先通过原始的二阶点积求得各自的组合的一个Score:
a i , j ′ = h T R e L u ( W ( v i ⊙ v j ) x i x j + b ) (21) a'_{i,j}=h^TReLu(W(v_i \odot v_j)x_ix_j+b) \tag{21} ai,j′?=hTReLu(W(vi?⊙vj?)xi?xj?+b)(21)
其中, W ∈ R t × k , b ∈ R t , h ∈ R t W \in R^{t \times k}, b \in R^t , h \in R^t W∈Rt×k,b∈Rt,h∈Rt,这里 t t t 表示Attention网络的大小。
对其score进行softmax归一化:
a i , j ′ = e x p ( a i , j ′ ) ∑ i , j e x p ( a i , j ′ ) (22) a'_{i,j} = \frac{exp(a'_{i,j})}{\sum_{i,j}exp(a'_{i,j})} \tag{22} ai,j′?=∑i,j?exp(ai,j′?)exp(ai,j′?)?(22)
最后该权重矩阵再次用于二阶项的计算,也就是最终的AFM式子:
Φ A F M ( ( w , v , b ) , x ) = w 0 + ∑ i = 1 m w i x i + ∑ i = 1 m ∑ j = i + 1 m a i , j < p , ( v i ⊙ v j ) > x i x j (23) \Phi_{AFM}((w, v, b), x)=w_0 + \sum_{i=1}^m{w_ix_i} + \sum_{i=1}^m\sum_{j=i+1}^m{a_{i,j}<p,(v_i \odot v_j)> x_i x_j} \tag{23} ΦAFM?((w,v,b),x)=w0?+i=1∑m?wi?xi?+i=1∑m?j=i+1∑m?ai,j?<p,(vi?⊙vj?)>xi?xj?(23)
这里, a i , j a_{i,j} ai,j? 是通过注意力机制学习得到的特征 i i i 和特征 j j j 组合的权重, p p p 是对隐向量每个维度学习得到的权重, v i ⊙ v j v_i \odot v_j vi?⊙vj? 表示向量 v i v_i vi? 和 v j v_j vj? 逐项相乘得到的新向量,显然,当 a ≡ 1 a \equiv 1 a≡1 且 p = 1 ? p= \vec{1} p=1 时,AFM退化为标准的FM模型。
NFM(Neural Factorization Machine)
Neural Factorization Machines for Sparse Predictive Analytics?
NFM公式定义如下:
Φ N F M ( X ) = w 0 + ∑ i = 1 m w i x i + f ( X ) (24) \Phi_{NFM}(X)=w_0 + \sum_{i=1}^m{w_i x_i} + f(X) \tag{24} ΦNFM?(X)=w0?+i=1∑m?wi?xi?+f(X)(24)
NFM在FM基础上增加多个隐层,达到对高阶特征的提取,其结构如下:
整体结构中规中矩,以FM和DNN的串行结构提取特征,在推荐系统中效果不错。
Bi-iteraction Layer
Bi-interation Layer是NFM的核心模块,本质是一个pooling操作,讲embedding向量归并为一个向量:
f B I ( V x ) = ∑ i = 1 m ∑ j = i + 1 m x i v i ⊙ x j v j (25) f_{BI}(V_x) = \sum_{i=1}^m \sum_{j=i+1}^m {x_i v_i \odot x_j v_j} \tag{25} fBI?(Vx?)=i=1∑m?j=i+1∑m?xi?vi?⊙xj?vj?(25)
其中, ⊙ \odot ⊙ 表示两个向量对应元素相乘,结果为一个向量,维度不变。
Hidden Layer
DNN部分定义如下:
z l = σ l ( W l z l ? 1 + b l ) (26) z_l = \sigma_l(W_l z_{l-1} + b_l) \tag{26} zl?=σl?(Wl?zl?1?+bl?)(26)
其中, W l W_l Wl? , b l b_l bl? 分别表示参数权重和偏置向量, σ \sigma σ 表示激活函数,这个hidden layer和平时接触的DNN结构没啥区别。
过拟合风险
NFM将模型复杂度提高,不可避免的会面临训练过拟合的问题,NFM作者使用了dropout与batch normalization技术来缓解过拟合问题。后续实验表明,结合使用这两种技术能够有效的避免过拟合风险。
-
dropout:为了防止过拟合,可以使用dropout技术。需要注意的是,dropout一般是用于Bi-Interaction Layer输出之后,对于后续的每一层隐层都可使用。
-
batch normalization:为了加速模型的收敛,同时还可使用batch normalization技术。同样的,作用于Bi-Interaction的输出,以及后续的隐层。
-
附加层相对顺序:同时使用dropout,与batch normalization技术,需要注意两者的使用顺序。在 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 一文中,作者提到 :
we would like to ensure that for any parameter values, the network always produces activations with the desired distribution. 也就是说,需要为激活函数提供需要的数据分布。所以,应该在Bi-Interaction Layer之后接入batch normalization,然后直接进行dropout。需要注意的是,Bi-Interaction Layer是没有激活函数的。后续隐层需要进行batch normalization调整数据分布,然后再加上激活函数,最后使用dropout技术。
实际应用中,也有对NFM进行改造的,将FM和DNN进行并联操作,FM模块负责对二阶交叉特征的提取,DNN对高阶特征建模,效果也很好。这种并联的操作和wide & deep网络结构类似,与下面介绍的DeepFM也很像。
WDL(wide & deep learning)
Wide & Deep Learning for Recommender Systems
wide & deep网络最先使用两个子网络结合的方式,分别提取低阶和高阶特征,由于wide & deep的结构简单,且应用在推荐场景中业务指标提升的比较明显,目前仍然是很多公司推荐排序落地的首选。wide & deep网络的结构如下:
wide部分
Wide部分是 y = w T x + b y = w^Tx + b y=wTx+b 的广义线性模型,如图1(左)所示。 y y y 是预测值, x = [ x 1 , x 2 , ? , x d ] x = [x_1, x_2,\cdots, x_d] x=[x1?,x2?,?,xd?] 是特征向量, w = [ w 1 , w 2 , ? , w d ] w = [w_1, w_2, \cdots, w_d] w=[w1?,w2?,?,wd?] 为模型参数,b为偏差。特征集包括原始输入特征和转换后的特征,最重要的转换之一是交叉乘积转换,定义为:
? k ( x ) = ∏ i = 1 d x i c k i , c k i ∈ { 0 , 1 } (27) \phi_k(x) = \prod_{i=1}^d x_i^{c_{ki}}, c_{ki} \in \{0, 1\} \tag{27} ?k?(x)=i=1∏d?xicki??,cki?∈{
0,1}(27)
[公式] 是一个布尔变量,如果第i个特征是第 k k k 个变换的一部分则为1,反之为0。对于二值特征,一个组合特征当原特征都为0的时候才会0。这捕获了二元特征之间的相互作用,并为广义线性模型增加了非线性。
deep部分
Deep部分是前馈神经网络,如图1(右)所示。对于类别型特征,原始输入是特征字符串。这些稀疏的高维类别特征会先转换成低维稠密的实数向量,通常被称为嵌入向量。嵌入向量的维度通常通常在o(10)到o(100)的量级。随机初始化嵌入向量,然后在模型训练中最小化最终损失函数。这些低维稠密向量馈送到前向传递中的神经网络的隐藏层中。 具体来说,每个隐藏层执行以下计算:
a l + 1 = f ( W l a l + b l ) (28) a^{l+1} = f(W^{l}a^{l}+b^l) \tag{28} al+1=f(Wlal+bl)(28)
其中, l l l 是层数, f f f 是激活函数,通常使用RELU函数。 a l a^l al, b l b^l bl 和 W l W^l Wl 是第 l l l 层的激活、偏置和模型权重。
Deep部分的主要作用是让模型具有“泛化能力”。“泛化能力”可以被理解为模型传递特征的相关性,以及发掘稀疏甚至从未出现过的稀有特征与最终标签相关性的能力。深度神经网络通过特征的多次自动组合,可以深度发掘数据中潜在的模式,即使是非常稀疏的特征向量输入,也能得到较稳定平滑的推荐概率,这就是简单模型所缺乏的“泛化能力”。
wide的部分和deep的部分使用其输出对数几率的加权和作为预测,然后将其输入到联合训练的一个共同的逻辑损失函数。注意到这里的联合训练和集成学习是有区别的。集成学习中,每个模型是独立训练的,而且他们的预测是在推理时合并而不是在训练时合并。相比之下,联合训练在训练时同时考虑wide和deep模型以及加权和来优化所有参数。这对模型大小也有影响:对于集成学习而言,由于训练是独立的,因此每个模型的大小通常会更大(例如:更多特征和交叉特征)来实现一个集成模型合理的精确度。相比之下,在联合训练中,wide部分只需要通过少量的跨产品特征变换来补充深度模型的不足,而且不是全量的模型。
DeepFM(Deep Factorization Machine)
DeepFM: A Factorization-Machine based Neural Network for CTR Prediction
上面有提到,改进后的NFM结构与DeepFM结构很类似,其网络结构如下:
DeepFM模型中有两个子网络:FM和DNN,两个子网络共享特征embedding向量,分别对交叉特征和高阶特征进行建模,两个子网络的输出进行concat输出,定义如下:
Φ D e e p F M = s i g m o i d ( Φ F M + Φ D N N ) (29) \Phi_{DeepFM} = sigmoid(\Phi_{FM} + \Phi_{DNN}) \tag{29} ΦDeepFM?=sigmoid(ΦFM?+ΦDNN?)(29)
DeepFM的架构其实特别清晰:
- 输入的是稀疏特征的id
- 进行一层lookup 之后得到id的稠密embedding
- 这个embedding一方面作为隐向量输入到FM层进行计算
- 同时该embedding进行聚合之后输入到一个DNN模型(deep)
- 然后将FM层和DNN层的输入求和之后进行co-training
DeepFM的三大优势:
- 相对于Wide&Deep不再需要手工构建wide部分;
- 相对于FNN把FM的隐向量参数直接作为网络参数学习;
- DeepFM将embedding层结果输入给FM和MLP,两者输出叠加,达到捕捉了低阶和高阶特征交叉的目的。
DCN(Deep and Cross Networks)
Deep & Cross Network for Ad Click Predictions
上面介绍了wide & deep learning,WDL在实际应用中效果不错,但在Wide部分,仍然需要人工地设计特征叉乘。面对高维稀疏的特征空间、大量的可组合方式,基于人工先验知识虽然可以缓解一部分压力,但仍需要不小的人力和尝试成本,并且很有可能遗漏一些重要的交叉特征。
DCN网络结构如下:
文中对原始特征做如下处理:
- 对sparse特征进行embedding,对于multi-hot的sparse特征,embedding之后再做一个简单的average pooling;
- 对dense特征归一化,然后和embedding特征拼接,作为随后Cross层与Deep层的共同输入,即:
x 0 = [ x e m b e d , 1 T , x e m b e d , 2 T , ? , x e m b e d , k T , x d e n s e T ] T (30) x_0 = [x_{embed, 1}^T, x_{embed,2}^T, \cdots, x_{embed,k}^T, x_{dense}^T]^T \tag{30} x0?=[xembed,1T?,xembed,2T?,?,xembed,kT?,xdenseT?]T(30)
Cross的目的是以一种显示、可控且高效的方式,自动构造有限高阶交叉特征,我们会对这些特点进行解读。Cross结构如上图1左侧所示,其中第 l + 1 l+1 l+1 层输出为:
x l + 1 = x 0 x l T w l + b l + x l = f ( x l , w l , b l ) + x l (31) x_{l+1} = x_0 x_l^Tw_l + b_l + x_l = f(x_l, w_l, b_l) + x_l \tag{31} xl+1?=x0?xlT?wl?+bl?+xl?=f(xl?,wl?,bl?)+xl?(31)
其中, x l + 1 , x l , x 0 ∈ R d x_{l+1}, x_l, x_0 \in R^d xl+1?,xl?,x0?∈Rd
xDeepFM
xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems
xDeepFM命名和DeepFM比较像,但是从模型构造及优化点来看,xDeepFM和deep & cross network更相似,是对DCN的进一步优化。xDeepFM的动机,正是将FM的vector-wise的思想引入Cross部分。
xDeepFM的结构如下:
上图也可以看出,模型的创新之处在于CIN模块,下面详细介绍一下CIN结构。
CIN的输入来自embedding层,假设有m个field,每个field的embedding向量维度为D,则输入可以表示为矩阵X
令 X k ∈ R H k × D X^k \in R^{H_k \times D} Xk∈RHk?×D 表示第 k k k 层的输出,其中 H k H_k Hk? 表示第 k k k 层的向量个数,向量维度始终为 D D D ,保持和输入层一致。具体的,第 k k k 层每个向量的计算方式为:
X h , ? k = ∑ i = 1 H k ? 1 ∑ j = 1 m W i j k , h ( X i , ? k ? 1 ? X j , ? 0 ) ∈ R 1 × D (32) X_{h,*}^k = \sum_{i=1}^{H_{k-1}} \sum_{j=1}^m {W_{ij}^{k,h} (X_{i,*}^{k-1} \circ X_{j,*}^0)} \in R^{1 \times D} \tag{32} Xh,?k?=i=1∑Hk?1??j=1∑m?Wijk,h?(Xi,?k?1??Xj,?0?)∈R1×D(32)
其中, 1 ≤ h ≤ H k 1 \leq h \leq H_k 1≤h≤Hk? , W W W 表示第 k k k 层的第 h h h 个向量的权重矩阵, ? \circ ? 表示Hadamard乘积,即逐元素相乘,例如: < a 1 , b 1 , c 1 > ? < a 2 , b 2 , c 2 > = < a 1 b 1 , a 2 b 2 , a 3 b 3 > <a_1, b_1, c_1> \circ <a_2, b_2, c_2> = <a_1 b_1, a_2 b_2, a_3 b_3> <a1?,b1?,c1?>?<a2?,b2?,c2?>=<a1?b1?,a2?b2?,a3?b3?>
首先,取前一层 X k ? 1 ∈ R H k ? 1 × D X^{k-1} \in R^{H_{k-1} \times D} Xk?1∈RHk?1?×D 中的 H k ? 1 H_{k-1} Hk?1? 个向量,与输入层 X 0 ∈ R m × D X^0 \in R^{m \times D} X0∈Rm×D 中的 m m m 个向量,进行两两Hadamard乘积运算,得到 H k ? 1 ? m H_{k-1} * m Hk?1??m 个向量,然后加权求和。
第 k k k 层的不同向量区别在于,对这 H k ? 1 ? m H_{k-1} * m Hk?1??m 个向量求和的权重矩阵不同, H k H_k Hk? 即对应有多少个不同的权重矩阵 W k W^k Wk ,是一个可以调整的参数。
CIN与DCN中cross层的设计动机是相似的,cross层的输入也是前一层与输出层。CIN保持了DCN的优点:有限高阶、自动叉乘、参数共享。
但同时,CIN和cross也存在一些差异:1. cross是bit-wise的,而CIN是vector-wise的。 2. 在第 l l l 层,cross包含从1阶到 l + 1 l+1 l+1 阶的所有组合特征,而CIN只包含 l + 1 l+1 l+1 阶的组合特征。相应的,cross在输出层输出全部结果,而CIN在每层输出中间结果。
FwFM(Field-weighted Factorization Machine)
Field-weighted Factorization Machines for Click-Through Rate Prediction in Display Advertising
在上面的介绍中,有提到FFM通过考虑field信息,对特征进行建模,模型效果也是不错的。但是FFM有个问题,不同特征之间的互信息是不同的。
下面这张图描述的是一个公开数据集上各个特征之间互信息的强弱关系。
由于不同特征的互信息强弱不同,FFM使用相同的权重建模,这就会造成模型的偏差,FwFM就是为了解决这个问题,根据特征交互的重要性不同,赋予不同的特征交互不同的权重。具体实现如下:
Φ F w F M ( ( w , v ) , x ) = w 0 + ∑ i = 1 m x i w i + ∑ i = 1 m ∑ j = i + 1 m x i x j < v i , v j > r F ( i ) , F ( j ) (33) \Phi_{FwFM}((w, v), x) = w_0 + \sum_{i=1}^m x_i w_i + \sum_{i=1}^m \sum_{j=i+1}^m x_i x_j <v_i, v_j> r_{F(i), F(j)} \tag{33} ΦFwFM?((w,v),x)=w0?+i=1∑m?xi?wi?+i=1∑m?j=i+1∑m?xi?xj?<vi?,vj?>rF(i),F(j)?(33)
FLEN(Field-Leveraged Embedding Network)
FLEN: Leveraging Field for Scalable CTR Prediction
FLEN能够以一种时空高效的方法缓解广泛存在的梯度耦合问题,从而得以在生产环境中部署服务。
FLEN使用了一个filed-wise bi-interaction pooling技术。通过利用特征所属的场的信息,filed-wise bi-interaction pooling能够以更少的模型参数量和更短的计算时间消耗来同时捕获inter-filed和intra-filed之间的特征交互。
FLEN模型相当于是FwFM和DeepFM的结合,将FwFM替换DeepFM中的FM模块,网络结构如下:
下面详细介绍一下FwBI模块:
线性部分
这个部分比较好理解,一个简单的lr,直接对输入特征进行简单处理
MF部分
主要用来学习特征域之间的组合特征
h M F = ∑ i = 1 M ∑ j = i + 1 M e i ⊙ e j ? r [ i ] [ j ] (34) h_{MF} = \sum_{i=1}^M \sum_{j=i+1}^M {e_i \odot e_j * r[i][j]} \tag{34} hMF?=i=1∑M?j=i+1∑M?ei?⊙ej??r[i][j](34)
其中, M M M 为域的个数, e i e_i ei? 为每个域的embedding向量, r [ i ] [ j ] r[i][j] r[i][j]表示域之间的相关性强度的参数。
FM部分
与常规FM算法相同,用来学习域内的特征交互
h F M = ∑ m ( h f m ? h t m ) ? r [ m ] [ m ] (35) h_{FM} = \sum_m (hf_m - ht_m)*r[m][m] \tag{35} hFM?=m∑?(hfm??htm?)?r[m][m](35)
其中:
h f m = e m ⊙ e m = ( ∑ n ∣ F ( n ) = m f n ) ⊙ ( ∑ n ∣ F ( n ) = m f n ) (36) hf_m = e_m \odot e_m = (\sum_{n|F(n)=m}f_n) \odot (\sum_{n|F(n)=m} f_n) \tag{36} hfm?=em?⊙em?=(n∣F(n)=m∑?fn?)⊙(n∣F(n)=m∑?fn?)(36)
h t m = ∑ n ∣ F ( n ) = m f n ⊙ f n (37) ht_m = \sum_{n|F(n)=m}f_n \odot f_n \tag{37} htm?=n∣F(n)=m∑?fn?⊙fn?(37)
结合式(5)、(36)、(37),式(35)就比较好理解了,相当于在field粒度下的特征使用FM,不同field的FM对应不同的权重。
MF和FM组件的输出分别是包含了特征组之间和特征组内部特征交叉的 K e K_e Ke? 维的向量。
将两个向量求和与一阶项的结果进行拼接,经过一次非线性变换得到最终的输出
h F w B I = σ ( W F w B I T [ h S , h M F + h F M ] ) (38) h_{FwBI} = \sigma (W_{FwBI}^T[h_S, h_{MF} + h_{FM}]) \tag{38} hFwBI?=σ(WFwBIT?[hS?,hMF?+hFM?])(38)
得到的 h F w B I h_{FwBI} hFwBI? 的维度为 K e + 1 K_e+1 Ke?+1
FwBI组件之所以能缓解梯度耦合问题,是因为其将传统的所有特征直接进行交互组合的方式变为了分组交互的方式。
FLEN保证在业务指标上有正向提升的同时,又大幅降低了模型的参数量,工程意义很大。
Reference
https://www.biaodianfu.com/ctr-fm-ffm-deepfm.html
https://zhuanlan.zhihu.com/p/92293407
https://zhuanlan.zhihu.com/p/57162373
https://zhuanlan.zhihu.com/p/132708525
https://zhuanlan.zhihu.com/p/55234968