论文阅读:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation

论文阅读:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation

 paper:https://arxiv.org/abs/2002.02126
 code:https://github.com/kuandeng/LightGCN

NGCF和LightGCN模型展示对比

何向南老师组的两大必读论文NGCF和LightGCN,分别发在SIGIR19’和SIGIR20’。

LightGCN模型的总体思路就是:
(1)先将用户和项目节点的邻域聚合
(2)使用三层卷积层分别生成每层的嵌入
(3)将节点的原始输入与生成每层新的嵌入做一个加权和
(4)将用户和项目最终的生成节点表示做内积生成预测的分数

论文阅读:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation_第1张图片

 

图NGCF     

论文阅读:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation_第2张图片

                                                                   图LightGCN

NGCF主要遵循标准GCN变形得到,包括使用非线性激活函数和特征变换矩阵w1和W2。然而作者认为实际上这两种操作对于CF并没什么大用,理由在于不管是user还是item,他们的输入都只是ID嵌入得到的,即根本没有具体的语义(一般在GCN的应用场景中每个节点会带有很多的其他属性),所以在这种情况下,执行多个非线性转换不会有助于学习更好的特性;更糟糕的是,它可能会增加训练的困难,降低推荐的结果。

所以将非线性激活函数non-linear和特征变换矩阵feature transformation都去掉,只增加一组权重系数来邻域聚集weighted aggregate不同gcn层输出的嵌入为最终的嵌入,大大简化了模型。即在LightGCN中,只采用简单的加权和聚合器,放弃了特征变换和非线性激活的使用,所以公式变为(只剩下):

论文阅读:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation_第3张图片

 

而且从上式可以看到它只聚合连接的邻居,连自连接都没有。最后的K层就直接组合在每个层上获得的嵌入,以形成用户(项)的最终表示:

论文阅读:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation_第4张图片

 

其中αk设置为1/(K+1)时效果最好。其余的部分就和NGCF一模一样。

为什么要组合所有层?

  1. GCN随着层数的增加会过平滑,直接用最后一层不合理

     2. 不同层的嵌入捕获不同的语义,而且更高层能捕获更高阶的信息,结合起来更加全面

     3. 将不同层的嵌入与加权和结合起来,可以捕获具有自连接的图卷积的效果,这是GCN中的一个重要技巧

LightGCN的缺陷:

论文阅读:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation_第5张图片

 

上式所示为LightGCN的每一层的计算方式,它直接聚合这些节点而不采用可学习权重和激活函数。其中u表示用户,i表示item,N(u)表示用户邻接的item集合,N(i)表示item邻接的user的集合,d表示节点的度。

论文阅读:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation_第6张图片

 

LightGCN是通过多层layer堆叠进行多层次的消息传递,从而进行节点之间的聚合,最后将两者的embedding求内积。但是这种堆叠的方式会影响基于GCN的推荐系统的训练效率和效果。以第L层为例,将上面lightgcn的定义中的item和user的embedding做内积可以计算得到下式,其中他u,v表示用户;i,k表示item。从下式可以发现做完内积后,模型在多个维度上进行了建模,包括用户-用户,用户-item,item-item。通过挖掘这些关系使得基于图的协同过滤方法能够起到好的效果。

  1. LightGCN对于给定的用户u,在更新node时item k和item i对应的权重不一样,即在聚合时的开方号不一致,这并不合理。
  2. LightGCN多层堆叠进行消息传递,但未捕捉到重要性,可能会引入噪声。
  3. 多层堆叠消息传递可以捕获高阶信息,但实际上LightGCN只能堆叠2,3层就过平滑了,高阶信息很难捕捉。这种多层堆叠的显式消息传递是否必要?

模型核心代码:

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))

                

            #归一化已经在A里面得到A_hat了,所以这里直接聚合就完了

            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, i_g_embeddings

总结:

LightGCN将传统的GCN中的特征转换和非线性激活去除,并且在CF上取得了很好的效果,同时,在聚合邻域时,LightGCN以层组合方式代替了传统GCN中的自连接。总之LightGCN易于训练,泛化能力强,效率高。

学习计划:

  1. 论文阅读:Ultra Simplification of Graph Convolutional Networks for Recommendation
  2. 对比总结一下GCN的三个模型NGCF、LightGCN、ULtraGCN。

你可能感兴趣的:(深度学习,人工智能,推荐系统,pytorch,神经网络)