FFM算法原理&实现
👹

FFM算法原理&实现

text
FFM算法的Python代码实现
Tags
机器学习
推荐系统
Created
Jul 28, 2022 09:37 AM

原理

FM算法公式:
当中一个特征只对应一个隐向量V,与不同特征交互时都使用该向量表示;

FFM算法原理

作者引入field的概念,把相同性质的特征(经过one-hot编码的类别特征)归于同一个field,同一特征与属于不同域的特征作交互时,具有不同的隐向量表示。
FFM算法公式:
表示特征 与特征 交互时的隐向量表示,其中 表示第 个特征所属的field;

FM与FFM对比

FM:模型参数量为 ,n为特征数,k为隐向量维度。即复杂度为
FFM:模型参数量为 ,F为field数量,复杂度为
注:上述可以看出FFM训练复杂度远高于FM,因此FFM在特征数较多的场景下,难以上线;

优缺点

优点

  • 引入field域的概念,让某一特征与不同特征做交互时,可发挥不同的重要性,提升模型表达能力;
  • 可解释性强,可提供某些特征组合的重要性;

缺点

  • 复杂度高,不适用于特征数较多的场景;

代码实现

def call(self, inputs, **kwargs): dense_inputs = inputs[:, :13] sparse_inputs = inputs[:, 13:] # one_hot encoding x = tf.cast(dense_inputs, dtype=tf.float32) # cast:转换数据格式 for i in range(sparse_inputs.shape[1]): # tf.one_hot中depth表示one hot维度的深度 x = tf.concat([x, tf.one_hot(tf.cast(sparse_inputs[:, i], dtype=tf.int32), depth=self.sparse_feature_columns[i]['feat_onehot_dim'])], axis=1) linear_part = self.w0 + tf.matmul(x, self.w) inter_part = 0 # 每维特征先跟自己的[field_num, k]相乘得到Vij*X field_f = tf.tensordot(x, self.v, axes=1) # 域之间两两相乘 for i in range(self.field_num): for j in range(i + 1, self.field_num): # 按一定方式计算张量中元素之和 inter_part += tf.reduce_sum( tf.multiply(field_f[:, i], field_f[:, j]), axis=1, keepdims=True ) return linear_part + inter_part

参考