经典图推荐系统论文LightGCN算法及代码简介

这篇具有很好参考价值的文章主要介绍了经典图推荐系统论文LightGCN算法及代码简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation (SIGIR'20)

论文链接:https://dl.acm.org/doi/pdf/10.1145/3397271.3401063

论文背景/动机

图卷积网络(Graph Convolution Network,GCN)已经被广泛地应用于推荐系统。然而先前基于GCN进行协同过滤的工作(例如NGCF)缺少对GCN的消融研究。作者指出GCN最初被设计用于图上的节点分类任务,并且GCN的特征转换与非线性激活过程并不适用于协同过滤。基于此,作者在标准的GCN的基础上针对推荐任务进行了简化,提出了轻量级图卷积网络(LightGCN)。

方法

LightGCN是一个端到端的图推荐模型,其模型框架图如下图所示(该图中输入部分被忽略)。具体来说,与先前的工作类似,LightGCN可以分为三个部分,即嵌入层、轻量级嵌入传播层和预测层。

经典图推荐系统论文LightGCN算法及代码简介

嵌入层

嵌入层的主要作用是构造用户和物品的低维嵌入表示(embedding representation),这样的向量通常包含了用户和物品的信息,再没有先验知识输入的情况下通常以随机初始化的方式构造。给定用户u和物品i,其对应的嵌入表示分别为经典图推荐系统论文LightGCN算法及代码简介经典图推荐系统论文LightGCN算法及代码简介。这样的嵌入表示通常具有经典图推荐系统论文LightGCN算法及代码简介维,并且以端到端的方式进行优化。在一个名经典图推荐系统论文LightGCN算法及代码简介用户和经典图推荐系统论文LightGCN算法及代码简介个物品的推荐场景中,完整的嵌入表被定义为:

经典图推荐系统论文LightGCN算法及代码简介

轻量级嵌入传播层

GCN的基本思想是通过平滑节点的特征来学习节点的嵌入表现,这一过程通过迭代地执行图卷积操作来实现。每一次迭代过程中,中心节点聚合来自所有邻域节点的特征,以此更新中心节点的嵌入表示,即:

经典图推荐系统论文LightGCN算法及代码简介

其中每个嵌入表示的上标表示该嵌入是通过第几个嵌入传播层得到的。作者认为传统的GCN中的特征转换和非线性激活过程对于协同过滤而言是不必要的。为了验证这一点,作者进行了一系列的消融实验,作者提出了NGCF的三个变体,即分别移除了NGCF模型中的特征转换矩阵(命名为NGCF-n)、非线性激活函数(命名为NGCF-f)和将特征转换和非线性激活过程一起移除(命名为NGCF-fn),随后在两个推荐数据集Gowalla和Amazon-Book上进行了对比实验:

经典图推荐系统论文LightGCN算法及代码简介

从图中可以看出移除特征转换矩阵和非线性激活函数后,NGCF的性能和训练效率有个明显的提升。基于此,作者指出GCN最初应用于半监督的节点分类任务,该类任务中的节点具有丰富的语义特征信息,然而在协同过滤任务中,用户-物品交互二部图中的用户和物品节点只有id编码信息。在这种情况下,执行非线性转换不仅不能提供更好的训练效果,而且会严重阻碍推荐模型想训练。NGCF的次优表现源于训练的困难,而不是过拟合。

基于这一启发,作者提出了轻量级图卷积(Light Graph Convolution,LGC),其核心思想是只保留图卷积的信息传递与平均聚合过程,而摈弃冗余的特征转换、非线性激活过程,其定义如下:

经典图推荐系统论文LightGCN算法及代码简介

该公式中的对称归一化项来自于标准的GCN设计,其可以有效地避免嵌入表示的量级随着图卷积运算而变大。需要指出的是,LGC只包含邻居节点向中心节点的信息传递与聚合过程,而不包括节点的自连接,这与大多数图卷积网络的设计都不同。

预测层

通过堆叠多个轻量级嵌入传播层,可以分别得到多个用户和物品的嵌入表示。不同层的嵌入表示携带着不同的语义信息。作者选择带权聚合的方式构造最终的用户和物品嵌入表示:

经典图推荐系统论文LightGCN算法及代码简介

其中经典图推荐系统论文LightGCN算法及代码简介用于调解每一层嵌入表示对于最终嵌入表示的重要程度。为了减少模型参数,作者将其简单地设为经典图推荐系统论文LightGCN算法及代码简介,即所有层的权重均相同,从而减少了手动调参的次数。同时作者指出,经典图推荐系统论文LightGCN算法及代码简介可以设置专门的注意力机制进行学习。此外,将多层的嵌入表示进行聚合可以有效地缓解过平滑(over-smooth)现象。

在得到所有用户和物品的嵌入表示之后,作者采用内积构造用户对物品的预测分数:

经典图推荐系统论文LightGCN算法及代码简介

矩阵形式

为了更清晰地了解LightGCN的训练过程,作者给出了LightGCN的矩阵形式。具体来说,用户-物品的交互矩阵用R表示,则用户-物品交互二部图的邻接矩阵被定义为:

经典图推荐系统论文LightGCN算法及代码简介

则轻量级图卷积过程的矩阵形式可以被定义为:

经典图推荐系统论文LightGCN算法及代码简介

其中D是对角度矩阵,其计算邻接矩阵A中每一行非零元素的个数。交互矩阵R、邻接矩阵A和对角度矩阵D的关系如下图所示:

经典图推荐系统论文LightGCN算法及代码简介

考虑到图卷积的迭代特性,最终嵌入表示的构造过程可以展开:

经典图推荐系统论文LightGCN算法及代码简介

其中

经典图推荐系统论文LightGCN算法及代码简介

模型训练

与先前的工作保持一致,LightGCN采用贝叶斯个性化排序损失(Bayesian Personalized Ranking,BPR)优化模型:

经典图推荐系统论文LightGCN算法及代码简介

其中经典图推荐系统论文LightGCN算法及代码简介用于控制正则化强度。BPR是一种成对化损失,其假设正样本的预测分数应该大于负样本。LightGCN使用Adam优化器,并采用mini-batch的方式进行训练(即每个epoch中将所有训练数据划分为多个batch,随后依次在每个batch上进行训练和反向更新)。考虑到LightGCN的简易性,作者没有为其引用额外的dropout机制。

实验

为了验证所提出的LightGCN的有效性,作者在以下三个大规模数据集上进行对比实验:

经典图推荐系统论文LightGCN算法及代码简介

LightGCN主要与NGCF进行对比,从下表可以看出LightGCN的性能有了明显的提升,这也验证了作者的设想,即特征转换和非线性激活对于推荐任务是冗余的。

经典图推荐系统论文LightGCN算法及代码简介

另一个值得关注的实验是层结合(Layer Combination),在该实验中,作者设置了一个变体,LightGCN-single,该模型只将最后一个图卷积层的嵌入表示作为用户和物品的最终嵌入表示,实验结果如下图所示:

经典图推荐系统论文LightGCN算法及代码简介

一个有趣的现象是并非所有情况下LightGCN的性能都优于LightGCN-single,这一现象在Amazon-Book和Yelp2018数据集上尤为明显,这表明带权求和的层结合机制并不是最优方案。

代码实现

LightGCN的官方开源代码链接如下:

TensorFlow 1版本:https://github.com/kuandeng/LightGCN

Pytorch版本:https://github.com/gusye1234/pytorch-light-gcn

以Pytorch版本为例,简要介绍LightGCN的具体实现中的核心部分:

邻接矩阵构造

LightGCN的核心操作即轻量级图卷积(LGC)操作,该操作依赖输入图的邻接矩阵以及进一步计算得到的图拉普拉斯矩阵,相关代码如下:

adjacency_matrix = sp.dok_matrix((self.num_nodes, self.num_nodes), dtype=np.float32)
adjacency_matrix = adjacency_matrix.tolil()
R = self.user_item_net.todok()

adjacency_matrix[:self.num_users, self.num_users:] = R
adjacency_matrix[self.num_users:, :self.num_users] = R.T
'''
    [ 0  R]
    [R.T 0]
'''
adjacency_matrix = adjacency_matrix.todok()

row_sum = np.array(adjacency_matrix.sum(axis=1))
d_inv = np.power(row_sum, -0.5).flatten()
d_inv[np.isinf(d_inv)] = 0.
degree_matrix = sp.diags(d_inv)

# D^(-1/2) A D^(-1/2)
norm_adjacency = degree_matrix.dot(adjacency_matrix).dot(degree_matrix).tocsr()
sp.save_npz(self.path + '/pre_adj_mat.npz', norm_adjacency)

以上代码完整地描述了邻接矩阵以及对应的图拉普拉斯矩阵的计算过程。具体来说,self.num_nodes表示用户-物品交互图中的所有节点数(用户节点数+物品节点数),邻接矩阵A以字典形式的dok_matrix进行构造,随后将用户-物品交互矩阵置入邻接矩阵对应的位置(参见7~9行的注释)。

构造完成邻接矩阵后,随后开始计算对角度矩阵D(第13行)。根据GCN的公式,我们需要将矩阵D中的每个元素变成-0.5次方(第14行),随后需要对特殊情况进行处理,以防止将0值放置在分母造成无穷大(第15行),随后需要将矩阵D变为对角矩阵(第16行)。

得到邻接矩阵和对角度矩阵后,就可以通过GCN的公式计算图拉普拉斯矩阵(第19行)。考虑到图拉普拉斯矩阵在LGC运算中是不变值,故该矩阵可以以文件形式进行保存,在随后的应用读取即可,从而显著降低时间复杂度。计算得到的图拉普拉斯矩阵以csr_matrix矩阵的形式进行存储(第20行)。

(上述关于Python中Scipy稀疏矩阵库的介绍可以参见https://blog.csdn.net/jeffery0207/article/details/100064602)

在需要使用该图拉普拉斯矩阵时,只需读取该文件,并将其转换为torch的稀疏张量即可,相关代码如下:

self.Graph = sp.load_npz(self.path + '/pre_adj_mat.npz')  # sparse matrix
self.Graph = self.convert_sp_mat_to_sp_tensor(self.Graph)  # sparse tensor
self.Graph = self.Graph.coalesce().to(self.device)

def convert_sp_mat_to_sp_tensor(self, sp_mat):
    """
        coo.row: x in user-item graph
        coo.col: y in user-item graph
        coo.data: [value(x,y)]
    """
    coo = sp_mat.tocoo().astype(np.float32)
    row = torch.Tensor(coo.row).long()
    col = torch.Tensor(coo.col).long()
    index = torch.stack([row, col])
    value = torch.FloatTensor(coo.data)
    # from a sparse matrix to a sparse float tensor
    sp_tensor = torch.sparse.FloatTensor(index, value, torch.Size(coo.shape))
    return sp_tensor

在实际应用中,为了增快训练速度,需要将该稀疏张量放置对应显卡进行矩阵计算(第3行)。

轻量级图卷积LGC

轻量级图卷积(LGC)是LightGCN的核心部分,该过程主要通过稀疏矩阵乘法实现,相关代码如下:

def aggregate(self):
    # [user + item, emb_dim]
    all_embedding = torch.cat([self.user_embedding.weight, self.item_embedding.weight])
    
    # no dropout
    embeddings = [all_embedding]
              
    for layer in range(self.config.GCNLayer):
        all_embedding = torch.sparse.mm(self.Graph, all_embedding)
        embeddings.append(all_embedding)

    final_embeddings = torch.stack(embeddings, dim=1)
    final_embeddings = torch.mean(final_embeddings, dim=1)

    users_emb, items_emb = torch.split(final_embeddings, [self.dataset.num_users, self.dataset.num_items])

    return users_emb, items_emb

其中emb_dim表示嵌入维度。LGC的计算过程首先需要将用户嵌入和物品嵌入拼接为统一的嵌入矩阵(第3行),随后进行迭代地进行图卷积(第8-10行)。轻量级图卷积过程通过稀疏矩阵乘法实现(第9行),随后将更新的嵌入加入嵌入列表。执行完多层图卷积后,需要将多层嵌入取平均聚合(第12-13行),再将其划分为用户嵌入和物品嵌入(第15行)。

aggregate()方法为LightGCN的核心部分,模型训练阶段计算BPR损失和测试阶段计算预测分数前据需调用aggregate()更新用户和物品的嵌入表示。

总结

作者通过大量消融实验证明了GCN的特征转换与非线性激活过程对于协同过滤任务而言是不必要的,并在此基础上提出了LightGCN,其只保留了GCN的核心信息传递和聚合过程。此外,作者在文中指出设计推荐模型时,设计严格的消融研究来明确每个操作的影响是非常重要的。否则,包含不太有用的操作会不必要地使模型复杂化,增加训练难度,甚至是降低模型的有效性。

LightGCN由于其优秀的性能表现、良好的泛化性和易实现的特性,已经广泛地成为现在图推荐系统的底层设计之一,在后续的工作中得到了更为深入的研究。文章来源地址https://www.toymoban.com/news/detail-474142.html

到了这里,关于经典图推荐系统论文LightGCN算法及代码简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PSI算法经典论文算法概述

    隐私求交是多方安全计算中的密码学技术,它允许数据持有方通过比较加密集合计算得到交集,且任何一方都不会获得其他信息。PSI还存在一种变体,即CS场景。客户端可以获取其与服务器的交集但是服务器无法学习到该集合。如果在一个小的可以预测的域上通过密码哈希比

    2024年02月12日
    浏览(45)
  • 详解深度学习中推荐系统的经典模型

    摘要: DSSM 用字向量作为输入既可以减少切词的依赖,又可以提高模型的泛化能力,因为每个汉字所能表达的语义是可以复用的。 本文分享自华为云社区《深度学习应用篇-推荐系统[12]:经典模型-DeepFM模型、DSSM模型召回排序策略以及和其他模型对比》,作者:汀丶。 CTR预估

    2024年02月09日
    浏览(47)
  • 推荐系统简介

    学习下b站上尚硅谷的推荐系统的课程,顺便做一下笔记,加深一下印象,并且方便以后回来查看。 根据实时性分类: 离线推荐 实时推荐 根据是否个性化分类: 基于统计的推荐 个性化推荐 根据推荐原则分类: 基于相似度的推荐 基于知识的推荐 基于模型的推荐 根据数据源

    2024年02月08日
    浏览(31)
  • 3D Object Detection经典论文整理【分类/下载/代码/笔记】

    3D Object Detection经典论文整理 【分类/下载/代码/笔记】 W.P. Xiao, Visual group, SHUSV 版本 更新时间 更新内容 作者 1 V 1.0 2021.12 论文分类整理 W.P. Xiao 2 V 1.0.1 2022.1.7 更新code链接 Y.Q. Wu 目录   笔者分类整理了与三维目标检测有关的经典论文和部分最新论文的PDF下载链接、开源代码

    2023年04月27日
    浏览(42)
  • 机器视觉 多模态学习11篇经典论文代码以及解读

    此处整理了深度学习-机器视觉,最新的发展方向-多模态学习,中的11篇经典论文,整理了相关解读博客和对应的Github代码,看完此系列论文和博客,相信你能快速切入这个方向。每篇论文、博客或代码都有相关标签,一目了然,整理到这里了 webhub123 机器视觉 多模态学习

    2024年02月13日
    浏览(39)
  • CNN经典网络模型(二):AlexNet简介及代码实现(PyTorch超详细注释版)

    一、开发背景 二、网络结构 三、模型特点 四、代码实现 1. model.py 2. train.py 3. predict.py 4. spilit_data.py 五、参考内容 AlexNet由Hinton和他的学生Alex Krizhevsky设计,模型名字来源于论文第一作者的姓名Alex。该模型以很大的优势获得了2012年ISLVRC竞赛的冠军网络,分类准确率由传统的

    2024年04月12日
    浏览(38)
  • CNN经典网络模型(四):GoogLeNet简介及代码实现(PyTorch超详细注释版)

    一、开发背景 二、网络结构 三、模型特点 四、代码实现 1. model.py 2. train.py 3. predict.py 4. spilit_data.py 五、参考内容 GoogLeNet在2014年由Google团队提出, 斩获当年ImageNet(ILSVRC14)竞赛中Classification Task (分类任务) 第一名,VGG获得了第二名,为了向“LeNet”致敬,因此取名为“GoogLeNe

    2024年02月04日
    浏览(64)
  • CNN经典网络模型(一):LeNet简介及代码实现(PyTorch超详细注释版)

    一、开发背景 二、网络结构 三、模型特点 四、代码实现 1. model.py 2. train.py 3. predict.py 四、参考内容 Lenet 是一系列网络的合称,包括 Lenet1 - Lenet5,由 Yann LeCun 等人 在1990年《Handwritten Digit Recognition with a Back-Propagation Network》中提出,是卷积神经网络的开山之作,也是将深度学

    2024年02月08日
    浏览(41)
  • CNN经典网络模型(三):VGGNet简介及代码实现(PyTorch超详细注释版)

    一、开发背景 二、网络结构 三、模型特点 四、代码实现 1. model.py 2. train.py 3. predict.py 4. spilit_data.py 五、参考内容 VGGNet在2014年由牛津大学计算机视觉组VGG (Visual Geometry Group) 提出,斩获该年ImageNet竞赛中Localization Task (定位任务) 第一名和Classification Task(分类任务)第二名(第一

    2024年02月04日
    浏览(42)
  • 整理了197个经典SOTA模型,涵盖图像分类、目标检测、推荐系统等13个方向

    今天来帮大家回顾一下计算机视觉、自然语言处理等热门研究领域的197个经典SOTA模型,涵盖了图像分类、图像生成、文本分类、强化学习、目标检测、推荐系统、语音识别等13个细分方向。建议大家收藏了慢慢看,下一篇顶会的idea这就来了~ 由于整理的SOTA模型有点多,这里只

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包