deepfm相比wide&deep模型有了几点改进,一是在宽部分新增加了fm项,即特征的二次交互;一是在deep模型中用采用fm方法嵌入得到的特征作为输入代替原始输入;再就是fm模型参数是直接放在模型中一起训练的,没有单独预训练的过程。
从图2和图四中可以看出,传统的FM方法是直接做特征交叉,忽视field,直接找到vi和vj使得vi和vj的乘积作为交叉特征的权重系数。而这篇文章中,是FM和DNN公用embedding作为输入特征。embedding是分field连接得到的。即假设特征i对应的潜因子向量为vi(k维),则对于每个field学习到一个embedding vector,这个embedding vector的维度是k,且满足
e
b
d
V
e
c
[
a
]
[
i
]
=
∑
j
=
1
d
v
j
,
i
x
j
ebdVec[a][i]=\sum_{j=1}^{d}v_{j,i}x_{j}
ebdVec[a][i]=j=1∑dvj,ixj(即第a个嵌入向量的第一维)对于特征的二阶组合,直接用dot(ebdVec[a],ebdVec[b])得到。
采用这种方式得到的因子的二阶组合和采用传统的方式得到的是一致的。原因在于,对于每个field往往field中的feature取值是互斥的,即对于某一个样本,同一个field中的所有feature中只有某一个feature能取1其余的feature取值均为0。这样第一步得到embdding feature的时候看似是对原始的feature做了全连接,每个feature都贡献了权重,实质上并不是这样。因为诸多变量中只有1个变量能取到1,其余都是0,因此同时只有一个变量会产生影响。即 e b d V e c [ 1 ] [ 1 ] = ∑ j = 1 d v j , 1 x j = v 1 , 1 x 1 ebdVec[1][1]=\sum_{j=1}^{d}v_{j,1}x_{j}=v_{1,1}x_{1} ebdVec[1][1]=j=1∑dvj,1xj=v1,1x1(假设对于field1只有x1取1其余feature取值为0,则 e b d V e c [ 1 ] = [ v 1 , 1 x 1 , v 1 , 2 x 1 , v 1 , 3 x 1 , e b d V e c [ 2 ] = [ v 8 , 1 x 8 , v 8 , 2 x 8 , v 8 , 3 x 8 ] ebdVec[1]=[v_{1,1}x_{1},v_{1,2}x_{1},v_{1,3}x_{1},ebdVec[2]=[v_{8,1}x_{8},v_{8,2}x_{8},v_{8,3}x_{8}] ebdVec[1]=[v1,1x1,v1,2x1,v1,3x1,ebdVec[2]=[v8,1x8,v8,2x8,v8,3x8](假设第一个field有7个feature且第一个feature取值为1,其余取值为0)。则 d o t ( e b d V e c [ 1 ] , e b d V e c [ 2 ] ) = x 1 x 8 ( v 1 , 1 v 8 , 1 + v 1 , 2 v 8 , 2 + v 1 , 3 v 8 , 3 ) = ⟨ v 1 , v 8 ⟩ x 1 x 8 dot(ebdVec[1],ebdVec[2])=x_{1}x_{8}(v_{1,1}v_{8,1}+v_{1,2}v_{8,2}+v_{1,3}v_{8,3})=\left \langle v_{1},v_{8} \right \rangle x_{1}x_{8} dot(ebdVec[1],ebdVec[2])=x1x8(v1,1v8,1+v1,2v8,2+v1,3v8,3)=⟨v1,v8⟩x1x8
也就是说先求嵌入向量,再由嵌入向量点积得到特征二阶组合的方法和传统的直接由特征交叉的方法是等价的,但是这种方法不仅能得到特征二阶交叉后的值,并且同时学习到了嵌入向量,这个dense feature可以直接作为dnn的输入,这样也避免了wide&deep中特征处理的问题。