FM模型相比普通的线性模型,多了二阶项,是一个二阶多项式模型。
从实际经验来看,线上有很多id类特征,categorical特征,这种特征是很稀疏的,对于求解w具有一定的困难。所以FM模型引入了辅助向量v
来表示上式中的w权重。
引入v向量后,我们可以推导出: FM推导公式
所以就可以愉快地优化了~~
代码实现
fm代码实现起来比较简单
def build_model(self):
self.x = tf.placeholder(tf.float32, shape=[None, self.input_dim])
self.y = tf.placeholder(tf.float32, shape=[None, 1])
self.w0 = tf.Variable(np.zeros(1), name="w0", dtype=tf.float32)
self.w = tf.Variable(np.zeros(self.input_dim), name="linear_weight", dtype=tf.float32)
self.v = tf.Variable(tf.random_normal(shape=[self.input_dim, self.v_dim], mean=0, stddev=0.01), name='pair_weight', dtype=tf.float32)
# 根据fm公式计算模型输出
linear_items = tf.add(self.w0, tf.reduce_sum(tf.multiply(self.w, self.x), axis=1, keep_dims=True))
x_square = tf.square(self.x)
v_square = tf.square(self.v)
pairwise_items = 0.5 * tf.reduce_sum(tf.square(tf.matmul(self.x, self.v)) - tf.matmul(x_square, v_square),
axis=1, keep_dims=True)
y_hat = tf.add(linear_items, pairwise_items)
with tf.name_scope("loss"):
self.loss = tf.reduce_mean(tf.square(self.y - y_hat))
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate)
self.train_step = optimizer.minimize(self.loss)
网友评论