RGCF: Refined Graph Convolution Collaborative Filering withConcise and Expressive Embedding

本文介绍了RGCF图卷积网络在推荐系统中的简化版本,主要针对lightGCN进行了优化,去除了非线性和dropout,强调了信息融合方式的改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章和lightGCN是大同小异,可以移步至lightGCN看具体介绍,

图卷积网络在推荐系统中的应用lightGCN,配套pytorch的代码解释_只想做个咸鱼的博客-优快云博客_图卷积 推荐

下面只是粗略的讲解一下做了啥,以及代码中变了啥

一、论文

这个图看起来很高大上,其实原理很简单,都在文中表述了,我们来看原话

1、在我们的 RGCF 中删除了非线性网络层,因为它们对模型性能没有任何好处。

2、即使采用dropout技术也无法完全消除网络层参数过多导致的过拟合问题。 

3、这一项可以减弱非线性图卷积产生的信息冗余和噪声的负面影响,类似于上述的串联操作。事实上,这样的乘积项也是多余的,而交互函数是内积。

好了!!!这就是这篇论文干的事情了

二、代码

它的代码和lightGCN代码9成相似度

这里借用直接NGCF的代码(红线部分都是删除的,论文中证明他们都是没有较大作用的)

 于是:简化的RGCF就诞生了

    def _create_rgcf_embed(self):

        A_fold_hat = self._split_A_hat(self.norm_adj)

        ego_embeddings = tf.concat([self.weights['user_embedding'], self.weights['item_embedding']], axis=0)

        for k in range(0, self.n_layers):

            temp_embed = []

            for f in range(self.n_fold):

                temp_embed.append(tf.sparse_tensor_dense_matmul(A_fold_hat[f], ego_embeddings))

            side_embeddings = tf.concat(temp_embed, 0)

            ego_embeddings = side_embeddings

        u_g_embeddings, i_g_embeddings = tf.split(ego_embeddings, [self.n_users, self.n_items], 0)
        return u_g_embeddings, i_g_embeddings

是不是比上面的简单多了,这里它是将聚合后的信息作为下一阶的输入,所以最后的结果就是最后一阶的表示

但是lightGCN是将每阶的结果都保存,然后整合,作为最后的结果,具体如下所示

    def _create_lightgcn_embed(self):
        if self.node_dropout_flag:
            A_fold_hat = self._split_A_hat_node_dropout(self.norm_adj)
        else:
            A_fold_hat = self._split_A_hat(self.norm_adj)
        
        ego_embeddings = tf.concat([self.weights['user_embedding'], self.weights['item_embedding']], axis=0)
        all_embeddings = [ego_embeddings]
        
        for k in range(0, self.n_layers):

            temp_embed = []
            for f in range(self.n_fold):
                temp_embed.append(tf.sparse_tensor_dense_matmul(A_fold_hat[f], ego_embeddings))

            side_embeddings = tf.concat(temp_embed, 0)
            ego_embeddings = side_embeddings
            all_embeddings += [ego_embeddings]
        all_embeddings=tf.stack(all_embeddings,1)
        all_embeddings=tf.reduce_mean(all_embeddings,axis=1,keepdims=False)
        u_g_embeddings, i_g_embeddings = tf.split(all_embeddings, [self.n_users, self.n_items], 0)
        return u_g_embeddings, 

 lightGCN对比RGCF。多了一个all—embedding,用来存储每一阶的的信息,然后融合成最后的embedding,他们的区别就在这,所以两篇论文代码9成相似

这篇论文,毕!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值