Neural Factorization Machines for Sparse Predictive Analytics paper
解决痛点
NFM可以看做是主要针对FM和FNN的改进,他们缺点如下
- FM模型虽然学习到了交叉特征,但是对于交叉后的特征仍然是线性建模,学习不到非线性的关系
- FNN模型虽然在底层用的FM进行向量初始化,在上层使用DNN来学习到高阶非线性特征,但是单个特征embedding后通过拼接(concatenating),然后在后续的DNN结构中学习到交叉特征(deep& wide和deep cross也是如此),但是在实际应用中,这种方法对于交叉特征的学习不尽人意。
所以需要一个模型既能学习到高阶特征,又能学习到非线性关系,因此提出了NFM模型。
目标函数
NFM模型的目标函数如下所示:
y^NFM(x)=w0+i=1∑nwixi+f(x)
前两项分别为偏置项和线性部分,f(X)为NFM的核心部分
网络结构
NFM的结构如下图所示,其中省略了常数项和线性回归部分。

Input Layer
图中最底层的部分,可以看到应该是由sparse部分(图中进行了one-hot)个dense(图中的0.2)部分组成。
Embedding Layer
Vi表示第n个特征embedding后的向量,它是一个k维向量,vi∈Rk。
经过Embedding后就可以得到一个输入特征的embedding向量的集合Vx={x1v1,…,xnvn},该集合中并不是n个向量,因为有的xi=0.
注意这一步这是得到了对应特征的embedding向量的集合,并没有进行拼接或者求平均的操作。
Bi-Interaction Layer
上一步得到特征向量的集合后,在这一层用一种方式来学习到这些向量的交叉信息。
定义如下的运算,将一个集合中若干个向量转化为一个K维向量
fBI(Vx)=i=1∑nj=i+1∑nxivi⊙xjvj(1)
可以看到这里计算只对xi=0的特征进行交叉,注意上式表达的是向量计算,并没有精确到元素,其含义为:将n个向量两两配对,这些pair对其第i个位置的乘积的总和构成结果的第i个元素。
对(1)式(n2时间复杂度),进行优化,得到:
fBI(Vx)=21⎣⎡(i=1∑nxivi)2−i=1∑n(xivi)2⎦⎤(2)
这一步二阶交叉项等于0.5*(和的平方减去平方的和)原理为:
(a+b+c)2−(a2+b2+c2)=2ab+2ac+2bc
这样在线性的时间复杂度内就可以进行计算,如果考虑到fBI(Vx)的维度K,那么(2)的时间复杂度为KNx,Nx为非零特征的个数。
这里生成二阶交叉信息和传统FM的区别是,就目标函数来看,FM先对所有特征进行交叉,最终保留存在存在的pair对,但是NFM是先保留存在的特征,然后从中提取出交叉信息,相当于对Vx进行了一次池化操作,所以这层又叫 bi-interactio pooling层。该层没有引入额外的参数。
Hidden Layers
隐藏层没啥特别的,都是乘上权重加上偏置项然后过**函数:
z1=σ1(W1fBI(Vx)+b1)z2=σ2(W2z1+b2)⋯⋯zL=σL(WLzL−1+bL)
Prediction Layer
接着对于隐藏层的最后一层的输出,再乘个权重(每个元素对应的权重构成h)
f(x)=hTzL
那么整个NFM的输出为:
y^NFM(x)=w0+i=1∑nwixi+hTσL(WL(…σ1(W1fBI(Vx)+b1)…)+bL)
即由偏置项加上线性回归项再加上深度FM项,这三个部分都是K维的向量。
NFM的特例
当NFM的hidden layer为0层时,NFM的表达式如下:
y^NFM−0=w0+i=1∑nwixi+hTi=1∑nj=i+1∑nxivi⊙xjvj=w0+i=1∑nwixi+i=1∑nj=i+1∑nf=1∑khfvifvjf⋅xixj
当权重h为常数向量[1,1,....,1]时,NFM退化为FM