NFM——引入pooling和NN的FM

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=1nwixi+f(x)\hat{y}_{N F M}(\mathbf{x})=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+f(\mathbf{x})
前两项分别为偏置项和线性部分,f(X)f(X)为NFM的核心部分

网络结构

NFM的结构如下图所示,其中省略了常数项和线性回归部分。
在这里插入图片描述

Input Layer

图中最底层的部分,可以看到应该是由sparse部分(图中进行了one-hot)个dense(图中的0.2)部分组成。

Embedding Layer

ViV_{i}表示第n个特征embedding后的向量,它是一个k维向量,viRk\mathbf{v}_{i} \in \mathbb{R}^{k}

经过Embedding后就可以得到一个输入特征的embedding向量的集合Vx={x1v1,,xnvn}V_{x} =\left\{x_{1} \mathbf{v}_{1}, \dots, x_{n} \mathbf{v}_{n}\right\},该集合中并不是n个向量,因为有的xi=0x_{i}=0.

注意这一步这是得到了对应特征的embedding向量的集合,并没有进行拼接或者求平均的操作。

Bi-Interaction Layer

上一步得到特征向量的集合后,在这一层用一种方式来学习到这些向量的交叉信息。
定义如下的运算,将一个集合中若干个向量转化为一个KK维向量
fBI(Vx)=i=1nj=i+1nxivixjvj(1)f_{B I}\left(\mathcal{V}_{x}\right)=\sum_{i=1}^{n} \sum_{j=i+1}^{n} x_{i} \mathbf{v}_{i} \odot x_{j} \mathbf{v}_{j} \qquad (1)
可以看到这里计算只对xi0x_{i} \neq 0的特征进行交叉,注意上式表达的是向量计算,并没有精确到元素,其含义为:将n个向量两两配对,这些pair对其第ii个位置的乘积的总和构成结果的第ii个元素。

对(1)式(n2n^2时间复杂度),进行优化,得到:
fBI(Vx)=12[(i=1nxivi)2i=1n(xivi)2](2)f_{B I}\left(\mathcal{V}_{x}\right)=\frac{1}{2}\left[\left(\sum_{i=1}^{n} x_{i} \mathbf{v}_{i}\right)^{2}-\sum_{i=1}^{n}\left(x_{i} \mathbf{v}_{i}\right)^{2}\right] \qquad(2)
这一步二阶交叉项等于0.5*(和的平方减去平方的和)原理为:
(a+b+c)2(a2+b2+c2)=2ab+2ac+2bc(a+b+c)^2 -(a^2 + b^2 + c^2) = 2ab + 2ac + 2bc

这样在线性的时间复杂度内就可以进行计算,如果考虑到fBI(Vx)f_{B I}\left(\mathcal{V}_{x}\right)的维度KK,那么(2)的时间复杂度为KNxKN_{x},NxN_{x}为非零特征的个数。

这里生成二阶交叉信息和传统FM的区别是,就目标函数来看,FM先对所有特征进行交叉,最终保留存在存在的pair对,但是NFM是先保留存在的特征,然后从中提取出交叉信息,相当于对Vx\mathcal{V}_{x}进行了一次池化操作,所以这层又叫 bi-interactio pooling层。该层没有引入额外的参数。

Hidden Layers

隐藏层没啥特别的,都是乘上权重加上偏置项然后过激活函数:
z1=σ1(W1fBI(Vx)+b1)z2=σ2(W2z1+b2)zL=σL(WLzL1+bL)\begin{array}{l} \mathbf{z}_{1}=\sigma_{1}\left(\mathbf{W}_{1} f_{B I}\left(\mathcal{V}_{x}\right)+\mathbf{b}_{1}\right) \\ \mathbf{z}_{2}=\sigma_{2}\left(\mathbf{W}_{2} \mathbf{z}_{1}+\mathbf{b}_{2}\right) \\ \cdots \cdots \\ \mathbf{z}_{L}=\sigma_{L}\left(\mathbf{W}_{L} \mathbf{z}_{L-1}+\mathbf{b}_{L}\right) \end{array}

Prediction Layer

接着对于隐藏层的最后一层的输出,再乘个权重(每个元素对应的权重构成hh
f(x)=hTzLf(\mathbf{x})=\mathbf{h}^{T} \mathbf{z}_{L}
那么整个NFM的输出为:
y^NFM(x)=w0+i=1nwixi+hTσL(WL(σ1(W1fBI(Vx)+b1))+bL)\begin{aligned} \hat{y}_{N F M}(\mathbf{x}) &=w_{0}+\sum_{i=1}^{n} w_{i} x_{i} \\ &+\mathbf{h}^{T} \sigma_{L}\left(\mathbf{W}_{L}\left(\ldots \sigma_{1}\left(\mathbf{W}_{1} f_{B I}\left(\mathcal{V}_{x}\right)+\mathbf{b}_{1}\right) \ldots\right)+\mathbf{b}_{L}\right) \end{aligned}
即由偏置项加上线性回归项再加上深度FM项,这三个部分都是KK维的向量。

NFM的特例

当NFM的hidden layer为0层时,NFM的表达式如下:
y^NFM0=w0+i=1nwixi+hTi=1nj=i+1nxivixjvj=w0+i=1nwixi+i=1nj=i+1nf=1khfvifvjfxixj\begin{aligned} \hat{y}_{N F M-0} &=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\mathbf{h}^{T} \sum_{i=1}^{n} \sum_{j=i+1}^{n} x_{i} \mathbf{v}_{i} \odot x_{j} \mathbf{v}_{j} \\ &=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n} \sum_{f=1}^{k} h_{f} v_{i f} v_{j f} \cdot x_{i} x_{j} \end{aligned}
当权重hh为常数向量[1,1,....,1][1,1,....,1]时,NFM退化为FM

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章