《图神经网络编程实战:开启深度学习新领域》
《图神经网络编程实战:开启深度学习新领域》
一、引言
随着大数据和物联网技术的发展,越来越多的数据呈现出结构化、复杂的关系性特征,图神经网络应运而生。在当今数字化时代,图神经网络(GNNs)和大数据技术备受关注,二者的结合为数据处理带来了更多可能性。
图数据遍布全球,任何由实体及其关系组成的系统都可以用图形表示。尽管深度学习算法在自然语言处理、计算机视觉和语音识别等领域取得了突出进展,但大多数深度学习架构都是针对欧几里得结构化数据量身定制的,而图形数据则在很大程度上被忽略了。以图结构的方式表示数据可能会揭示从实体及其关系的高维表示中浮现出的有价值的信息,然而图的高度灵活性也带来了设计能够学习该数据并在不同领域推广的同质框架的复杂性。
在过去二十年中,虽然已经提出了各种能够大规模处理图形数据的人工智能系统的方法,但这些进步往往与具体情况和设置有关。近年来,一个相对较小的高级深度学习研究人员社区在展示如何将不同领域的各种数据问题最好地转化为图问题方面取得了长足进步,其中图神经网络及其一些变体已被证明在各种深度学习任务中优于主流方法。GNN 已成为解决许多不同领域现实问题的重要工具,例如在药物发现、推荐系统、交通预测等领域,而更传统和针对具体案例的方法则失败了。
如果我们查看过去几年 ICLR 和 NeurIPS 接受的研究出版物,就可以初步了解 GNN 在研究中的增长情况。“图神经网络” 一词逐年稳定地位居前 3 个关键词之列,涉及 GNN 的已发表研究数量呈指数级增长。GNN 在不同应用领域的影响也十分显著,其论文分布在 22 个不同类别中,涵盖了众多领域。
图神经网络已成为许多近期激动人心的项目背后的关键要素。例如,Uber Eats 团队将图学习技术引入推荐系统,为食品配送应用程序提供支持。鉴于处理的图规模巨大,图神经网络只需要固定数量的参数,与输入图的大小无关,使学习可扩展到大型图。在对该模型进行推荐菜肴和餐馆的首次测试中,团队报告称,与现有生产模型相比,在关键指标上的性能提升了 20% 以上。
二、图神经网络的背景和现状
1. 问题的由来
随着大数据和物联网技术的快速发展,越来越多的数据呈现出结构化、复杂的关系性特征,传统的深度学习方法难以直接应用,图神经网络旨在直接处理图结构的数据。这一问题的由来可以追溯到多个方面。
首先,在现实世界中,许多数据都具有图结构的特点。例如社交网络中的用户关系、生物分子网络中的分子相互作用、交通网络中的道路连接等。这些数据中的节点和边代表了不同的实体和它们之间的关系,传统的深度学习方法往往难以有效地处理这种复杂的结构。
其次,图数据的复杂性给数据分析和挖掘带来了挑战。图数据的大小可以是任意的,其拓扑结构复杂,没有像网格那样的空间局部性。此外,图数据通常是动态的,具有多模态特征,没有固定的节点顺序或参考点。这些特点使得传统的深度学习方法在处理图数据时面临困难。
为了解决这些问题,图神经网络应运而生。图神经网络通过在图的节点之间传递消息来获取图的依赖性,从而能够有效地处理图结构的数据。图神经网络的核心概念包括图卷积层、图神经网络、邻接矩阵等。其中,图卷积层是图神经网络的核心组件,它使用图卷积操作来学习图结构的特征。
2. 研究现状
近年来,图神经网络已成为机器学习和人工智能领域的热点话题,从简单的图卷积网络到更加复杂的模型,都展示了在各种任务上的出色性能。
图卷积网络在图神经网络领域产生了颠覆性的影响。它是一种深度学习模型,专门处理非欧几里得数据,如图数据。图卷积网络的核心算法原理是基于图卷积操作的,将图上的节点表示为线性组合的邻居节点的特征。这种操作可以理解为在图上进行的卷积操作,因此称为图卷积。
图卷积网络的具体操作步骤包括初始化图卷积层的权重矩阵、计算输入特征矩阵和邻接矩阵、对于每个节点计算其邻居节点的特征矩阵并通过线性组合和权重矩阵得到输出特征矩阵、将所有节点的输出特征矩阵拼接成新的输出特征矩阵、应用非线性激活函数等。数学模型可以表示为 ,其中 是第 层图卷积层的输出特征矩阵, 是第 层图卷积层的输入特征矩阵, 是第 层图卷积层的邻接矩阵, 是一个非线性激活函数。
除了图卷积网络,图神经网络还包括其他各种模型和方法。例如,图注意力网络借鉴了 Transformer 模型中的注意力机制,在计算图中会根据邻居节点特征的不同来为其分配不同的权值。它可以处理不同的节点上的并行计算,也能对未见过的图结构进行处理,既能处理有监督任务也能处理无监督任务。
嵌套图神经网络则通过使每个节点表示编码围绕它的子图而不是子树来提高表达能力和表示。它在每个节点周围提取一个局部子图,然后将带有池化层的基础 GNN 应用于每个有根子图以学习子图表示,最后将最终节点表示应用于图池化层以获得全图表示。
此外,还有向量量化图神经网络(VQ-GNN)通过使用向量量化提高基于卷积的 GNN 扩展性。它在每个 GNN 层中使用矢量量化来学习和更新全局节点表示的少量量化参考矢量,保留传递给一个小批节点的所有消息,避免 “邻居爆炸” 问题,在大图节点分类和链接预测基准上展示了可扩展性高和有竞争力的性能。
图神经网络在多个领域都取得了显著的应用成果。在社交网络分析中,可以用于用户关系挖掘和推荐系统;在知识图谱中,可以进行知识表示和推理;在生物信息学中,可以预测蛋白质界面和疾病分类等。同时,图神经网络的发展也面临着一些挑战,如可扩展性、鲁棒性、可解释性等问题。未来的研究方向包括扩展图卷积网络到非结构化图数据、提高图卷积网络的效率、进行图卷积网络的理论分析等。
三、图神经网络的原理
图神经网络以图结构的数据为输入,通过学习节点间的相互关系来提取特征,从而进行有效的模式识别和预测。其核心在于对图结构中节点和边的信息进行充分挖掘和利用。
图神经网络主要是对卷积神经网络在 graph domain 上的自然推广,能够同时对节点特征信息与结构信息进行端对端学习。对于图数据而言,其信息包含节点信息(V)、边信息(E)、图整体(U)三个层面,通常用向量来表示。而图神经网络通过学习数据,得到这三个层面向量的最优表示。
在工作过程中,图神经网络采用消息传递机制对图上的所有属性进行优化变换。输入是一个图,输出也是一个图,只对属性向量进行变换,不改变图的连接性。不同的图神经网络模型本质差别就在于它们如何进行节点之间的信息传递和计算,也就是消息传递机制不同。比如最原始的图神经网络是 SUM 求和传递机制;图卷积网络(GCN)考虑到了节点的度,度越大,权重越小,使用了加权的 SUM;图注意力网络(GAT)在消息传递过程中引入了注意力机制。
从类型上看,图神经网络通常分为图卷积网络(GCN)、递归图神经网络(RGNN)、空间图卷积网络、谱图卷积网络、递归神经网络(RNN)、绘制自动编码器网络等。以 GCN 为例,它通过检查附近的节点来学习特征,由图卷积和线性层组成,并使用非线性激活函数。其具体操作步骤包括初始化图卷积层的权重矩阵、计算输入特征矩阵和邻接矩阵、对于每个节点计算其邻居节点的特征矩阵并通过线性组合和权重矩阵得到输出特征矩阵、将所有节点的输出特征矩阵拼接成新的输出特征矩阵、应用非线性激活函数等。数学模型可以表示为 ,其中 是第 层图卷积层的输出特征矩阵, 是第 层图卷积层的输入特征矩阵, 是第 层图卷积层的邻接矩阵, 是一个非线性激活函数。
图神经网络在处理图数据时,借助图谱的理论来实现拓扑图上的卷积操作。借助于图的拉普拉斯矩阵的特征值和特征向量来研究图的性质,Graph Fourier Transformation 及 Graph Convolution 定义都用到图的拉普拉斯矩阵。拉普拉斯矩阵是对称矩阵,可以进行特征分解(谱分解),且只在中心顶点和一阶相连的顶点上有非 0 元素。常用的拉普拉斯矩阵实际用三种:Combinatorial Laplacian、Symmetric normalized Laplacian、Random walk normalized Laplacian。
图神经网络在多个领域都有广泛应用,如自然语言处理、计算机视觉、节点分类、链路预测、图分类、图可视化等。在自然语言处理中,可用于文本分类、语义、关系提取和问答等任务;在计算机视觉中,适用于图像分类等任务;在节点分类任务中,预测每个节点的节点嵌入;在链路预测中,检查图形中两个数据点之间的关系,以确定这两个点是否相连;在图分类中,将图分类为组以识别它们;在图可视化中,查找图形数据中存在的结构和异常,以帮助用户理解图形。
四、图神经网络编程实践
1. 使用 PyTorch Geometric
PyTorch Geometric 是一个强大的图神经网络库,它提供了很多方便的接口和工具,让我们能够轻松地构建和训练图神经网络模型。
它包含了很多 GNN 相关论文中的方法实现和常用数据集,并且提供了简单易用的接口来生成图。用法大多数和 PyTorch 很相近,因此熟悉 PyTorch 的同学使用这个库可以很快上手。
torch_geometric.data.Data 是 PyTorch Geometric 中用于构建图的数据结构,它包括以下几个属性:
- x:用于存储每个节点的特征,形状是 [num_nodes, num_node_features]。
- edge_index:用于存储节点之间的边,形状是 [2, num_edges]。
- pos:存储节点的坐标,形状是 [num_nodes, num_dimensions]。
- y:存储样本标签。如果是每个节点都有标签,那么形状是 [num_nodes, *];如果是整张图只有一个标签,那么形状是 [1, *]。
- edge_attr:存储边的特征。形状是 [num_edges, num_edge_features]。
我们可以通过以下方式构建一个简单的图:
import torch
from torch_geometric.data import Data
# 由于是无向图,因此有4 条边:(0 -> 1), (1 -> 0), (1 -> 2), (2 -> 1)
edge_index = torch.tensor([[0,1, 1, 2],[1, 0, 2, 1]], dtype=torch.long)
# 节点的特征
x = torch.tensor([[-1],[0], [1]], dtype=torch.float)
data = Data(x=x, edge_index=edge_index)
PyG 的 Dataset 继承自 torch.utils.data.Dataset,自带了很多图数据集,我们以 TUDataset 为例,可以通过以下代码加载数据集:
from torch_geometric.datasets import TUDataset
dataset = TUDataset(root='/tmp/ENZYMES', name='ENZYMES')
data = dataset[0]
在一个图中,由 edge_index 和 edge_attr 可以决定所有节点的邻接矩阵。PyG 通过创建稀疏的对角邻接矩阵,并在节点维度中连接特征矩阵和 label 矩阵,实现了在 mini-batch 的并行化。PyG 允许在一个 mini-batch 中的每个 Data (图) 使用不同数量的节点和边。
我们也可以通过继承 torch_geometric.data.Dataset 使用自己的数据集。
2. 《动手实践图神经网络 Python 版》项目详解
具体内容, 后续进行详解。
3. 图神经网络原理与代码实战案例讲解
在代码实战方面,可以参考以下内容:
-
背景介绍
- 问题的由来:随着大数据和物联网技术的快速发展,越来越多的数据呈现出结构化、复杂的关系性特征。例如社交网络、生物分子之间的相互作用、交通网络等场景中的数据可以被抽象为图的形式。对于这类结构化数据的分析和挖掘,传统的深度学习方法往往难以直接应用,图神经网络应运而生,旨在直接处理图结构的数据,通过学习节点间的相互关系来提取特征,从而进行有效的模式识别和预测。
- 研究现状:近年来,图神经网络已经成为机器学习和人工智能领域的一个热点话题。从简单的图卷积网络到更加复杂的模型,如图注意力网络、图生成网络、以及基于消息传递机制的模型,都展示了在各种任务上的出色性能。
-
代码实战案例
- 可以使用 PyTorch Geometric 进行节点分类。首先从 URL 下载数据集,如 Facebook Large
Page-Page Network 数据集,包含 Facebook 页面之间的连接图、页面的描述和类型以及每个页面的特征向量。 - 创建 PyTorch 同构数据对象,使用 pandas 读取 CSV 文件中的节点数据,从 json
文件中提取特征并进行处理,使其特征向量大小一致并归一化。然后加载边的数据,建立节点直接的连接。最后为同构图创建 PyTorch data
对象。 - 分割数据为训练集和测试集,使用 mask 来标识训练和验证集。
- 训练神经网络,如训练一个多层感知网络(MLP)作为对比,创建对象并进行训练和验证。
- 可以使用 PyTorch Geometric 进行节点分类。首先从 URL 下载数据集,如 Facebook Large
4. 图神经网络代码示例
以下是一些图神经网络的代码示例:
- 使用 PyTorch 和 PyTorch Geometric 实现一个简单的图神经网络示例:
import torch
import torch.nn as nn
import torch_geometric.transforms as T
from torch_geometric.data import Data
class GraphNeuralNetwork(nn.Module):
def __init__(self, input_dim, output_dim):
super(GraphNeuralNetwork, self).__init__()
self.linear = nn.Linear(input_dim, output_dim)
def forward(self, data):
x = data.x
x = self.linear(x)
x = x + data.edge_index.new_zeros(x.size(0))
x = torch.mean(x, dim=1)
return x
# 创建一个简单的图
edge_index = torch.tensor([[0,1, 2], [1, 0, 2]], dtype=torch.long)
x = torch.tensor([[1.0], [2.0], [3.0]], dtype=torch.float)
data = Data(x=x, edge_index=edge_index)
# 初始化图神经网络
gnn = GraphNeuralNetwork(input_dim=1, output_dim=1)
# 前向传播
output = gnn(data)
print(output)
- 使用 Julia 语言写一个图神经网络的例子:
using Flux
using LightGraphs
# 创建一个图数据
G = Graph(5)
add_edge!(G,1, 2)
add_edge!(G, 2, 3)
add_edge!(G, 1, 4)
add_edge!(G, 4, 5)
# 创建一个随机特征矩阵
X = randn(5,3)
# 定义 GNN 的模型参数
W1 = randn(3,4)
b1 = randn(4)
W2 = randn(4, 2)
b2 = randn(2)
# 定义 GNN 的前向传递函数
function gnn_forward(G, X, W1, b1, W2, b2)
A = adjacency_matrix(G) # 邻接矩阵
H1 = relu.(X * W1.+ b1) # 第一层隐藏层
H2 = relu.(A * H1 * W2.+ b2) # 第二层隐藏层
return H2
end
# 测试 GNN 的前向传递函数
H = gnn_forward(G, X, W1, b1, W2, b2)
println(H) # 输出变量 H 的值
5. 图神经网络的典型用例
虽然 ChatGPT 或 Diffusion 模型等 AI 系统最近备受关注,但图神经网络 (GNN) 却发展迅速。在过去的几年中,GNN 悄然成为众多激动人心的新成就背后的黑马,这些成就从纯学术研究突破一路发展到大规模积极部署的实际解决方案。
许多公司已经在其部分核心产品中转向基于 GNN 的方法,其动机是这些方法与之前最先进的 AI 架构相比表现出显著的性能改进。
例如,Uber Eats 团队开发了一款食品配送应用程序,最近开始将图学习技术引入推荐系统,为该应用程序提供支持。鉴于在这种环境下处理的图规模巨大,图神经网络是一个非常有吸引力的选择。事实上,GNN 只需要固定数量的参数,这些参数与输入图的大小无关,从而使学习可扩展到大型图。在对该模型进行推荐菜肴和餐馆的首次测试中,团队报告称,与现有生产模型相比,在关键指标(如平均倒数排名、Precision@K 和 NDCG)上的性能提升了 20% 以上。
6. 动手实现图神经网络
可以参考以下步骤实现图神经网络:
确保已经安装了 PyTorch 和 PyTorch Geometric 库。可以使用以下命令进行安装:
pip install torch torchvision
pip install torch-geometric
实现一个简单的图神经网络,它将计算节点的邻居特征的平均值作为节点的新特征。以下是实现代码:
import torch
import torch.nn as nn
import torch_geometric.transforms as T
from torch_geometric.data import Data
class GraphNeuralNetwork(nn.Module):
def __init__(self, input_dim, output_dim):
super(GraphNeuralNetwork, self).__init__()
self.linear = nn.Linear(input_dim, output_dim)
def forward(self, data):
x = data.x
x = self.linear(x)
x = x + data.edge_index.new_zeros(x.size(0))
x = torch.mean(x, dim=1)
return x
# 创建一个简单的图
edge_index = torch.tensor([[0,1, 2], [1, 0, 2]], dtype=torch.long)
x = torch.tensor([[1.0], [2.0], [3.0]], dtype=torch.float)
data = Data(x=x, edge_index=edge_index)
# 初始化图神经网络
gnn = GraphNeuralNetwork(input_dim=1, output_dim=1)
# 前向传播
output = gnn(data)
print(output)
7. 用 julia 语言写一个图神经网络的例子
使用 Julia 语言中的 Flux 和 LightGraphs 包可以实现一个简单的图神经网络:
using Flux
using LightGraphs
# 创建一个图数据
G = Graph(5)
add_edge!(G,1, 2)
add_edge!(G, 2, 3)
add_edge!(G, 1, 4)
add_edge!(G, 4, 5)
# 创建一个随机特征矩阵
X = randn(5,3)
# 定义 GNN 的模型参数
W1 = randn(3,4)
b1 = randn(4)
W2 = randn(4, 2)
b2 = randn(2)
# 定义 GNN 的前向传递函数
function gnn_forward(G, X, W1, b1, W2, b2)
A = adjacency_matrix(G) # 邻接矩阵
H1 = relu.(X * W1.+ b1) # 第一层隐藏层
H2 = relu.(A * H1 * W2.+ b2) # 第二层隐藏层
return H2
end
# 测试 GNN 的前向传递函数
H = gnn_forward(G, X, W1, b1, W2, b2)
println(H) # 输出变量 H 的值
五、总结
图神经网络作为一种新兴的深度学习技术,具有广泛的应用前景。通过本文的介绍,我们对图神经网络的原理和编程实践有了更深入的了解,为进一步研究和应用打下了坚实的基础。
图神经网络能够有效地处理图结构的数据,在多个领域都取得了显著的成果。从社交网络分析到生物信息学,从推荐系统到交通预测,图神经网络都展现出了强大的能力。
在编程实践方面,我们介绍了使用 PyTorch Geometric 进行图神经网络编程的方法,包括构建图数据结构、加载数据集、实现图神经网络模型等。我们还介绍了使用 Julia 语言实现图神经网络的例子,以及图神经网络的代码示例、典型用例和入门示例等。
虽然图神经网络已经取得了很大的成功,但仍然面临着一些挑战。例如,可扩展性、鲁棒性、可解释性等问题仍然需要进一步研究。未来的研究方向包括扩展图卷积网络到非结构化图数据、提高图卷积网络的效率、进行图卷积网络的理论分析等。
总之,图神经网络是一种非常有前途的深度学习技术,具有广泛的应用前景。我们相信,
原文地址:https://blog.csdn.net/zheng_ruiguo/article/details/144324170
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!