因子分解机(Factorization Machines, FM)是一个在2010年被提出的算法,是预估CTR的经典模型之一。在这篇文章里,前半部分会介绍FM的原理,后半部分会通过tensorflow来实现FM算法。由于个人水平十分有限,文章中对算法理解不当的地方,烦请大家指出,不胜感激!
1 FM简介
1.1 提出的动机
我们知道逻辑回归方法是对所有特征的一个线性加权组合,其预测值可以写为如下形式:
但这样的形式只是单独考虑了每个特征对目标值 的影响,而没有考虑特征之间的关系,比如二阶组合特征 或者三阶组合特征
对目标值的影响。现在我们只考虑二阶特征组合的情况,那么逻辑回归表达式可以改写为:
写成公式2的形式确实是考虑了二阶特征组合对模型预测的影响,但同时会带来一个新的问题。因为在CTR预估问题里面,或者很多分类、回归问题里面,我们常常需要对类别型特征进行one-hot编码(比如男性、女性分别被编码为01,10),当类别型特征变量较多的情况下,编码后其实是会产生了高维特征,这导致我们很难找到一组 和 使得
不为0。而对于大多数
乘积为0的项,对应的
在梯度更新时
,也就无法进行梯度更新来求解
。
而因子分解机的工作就是将 替换为两个向量的乘积 ,进而缓解了稀疏特征对模型求解的困难。
1.2 具体内容
仅考虑二阶特征组合的话,FM模型表达式可以写为:
其中 vi和vj 是 维向量
和
的点积,也是对应一个实数值:
由矩阵分解可知,对任意一个正定矩阵 ,都可以找到一个矩阵
,且在矩阵
维度
足够大的情况下使得
成立。FM这样写法的精妙之处在于,首先通过矩阵分解用两个向量
和
的乘积近似原先矩阵
,这保持了变化前后的统一。其次,在拆解为
和
之后,参数更新时是对这两个向量分别更新的,那么在更新时,对于向量
,我们不需要寻找到一组
和
同时不为0,我们只需要在
的情况下,找到任意一个样本
即可通过
来更新
,也就是说,原先更新参数
的条件对于稀疏数据比较苛刻,FM这样的写法缓解了稀疏数据造成无法更新参数的困难。
其实我觉得FM算法的核心思想写到这里就介绍完了,因子分解机中的“因子分解”部分就是替换原先的 。而在FM论文里,作者更进一步,将公式3改写,降低FM算法的时间复杂度。对于公式3,我们知道二阶项有两次循环,而 又是经过
次计算,因此其时间复杂度为
,但通过如下的转换过程,可以将时间复杂度降低为
:
需要解释一下的是公式5的第1步,原始求解的就是矩阵上三角之和,那么第1步就是整个矩阵之和减去矩阵的迹,然后求一半。对于稀疏数据中 大多数都为0,假设
代表的是对于所有数据
特征不为0个数的平均值,那么FM算法复杂度实际上为
。
那么二阶FM表达式可以写为:
接下来我们根据公式6计算一下FM算法更新时的梯度。
第一种情况,当参数为 时,很简单:
第二种情况,当参数为 时,显然更新
只跟和它相关的
有关:
第三种情况,当参数为 时,因为我们所求的是模型对具体的某一个
和具体的某一个
对应的向量
产生的梯度,那么对于公式6中,第二项大括号外面的
其实是失效的,第二项大括号里面的第二小项
也是失效的,即:
总结来说,FM模型对参数的梯度为:
参考链接: