七个用于图形深度学习的开源代码库

如果你是一名深度学习的爱好者,那么可能已经熟悉一些基本的数学原语,这些原语推动了具有强大功能的深度神经网络的发展。尽管很多人喜欢将基本的人工神经网络视为具有一些加权连接的一些节点,但将神经网络视为矩阵乘法在计算上更有效。

公共领域的多层感知器

这种类型的神经网络是一种前馈多层感知器(MLP)。如果想让计算机计算这个模型的前向传递,它将在隐藏层中使用矩阵乘法和某种非线性数据。

前馈多层感知器(MLP)非常适合可以自然形成的一维向量数据。虽然很简洁,但是当数据样本很大时,前馈多层感知器(MLP)会采用大量参数,这对于处理高维数据(如2D图像或3D体积)来说并不是一种非常有效的方法。2D类似数据的图像自然适用于卷积运算,其中权重应用于整个图像的局部邻域,而不是赋予层之间的每个点对点连接自己的权重。这种类型的权重共享有许多优点,其中包括平移等方差、正则化和参数效率等。

卷积可以实现可视化。当然,开发人员现在不可能采用人工执行这些操作,他们想要的是一种能够以计算机友好的方式在每个图像通道上快速执行卷积的算法。

卷积运算再次实现为矩阵的乘法,尽管这次是按元素进行的。这要归功于傅里叶变换的卷积定理,它指出傅里叶域中的乘法与空间域中的卷积有关。但是,当开发人员感兴趣的数据不是特别适合表示为1D矢量或2D/3D图像,而是自然地表示为图形时会发生什么?

就开发人员的目的而言,图形是由边连接的节点的集合,边可以具有自己的属性,例如权重或方向性,并且节点通常具有某种状态或特征,就像前馈多层感知器(MLP)中的节点激活一样。

在图形神经网络中,每个“层”只是图节点状态的快照,这些状态通过与每个节点及其相邻节点相关的操作更新连接,例如作为节点之间边的神经网络。

如果想使用图神经网络在图形结构数据上取得令人印象深刻的结果,就像卷积神经网络对图像进行深度学习所做的那样,需要采用在计算机上实现这些模型的有效方法。这通常意味着需要一种方法将概念图神经网络框架转换为适用于现代深度学习的东西。

图形卷积网络

那么怎么可能将图形神经网络的复杂思想转换为矩阵乘法的另一种形式?表示连接的一种方法是使用邻接矩阵。顾名思义,邻接矩阵描述了图中哪些节点彼此相邻(即通过边彼此连接)。

但是图形神经网络需要对具有任意结构的图形进行操作,因此不能期望每次输入的数据都有相同的邻接矩阵,甚至每个邻接矩阵都有相同的维数。开发人员可以通过将多个样本的邻接矩阵对角组合成一个更大的矩阵来描述一批中的所有连接来处理这个问题。

这使开发人员能够在一个批次中处理具有不同结构的多个图,他们会注意到其公式也会导致节点之间的权重共享。还有一些更多的细节:邻接矩阵应该被归一化,这样特征尺度不会完全改变,除了在这里讨论的图形卷积神经网络(GNN)方法之外,还有其他的图卷积方法,但是这是理解图形卷积神经网络(GNN)前向传递的一个很好的起点。

这足以在图形上实施深度学习所需的数据准备和数学运算。幸运的是,对图形结构数据深度学习的兴趣推动了许多用于图形深度学习的开源库的开发,为研究人员和工程师提供了更多的认知空间,使他们专注于架构、实验和应用。

以下对7个新兴的图形深度学习开源代码库进行介绍,并按受欢迎程度进行从低向高排列。

7.GeometricFlux.jl

这个列表中的大多数条目都使用Python,并构建在TensorFlow、PyTorch或JAX之上,这反映了图形深度学习语言的主导地位。然而,其第一个条目是一个基于Julia编程语言的Flux深度学习框架的图形神经网络开源库。

由于从业者的数量相对较少,人们可能会放弃GeometricFlux.jl,甚至放弃使用Julia语言进行深度学习的整个想法,但它是一种不断发展的语言,与Python相比具有许多技术优势。人们很难预料到,DeepMind会在几年前开始放弃TensorFlow,转而支持JAX,同样在短短几年内,人们可能会看到Julia语言开始取代Python作为标准机器学习语言。

Julia编程语言从一开始就被设计为既高效(如Python)又快速(像C等编译语言一样)。Julia语言使用即时编译来实现快速执行速度,而其read-execute-print循环(REPL)使得交互式和迭代编程具有相当高的效率。当用户第一次运行代码时,会注意到一点延迟,特别是当习惯于以一种特别交互式的方式使用Python时(比如在Jupyter记事本中),但是随着时间的推移,给定工作流的速度会显著提高。

