浅谈GCN

一:GCN与GNN的区别

GNN指的是图神经网络,而GCN指的是图卷积网络。在本人另一篇文章中详细讲解了GNN的应用背景和工作原理,在此不再赘述,今天主要讲解GCN。

有人一听到“卷积”就两眼冒金光,于是CNN中的卷积操作便涌上脑中,但在我看来此卷积非彼卷积,完全不是一码事,只是说GCN也可以做多层罢了。。。如下图:
在这里插入图片描述

话不多说,下面我将分步对GCN原理进行讲解。

二:GCN原理

※※先附上GCN的核心计算公式:
在这里插入图片描述
接下来,我将带领大家分步骤理解该公式。

Step1: 求图模型的邻接矩阵和度矩阵

对于传统的GNN,一个图网络需要节点特征矩阵和邻接矩阵的输入,这样才能进行节点的聚合操作。但是GCN中还需要引入一个度矩阵,这个矩阵用来表示一个节点和多少个节点相关联,对于后面的步骤有巨大的作用,如图所示:
在这里插入图片描述

Step2:进行特征计算

求得矩阵 A , D , X A,D,X A,D,X后,进行特征的计算,来聚合邻居节点的信息。GCN中的聚合方式和传统GNN中的方式有较大差异,这里分解为几个细节点:

① 邻接矩阵的改变

邻接矩阵 A A A 没有考虑自身的加权,所以GCN中的邻接矩阵实际上等于 A A A +单位对角矩阵 I I I
在这里插入图片描述

② 度矩阵的改变

首先对度矩阵的行和列进行了归一化(具体格式看下图),为什么这么做呢?行归一化系数代表着节点自身的一个变化程度,关联的节点越少,系数越大,越容易随波主流,更易受别人影响。而列归一化系数,代表关联节点对当前节点的影响程度,关系网越复杂的节点,它对其他节点的作用就越小,比如我认识一个亿万富翁,但富翁认识很多人,我们也就是一面之缘,那么能说因为我和他认识,我就是个百万富翁了嘛,显然有点草率了。通过行和列归一化系数,相互制衡,秒不可言

同时,归一化的系数还开了根号,就是因为考虑到归一化后的行和列系数都加权给了节点特征,均衡一点。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

③ Attention机制

在部分GCN中,还会引入注意力机制,根据关联节点的重要性来分配权重,最后乘到邻接矩阵上。传统计算权重的方法有两种,第一种方法,两节点特征向量直接相乘,关联节点都算完后,经过softmax算出权重值。还有第二种方法,就是将本节点和关联节点拼接成一个特征向量后,传入FC中,最后经过softmax算出权重值。如图所示:
在这里插入图片描述
在这里插入图片描述

Step3:训练参数 w w w 的加权

进行完聚合操作后,新的节点特征向量再乘上 w w w,往往会改变一下特征的维度,具体见下图:
在这里插入图片描述

Step 4:层数的迭代

接下来重复step1~3,每重复一次算一层,GCN正常只需要3–5层即可,这里就和CNN、RNN很不一样。因为节点每更新一次,感受野就变大一些,如果网络太深,那么每个节点就会受无关节点的影响,效果反而下降。

正如六度分割空间理论——“只需6个人,你就可以认识全世界”,见下图所示:
在这里插入图片描述

三:总结

可见,GCN中加入了许多不同于传统GNN的新元素,达到的效果也是很好的。github上也有相关的GCN工具包,安装好后便可直接使用,附上链接工具包地址


  至此我对GCN的基本概念和工作原理,进行了简单讲解,希望对大家有所帮助,有不懂的地方或者建议,欢迎大家在下方留言评论。

我是努力在CV泥潭中摸爬滚打的江南咸鱼,我们一起努力,不留遗憾!

GCN(Graph Convolutional Network)是一种用于图数据的深度学习模型,它可以对节点和边进行特征学习和预测。GCN在图神经网络领域具有重要的应用价值。 GCN的PyTorch实现可以使用PyTorch Geometric库来实现。PyTorch Geometric是一个专门用于处理图数据的PyTorch扩展库,提供了一系列用于构建和训练图神经网络的工具和函数。 在PyTorch Geometric中,可以使用torch_geometric.nn模块中的GCNConv类来定义GCN层。GCNConv类实现了GCN的前向传播过程,可以根据输入的节点特征和图结构进行特征学习和传播。 以下是一个简单的GCN模型的示例代码: ```python import torch import torch.nn as nn from torch_geometric.nn import GCNConv class GCN(nn.Module): def __init__(self, num_features, num_classes): super(GCN, self).__init__() self.conv1 = GCNConv(num_features, 16) self.conv2 = GCNConv(16, num_classes) def forward(self, x, edge_index): x = self.conv1(x, edge_index) x = torch.relu(x) x = self.conv2(x, edge_index) return x # 构建模型 model = GCN(num_features, num_classes) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 训练模型 for epoch in range(num_epochs): # 前向传播 output = model(x, edge_index) loss = criterion(output, y) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() ``` 在上述代码中,GCN类定义了一个简单的两层GCN模型,输入节点特征的维度为num_features,输出类别的数量为num_classes。模型的前向传播过程中使用了两个GCNConv层,并通过ReLU激活函数进行非线性变换。训练过程中使用交叉熵损失函数和Adam优化器进行模型的优化。 希望以上内容对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值