终于彻底理解图神经网络(GNNs)了!

开通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通过图上的滤波器,检查可用于对数据中的节点进行分类的节点和边。

在深度学习中,什么是图?

图深度学习也被称为几何深度学习。它使用多个神经网络层以实现更好的性能。这是一个活跃的研究领域,科学家们正试图在不影响性能的情况下增加层数。

THE END
1.人工智能深入了解神经网络 通过Frank La La|2019 年 2 月 神经网络是很多高级的人工智能 (AI) 解决方案的基本元素。但是,很少人取消 derstand 这一概念的核心数学或结构化基础。虽然初始研究神经网络返回日期数十年来,它不是直到最近的计算能力和训练数据集的大小进行它们实际供常规使用。 https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2019/february/artificially-intelligent-a-closer-look-at-neural-networks
2.(图解)类神经网络的复兴:深度学习简史腾讯云开发者社区然而若采用仅有两层的神经网络,不如使用其他理论更完备也更好实践、同样只有两层的「浅层」机器学习模型。因此在1990年代,支持矢量机(Support Vector Machine)等「浅层机器学习模型」成为主流技术,此为机器学习的第二波浪潮。 接下来,让我们来继续谈谈类神经网络是如何再度复甦。https://cloud.tencent.com/developer/article/1080858
3.在AI智能中有几种重要的神经网络类型?6种重要的神经网络类型分享!这将我们带到了接下来的两类神经网络:卷积神经网络和循环神经网络。 2. 卷积神经网络(CNN) 在CNN 流行之前,人们用于图像分类的算法有很多。人们过去常常从图像中创建特征,然后将这些特征输入到一些分类算法中,例如 SVM。一些算法也使用图像的像素级值作为特征向量。举个例子,您可以训练一个具有 784 个特征的 SVM,https://m.w3cschool.cn/article/95743536.html
4.什么是神经网络?神经网络的类型Cloudflare不过,它们大致可以分为以下几类: 浅层神经网络通常只有一个隐藏层 深度神经网络有多个隐藏层 与深度神经网络相比,浅层神经网络速度更快,所需的处理能力更低,但无法像深度神经网络那样执行大量复杂任务。 下面是目前可能使用的神经网络类型的不完整列表: 感知器神经网络是一种简单的浅层网络,有一个输入层和一个输出https://www.cloudflare-cn.com/learning/ai/what-is-neural-network/
5.机器学习19:多类别神经网络MultiClassNeuralNetworks该飞机是波音 747、空客 320、波音 777 还是巴西航空工业公司 190? 这是苹果、熊、糖果、狗还是鸡蛋的图像? 在现实世界中,多分类问题需要从数百万个单独的类中进行选择。例如一个可以识别几乎任何东西的图像的多类分类模型。 目录 1.一对多 2.多类神经网络 https://download.csdn.net/blog/column/8117549/131538081
6.应用各种类型的深度神经网络来解决不同的学习任典型深度神经网络LeNet-5虽然提出的时间比较早,但它是一个非常成功 的神经网络模型,LeNet-5的网络结构如图所示。 1.1 结构:LeNet-5 共包含 8 层 整体上是:输入层>卷积层>池化层+激活函数>卷积层>池化层+激活函数>卷积层>全连接层>输出层 输入层:N 个 32x32 的训练样本 https://blog.51cto.com/u_13229/7691640
7.物理神经网络物理神经网络 编辑 物理神经网络是一种类型的人工神经网络,其中可电调整的材料被用来模拟一个的功能神经突触。“物理”神经网络用于强调对用于模拟神经元的物理硬件的依赖,而不是基于软件的方法来模拟神经网络。更一般而言,该术语适用于其他人工神经网络,其中忆阻器或其他电可调电阻材料用于模拟神经突触。 物理神经网络的https://vibaike.com/111076/
8.两类忆阻神经网络的稳定性分析【摘要】:忆阻神经网络作为类脑研究的重要算法之一,备受国内外众多学者的关注。而稳定性是忆阻神经网络最基本的动力学行为之一,其理论研究涉及到微分方程、Lyapunov稳定性理论、脉冲控制理论、生物科学、计算机科学等学科知识。忆阻神经网络稳定性相关成果已广泛应用于模式识别、语音合成、联想记忆等实际工程。众所周知,含有https://cdmd.cnki.com.cn/Article/CDMD-10635-1021769979.htm
9.类脑智能与脉冲神经网络类脑智能算法主要通过对生物神经系统的模拟,构建更符合生物神经系统原理的人工智能算法及计算框架。近年来,起源于神经科学理论基础的脉冲神经网络(spike neural network, SNNs)已成为类脑计算领域的主流框架之一。然而,目前snn使用的基于反向传播(BP)直接训练的LeakyIntegration‐and‐Fire (LIF)神经元模型大多没有考虑周期https://cst.dhu.edu.cn/2022/0906/c3127a299265/page.htm
10.类脑运算脉冲神经网络(SpikingNeuralNetwork)发展现状类脑运算–脉冲神经网络(Spiking Neural Network)发展现状 前一段时间忙于博士论文的攥写和答辩, 抱歉拖更 继上一章: 类脑运算–脉冲神经网络(Spiking Neural Network)叙述 SNN是第三代人工神经网络(ANN),是一类event驱动的神经形态算法,可能具有广泛的应用领域,并适用于各种极低功耗的神经形态硬件。现阶段SNN 的应https://www.pianshen.com/article/94171855502/
11.类脑计算:从神经网络到真正的人工智能丨CCF中国科学院自动化研究所研究员余山表示,现在的深度学习从广义上来说也是类脑计算,因为它不是基于规则的机器学习系统,而是用神经网络从经验中学习知识。所以类脑计算和现在的深度学习两者是互相借鉴,互相促进的关系。 在类脑这一领域,目前国内机会较多。我国在计算、工程、智能技术方面有比较好的基础,脑科学方面总体和https://www.leiphone.com/category/ai/WOIMqvQZwFvOxFUK.html
12.清华NLP图神经网络GNN论文分门别类,16大应用200+篇论文机器之心本文总结了清华大学NLP课题组Jie Zhou, Ganqu Cui, Zhengyan Zhang and Yushi Bai同学对 GNN 相关的综述论文、模型与应用。 [ 导读 ]图神经网络研究成为当前深度学习领域的热点。最近,清华大学NLP课题组Jie Zhou, Ganqu Cui, Zhengyan Zhang and Yushi Bai同学对 GNN 相关的综述论文、模型与应用进行了综述,并https://www.jiqizhixin.com/articles/2019-08-12-2
13.智慧法治学术动态(2023年第18期总第42期)2023年5月9日,在《自然·机器智能》第5卷第4期上发表的一项新研究中,荷兰国家数学与计算机科学研究所(CWI)科学家展示了类脑神经元如何与新颖的学习方法相结合,能够大规模训练快速节能的尖峰神经网络。该技术潜在的应用包括可穿戴人工智能(AI)、语音识别、增强现实等诸多领域。(人民日报) https://www.jfdaily.com/sgh/detail?id=1028742
14.PyTorch的nn.Module类的定义和使用介绍python在PyTorch中,nn.Module类是构建神经网络模型的基础类,所有自定义的层、模块或整个神经网络架构都需要继承自这个类,本文介绍PyTorch的nn.Module类的定义和使用介绍,感兴趣的朋友一起看看吧+ 目录 在PyTorch中,nn.Module 类是构建神经网络模型的基础类,所有自定义的层、模块或整个神经网络架构都需要继承自这个类。nn.https://www.jb51.net/python/314596jdu.htm