什么是图神经网络 (GNN)?
图神经网络 (GNN) 是一类功能强大的神经网络,专门设计用于对图结构数据进行机器学习。与图像(像素网格)或文本(单词序列)等传统数据类型不同,世界上大部分数据都是相互关联的,从社交网络和金融交易到分子结构和交通系统。GNN 通过直接从实体之间的连接和关系中学习,擅长解决这些关系数据上的问题。
GNN 背后的核心思想是消息传递,即图中的节点与其邻居迭代地交换信息。这个过程允许每个节点建立对其在图中位置的丰富、上下文的理解。经过几轮消息传递后,生成的节点表示可用于各种任务,如预测节点属性(例如,识别用户的兴趣)、预测链接(例如,推荐新朋友)或对整个图进行分类(例如,确定一个分子是否有毒)。像 PyTorch Geometric (PyG) 这样的库使得构建和训练这些复杂模型对开发人员来说变得容易。
主要特点
- 关系学习: GNN 天生就设计用于建模和学习图数据中的关系和结构,这是传统模型难以处理的。
- 置换不变性: GNN 的输出与节点处理的顺序无关,这是图数据的自然属性。
- 端到端训练: GNN 可以针对各种基于图的任务进行端到端训练,包括节点分类、图分类和链接预测。
- 组合性: GNN 层可以堆叠以创建深度模型,使其能够从每个节点周围越来越大的邻域中捕获信息。
- 可扩展性: 像 PyTorch Geometric 这样的现代 GNN 框架经过高度优化,可以扩展到拥有数百万甚至数十亿节点和边的图。
应用场景
- 社交网络分析: 识别社区、检测有影响力的用户以及预测新的连接或友谊。
- 推荐系统: 通过建模用户和物品之间的关系,为推荐引擎(例如,产品、电影或音乐)提供动力。
- 药物发现与化学: 通过将分子视为图来预测分子性质、发现新候选药物以及理解蛋白质相互作用。
- 欺诈检测: 通过发现异常模式和连接,在金融交易网络中识别复杂的欺诈活动。
- 交通预测: 通过将道路网络建模为具有动态特征的图来预测交通流量和旅行时间。
入门指南
这是一个使用流行的 PyTorch Geometric 库的 GNN “Hello World” 示例。此代码训练一个简单的图卷积网络 (GCN) 在 Cora 数据集(一个标准的引文网络基准)上执行节点分类。
首先,请确保您已安装 PyTorch 和 PyG: ```bash
首先安装 PyTorch
pip install torch
安装 PyTorch Geometric
pip install torch-geometric
现在,您可以定义和训练您的 GNN 模型: ```python import torch import torch.nn.functional as F from torch_geometric.datasets import Planetoid from torch_geometric.nn import GCNConv
加载 Cora 数据集
dataset = Planetoid(root=’/tmp/Cora’, name=’Cora’) data = dataset[0]
定义一个简单的 GCN 模型
class GCN(torch.nn.Module): def init(self): super().init() # 第一个 GCN 层:输入特征 -> 16 个隐藏特征 self.conv1 = GCNConv(dataset.num_node_features, 16) # 第二个 GCN 层:16 个隐藏特征 -> 类别数 self.conv2 = GCNConv(16, dataset.num_classes)
def forward(self, data):
x, edge_index = data.x, data.edge_index
x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, training=self.training)
x = self.conv2(x, edge_index)
return F.log_softmax(x, dim=1)
训练设置
device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’) model = GCN().to(device) data = data.to(device) optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
训练循环
model.train() for epoch in range(200): optimizer.zero_grad() out = model(data) loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask]) loss.backward() optimizer.step() if epoch % 20 == 0: print(f’轮次 {epoch}, 损失: {loss.item():.4f}’)
评估模型
model.eval() pred = model(data).argmax(dim=1) correct = (pred[data.test_mask] == data.y[data.test_mask]).sum() acc = int(correct) / int(data.test_mask.sum()) print(f’测试集准确率: {acc:.4f}’)
定价
图神经网络是一种开源模型架构。使用它们的主要成本是训练和推理所需的计算资源 (CPU/GPU),尤其是在非常大的图上。像 PyTorch Geometric、DGL 和 Spektral 这样的库在 MIT 等宽松的开源许可下免费使用。