近年来,图神经网络(GNN)领域取得了快速和难以置信的进展,图神经网络又被称为图深度学习、图表示学习,已经成为机器学习特别是深度学习领域发展最快的研究课题之一。GNN开始运用于药物发现、疾病分类、电路网络、物理模拟 、假新闻检测、交通流量预测、推荐系统、目标监测、视觉推理、实体关系抽取、关系推理等方面。GNN有着强大的图数据拟合能力、推理能力并与知识图谱结合(知识图谱,利用可视化的图谱形象地展示整体知识架构)。以下两图是从某学术网站上截取的一篇有关GNN的中科院1区高影响因子论文,从该篇论文的引用脉络图不难看出图神经网络近几年的火热程度。
下图是历年有关GNN的论文数量展示,该数据说明在GNN领域还大有可为,因为相比于其他领域每年数以万计的科研论文,GNN的论文数量是相对很低的。
随着机器学习、深度学习的发展,语音、图像自然语言取得了重大突破,然而语音、图像、文本都是很简单的序列或者网格数据,是很结构化的数据,深度学习很善于处理该种类型的数据,然而现实世界中并不是所有的事物都可以表示成一个序列或者一个网格,例如社交网络、知识图谱、复杂的文件系统等,也就是说很多事物都是非结构化的。相比于简单的文本和图像,这种网络类型的非结构化的数据非常复杂,处理它的难点包括:(1)图的大小是任意的,图的拓扑结构复杂,没有像图像一样的空间局部性;(2)图没有固定的节点顺序,或者说没有一个参考节;(3)图经常是动态图,而且包含多模态的特征。
补充:非结构化数据:是数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现的数据。包括所有格式的办公文档、文本、图片、XML, HTML、各类报表、图像和音频/视频信息等。
那么对于这类非结构化数据我们该如何建模呢?能否将深度学习进行扩展使得能够建模该类数据呢?这些问题促使了图神经网络的出现与发展。
图表示实体(entity)之间的一些关系。实体就是点,关系就是边。图分为有向图和无向图。为了进一步描述每个节点(V)、边(E)或整个图(U),我们可以将信息存储在图的每个部件中,如节点、边,并用向量进行表示。GNN关注的重点就在于如何将想要的信息表示为向量,已经这些向量如何通过数据进行学习。
下图展示了GNN如何通过网络层从其周围的节点收集信息:
以下数据可以表示为图:
我们通常将图像视为具有图像通道的矩形网格,将它们表示为数组(例如,244x244x3 浮点数)。将图像视为具有规则结构的图形的另一种方式,其中每个像素代表一个节点并通过边连接到相邻像素。可视化图的连通性的一种方法是通过其邻接矩阵,对节点进行排序。下面这三种表示形式中的每一种都是同一数据的不同视图。
文本序列,词与词之间使用有向边,例如:
原子为节点,键为边,例如:
对象作为节点并将他们的关系当作边。例如奥赛德剧本中同时出现的人则连边、选手之间有比赛则连为边。
每篇论文都是一个节点,每条边则为一篇论文与另一篇论文之间的引用,例如:
网页连接(有向图),机器学习模型、编程代码、数学方程式等也可以表示为图,其中变量是点,边则是将这些变量作为输入和输出的操作。
总结:从上面的例子可以得出,输入到GNN中的一个图包含四个部分,一个节点的特征矩阵,一个边的特征矩阵,一个点连接情况的邻接矩阵以及一个全局信息。
图上的预测任务通常分为三种类型:图级、节点级和边级。
在图级任务中,我们的目标是预测整个图的属性。例如,对于以图形表示的分子,我们可能想要预测该分子闻起来像什么,或者它是否会与与疾病有关的受体结合。这类似于图像分类问题,我们希望将标签与整个图像相关联。对于文本,一个类似的问题是情感分析,我们想要一次识别整个句子的情绪或情感。例如:
在节点级任务中:涉及预测图中每个节点的身份或角色,对于文本,类似的任务是预测句子中每个单词的词性(例如名词、动词、副词等)。例如:一个典型例子是空手道俱乐部。 该数据集是一个单一的社交网络图,Hi先生(教练)和John H(管理员)之间的争执在空手道俱乐部造成了分裂。 每个空手道练习者是一个顶点,边代表这些成员之间的社交关系。预测问题是在Hi先生(教练)和John H(管理员)争执之后对给定成员是忠于 Mr. Hi (蓝色)还是 John H(红色) 进行分类。
在边级任务中:GNN模型可用于预测节点之间的关系(即每条边的信息)。 例如我们希望预测这些节点中的哪些节点共享一条边或该边的值是什么。希望发现实体之间的联系,我们可以认为图是完全连接的,并根据它们的预测值修剪边来得到一个稀疏图,例如:
在该GNN的一层中: 对节点向量、边向量和全局向量分别构造一个多层感知机(MLP)(或者可微分方程),这三个MLP就共同组成了一个GNN的层。图是输入,每个组件 (V,E,U) 都由 MLP 更新以生成新图。每个函数下标表示 GNN 模型第 n 层的不同图形属性的单独函数。
其中Un代表全局信息,Vn代表所有的节点,En代表所有的边,每个f(带有下标)就是一个多层感知机,由这些共同组成了GNN的一层。多层这样的结构堆叠在一起就构成了一个最简单的图神经网络。
我们已经构建了一个简单的 GNN,但是我们如何在上述任何任务中进行预测?如果要求对节点进行二元预测,并且图形已经包含节点信息,则方法很简单——对于每个节点嵌入,应用线性分类器(或者若干全连接层),就可以对顶点进行预测了。
然而,这并不总是那么简单。例如,您可能将图中的信息存储在边中,但在节点中没有信息,但仍需要对节点进行预测。我们需要一种方法从边缘收集信息并将它们提供给节点进行预测。我们可以通过合并做到这一点。合并分两步进行:第一步,对于要合并的每个项目收集它们的每个嵌入并将它们连接成一个矩阵;第二步,通过求和运算聚和收集到的嵌入。
通俗来讲就是将与该顶点相连接的边的嵌入求和(或者其他方式),得到的结果加到顶点嵌入中(如果维度不同需要做映射),如下图展示。这种操作方法叫做池化(pooling)。这样经过池化Pooling以后每个顶点中都含有丰富信息,对于边信息缺失或者全局信息缺失我们采用对称的方法进行处理。
如果我们只有边缘级特征,并试图预测二进制节点信息,我们可以使用池化将信息路由(或传递)到需要去的地方。例如:
A Gentle Introduction to Graph Neural Networks
如果我们只有节点级特征,并试图预测二进制边缘级信息,则模型如下:
如果我们只有节点级别的特征,并且需要预测二进制全局属性,我们需要将所有可用的节点信息收集在一起并聚合它们。例如:
可以将最简单的GNN模型总结成如下的结构:一张图输入,经过GNN层(实质上就是三个分别对应点、边和全局的MLP),输出一个属性已经变换的图,在经过全连接层,得到输出。例如:
这只是最简单的GNN,因为我们没有在GNN层内使用图的连通性信息。 顶点、边和全局信息都是独立处理的,只在最后池化时使用了连通性信息。
前面构建的GNN层存在一个缺点,就是每一层GNN层单独地对节点、边、全局信息进行处理,没有利用节点之间的连接信息。GNN的输入有四个部分,节点信息、边信息、全局信息、节点之间的连接信息,但是目前为止,GNN层中只利用了前三种信息,那么如何有效利用节点之间的连接信息呢?
考虑在每一层GNN层中加入池化,让相邻顶点、边、以及全局信息之间进行信息传递,而不是等到最后进行预测的时候才进行池化。那么,在每一次池化(也就是消息传递)操作中我们就利用了顶点之间的连接信息,因为在进行消息传递的时候需要知道那些顶点是相邻的,每个顶点有哪些边。信息传递(或者说池化)包括三个步骤:第一步,对于图中的每个顶点,收集所有相邻顶点或边的信息;第二步,通过聚合函数(如求和)聚合所有收集到的信息;第三步,合并的信息通过一个更新函数传递,通常是一个学习过的神经网络。 这些步骤是利用图形连通性的关键。我们将在 GNN 层中构建更精细的消息传递变体,从而产生具有更高表现力和能力的 GNN 模型。
通过将消息传递 GNN 层堆叠在一起,一个节点最终可以整合来自整个图的信息:在三层之后,一个节点拥有离它三步之遥的节点的信息。例如:
为了让GNN网络能更好的对图进行预测,提取出图中更加丰富的特征信息,我们不局限于在相邻顶点之间进行消息传递,顶点和边之间,边和边之间,顶点和全局信息之间,以及边和全局信息之间都可以进行消息传递。例如:
之前的消息传递,只考虑了邻接的顶点和边,如果一个顶点想要聚合距离它很远的顶点和边的信息,怎么办呢?此提出一个虚拟的主节点,它和图中所有的节点和边虚拟地连接,这个主节点的信息就是全局信息U。在节点信息传递给边的时候,也会把U一起传递,把边信息传递给节点的时候,也会把U一起传递;然后更新边和节点后,将边和节点的信息一起汇聚给U,之后做多层感知机更新。
在原文中作者展示了一个带有小分子图的图级预测任务。使用 Leffingwell 气味数据集,它由具有相关气味感知(标签)的分子组成,预测分子结构(图形)与其气味的关系。为了简化问题,只考虑每个分子的一个二元标签,分类分子图是否闻起来像专业调香师所标记的那样“刺鼻”。如果一个分子有强烈的、醒目的气味,我们就说它有“刺鼻”的气味。我们将每个分子表示为一张图,其中原子是包含其原子身份(碳、氮、氧、氟)的单热编码的节点,键是包含其键类型(单键、双键、三键)的单键编码的边或芳香)。我们针对此问题的通用建模模板将使用顺序 GNN 层构建,然后是具有用于分类的 sigmoid 激活的线性模型。我们的 GNN 的设计空间有许多可以定制模型的杠杆:第一,GNN 的层数,也称为深度;第二,更新时每个属性的维度。更新函数是一个 1 层 MLP,具有 relu 激活函数和用于激活归一化的层范数;第三,池化中使用的聚合函数:max、mean 或 sum;第三,更新的图形属性或消息传递的样式,节点、边和全局表示。
作者将一个GNN的预测程序嵌入到了java script里面,读者可以自行调节一些超参数来看预测结果,如下图:
在探索上述架构选择时,您可能会发现某些模型的性能优于其他模型。是否有一些明确的 GNN 设计选择可以为我们提供更好的性能?例如,更深的 GNN 模型是否比更浅的模型表现更好?还是聚合函数之间有明确的选择?答案将取决于数据,甚至不同的特征化和构建图的方式也会给出不同的答案。
通过下面的交互图,我们探索了 GNN 架构的空间和这项任务在几个主要设计选择中的表现:消息传递的风格、嵌入的维度、层数和聚合操作类型。其中散点图中的每个点代表一个模型:x 轴是可训练变量的数量,y 轴是性能。将鼠标悬停在一个点上可以查看 GNN 架构参数。
首先要注意的是,令人惊讶的是,更多的参数确实与更高的性能相关。GNN 是一种参数效率非常高的模型类型:即使是少量参数 (3k),我们也已经可以找到具有高性能的模型。接下来,我们可以查看基于不同图属性的学习表示的维数聚合的性能分布。
我们可以注意到,具有更高维数的模型往往具有更好的均值和下限性能,但最大值却没有发现相同的趋势。可以找到一些性能最好的模型用于较小的尺寸。由于更高的维度也将涉及更多的参数,因此这些观察结果与上图一致。
接下来我们可以看到基于 GNN 层数的性能分解:
箱线图显示了类似的趋势,而平均性能往往随着层数的增加而增加,性能最好的模型不是三层或四层,而是两层。此外,性能的下限随四层而降低。之前已经观察到这种效果,具有更多层数的 GNN 将在更远的距离广播信息,并且可能会冒着从许多连续迭代中“稀释”其节点表示的风险。
我们的数据集是否有首选的聚合操作?我们的下图根据聚合类型细分了性能:
总体上看,三种聚合函数都差别不大。
之前的探索给出了混合信息。我们可以找到平均趋势,其中更复杂的性能更好,但我们可以找到明确的反例,其中参数、层数或维度更少的模型性能更好。一个更清晰的趋势是关于相互传递信息的属性的数量。在这里,我们根据消息传递的风格来分解性能。在这两个极端,我们考虑不在图实体之间通信的模型(“无”)和在节点、边和全局变量之间传递消息的模型。
总的来说,我们看到通信的图属性越多,平均模型的性能就越好。我们的任务以全局表示为中心,因此明确学习此属性也有助于提高性能。我们的节点表示似乎也比边表示更有用,这是有道理的,因为这些属性中加载了更多信息。
您可以从这里走很多方向以获得更好的性能。我们希望两个突出两个一般方向,一个与更复杂的图形算法有关,另一个与图形本身有关。到目前为止,我们的 GNN 是基于基于邻域的池化操作。有一些图形概念很难用这种方式表达,例如线性图形路径(连接的节点链)。设计可以在 GNN 中提取、执行和传播图形信息的新机制是当前的一个研究领域。
GNN 研究的前沿之一不是制作新的模型和架构,而是“如何构建图”,更准确地说,是为图注入可以利用的额外结构或关系。正如我们粗略地看到的那样,通信的图形属性越多,我们就越倾向于拥有更好的模型。在这种特殊情况下,我们可以考虑通过在节点之间添加额外的空间关系、添加非键的边或子图之间的显式可学习关系来使分子图的特征更加丰富。
虽然我们只描述了具有每个属性的矢量化信息的图,但图结构更加灵活,可以容纳其他类型的信息。幸运的是,消息传递框架足够灵活,通常使 GNN 适应更复杂的图结构就是定义信息如何通过新的图属性传递和更新。
上面我们只考虑了单边图,现实中信息的内容是多样的,比如社会关系交错臃杂,不是单边图能够描绘清楚的,我们可以考虑很多种其他类型的图。比如,对于社交网络,我们可以根据关系类型(熟人,朋友,家人)指定边缘类型。可以通过为每个边缘类型提供不同类型的消息传递步骤来调整 GNN。我们还可以考虑嵌套图,例如节点表示图,也称为超节点图。嵌套图形对于表示分层信息非常有用。例如,我们可以考虑一个分子网络,其中一个节点代表一个分子,如果我们有将一个分子转换为另一个分子的方法(反应),则两个分子之间共享一个边缘。在这种情况下,我们可以通过有一个GNN在分子水平上学习表示,另一个在反应网络水平上学习表示,并在训练期间交替使用它们。
另一种类型的图形是超图,其中一条边可以连接到多个节点,而不仅仅是两个节点。对于给定的图形,我们可以通过识别节点社区并分配连接到社区中所有节点的超边缘来构建超图。
如何训练和设计具有多种图属性的 GNN 是当前的研究领域。
如果GNN有很多层,就算每一次只做1近邻,到最后一层中的一个节点可能包含有整个图的信息。在神经网络中计算梯度的时候,我们需要将整个梯度给保存下来,如果对最后一个顶点计算梯度的时候,我们需要保存整个图的中间结果,如果图很大,这可能会导致我们是无法承受的。所以我们也需要做小批量梯度,就是每次从图中随机采集一个小图,然后在这个小图上面做汇聚,计算梯度的时候只需要保存小图上面的结果就足够了。下面介绍四种采样的方法:
上图中,左边是说随机采样一些点,然后把这些点的1近邻找出来,构成子图,做计算的时候只在子图上做计算,我们可以控制这个子图的大小;右图是通过随机游走,随机找到一个点,从这个点开始随机游走,规定走多少步,然后得到一个子图。
这个图中的左图,是结合上面两种方法,先随机游走三步,然后找出这些点的1近邻,构成一个子图;右图是随机取一个点,然后把这个点的k近邻找出来构成一个子图。这是四种不同的采样方法,不同的图适合不同的采样方法。
汇集来自相邻节点和边缘的信息是任何相当强大的 GNN 架构中的关键步骤。因为每个节点都有可变数量的邻居,并且因为我们想要一种聚合此信息的可区分方法,所以我们希望使用对节点排序和提供的节点数量不变的平滑聚合操作。选择和设计最优聚合操作是一个开放的研究课题。
聚合操作的一个理想属性是相似的输入提供相似的聚合输出,反之亦然。一些非常简单的候选置换不变运算是求和、均值和最大值。像方差这样的汇总统计也有效。所有这些都采用可变数量的输入,并提供相同的输出,无论输入顺序如何。让我们探讨一下这些操作之间的区别。
上面左图中,两个点对做汇聚,用三种不同汇聚操作得到不同的结果,其中max得到的结果是一样的,但是点对并不一样;右图中两个点对,max和mean得到的结果也是一样的,但是点对并不相同;sum也很容易找到无法区分点对的例子,比如点对分别为1、5和4、2,这个例子中sum得到的结果也是一样的。
没有一种操作是一致的最佳选择。当节点具有高度可变的邻居数量或者您需要局部邻域特征的规范化视图时,均值操作可能很有用。当您想要突出显示局部邻域中的单个显着特征时,最大操作会很有用。Sum 提供了这两者之间的平衡,通过提供特征局部分布的快照,但因为它没有被归一化,所以也可以突出异常值。在实践中,通常使用 sum。
设计聚合操作是一个开放的研究问题,与集合上的机器学习交叉。主要邻域聚合等新方法通过连接它们并添加取决于要聚合的实体的连接程度的缩放函数来考虑多个聚合操作。同时,还可以设计领域特定的聚合操作。
GCN为图卷积神经网络,利用GCN 收集所有可能的大小为 k 的子图,并从一个节点或边的有利位置学习向量表示。可能的子图的数量可以组合增长,因此从一开始就枚举这些子图与在 GCN 中动态构建它们相比,可能会让人望而却步。
在使用GNN 时,我们可能会关心模型的可解释性,以建立可信度、调试或科学发现。我们要解释的图形概念因信息的不同而不同。例如,对于分子,我们可能关心特定子图的存在或不存在,而在引用网络中,我们可能关心文章的连通性程度。由于图形概念的多样性,有许多方法来构建解释。GNNExplainer将这个问题转换为提取对任务重要的最相关的子图。归因技术将排序的重要性值分配给图表中与任务相关的部分。因为现实和具有挑战性的图形问题可以综合生成,GNN 可以作为一个严格和可重复的测试床评估归因技术。
除了学习图上的预测模型,我们可能还关心学习图的生成模型。使用生成模型,我们可以通过从学习分布中采样或通过给定起点完成图来生成新图。一个相关的应用是在新药的设计中,需要具有特定特性的新型分子图作为治疗疾病的候选药物。
https://distill.pub/2021/gnn-intro/
更多优质内容持续发布中,请移步主页查看。
点赞+关注,下次不迷路!