FM模型

FM模型相比普通的线性模型,多了二阶项,是一个二阶多项式模型。

从实际经验来看,线上有很多id类特征,categorical特征,这种特征是很稀疏的,对于求解w具有一定的困难。所以FM模型引入了辅助向量v
来表示上式中的w权重。

FM模型_第1张图片

FM模型_第2张图片

引入v向量后,我们可以推导出:
FM模型_第3张图片
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)

你可能感兴趣的:(FM模型)