因子分解机Factorization Machine的提出是对标SVM和矩阵分解,如SVD++、PITF、FPMC模型。
FM集成了SVM的优点,可以应用在任意的实值特征向量上。相比于SVM,FM可以通过分解参数对变量之间的交互建模,因此可以应用于数据稀疏的问题上,来对特征之间的交互进行估计,SVM在这类问题上没有很好的发挥。FM的计算时间可以优化到线性时间,因此FM可以直接优化。不同于对偶SVM,FM不用对原问题进行对偶求解,模型参数可以直接估计计算,不需要支持向量。
其他的分解方法,如矩阵分解、并行因子分析,或特定模型,如SVD++、PITF、FPMC。这些模型对于更general的问题不能很好的适用,而且对输入数据有特定的格式要求。而且,它们的求解和优化方法需要根据具体的问题来确定、推导。FM和它们相比,只是在输入数据上相似,但是更容音应用,而且不需要特定的先验知识。
FM
公式
对于二阶交叉特征来说,FM计算公式为:
vi表示V中由k个元素组成的第i行向量,k是一个决定特征向量维度的超参数;
w0表示全局的偏置;wi表示对应特征的权重参数;wij=<vi, vj>表示第i个、第j个特征的交叉值。FM不是直接用wij,而是用分解来对其进行建模,这正是FM可以用于高稀疏数据场景的关键。
优化
对于FM的交叉项来说,如果直接计算时间复杂度为O(knn);但是我们可以对这个计算过程进行进一步的优化,将时间复杂度简化为O(k*n)。
这个过程相当于完全平方公式,我们只要交叉项,所以<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="26.502ex" height="2.884ex" viewBox="0 -1024.6 11410.7 1241.8" role="img" focusable="false" style="vertical-align: -0.505ex;" class="in-text-selection"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(53.819) matrix(1 0 0 -1 0 0)">(</text><g transform="translate(3018,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(53.819) matrix(1 0 0 -1 0 0)">)</text></g></g></svg>,
在知道了FM的表达式之后,其中的参数可以借助于梯度下降方法进行求解。
应用
FM可以用于各种监督学习任务,比如
回归问题。FM的输出值作为预测;
二分类问题。FM的输出正负作为分类结果;
排序问题。根据FM的输出对x进行排序,使用pair-wise loss作为损失函数。
个人思考
FM的关键点在于使用分解向量来对交叉项系数进行建模;每个特征对应一个向量。使用这种方法建模,将xixj的关联关系打破,原来的建模wij系数的训练依赖于xixj样本,但对于非常稀疏的场景中,这样的数据是非常稀少的,就会导致wij学习不到,始终为0(初始化为0);使用分解建模后,将wij变为vi,vj;而所有与xi发生交叉的特征样本都可以用来训练vi,vi能很好地训练,vj类似;这样通过<vi, vj>就可以得到wij,提升了模型的泛化能力。
vi、vj本质上也属于一种embedding方式。
对于推荐系统、计算广告来说,场景数据非常稀疏;此外,交叉特征对于模型的预测非常有帮助。比如,“男性”+“大学生”,对于“LoL”广告感兴趣的可能性会很大,发生点击的概率比“女性”+“白领”要大。
自己如何产生合理的idea?