FM即因子分解机,主要是针对logistic回归的改进,FM通过不同因子间的高阶组合构造了新的特征,增加了模型的非线性。
对于因子间的二阶组合,可以表示为:
假设特征个数为n,特征间两两组合有 (nn - n)/2 种组合,那么理论上就要学习到 (nn - n)/2 个参数,当n比较大的时候,参数量会变得很大,比如当n=100时,参数个数为 (100*100 - 100)*2 = 4950。这样主要有两个问题,一个是参数量太多,一个是样本往往很稀疏,因为离散后的数据在大多数位置的取值都是0(比如手机类别变量,假设有5种类别,而每个用户一般只用一种手机,所以只会在一个位置取1其余4个位置都会取0)。 这样带来的问题就是参数往往无法学习。为了解决这样的问题,实质上参照SVD分解的思想即: 的方法,即将矩阵分解为两个低阶矩阵p,q,使得p,q的乘积近似等于原始矩阵。
即目标是找到一个nk维的矩阵g,满足[latex]g_{i}g_{j}=W_{i,j}[/latex],这样就由原来求 (nn - n)/2个参数变为了求nk个参数的问题了,一般k远小于n,这样求解的参数个数就大大减少了。并且这样做也解决了原来的数据稀疏的问题。
此时可以表示为:
可以改写为:
因此
这样,计算复杂度就从O(kn2)降低到了O(kn)。
损失函数采用交叉熵损失函数,即:
如果考虑到和不同的field中的feature交互时,latent vector参数的值不同,即一个特征对于每个field都维护一个latent vector。这样FM就变成了FFM,此时参数的个数变成了nkfield_num。