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} y=w1∗x1+w2∗x2+...+wn∗xn+i,j∑wi,j∗xi,j
假设特征个数为n,特征间两两组合有 ( n ∗ n − n ) / 2 (n*n - n)/2 (n∗n−n)/2 种组合,那么理论上就要学习到 ( n ∗ n − n ) / 2 (n*n - n)/2 (n∗n−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} Ai,j=pi∗qj的方法,即将矩阵分解为两个低阶矩阵p,q,使得p,q的乘积近似等于原始矩阵。
即目标是找到一个nk维的矩阵g,满足 g i ∗ g j = W i , j g_{i}*g_{j}=W_{i,j} gi∗gj=Wi,j,这样就由原来求 ( n ∗ n − n ) / 2 (n*n - n)/2 (n∗n−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} ϕ(x)=w0+i=1∑nwixi+i=1∑n−1j=i+1∑n⟨vi,vj⟩xixj
可以改写为:
因此
这样,计算复杂度就从O(kn2)降低到了O(kn)。
损失函数采用交叉熵损失函数,即:
如果考虑到和不同的field中的feature交互时,latent vector参数的值不同,即一个特征对于每个field都维护一个latent vector。这样FM就变成了FFM,此时参数的个数变成了nkfield_num。