该仓库包含原始GAT论文的Pytorch实现(:link:Veličković等人)。
它的目的是使一般而言开始游戏和学习GAT和GNN变得容易。
图神经网络是一个正在处理图形定义的信号的神经网络家族!
图形可以建模许多有趣的自然现象,因此您会看到它们到处都使用:
一路走到大型雪伦对撞机(LHC)的粒子物理,假新闻检测和清单还在不断!
GAT是空间(卷积)GNN的代表。由于CNN在计算机视觉领域取得了巨大的成功,因此研究人员决定将其推广到图形,所以我们就在这里! ?
这是GAT结构的示意图:

如果不提及最著名的图形数据集-Cora ,您不能仅仅开始谈论GNN。
Cora中的节点代表研究论文,您猜到了这些论文之间的引用。
我添加了一个可视化Cora和进行基本网络分析的实用程序。这就是科拉的样子:

节点大小对应于其程度(即内/传出边缘的数量)。边缘厚度大致对应于“流行”或“连接”该边缘的方式(边缘介绍是书呆子的术语,请查看代码。)
这是一个显示Cora上的学位分布的图:

由于我们正在处理一个无方向的图,因此内外图是相同的。
在底部图(度分布)上,您可以在[2, 4]范围内看到一个有趣的峰值。这意味着大多数节点具有少量边缘,但是有1个节点具有169个边缘! (大绿节点)
一旦我们拥有一个完全训练的GAT模型,我们就可以看到某些“节点”所学到的注意力。
节点使用注意力来决定如何汇总他们的邻居,足够的谈话,让我们看看:

这是Cora的节点之一,具有最多的边缘(引用)。颜色代表同一类的节点。您可以清楚地看到此图中的两件事:
相似的规则适用于较小的社区。还要注意自我边缘:


另一方面,PPI正在学习更多有趣的注意力模式:


在左侧,我们可以看到6个邻居正在受到不可忽略的关注,在右边,我们可以看到所有注意力都集中在一个邻居上。
最后,有2个更有趣的模式 - 左侧和右侧的强大自我边缘,我们可以看到一个邻居受到了大量的关注,而其余的则在整个社区的其他地方平均分布:


重要说明:仅对于第一个GAT层,所有PPI可视化才有可能。由于某种原因,第二和第三层的注意力系数几乎是所有0(即使我获得了已发布的结果)。
另一种理解GAT没有学习Cora上有趣的注意力模式的方法(即它是学习const的关注)是将节点社区的注意力重量视为概率分布,计算熵并在每个节点的社区中积累信息。
我们会喜欢Gat的注意力分布。您可以在橙色中看到理想统一分布的直方图的外观,并且可以在浅蓝色的情况下看到学习的分布 - 它们完全一样!


我从第一层(8中)只绘制了一个注意力头,因为它们都是一样的!
另一方面,PPI正在学习更多有趣的注意力模式:

正如预期的那样,由于均匀分布的熵最高,因此均匀的分布熵直方图位于右侧(橙色)。
好的,我们已经看到了关注!还有什么可视化的?好吧,让我们从GAT的最后一层可视化学习的嵌入。 GAT的输出是形状=(2708,7)的张量,其中2708是Cora中的节点的数量,而7是类的数量。一旦我们将这些7-DIM向量投射到2D,使用T-SNE,我们就会明白:

我们可以看到,具有相同标签/类的节点大致聚集在一起- 使用这些表示,很容易训练一个简单的分类器,这将告诉我们节点所属的类别。
注意:我也尝试过UMAP,但没有得到更好的结果 +如果您想使用其情节u,它具有很多依赖关系。
因此,我们讨论了什么是GNN,以及他们可以为您做什么(其他事情)。
让我们来运行这个东西吧!按照下一步:
git clone https://github.com/gordicaleksa/pytorch-GATcd path_to_repoconda env create (这将创建一个全新的Conda环境)。activate pytorch-gat (用于从控制台运行脚本或在IDE中设置解释器)就是这样!它应该在开箱即用的执行环境中进行处理,以处理依赖关系。
Pytorch Pip软件包将与某些版本的Cuda/cudnn捆绑在一起,但强烈建议您事先安装系统范围的CUDA,这主要是因为GPU驱动程序。我还建议使用Minconda安装程序作为在系统上获得Conda的一种方式。遵循此设置的点1和第2点,并为您的系统使用最新版本的minconda和cuda/cudnn。
只需从您的Anaconda控制台运行jupyter notebook ,它将在您的默认浏览器中打开会话。
打开The Annotated GAT.ipynb ,您就可以玩了!
注意:如果DLL load failed while importing win32api: The specified module could not be found
只需pip uninstall pywin32 ,然后pip install pywin32或conda install pywin32就可以修复它!
您只需要链接您在设置部分中创建的Python环境即可。
仅供参考,我的GAT实施实现了已发表的结果:
82-83%精度0.973 Micro-F1分数(实际上甚至更高)在Cora上训练GAT所需的一切已经设置。要运行它(从控制台)只需致电:
python training_script_cora.py
您也可能有可能:
--should_visualize可视化图形数据--should_test以评估数据的测试部分的GAT--enable_tensorboard开始保存指标(准确性,损失)该代码对您的评论进行了很好的评论,因此您可以(希望)了解培训本身的工作原理。
脚本将:
models/checkpoints/models/binaries/runs/ ,只需运行tensorboard --logdir=runs即可可视化它在PPI上进行培训也是如此,只需运行python training_script_ppi.py即可。 PPI更具GPU渴望,因此,如果您没有至少8 GB的强大GPU,则需要添加--force_cpu标志来训练CPU上的GAT。您可以尝试将批处理大小降低到1或使模型较小。
您可以通过调用tensorboard --logdir=runs并粘贴http://localhost:6006/ url到您的浏览器:


