【GCN】论文笔记:Simplifying Graph Convolutional Networks

本文介绍简单图卷积(SGC),它是简化版的GCN。通过去除GCN连续层的非线性变换和折叠权重矩阵,减少计算复杂度。SGC对应固定低通滤波器和线性分类器,实验表明简化不影响准确性,速度比FastGCN快两个数量级,启示GCN表达力或源于图传播。

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


一、前言

1、SGC研究背景

GCNs的灵感主要来自于深度学习方法,因此可能会继承不必要的复杂性和冗余计算。在本文中,我们通过去除连续层的非线性变换折叠权重矩阵(反复去除GCN层之间的非线性变换并将结果函数分解为单一的线性变换)来减少这一超额复杂性。我们从理论上分析得到的线性模型,并表明它对应于一个固定低通滤波器,然后是一个线性分类器。值得注意的是,我们的实验评估表明,在许多下游应用中,这些简化不会对准确性产生负面影响。此外,产生的模型能够拓展到更大的数据集,且它的速度是惊人的,比FastGCN快两个数量级。我们将这个简化的线性模型称为简单图卷积(SGC)。

2、最终输入输出

  • 输入:带有一些标签节点的图
  • 输出:所有图节点的标签预测

(其实就是根据输入的已知的标签去预测图中未知的其余标签并尽量正确地分类)

3、符号定义

  • 图G = ( V , A ),A ∈ R n × n R^{n × n} Rn×n 是对称的邻接矩阵,V是图的节点集
  • D = diag ⁡ ( d 1 _1 1 , … , d n _n n ) )代表度矩阵,d i _i i = ∑ j ∑ _j j a i j a _{i j} aij
  • y i y_i yi ∈ { 0 , 1 } C ^C C 表示C维的节点one-hot标签

二、GCN

跟CNN和MLP一样,GCN 也是通过多层网络学习一个节点的特征向量 X i X_i Xi,然后作为线性分类器的输入。对于一个k 层的图卷积网络,我们把输入表示成 H k − 1 H^{k-1} Hk1,输出表示成 H k H^{k} Hk,那么初始输入特征表示为: H 0 H^0 H0 = = = X X X。一个k层的GCN相当于对图中每个节点的特征向量 x i x_i xi应用一个k层的MLP,只不过每个节点的隐藏表示是在每一层的开始与它的邻居取平均值。在每一个图卷积层,节点表示都是使用三个策略来更新:特征传播、线性转换和逐点非线性激活。

1、特征传播

特征传播是区分GCN和MLP的关键。在每一层的开始,将每个节点 v i v_i vi的特征 h i h_i hi用其局部邻域的特征向量进行平均:

在这里插入图片描述
更简洁地说,我们可以将整个图的更新表示为一个简单的矩阵操作。设S表示加入自环的“归一化”邻接矩阵:

在这里插入图片描述
其中, A ~ \tilde{A} A~= A A A+ I I I D ~ \tilde{D} D~ A ~ \tilde{A} A~的度矩阵
则所有节点的同时更新成为一个简单的稀疏矩阵乘法:
在这里插入图片描述
直观地说,这一步沿着图的边缘局部地平滑隐藏的表示,并最终鼓励在局部连接的节点之间进行类似的预测。
可以看出这一步的作用即为局部平滑

2、特征变换和非线性过渡

局部平滑后,GCN层与标准MLP相同。每一层都与一个学习过的权重矩阵 Θ ( k ) \Theta^{(k)} Θ(k)相关联,并对平滑过的隐藏特征表示进行线性变换。最后,在输出特征表示 H k H_k Hk之前,逐点应用ReLU等非线性激活函数。综上所述,第k层的表示更新规则为:
在这里插入图片描述
第k层的逐点非线性变换之后是第(k + 1)层的特征传播(由此得出每一层分别进行特征传播和非线性变换再进入到下一层)。

3、分类器

对于节点分类,类似于标准MLP, GCN的最后一层使用softmax分类器预测标签。
在这里插入图片描述

三、SGC

在传统的MLP中,更深的层增加了表达能力,因为它允许创建功能层次结构,例如,第二层的功能构建在第一层的功能之上。在GCNs中,各层还有第二个重要的功能:在每一层中,隐藏的表示在一跳之外的相邻层中取平均值。这意味着在k层之后,一个节点从图中k跳之外的所有节点获得特征信息。这种效果类似于卷积神经网络,深度增加内部特征的感受野。虽然卷积网络可以从深度的增加中获得很大的好处,但通常MLP在3或4层以上获得的好处很少。

1、线性化

假设:GCN层之间的非线性不是关键的,大部分的高效主要因为局部平均。
因此,我们删除了各层之间的非线性过渡函数,只保留最终的softmax(为了获得概率输出)。得到的模型是线性的,但仍然有k层GCN增加的“接受野”,

在这里插入图片描述
为了简化符号,我们可以把与标准化邻接矩阵S的重复乘法分解成一个单一的矩阵,取S的k次方, S k S^k Sk。进一步,我们可以把我们的权值重新参数化为一个单一的矩阵θ=θ(1)θ(2)… Θ K Θ^K ΘK。产生的分类器变成:
在这里插入图片描述
这就是SGC。

2、逻辑回归

