图卷积网络(GCN)
消息传递框架、GCNConv、节点特征聚合和 PyTorch Geometric 设置。
图卷积网络(GCN) 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
从卷积神经网络到 GCN
卷积神经网络利用图像中的网格结构。图卷积网络(GCN)将卷积推广到不规则图,使每个节点都能利用邻居的信息更新自身表示。这种方法可以处理没有固定网格的数据。
消息传递
GCN 遵循消息传递框架:在每一层中,每个节点都会(1)从邻居收集消息,(2)聚合这些消息,(3)更新自己的嵌入表示。叠加多层后,信息就能在图中传播。
邻居聚合
核心操作是聚合邻居特征。一个简单的 GCN 层会对某个节点的邻居(以及节点自身)的特征向量取平均,然后应用学习得到的线性变换和非线性函数。
# For each node v:
# h_v = activation( W * mean(features of v and its neighbors) )为何要对邻接矩阵进行归一化
如果直接对邻居求和,高度节点就会占据主导地位。GCN 使用归一化邻接矩阵来缩放各项贡献,使不同度数节点的嵌入表示保持稳定的幅度。
归一化公式
对称归一化会先添加自环,然后根据节点的度进行缩放,写作 D^(-1/2) (A + I) D^(-1/2)。加入单位矩阵 I 后,节点在聚合过程中就能保留自身特征。
# A_hat = A + I (add self-loops)
# D_hat = degree matrix of A_hat
# A_norm = D_hat^(-1/2) * A_hat * D_hat^(-1/2)PyTorch Geometric
PyTorch Geometric(PyG)是 PyTorch 中用于 GNN 的标准库。它提供了 GCNConv 等现成层,为您实现归一化的消息传递卷积。
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv单个 GCNConv 层
GCNConv(in_channels, out_channels)创建一个图卷积层。它接收节点特征矩阵 x 和 edge_index(COO 格式的图连接关系),并返回更新后的节点嵌入表示。
conv = GCNConv(in_channels=16, out_channels=32)
# x: [num_nodes, 16], edge_index: [2, num_edges]
h = conv(x, edge_index) # -> [num_nodes, 32]两层 GCN
典型的 GCN 会叠加两层:第一层投影特征并聚合一跳邻居的信息,第二层再聚合二跳邻居的信息,从而使每个节点拥有二跳感受野。
class GCN(torch.nn.Module):
def __init__(self, in_dim, hid, out):
super().__init__()
self.conv1 = GCNConv(in_dim, hid)
self.conv2 = GCNConv(hid, out)
def forward(self, x, edge_index):
x = F.relu(self.conv1(x, edge_index))
x = F.dropout(x, training=self.training)
return self.conv2(x, edge_index)感受野随深度扩大
每个 GCN 层都会使节点的感受野扩大一跳。两层可以看到二跳邻域,三层可以看到三跳邻域,以此类推。增加深度可以让远处的信息到达某个节点。
过平滑
但是,叠加过多层会导致过平滑:反复对邻居求平均会使所有节点嵌入表示收敛到几乎相同的向量,从而破坏分类所需的差异。这就是大多数 GCN 只使用 2 层或 3 层的原因。
缓解过平滑
应对过平滑的技术包括残差/跳跃连接、结合各层输出的跳跃知识网络,以及简单地保持网络较浅。在标准基准数据集上,浅层 GCN 往往优于深层 GCN。
快速检查
测试您的 GCN 知识。
回顾
您学习了图卷积网络:
- GCN 遵循消息传递框架:聚合邻居特征,然后进行更新
- 带有自环的归一化邻接矩阵可以保持嵌入表示稳定
- PyTorch Geometric 中的
GCNConv实现了一个卷积层 - 常见架构是两层 GCN
- 深度过大会导致过平滑
常见问题解答
「图卷积网络(GCN)」课时是免费的吗?
是的 — 「图卷积网络(GCN)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「图卷积网络(GCN)」这节课中我会学到什么?
消息传递框架、GCNConv、节点特征聚合和 PyTorch Geometric 设置。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「图卷积网络(GCN)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 机器学习的图论基础
- 图卷积网络(GCN)
- 使用 GNN 进行节点分类
- 链接预测与图分类