注意:Cora的火车拆分似乎比验证和测试拆分查看损失和准确度指标要困难得多。
话虽如此,大多数乐趣实际上都在于playground.py 。
我添加了3个GAT实现 - 有些在概念上更容易理解有些更有效。最有趣,最难理解的是实施3。实施1和实现2在微妙的细节上有所不同,但基本上做同样的事情。
有关如何处理代码的建议:
如果要介绍3个实现,则只需将playground_fn变量设置为PLAYGROUND.PROFILE_GAT在playground.py中。
您可能会关心2个参数:
store_cache如果您想保存内存/时间分析结果,请设置为Trueskip_if_profiling_info_cached如果要从cache获取分析信息,请设置为True结果将存储在data/ in memory.dict和timing.dict字典(泡菜)中。
注意:实现#3是迄今为止最优化的一个 - 您可以在代码中看到详细信息。
我还添加了profile_sparse_matrix_formats如果您想对不同的矩阵稀疏格式(例如COO , CSR , CSC ,LIL, LIL ,ETC)获得一些熟悉。
如果您想可视化T-SNE嵌入式,请注意或嵌入playground_fn变量将变量设置为PLAYGROUND.VISUALIZE_GAT ,并将visualization_type _type设置为:
VisualizationType.ATTENTION - 如果您想在节点社区中可视化注意力VisualizationType.EMBEDDING如果您想可视化嵌入(通过T -SNE)VisualizationType.ENTROPY如果您想可视化熵直方图而且您将获得类似这些的疯狂可视化( VisualizationType.ATTENTION 。注意选项):


在左侧,您可以在整个CORA数据集中看到最高学位的节点。
如果您想知道为什么这些看起来像一个圆圈,那是因为我使用了layout_reingold_tilford_circular bleatout,它特别适合像图这样的树(因为我们正在可视化一个节点及其邻居,并且该子绘图实际上是m-ary树)。
但是您也可以使用kamada kawai (右侧)等不同的图形算法,等等。
请随意浏览代码,并从不同的GAT层中绘制注意力,从而绘制不同的节点社区或注意力头。您也可以轻松地更改GAT中的层数,尽管浅GNN倾向于在小世界,同质图数据集上执行最好的表现。
如果您想可视化Cora/PPI,只需将playground_fn设置为PLAYGROUND.VISUALIZE_DATASET ,您将从此读数中获得结果。
HW要求高度取决于您将使用的图形数据。如果您只想和Cora一起玩,那么您可以选择2个以上的GBS GPU。
它需要(在Cora引文网络上):
将此与最小的变压器所需的硬件进行比较!
另一方面, PPI数据集更具GPU渴望。您将需要一个具有8+ GB的VRAM的GPU,也可以将批次尺寸降低到1,并使模型“ Slimmer”,从而尝试减少VRAM消耗。
sparse API的实现如果您想了解如何使用Pytorch的稀疏API实施GAT,请随时提交PR。我个人的API遇到了困难,这是在Beta中,而且是否有可能使实施与我的实施3一样有效,这是值得怀疑的。
其次,我仍然不确定为什么GAT在PPI上获得报告的结果,而在更深层中存在一些明显的数字问题,因为所有注意力系数都等于0。
如果您很难理解GAT,我在本视频中对本文进行了深入的概述:
我还制作了该仓库的演练视频(重点关注潜在的痛点),并在Graph ML一般开始进行了博客! ❤️
我还有更多视频,可以进一步帮助您了解GNN:
我发现这些存储库很有用(在开发此存储库时):
如果您发现此代码有用,请引用以下内容:
@misc{Gordić2020PyTorchGAT,
author = {Gordić, Aleksa},
title = {pytorch-GAT},
year = {2020},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/gordicaleksa/pytorch-GAT}},
}