由上一个公式可以看出,SGC由两部分组成:
(按顺序)

  • 一个固定的特征提取器(平滑器): X ˉ \bar{X} Xˉ= S K S^K SKX
  • 线性逻辑回归分类器: Y ~ \tilde{Y} Y~=softmax( X ˉ \bar{X} Xˉ Θ \Theta Θ)

由于 X ˉ \bar{X} Xˉ的计算不需要权重,所以本质上相当于一个特征预处理步骤,整个模型的训练简化为对预处理后的特征 X ˉ \bar{X} Xˉ进行直接的多类逻辑回归

3、谱域分析

我们现在从图卷积的角度来研究SGC。我们证明了SGC对应于图谱域上的一个固定滤波器。此外,我们还证明了在原始图上添加自循环,即重正化技巧,可以有效地缩小底层图谱。在这个缩放域上,SGC充当低通滤波器,在图上产生平滑的特征。因此,邻近的节点倾向于共享相似的表示和预测。

四、总结

  • 简化版的GCN,即SGC:移除连续层中的非线性变换,折叠权重矩阵减少计算复杂度,得到的线性模型等价于一个固定的低通滤波器。
  • 实验结果证明证明去掉激活函数也可以在图学习任务上取得好的表现
  • 带给我们的启示:GCNs的表达能力可能主要来自于重复的图传播(SGC保留了这一点),而不是非线性特征提取(SGC没有)。
### LightGCN 在推荐系统中的应用 LightGCN 是一种专门为推荐系统设计的轻量级图卷积网络 (Graph Convolutional Network, GCN),其核心目标是在保持高性能的同时减少计算复杂度和参数数量。以下是关于 LightGCN 的实现及其优化的关键点: #### 1. **模型结构** LightGCN 去除了传统 GCN 中常见的两个操作——特征转换和非线性激活函数[^1]。这种简化不仅减少了模型的复杂性和训练时间,还提高了推荐系统的性能。 - 特征转换被移除意味着不再需要学习额外的权重矩阵 \( W_1 \) 和 \( W_2 \)[^4]。 - 非线性激活函数也被省略,从而进一步降低了计算开销。 通过这些修改,LightGCN 能够专注于传播用户的嵌入表示,而无需引入复杂的变换或激活机制。 #### 2. **预测层的设计** 在传统的基于 GCN 的方法(如 NGCF)中,最终的用户和物品嵌入通常是多层嵌入的拼接 (concatenation) 结果。然而,LightGCN 将这一过程替换为加权求和的方式。具体来说,每一层的嵌入都被赋予不同的权重,并通过对这些嵌入进行加权平均来生成最终的表示。 公式如下所示: \[ e_u^{(K)} = \sum_{k=0}^{K} w_k e_u^{(k)} \] 其中 \( e_u^{(k)} \) 表示第 \( k \)-th 层的用户嵌入,\( w_k \) 则是对应的权重系数。 #### 3. **损失函数与正则化** 为了提高推荐质量并防止过拟合,LightGCN 使用了贝叶斯个性化排名 (Bayesian Personalized Ranking, BPR) 损失作为主要的目标函数。BPR 损失鼓励模型更倾向于用户已交互过的项目而非未交互的项目。 此外,L2 正则化项也用于约束模型参数,以提升泛化能力。 #### 4. **实验验证** 研究表明,尽管 LightGCN 的架构非常简单,但它仍然能够在多个公开数据集上取得优于其他复杂模型的结果。这表明,对于推荐任务而言,简单的消息传递机制可能已经足够有效。 --- ### Python 实现代码示例 以下是一个简化的 LightGCN 模型实现框架: ```python import torch import torch.nn as nn import torch.optim as optim class LightGCN(nn.Module): def __init__(self, num_users, num_items, embedding_dim, n_layers): super(LightGCN, self).__init__() self.num_users = num_users self.num_items = num_items self.embedding_dim = embedding_dim self.n_layers = n_layers # 初始化用户和项目的嵌入 self.user_embedding = nn.Embedding(num_users, embedding_dim) self.item_embedding = nn.Embedding(num_items, embedding_dim) def forward(self, adjacency_matrix): all_embeddings = torch.cat([self.user_embedding.weight, self.item_embedding.weight], dim=0) embeddings_list = [all_embeddings] for _ in range(self.n_layers): all_embeddings = torch.sparse.mm(adjacency_matrix, all_embeddings) embeddings_list.append(all_embeddings) final_embeddings = sum(embeddings_list) / (self.n_layers + 1) user_final_embeddings, item_final_embeddings = torch.split(final_embeddings, [self.num_users, self.num_items]) return user_final_embeddings, item_final_embeddings # 示例初始化 num_users = 1000 num_items = 500 embedding_dim = 64 n_layers = 3 model = LightGCN(num_users=num_users, num_items=num_items, embedding_dim=embedding_dim, n_layers=n_layers) optimizer = optim.Adam(model.parameters(), lr=0.001) ``` --- ### 性能对比分析 相比于其他先进的推荐算法(例如 KGAT 或者强化学习方法),LightGCN 主要具有以下几个优势[^2]: - 更少的超参数调整需求; - 显著降低的内存占用; - 可扩展性强,适合大规模稀疏场景下的高效推理。 不过需要注意的是,在某些特定领域(比如涉及知识图谱的任务),像 KGAT 这样的模型可能会提供更加丰富的语义信息支持。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值