FM(Factor Machine, 因子分解机)算法是一种基于矩阵分解的机器学习算法,是为了解决大规模稀疏数据中的特征组合问题。
不同于传统的线性模型LR(Logistic Regression),其认为每个特征都是独立的。在FM中,考虑到特征之间的的交互作用,并对特征进行交叉组合。
FM的二阶多项式回归模型如下:
右式中的前两项就是简单的线性回归;第三项是交叉项,即特征两两组合,那么一共有n(n-1)/2个组合特征,从而建立起了特征和结果直接的非线性关系。
由于样本数据本来就很稀疏,即大部分xi和xj都为0,那么能够满足xi和xj都为0的样本就更少了。因此这样的话,导致对交叉项的参数wij估计的不充分,严重影响模型预测的效果以及模型的稳定性。那么,如何既能降低数据稀疏给模型性能带来的不良影响,同时又能有效地解决二阶交叉项参数的学习问题呢?这里使用的方法就是进行矩阵分解。
这里举一个用户给商品打分的例子,如左表打分矩阵所示。可以分解为一个用户矩阵和商品矩阵,这样的到的两个矩阵就不稀疏了。用户A对于商品W的喜好就可以直接通过用户A对应的行向量[1.2, 0.8]乘W对应的列向量[1.5, 1.7]’计算得到。
通过上述思想,我们就可以对交叉参数矩阵W进行矩阵分解,将交叉项参数W分解为:
其中n为特征的维数,k为隐向量的维数。经过了矩阵分解,那么每个交叉项系数wij就可以用隐向量的内积来表示,得到了如下公式:
这样需要学习的参数大大减少了,从n*n减少到了k*n,而k<>
从直观上看FM算法的复杂度为O(kn^2),但经过化简得到下式,可以将算法复杂度降到O(kn)。
同LR一样,FM也可以利用SGD来训练模型,其中模型中参数梯度计算的方法如下: