FM算法原理&实现
⛸️

FM算法原理&实现

text
FM算法的Python代码实现
Tags
机器学习
推荐系统
Created
Jul 26, 2022 08:08 AM

原理

背景

  • 在逻辑回归中,利用单一特征而非交叉特征进行判断的情况下,有时不仅会造成信息损失的问题,甚至会得出错误结论。例如最常见的“辛普森悖论”,逻辑回归不具备进行特征交叉的能力,因此表达能力弱,可能在汇总实验时会出现“辛普森悖论”一样的错误结论。
  • POLY2模型:将所有特征进行两两组合,并赋予权重;存在两个较大的缺陷:1、互联网数据中经常采用one-hot编码,即特征向量会极度稀疏,特征交叉后会更加稀疏,导致有效训练数据不足;2、权重参数的数量从 上升到 ,极大的增加了训练复杂度;

FM模型——隐向量特征交叉

与POLY2模型相比,其主要区别是用两个向量的内积 取代单一的权重系数 。具体来说FM为每个特征学习一个隐向量权重,在特征交叉时,使用两个特征隐向量的内积作为交叉特征的权重:
FM通过引入隐向量的方式,将POLY2模型 级别的权重参数数量降低到 (k为隐向量维度),隐向量的引入使得FM更好的解决数据稀疏性的问题,虽然跌势了某些具体特征组合的精确记忆能力,但是泛化能力大大的提高了。

推导

FM的模型方程为:
其中 是第 维特征的隐向量, 代表向量点积。隐向量的长度为 ,包含 个描述特征的因子。二次项参数的数量减少为 个,远小于多项式模型的参数数量。另外,参数因子化使得 的参数和 的参数不再是相互独立的,存在共同项 ,即所有包含 的非零组合特征的样本都可以用来学习隐向量 ,这很大程度的避免了数据稀疏性造成的影响,而且隐向量可以表示之前没有出现过的交叉特征。
推导公式如下:
第一个等号:对称矩阵W对角线上半部分; 第二个等号:把向量内积 展开成累加和的形式; 第三个等号:提出公共部分; 第四个等号:i和j相当于一样,表示为平方过程;
notion image
采用随机梯度下降法SGD求解参数:
由上式可知, 的训练只需要样本的 特征非0即可,适合于稀疏数据;
在使用SGD训练模型时,在每次迭代中只需要计算一次所有 ,既可得所有梯度;

优缺点

优点:

  • 利用特征之间的信息来增加模型的拟合能力;
  • 适用于高度稀疏的数据场景下;
  • 具有线性的计算复杂度,且模型简单便于部署服务;

缺点:

  • 每个特征只引入了一个隐向量,不同类型特征之间交叉没有区分性。后续FFM模型针对这一方面进行优化;

代码实现

def call(self, inputs, *args, **kwargs): linear_part = tf.matmul(inputs, self.w1) + self.w0 inter_part1 = tf.pow(tf.matmul(inputs, self.v), 2) inter_part2 = tf.matmul(tf.pow(inputs, 2), tf.pow(self.v, 2)) inter_part = 0.5 * tf.reduce_sum(inter_part1 - inter_part2, axis=-1, keepdims=True) output = linear_part + inter_part return output

参考