这篇文章和lightGCN是大同小异,可以移步至lightGCN看具体介绍,
图卷积网络在推荐系统中的应用lightGCN,配套pytorch的代码解释_只想做个咸鱼的博客-CSDN博客_图卷积 推荐
下面只是粗略的讲解一下做了啥,以及代码中变了啥
一、论文
这个图看起来很高大上,其实原理很简单,都在文中表述了,我们来看原话
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成相似
这篇论文,毕!!!!