FM

FM即因子分解机,主要是针对logistic回归的改进,FM通过不同因子间的高阶组合构造了新的特征,增加了模型的非线性。

对于因子间的二阶组合,可以表示为:

y = w 1 x 1 + w 2 x 2 + . . . + w n x n + i , j w i , j x i , j y=w_{1}*x_{1}+w_{2}*x_{2}+...+w_{n}*x_{n}+\sum_{i,j}w_{i,j}*x_{i,j}

假设特征个数为n,特征间两两组合有 (nn - n)/2 种组合,那么理论上就要学习到 (nn - n)/2 个参数,当n比较大的时候,参数量会变得很大,比如当n=100时,参数个数为 (100*100 - 100)*2 = 4950。这样主要有两个问题,一个是参数量太多,一个是样本往往很稀疏,因为离散后的数据在大多数位置的取值都是0(比如手机类别变量,假设有5种类别,而每个用户一般只用一种手机,所以只会在一个位置取1其余4个位置都会取0)。 这样带来的问题就是参数往往无法学习。为了解决这样的问题,实质上参照SVD分解的思想即: A i , j = p i q j A_{i,j}=p_{i}*q_{j} 的方法,即将矩阵分解为两个低阶矩阵p,q,使得p,q的乘积近似等于原始矩阵。

即目标是找到一个nk维的矩阵g,满足[latex]g_{i}g_{j}=W_{i,j}[/latex],这样就由原来求 (nn - n)/2个参数变为了求nk个参数的问题了,一般k远小于n,这样求解的参数个数就大大减少了。并且这样做也解决了原来的数据稀疏的问题。

此时可以表示为:

ϕ ( x ) = w 0 + i = 1 n w i x i + i = 1 n 1 j = i + 1 n v i , v j x i x j \phi (x)=w_{0} + \sum_{i=1}^{n}w_{i}x_{i} + \sum_{i=1}^{n-1}\sum_{j=i+1}^{n} \left \langle v_{i},v_{j} \right \rangle x_{i}x_{j}

可以改写为:
在这里插入图片描述
因此
在这里插入图片描述

这样,计算复杂度就从O(kn2)降低到了O(kn)。

损失函数采用交叉熵损失函数,即:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果考虑到和不同的field中的feature交互时,latent vector参数的值不同,即一个特征对于每个field都维护一个latent vector。这样FM就变成了FFM,此时参数的个数变成了nkfield_num。