Julia被设计为一种科学编程语言,在过去五年的时间,自动微分软件包有了长足的发展。最终结果是其功能可以将诸如DifferentialEquations.jl包等以研究为中心的库与机器学习功能相结合,正如人们在神经微分方程包DiffEqFlux.jl中看到的那样。GeometricFlux.jl也是如此,它旨在与图论研究JuliaGraphs生态系统以及Flux的其他部分相兼容。

如果在工作中使用图形深度学习,那么坚持使用基于PyTorch的库或用于其他项目的深度学习标准工作框架可能是最有效的。但是,如果是从头开始或进行研究,GeometricFlux.jl为使用Julia进行图深度学习和可微编程提供了一个引人注目的切入点。该库友好的MIT许可证还可以轻松构建和贡献开发人员需要的工具,或解决项目GitHub存储库中的一些未解决的问题。

6.PyTorch GNN

PyTorch GNN库是微软公司的图形深度学习库,在2020年5月发布之后仍在积极开发0.9.x版本。PyTorch GNN(PTGNN)旨在让熟悉基于PyTorch构建模型的用户容易熟悉torch.nn.Module类,并处理数据加载器的工作流任务。并将图形转换为PyTorch-ready tensors。

PTGNN基于一个有趣的架构,称为Abstract Neural Model。这个类封装了训练图神经网络的整个过程,包括张量化和预处理原始数据,还包括从PyTorch的nn.Module类中提取的实际神经模型子类T Neural Module。神经模块可以独立于Abstract Neural Model对象使用,事实上,如果需要的话,可以与其他类型的Pytork模块/层结合使用。

PTGNN比GeometricFlux.jl推出略晚,提交历史不太活跃,但是GitHub的Star和Fork稍微多一些。它具有相同的宽松和开源MIT许可证,但如果正在寻找一个可以贡献的项目,则需要大量的自我指导和学习。GitHub上的“问题”选项卡几乎没有提供需要修复或实施的内容方向。

PTGNN在其构造中有一些有趣的设计元素,可能会对其使用或使用感兴趣,但如果开发人员是图形神经网络爱好者,并正在寻找基于PyTorch的图深度学习库,那么可以使用PyTorch Geometric。PyTorch Geometric更加成熟,已经开发了大约4年的时间,并且拥有一个成熟且不断增长的用户和开发者社区。

5.Jraph

人们可能已经注意到DeepMind在2020年12月发表的一篇博客文章,描述了他们在开发和使用基于功能可微编程库JAX的深度学习研究库的强大生态系统方面所做的持续努力。JAX是最初作为Python(尤其是NumPy)中简单但几乎通用的自动微分学术项目Autograd的概念产物推出的。

在谷歌公司招募到几位最初负责Autograd开发的程序人员之后,他们开发了JAX。JAX是一个有趣的包,这在很大程度上归功于它对可组合函数式编程范例的重视。它还关注“可微分编程”的一般概念,而不是主要关注像TensorFlow或PyTorch这样的神经网络。尽管PyTorch和TensorFlow都可用于构建可微物理模型而不是神经网络,但JAX更容易从一开始就更适合用于科学和其他编程任务的灵活可微编程。尽管之前曾花费大量时间构建基于TensorFlow的工具(如Sonnet),但JAX产品足以促使DeepMind开始大量采用和开发。

作为DeepMind为深度学习研究开发基于JAX的生态系统的努力的一部分,他们开发了一个名为Jraph的图学习库。

与这一列表中的其他一些库不同,Jraph是一个轻量级和简约的图学习库,它通常不规定特定的使用方式。Jraph继承了其前身Graph Nets的一些设计模式,它使用TensorFlow和Sonnet构建。也就是Jraph使用与Graph Nets相同的Graphs Tuple概念,它是一种包含描述节点、边和边方向的信息的数据结构。Jraph处理的另一个特性为使用掩码和填充处理可变结构图提供了特殊的便利。对于这一列表中的大多数其他Python库,这不是一个问题,但由于在JAX中使用即时编译,这是必要的。这可以确保在JAX中使用图形,并不意味着放弃JAX在GPU和CPU硬件上提供的执行加速。

4.Spektral

Spektral是一个基于Tensorflow 2和Keras的图形深度学习库,其徽标明显受到Pac-Man ghost villains的启发。如果开发人员打算使用基于TensorFlow的库来满足其图形深度学习需求,那么Spektral可能是最佳选择。它旨在易于使用和灵活,同时保留尽可能接近熟悉的Keras API的用法。这意味着开发人员甚至可以使用方便的model.fit()方法训练模型,只要提供Spetkral数据加载器来处理定义图形的TensorFlow友好稀疏矩阵的形成。然而,Spektral的易用性需要权衡,与其他主要库DGL和PyTorchGeometric相比,大多数任务的训练速度明显较慢。

Spektral已被广泛采用,如果开发人员想使用TensorFlow构建图形模型,它可能是一个有吸引力的选择。它可能比Deepmind的GraphNets库得到更好的支持,但从各方面来看,它正在逐步淘汰,取而代之的是基于JAX的Jraph。Spektral是在Apache2.0开源许可下发布的,并有一个活跃的问题板,它将定期将请求整合在一起,这使得这个库成为一个吸引人的深度学习库。

