开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2024.03.09广东
学习有关图神经网络的所有知识,包括GNN是什么,不同类型的图神经网络,以及它们的用途。此外,了解如何使用PyTorch构建图神经网络。目录什么是图?使用NetworkX创建图为什么分析图很难?什么是图神经网络(GNN)?什么是图卷积网络(GCN)?图神经网络如何工作?使用PyTorch构建图神经网络GNN
1.什么是图?
图是一种包含节点和边的数据结构。一个节点可以是一个人、地方或物体,边定义了节点之间的关系。边可以是有向的,也可以是无向的,基于方向性依赖关系。
在下面的示例中,蓝色圆圈是节点,箭头是边。边的方向定义了两个节点之间的依赖关系。
让我们了解一下复杂的图数据集:爵士音乐家网络。它包含198个节点和2742条边。
在下面的社区图中,不同颜色的节点代表爵士音乐家的各种社区,边连接着它们。存在一种协作网络,其中单个音乐家在社区内外都有关系。
爵士音乐家网络的社区图
图在处理具有关系和相互作用的复杂问题方面非常出色。它们在模式识别、社交网络分析、推荐系统和语义分析中得到应用。创建基于图的解决方案是一个全新的领域,为复杂且相互关联的数据集提供了丰富的见解。
2.使用NetworkX创建图
在本节中,我们将学习使用NetworkX创建图。
下面的代码受到DanielHolmberg在Python中的图神经网络博客的影响。
创建networkx的DiGraph对象“H”
添加包含不同标签、颜色和大小的节点
添加边以创建两个节点之间的关系。例如,“(0,1)”表示0对1有方向性依赖。我们将通过添加“(1,0)”来创建双向关系
以列表形式提取颜色和大小
使用networkx的draw函数绘制图
importnetworkxasnx
H=nx.DiGraph()
#addingnodes
H.add_nodes_from([
])
#addingedges
H.add_edges_from([
(0,1),
(1,2),
(1,0),
(1,3),
(2,3),
(3,0)
colors=list(node_colors)
sizes=list(node_sizes)
#PlottingGraph
nx.draw(H,with_labels=True,node_color=colors,node_size=sizes)
在下一步中,我们将使用to_undirected()函数将数据结构从有向图转换为无向图。#转换为无向图
G=H.to_undirected()
nx.draw(G,with_labels=True,node_color=colors,node_size=sizes)
3.为什么分析图很难?
基于图的数据结构存在一些缺点,数据科学家在开发基于图的解决方案之前必须了解这些缺点。
图存在于非欧几里得空间中。它不在2D或3D空间中存在,这使得解释数据变得更加困难。为了在2D空间中可视化结构,您必须使用各种降维工具。
图是动态的;它们没有固定的形式。可以存在两个在视觉上不同的图,但它们可能具有相似的邻接矩阵表示。这使得使用传统的统计工具来分析数据变得困难。
对于人类解读来说,图的规模和维度会增加图的复杂性。具有多个节点和数千条边的密集结构更难理解和提取洞察。
4.什么是图神经网络(GNN)?
图神经网络是一种特殊类型的神经网络,能够处理图数据结构。它们受到卷积神经网络(CNNs)和图嵌入的很大影响。GNNs用于预测节点、边和基于图的任务。
CNNs用于图像分类。类似地,GNNs应用于图结构(像素网格)以预测一个类。
循环神经网络用于文本分类。类似地,GNNs应用于图结构,其中每个单词是句子中的一个节点。
GNNs是在卷积神经网络由于图的任意大小和复杂结构而无法取得最佳结果时引入的。
输入图经过一系列神经网络。输入图结构被转换成图嵌入,允许我们保留关于节点、边和全局上下文的信息。
然后,节点A和C的特征向量通过神经网络层。它聚合这些特征并将它们传递到下一层。
4.1图神经网络的类型
有几种类型的神经网络,它们大多数都有一些卷积神经网络的变体。在本节中,我们将学习最流行的GNNs。
图卷积网络(GCNs,GraphConvolutionalNetworks)类似于传统的CNNs。它通过检查相邻节点来学习特征。GNNs聚合节点向量,将结果传递给稠密层,并使用激活函数应用非线性。简而言之,它包括图卷积、线性层和非学习激活函数。有两种主要类型的GCNs:空间卷积网络和频谱卷积网络。
图自编码器网络(GraphAuto-EncoderNetworks)使用编码器学习图表示,并尝试使用解码器重建输入图。编码器和解码器通过瓶颈层连接。它们通常用于链路预测,因为自编码器擅长处理类平衡问题。
循环图神经网络(RGNNs,RecurrentGraphNeuralNetworks)学习最佳扩散模式,它们可以处理单个节点具有多个关系的多关系图。这种类型的图神经网络使用正则化器来增强平滑性并消除过度参数化。RGNNs使用更少的计算能力产生更好的结果。它们用于生成文本、机器翻译、语音识别、生成图像描述、视频标记和文本摘要。
4.2图神经网络任务类型
下面,我们列举了一些图神经网络任务类型,并提供了示例:
图分类(GraphClassification:):用于将图分类为不同的类别。其应用包括社交网络分析和文本分类。
节点分类(NodeClassification:):这个任务使用相邻节点的标签来预测图中缺失的节点标签。
链路预测(LinkPrediction):预测图中具有不完整邻接矩阵的一对节点之间的链接。这通常用于社交网络。
社区检测(CommunityDetection):基于边的结构将节点划分为不同的群集。它类似地从边的权重、距离和图对象中学习。
图生成(GraphGeneration:):从样本图分布中学习,以生成一个新的但相似的图结构。
4.3图神经网络的缺点
使用GNNs存在一些缺点。了解这些缺点将帮助我们确定何时使用GNN以及如何优化我们的机器学习模型的性能。
大多数神经网络可以深度学习以获得更好的性能,而GNNs大多是浅层网络,主要有三层。这限制了我们在大型数据集上获得最先进性能的能力。
图结构不断变化,这使得在其上训练模型变得更加困难。
将模型部署到生产环境面临可扩展性问题,因为这些网络在计算上很昂贵。如果您有一个庞大且复杂的图结构,将难以在生产环境中扩展GNNs。
5.什么是图卷积网络(GCN)?
大多数GNNs都是图卷积网络,了解它们在进入节点分类教程之前很重要。
GCN中的卷积与卷积神经网络中的卷积相同。它将神经元与权重(滤波器)相乘,以从数据特征中学习。
它在整个图像上充当滑动窗口,以从相邻单元中学习特征。该滤波器使用权重共享在图像识别系统中学习各种面部特征。
现在将相同的功能转移到图卷积网络中,其中模型从相邻节点中学习特征。GCN和CNN之间的主要区别在于,GCN被设计为在非欧几里得数据结构上工作,其中节点和边的顺序可能变化。
有两种类型的GCNs:
空间图卷积网络(SpatialGraphConvolutionalNetworks)使用空间特征从位于空间空间的图中学习。
频谱图卷积网络(SpectralGraphConvolutionalNetworks)使用图拉普拉斯矩阵的特征值分解进行节点间的信息传播。这些网络灵感来自信号与系统中的波动传播。
6.图神经网络如何工作?使用PyTorch构建图神经网络
我们将构建和训练用于节点分类模型的谱图卷积。代码源可在文末获取,让您体验并运行您的第一个基于图的机器学习模型。
6.1准备
我们将安装Pytorch软件包,因为pytorch_geometric是在其基础上构建的。
!pipinstall-qtorch
然后,我们将使用torch版本安装torch-scatter和torch-sparse。之后,我们将从GitHub安装pytorch_geometric的最新版本。%%capture
importos
importtorch
6.2PlanetoidCora数据集
Planetoid是来自Cora、CiteSeer和PubMed的引文网络数据集。节点是具有1433维词袋特征向量的文档,边是研究论文之间的引文链接。有7个类别,我们将训练模型以预测缺失的标签。
我们将导入PlanetoidCora数据集,并对词袋输入特征进行行标准化。之后,我们将分析数据集和第一个图对象。
fromtorch_geometric.datasetsimportPlanetoid
fromtorch_geometric.transformsimportNormalizeFeatures
data=dataset[0]#Getthefirstgraphobject.
print(data)
Cora数据集有2708个节点、10,556条边、1433个特征和7个类别。第一个对象有2708个训练、验证和测试掩码。我们将使用这些掩码来训练和评估模型。Dataset:Cora():
======================
Numberofgraphs:1
Numberoffeatures:1433
Numberofclasses:7
Data(x=[2708,1433],edge_index=[2,10556],y=[2708],train_mask=[2708],val_mask=[2708],test_mask=[2708])
6.3使用GNN进行节点分类
我们将创建一个包含两个GCNConv层、relu激活和0.5的丢弃率的GCN模型结构。该模型包含16个隐藏通道。
GCN层:
fromtorch_geometric.nnimportGCNConv
importtorch.nn.functionalasF
classGCN(torch.nn.Module):
def__init__(self,hidden_channels):
super().__init__()
torch.manual_seed(1234567)
self.conv1=GCNConv(dataset.num_features,hidden_channels)
self.conv2=GCNConv(hidden_channels,dataset.num_classes)
defforward(self,x,edge_index):
x=self.conv1(x,edge_index)
x=x.relu()
x=F.dropout(x,p=0.5,training=self.training)
x=self.conv2(x,edge_index)
returnx
model=GCN(hidden_channels=16)
print(model)
>>>GCN(
(conv1):GCNConv(1433,16)
(conv2):GCNConv(16,7)
)
6.4可视化未经训练的GCN网络
让我们使用sklearn.manifold.TSNE和matplotlib.pyplot来可视化未经训练的GCN网络的节点嵌入。它将绘制一个包含7个维度节点嵌入的2D散点图。%matplotlibinline
importmatplotlib.pyplotasplt
fromsklearn.manifoldimportTSNE
defvisualize(h,color):
z=TSNE(n_components=2).fit_transform(h.detach().cpu().numpy())
plt.figure(figsize=(10,10))
plt.xticks([])
plt.yticks([])
plt.show()
然后我们将评估模型,然后将训练数据添加到未经训练的模型中以可视化各种节点和类别。
model.eval()
out=model(data.x,data.edge_index)
visualize(out,color=data.y)
我们将使用Adam优化器和交叉熵损失函数(Cross-EntropyLoss)对模型进行100轮训练。
在训练函数中,我们有:
清除梯度
执行一次前向传播
使用训练节点计算损失
计算梯度,并更新参数
在测试函数中,我们有:
预测节点类别
提取具有最高概率的类别标签
检查有多少个值被正确预测
创建准确率比,使用正确预测的总和除以节点的总数。model=GCN(hidden_channels=16)
optimizer=torch.optim.Adam(model.parameters(),lr=0.01,weight_decay=5e-4)
criterion=torch.nn.CrossEntropyLoss()
deftrain():
model.train()
optimizer.zero_grad()
loss=criterion(out[data.train_mask],data.y[data.train_mask])
loss.backward()
optimizer.step()
returnloss
deftest():
pred=out.argmax(dim=1)
test_correct=pred[data.test_mask]==data.y[data.test_mask]
test_acc=int(test_correct.sum())/int(data.test_mask.sum())
returntest_acc
forepochinrange(1,101):
loss=train()
GAT(
(conv1):GATConv(1433,8,heads=8)
(conv2):GATConv(64,7,heads=8)
........
Epoch:098,Loss:0.5989
Epoch:099,Loss:0.6021
Epoch:100,Loss:0.5799
6.6模型评估
我们将使用测试函数在未见过的数据集上评估模型,如您所见,我们在准确率上取得了相当不错的结果,为81.5%。
test_acc=test()
输出:>>>测试准确率:0.8150
现在,我们将可视化经过训练的模型的输出嵌入以验证结果。
6.7训练GATConv模型
在第二个例子中,我们将使用GATConv层替换GCNConv。图注意力网络使用掩码的自注意力层来解决GCNConv的缺点并取得最先进的结果。
您还可以尝试其他GNN层,并尝试不同的优化、丢失率和隐藏通道数量,以获得更好的性能。
在下面的代码中,我们只是用具有8个注意力头的GATConv替换了GCNConv,其中第一层有8个头,第二层有1个头。
我们还将设置:
dropout为0.6
隐藏通道为8
学习率为0.005
我们修改了测试函数以找到特定掩码(验证、测试)的准确率。这将帮助我们在模型训练期间打印出验证和测试分数。我们还将验证和测试结果存储到后面的绘图线图中。fromtorch_geometric.nnimportGATConv
classGAT(torch.nn.Module):
def__init__(self,hidden_channels,heads):
self.conv1=GATConv(dataset.num_features,hidden_channels,heads)
self.conv2=GATConv(heads*hidden_channels,dataset.num_classes,heads)
x=F.dropout(x,p=0.6,training=self.training)
x=F.elu(x)
model=GAT(hidden_channels=8,heads=8)
optimizer=torch.optim.Adam(model.parameters(),lr=0.005,weight_decay=5e-4)
deftest(mask):
correct=pred[mask]==data.y[mask]
acc=int(correct.sum())/int(mask.sum())
returnacc
val_acc_all=[]
test_acc_all=[]
val_acc=test(data.val_mask)
test_acc=test(data.test_mask)
val_acc_all.append(val_acc)
test_acc_all.append(test_acc)
Epoch:098,Loss:1.1283,Val:0.7960,Test:0.8030
Epoch:099,Loss:1.1352,Val:0.7940,Test:0.8050
Epoch:100,Loss:1.1053,Val:0.7960,Test:0.8040
正如我们所观察到的,我们的模型并没有比GCNConv表现得更好。它需要进行超参数优化或更多轮次的训练才能取得最先进的结果。
6.8模型评估
在评估部分,我们使用matplotlib.pyplot的折线图可视化验证和测试分数。
importnumpyasnp
plt.figure(figsize=(12,8))
经过60轮次,验证和测试准确率达到了稳定的值,约为0.8+/-0.02。
正如我们所见,GATConv层在相同类别的节点上产生了相同的聚类结果。
GNN常见问题
图神经网络(GNN)用于什么?
在图神经网络中,什么是图?
在图神经网络中,图是一种包含节点和节点之间连接(称为边)的数据结构。边可以是有向的或无向的。它具有动态形状和多维结构。例如,在社交媒体中,节点可以是您朋友群中的人,而边则是您与每个人之间的关系。
图神经网络有多强大?
在图像和节点分类方面,图神经网络优于典型的卷积神经网络(CNN)。许多图神经网络的变体在节点和图分类任务中取得了最先进的结果-openreview.net。
神经网络是否使用图论?
什么是图卷积网络?
图卷积网络类似于用于图数据集的卷积神经网络。它包括图卷积、线性层和非线性激活。GNN通过图上的滤波器,检查可用于对数据中的节点进行分类的节点和边。
在深度学习中,什么是图?
图深度学习也被称为几何深度学习。它使用多个神经网络层以实现更好的性能。这是一个活跃的研究领域,科学家们正试图在不影响性能的情况下增加层数。