Weiguo's Station

  • 博客首页

  • 文章归档

  • 分类专栏

  • 各种标签

  • 站点搜索

Factorization Machines笔记

发表于 2019-10-05 更新于 2021-03-22 分类于 推荐系统

FM预测公式:

其中,

二阶交叉部分可以通过数学转化,降低计算复杂度:

最终FM的预测公式为:

FM的训练复杂度,利用SGD(Stochastic Gradient Descent)训练模型。模型各个参数的梯度如下:

其中, $v_{j,f}$ 是隐向量 $v_j$ 的第 $f$ 个元素。 由于 $\sum_{j=1}^n v_{j,f} x_j$ 只与 $f$ 有关,而与 $i$ 无关,在每次迭代过程中,只需计算一次所有 $f$ 的 $\sum_{j=1}^n v_{j,f} x_j$, 就能够方便地得到所有 $v_{i,f}$ 的梯度。显然,计算所有 $f$ 的 $\sum_{j=1}^n v_{j,f} x_j$ 的复杂度是 $O(kn)$; 已知 $\sum_{j=1}^n v_{j,f} x_j$ 时,计算每个参数梯度的复杂度是 $O(1)$;得到梯度后,更新每个参数的复杂度是 $O(1)$; 模型参数一共有 $nk + n + 1$ 个。因此,FM参数训练的复杂度也是 $O(kn)$。综上可知,FM可以在线性时间训练和预测,是一种非常高效的模型。

MSE为:

FM_TensorFlow为:

其中p为特征维度,k为$v$的维度,label是one-hot形式的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
"""
y'(x) = w0 + sum( wi * xi ) + 0.5 * sum( (vi xi)**2 - vi**2 * xi**2 )
"""
with tf.variable_scope('linear_layer'):
# 单独的全局bias
w0 = tf.get_variable(name='w0',
shape=[self.num_classes],
initializer=tf.zeros_initializer())
# 线性乘积部分
self.w = tf.get_variable(name='w',
shape=[self.p, num_classes],
initializer=tf.truncated_normal_initializer(mean=0, stddev=0.01))
# [n, feature_num] * [feature_num, num_classes] -> [n, num_classes]
# [n, num_classes] + [feature_num] -> [n, num_classes]
self.linear_terms = tf.add(tf.matmul(self.X, self.w), w0)

with tf.variable_scope('interaction_layer'):
# 特征交叉部分
self.v = tf.get_variable(name='v',
shape=[self.p, self.k],
initializer=tf.truncated_normal_initializer(mean=0, stddev=0.01))
self.interaction_terms = tf.multiply(0.5,
tf.reduce_mean(tf.subtract(tf.pow(tf.matmul(self.X, self.v), 2),
tf.matmul(self.X, tf.pow(self.v, 2))),
1, keep_dims=True))
with tf.name_scope("predict_layer"):
self.y_out = tf.add(self.linear_terms, self.interaction_terms)
if self.num_classes == 2:
self.y_out_prob = tf.nn.sigmoid(self.y_out)
elif self.num_classes > 2:
self.y_out_prob = tf.nn.softmax(self.y_out)

论文及工程地址:

  1. Factorization Machines
  2. fm_tensorflow
  3. LLSean/data-mining
# 模型算法
Java修饰符总结
Field-aware Factorization Machines for CTR Prediction笔记
WeiguoZHAO

WeiguoZHAO

Welcome to my blog~
87 日志
13 分类
49 标签
GitHub E-Mail
大牛们
  • colah's blog
  • 王喆的Github
  • 刘建平的Github
  • 美团技术团队
© 2021 WeiguoZHAO
0%