使用图神经网络(GNN)寻找最短路径

使用图神经网络(GNN)寻找最短路径

在本文中,我们将展示具有关注读写功能的图形网络如何执行最短路径计算。经过最少的培训后,该网络可以100%的准确率执行此任务。
1

引言

在Octavian,我们相信图是表示复杂知识的强大媒介(例如BenevolentAI使用它们来代表药物研究和知识)。

神经网络是一种创造人类无法表达的函数的方法。人们使用大型数据集对网络进行训练。对于神经网络可以处理的模型,我门使用示例的方法训练神经网络拟合输入和输出的关系.

我门需要能够从图结构中进行学习的神经网络,这些神经网络学习有效的归纳偏置用以可靠的学习处理图中的函数.在这个基础上,我门建立了一个强大的神经图系统.

在这里我门提出了一个’面向读写的图网络’,一个可以有效处理最短路径的简单的网络.它是如何组合不同神经网络组件以使系统易于学习经典图算法的一个例子。
这个网络本身是一个新的运算系统,但更重要的是,网络是进一步研究神经图计算的基础。

代码在这里 https://github.com/Octavian-ai/shortest-path

问题陈述

考虑一个问题“站A和B之间最短路径的长度是多少?

如果考虑一个图中任意两点的最短路径呢?

我们想要通过训练神经网络返回整数的答案.

相关工作

机器学习图表是一个年轻但不断发展的领域。

详细的请参见综述文章Graph Neural Networks: A Review of Methods and Applications or our introduction

用于计算最短路径的经典算法是A-star,Dijkstra和Bellman Ford算法。

这些方法有效并且可以广泛的被应用。 Dijkstra与我们的用例最相似,即在没有路径成本启发的情况下找到两个特定节点之间的最短路径。

最早的基于神经的最短路径解决方案的工作是通过通信和分组路由来驱动的,这样的近似算法比经典算法速度更快。 这些操作与当今的神经网络完全不同,它们使用迭代反向传播来解决特定图形上的最短路径。 该领域的工作示例包括 Neural networks for routing communication traffic (1988), A Neural Network for Shortest Path Computation (2000) 和 Neural Network for Optimization of Routing in Communication Networks (2006).

本工作建立了一个可以在未知结构图中工作的模型,与前文提到的只能解决某个图中问题的方法形成鲜明的对比.另外,我门寻求为从输入输出对中寻找解决复杂图问题运算提供基础.

最近一个突破性的解决方法在 Differentiable neural computers, 它通过将图形作为连接元组序列并使用读写存储器学习逐步算法来实现这一点。训练的过程以一个学习计划的形式提供,逐步的提高图和问题的规模.

相比之下,我们的解决方案在更大的路径(长度9对4)上表现更好(100%对55.3%),不需要计划学习,不需要训练LSTM控制器,参数更少,网络更简单组件更少。虽然我们还没有找到任何其他公布的解决方案来解决这个问题,但是有很多类似技术被用于不同的问题。几个相关的例子:

• Commonsense Knowledge Aware Conversation Generation with Graph Attention 使用注意力来读出知识图
• Deeply learning molecular structure-property relationships using attention- and ga

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
当然可以!以下是一个简单的示例代码,展示了如何使用PyTorch Geometric库实现一个神经网络(Graph Neural Network,GNN)模型: ```python import torch import torch.nn as nn import torch.nn.functional as F from torch_geometric.datasets import Planetoid from torch_geometric.nn import GCNConv # 加载数据集 dataset = Planetoid(root='data/Cora', name='Cora') data = dataset[0] class GNNModel(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(GNNModel, self).__init__() self.conv1 = GCNConv(input_dim, hidden_dim) self.conv2 = GCNConv(hidden_dim, output_dim) def forward(self, x, edge_index): x = F.relu(self.conv1(x, edge_index)) x = self.conv2(x, edge_index) return F.log_softmax(x, dim=1) # 配置模型和优化器 input_dim = dataset.num_features hidden_dim = 16 output_dim = dataset.num_classes model = GNNModel(input_dim, hidden_dim, output_dim) 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.x, data.edge_index) loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask]) loss.backward() optimizer.step() # 测试模型 model.eval() _, pred = model(data.x, data.edge_index).max(dim=1) correct = int(pred[data.test_mask].eq(data.y[data.test_mask]).sum().item()) acc = correct / int(data.test_mask.sum()) print(f'Test Accuracy: {acc:.4f}') ``` 上述代码使用了PyTorch Geometric库来加载Cora数据集,并根据GCN(Graph Convolutional Network)模型的架构实现了GNN模型。模型的前向传播通过两个GCNConv层实现,使用ReLU作为激活函数,并使用log_softmax输出。然后使用Adam优化器进行训练,并使用负对数似然损失进行监督学习。最后,将模型切换到评估模式,计算测试集上的准确率。 请注意,这只是一个简单的示例,实际应用中可能需要根据需求进行调整和优化。你可以根据自己的数据集和任务来修改和扩展这个代码。希望对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值