FM模型

作者: 西二旗小豌豆 | 来源:发表于2019-04-19 01:59 被阅读0次

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

    y=w_0+\sum_{i=1}^n w_ix_i + \sum_{i=1}^{n-1} \sum_{j=i+1}^{n}w_{ij}x_ix_j

    从实际经验来看,线上有很多id类特征,categorical特征,这种特征是很稀疏的,对于求解w具有一定的困难。所以FM模型引入了辅助向量v
    v_i = (v_{i1},v_{i2},v_{i3}......v_{ik}) 来表示上式中的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)
    

    相关文章

      网友评论

          本文标题:FM模型

          本文链接:https://www.haomeiwen.com/subject/ynpxgqtx.html