FM算法是一种能够降低特征工程复杂性的模型,它能够处理高维稀疏数据。特征被分为一阶以及二阶交互,一阶项是原始特征的线性组合,二阶项则是特征对之间的交互。FM算法通过将输入数据映射到一个稠密向量空间中来处理高维稀疏数据,然后在该向量空间上进行计算,从而解决了传统的LR以及SVM等模型在处理高维稀疏数据时遇到的困难。

1.1 FM模型的损失函数

假设我们有一个输入的样本x, 包含了n个特征,我们将其为x=x1,x2,,xn,以及对应的标签y0,1,其中每个特征一阶权重被表示为wi, 且每一个特征值有一个对应的稠密向量viRk。FM算法的目标是学习这组权重参数w=w0,w1,,wn,v1,,vn来最小化预测误差。其损失函数定义如下:

y^(x):=w0+inwixi+i=1nj=i+1nvivjxixj(1)

原始的计算代价为O(kn2). 如果我们希望将计算的代价降低到O(kn),可以利用类似ab=12[(a+b)2(a2+b2)]的思路来对上面的式子中的最后一项进行变换,得到下面的式子:

y^(x):=w0+inwixi+12f=1k[(i=1nvi,fxi)2i=1nvi,f2xi2](2)

其中k是每一个特征的dim的值(在AlphaFM的实现中,使用的是8),n是整个算法所使用的特征的总数(这个值通常比较大,有可能达到几百万或者上亿)

1.2 FM模型的推理(召回场景)

上面的公式很好地诠释了损失函数,但如果我们要把FM模型用在推荐系统的召回阶段,我们如何才能做到快速召回大量的Items? 我们需要把召回看做是一个用户向量Vuj物品向量Vik的匹配问题:为一个用户找到大量的推荐物品,本质是为Vuj找到最相似的一组Vik,其中k1,2,,Ni,其中Ni是物品的总数。

我们将公式(1)中各计算项按照所属关系,可以拆分为用户物品两大类别,这些项可以分为如下的三情况:

  • 用户特征及其内部的交叉特征
  • 物品特征以及内部的交叉特征
  • 用户物品之间的交叉特征

所以我们可以将这个匹配公式定义成如下的样子:

=Item+Item+User+User+User×item

由于User特征一阶权重以及User特征内部交叉对于对于所有要召回的item都是相等的, 因此直接去掉, 所以上面的公式可以写作:

=Item+Item+User×item=i=1Niwixi+i=1Nij=i+1Nivivjxixj+i=1Nuj=1Nivivjxixj=1,i=1Nuvixii=1Nixiwi+j=1Nik=j+1Nivjvkxjxk,j=1Nivjxj=defEuserEitem

其中,Nu,Ni分别表示属于User特征和属于Item特征的数量。

注意到在上面的式子中,我们已经在最后将匹配度写成了向量的内积形式。第一个向量Euser表示用户的向量;第二个向量Eitem是表示item的向量。

Euser=1,i=1NuvixiEitem=i=1Nixiwi+j=1Nik=j+1Nivjvkxjxk,j=1Nivjxj

其中, Eitem可以在模型训练完成后,计算并存储到向量数据库;而Euser则在用户发起推荐请求的时候,根据用户信息以及当前上下文动态计算得到。

所谓召回,实际上是计算

argmaxπΩj=1TopkEkUEπ(j)I

其中Ω是Item所有可能排序的集合,π是其中一种排序;π(j)表示在这个排序下的第j个位置对应的Item的序号; EkUEjI分别代表用户k以及物品j所对应的向量 (分别跟前面对应的Euser以及Eitem类似); Topk是需要召回的物品数量。