3.Graph Nets

Graph Nets是Deepmind的另一个图形深度学习库。它建立在TensorFlow和Sonnet(另一个DeepMind库)之上,可能很快就会被前面描述的基于JAX的Jraph所取代。Graph Nets需要TensorFlow1,尽管它只有大约3年的使用历史,但感觉有些过时。它在GitHub上拥有令人印象深刻的737个Fork和近5,000个Star,并且与来自Google/DeepMind的大多数其他库一样,在Apache2.0下获得许可。Graph Nets起源于Jraph使用的Graphs Tuple数据结构。

尽管Graph Nets在GitHub上似乎很受欢迎,但它可能没有这一列表中的其他库那么吸引人,除非开发人员正在处理已经大量使用该库的现有代码库。对于使用TensorFlow的新项目来说,Spektral和DGL可能是更好的选择,因为它们是用更新的技术构建的,并且可能会在几年内继续获得支持。

2.Deep Graph Library (DGL)

DGL与微软的PTGNN或谷歌/DeepMind的Jraph和GraphNets等大型科技公司无关,而是一个名称为“分布式深度机器学习社区”的一些深度学习爱好者的产品。它在GitHub上拥有超过100名贡献者、1500次以上的提交和7,000多个Star。DGL在这一列表中也是独一无二的,它提供了灵活的后端选择。该模型可以运行PyTorch、TensorFlow或MXNet,同时提供与驱动实验的体验大致相似的体验。它是这一列表中仍在积极开发中的寿命较长的库之一,其第一次提交可追溯到2018年4月。DGL最近被用来构建SE(3)转换器,这是一种强大的图形转换器,具有旋转和平移等方差可能是AlphaFold2的构建块或灵感。该模型是已经令人印象深刻的AlphaFold的继承者,是DeepMind在2020年CASP14蛋白质结构预测挑战赛上令人印象深刻的获奖表现背后的明星。这一事件促使一些新闻机构宣布AlphaFold2是第一个解决重大科学挑战的人工智能项目。

DGL是围绕Gilmer等人描述的神经消息传递范式在2017年构建的。它提供了一个灵活的框架,涵盖了用于构建图形神经网络的大多数类型的图层。通过阅读代码存储库和文档,就会注意到DGL是一个庞大的项目。这也意味着有很多(将近200个)未解决的问题,对于希望为具有重大影响的图形深度学习项目做出贡献的人来说,这是一个成熟的机会。DGL用于许多专门的应用程序,在一定程度上已经在它的基础上构建了几个额外的库。DGL-LifeSci是一个专为应用于化学和生物信息学的深度学习图而构建的库,而DGL-KE是为处理知识图嵌入而构建的。这两个额外的库都是由AWS实验室开发的。

1. PyTorch Geometric

在这一列表中名列榜首的库就是PyTorch Geometric。PyTorch Geometric或PyG是一个成熟的几何深度学习库,拥有1万多个stars和4400次提交,其中大部分都是一名才华横溢的博士生Ru Stu1s推出的。PyG提供了一个实现图神经网络层列表,它不仅可以非常快速地运行深度图网络,而且PyG还可以用于其他类型的几何深度学习,例如点云和基于网格的模型。

PyG有一个精心编写的示例教程介绍,自从2017年以来一直在开发,它非常完善,并得到了用户社区和140多个贡献者的大力支持。对于以前使用过PyTorch的任何人来说,使用PyG是非常熟悉的,最明显的区别是数据输入的一些差异。与通常的forward(x)编程模式不同,开发人员将习惯于使用forward(batch),其中“batch”是包含描述图形特性和连接的所有信息的数据结构。

对于可以自由选择库的新项目,PyTorchGeometric很难被击败。

以下是这些用于图形深度学习的开源代码库之间的比较:

如何选择深度学习库

在许多情况下,开发人员对深度图学习库的选择将受到自己、雇主或指导人员之前选择的深度学习库的严重影响。例如,如果喜欢KerasAPI和TensorFlow,或者需要与预先存在的代码库保持一致的依赖关系,例如,Spektral可能是适合的库。在此不建议使用DeepMind的GraphNets和TensorFlow1启动新项目,但该库仍然会偶尔更新,并且可能是支持遗留项目的合理选择。

如果开发人员希望从头开始,可能有几个诱人的选择。如果认为Julia Programming的深思熟虑的生产力+执行速度优先是机器学习和科学编程的未来,那么GeometricFlux.jl将面临令人兴奋的前景。如果对函数式编程范式感兴趣,并希望保留即时编译(如Julia)的一些速度优势,那么使用基于JAX的Jraph是一个更具吸引力的选择。最后,如果想要一个处于相对成熟和成熟的开发状态的快速、功能强大的库,那么PyTorchGeometric将是一个理想选择。

你可能感兴趣的:(七个用于图形深度学习的开源代码库)