当前位置: 首页 > 科技观察

GCN图卷积网络入门

时间:2023-03-15 11:43:45 科技观察

在这篇文章中,我们将仔细研究一个名为GCN的著名图神经网络。首先,让我们直观地了解它是如何工作的,然后深入了解其背后的数学原理。为什么要使用图形?许多问题本质上都是图形。在我们的世界中,我们看到很多数据都是图形,例如分子、社交网络、论文引用网络。图例。(图片来自[1])GraphTaskNodeClassification:预测特定节点的类型。链接预测:预测两个节点是否连接社区检测:识别密集连接的节点社区。网络相似性:两个(子)网络有多相似?机器学习生命周期在图中,我们有节点特征(表示节点的数据)和图结构(表示节点如何连接)。对于节点,我们可以很容易的获取到每个节点的数据。但是当涉及到图的结构时,从中提取有用的信息并不是一件容易的事。例如,如果2个节点彼此非常接近,我们是否应该将它们与其他节点对区别对待?高低度节点呢?其实对于每一个具体的工作,都只是特征工程,也就是将图结构转化为我们的特征,这会消耗大量的时间和精力。图上的特征工程。(图片来自[1])如果能通过某种方式获取图的节点特征和结构信息作为输入,让机器判断哪些信息有用就更好了。这就是为什么我们需要图表示学习。我们希望图表能够自己学习“特征工程”。(图片来自[1])图卷积神经网络(GCNs)论文:基于图神经网络的半监督分类(2017)[3]GCN是一种直接作用于图并利用图结构信息的卷积神经网络。它解决了在图(例如引文网络)中对节点(例如文档)进行分类的问题,其中只有一小部分节点被标记(半监督学习)。图的半监督学习示例。有些节点没有标签(未知节点)。主要思想正如名称“卷积”所指的那样。这个想法来自图像,然后被引入到图形中。然而,当图像具有固定结构时,图(Graphs)就复杂得多。从图像到图的卷积思想。(图片来自[1])GCN的基本思想:对于每个节点,我们从它的所有邻居节点中获取它的特征信息,包括它自己的特征。假设我们使用average()函数。我们将对所有节点执行相同的操作。最后,我们将这些计算出的平均值输入神经网络。在下图中,我们有一个引文网络的简单实例。每个节点代表一篇研究论文,而边缘代表引用。我们这里有一个预处理步骤。这里我们没有使用原始论文作为特征,而是将论文转换为向量(通过使用NLP嵌入,例如tf-idf)。NLP嵌入,例如TF-IDF)。让我们考虑绿色节点。首先,我们得到它所有邻居的特征值,包括它自己,取平均值。最后通过神经网络返回一个结果向量作为最终结果。GCN的主要思想。我们以绿色节点为例。首先,我们取它所有邻居的平均值,包括它自己。然后,将平均值传递给神经网络。请注意,在GCN中,我们只使用一个全连接层。在这个例子中,我们得到2D向量作为输出(全连接层的2个节点)。在实践中,我们可以使用比平均函数更复杂的聚合函数。我们还可以将更多层堆叠在一起以获得更深的GCN。每层的输出被认为是下一层的输入。2层GCN的例子:第一层的输出是第二层的输入。另外,请注意GCN中的神经网络只是一个全连接层(图片来自[2])。让我们认真研究一下它在数学上是如何工作的。背后的直觉和数学原理首先,我们需要一些注释。我们考虑图G,如下图所示。从图G中,我们有一个邻接矩阵A和一个度矩阵D。同时我们还有特征矩阵X。那么我们如何从邻居节点中得到每个节点的特征值呢?解决办法在于A和X的乘法。看邻接矩阵的第一行,我们看到节点A和节点E之间存在连接,结果矩阵的第一行是该矩阵的特征向量E节点连接到A(如下图所示)。同理,得到的矩阵第二行是D和E的特征向量之和。通过这种方法,我们可以得到所有邻居节点的向量之和。计算“和向量矩阵”AX的第一行。这里还有一些改进的余地。我们忽略节点本身的特性。例如,计算矩阵的第一行也应该包含节点A的特征。我们不需要使用sum()函数,而是需要取平均值,或者更好的是,邻居节点的特征向量的加权平均值。那我们为什么不使用sum()函数呢?原因是当使用sum()函数时,度数较大的节点可能会生成较大的v向量,而度数较低的节点往往会生成较小的聚合向量,这可能会导致稍后的梯度爆炸或消失(例如,使用sigmoid时)。此外,神经网络似乎对输入数据的规模很敏感。因此,我们需要对这些向量进行归一化处理,以摆脱可能出现的问题。在问题(1)中,我们可以通过在A上添加一个单位矩阵I来求解,得到一个新的邻接矩阵A。取lambda=1(使节点本身的特征与其邻居一样重要),我们有?=A+I。注意,我们可以使用lambda作为可训练参数,但是现在我们只需要给lambda赋值1。即使在论文中,lambda也只是简单地赋值1。通过给每个节点添加一个自循环,我们得到新的邻接矩阵。对于问题(2):对于矩阵缩放,我们通常将矩阵乘以对角矩阵。在当前情况下,我们想要对聚合特征进行平均,或者从数学上讲,根据节点度缩放聚合向量矩阵X。直觉告诉我们这里用于缩放的对角矩阵与度矩阵D?有关(为什么是D?而不是D?因为我们考虑的是新邻接矩阵的度矩阵D?而不是A)。现在的问题是我们如何缩放/归一化和向量?换句话说:我们如何将有关邻居的信息传递给特定节点?我们从我们的老朋友平均值开始。在这种情况下,D?的逆(即D?^{-1})开始发挥作用。基本上,D?的逆矩阵中的每个元素都是对角矩阵D中对应条目的逆。例如,节点A的度数为2,因此我们将节点A的聚合向量乘以1/2,节点E的度数为5,我们应该将E的聚合向量乘以1/5,依此类推。因此,通过取D?的倒数并乘以X,我们可以取所有邻居节点(包括我们自己的节点)的特征向量的平均值。到目前为止,一切都很好。但是你可能会问加权平均()怎么样?直觉上,如果我们区别对待高度和低度节点应该会更好。但是我们只是按行缩放,而忽略了相应的列(虚线框)。为列添加一个新的定标器。新的缩放方法为我们提供了“加权”平均值。我们在这里所做的是给低度数的节点更多的权重,以减少高度数节点的影响。这个加权平均的想法是,我们假设度数低的节点会对它们的邻居产生较大的影响,而度数高的节点会产生较小的影响,因为它们的影响分散在太多的邻居上。当在节点B处聚合相邻节点特征时,我们将最大权重(3级)分配给节点B本身,将最小权重(5级)分配给节点E。因为我们归一化了两次,将“-1”改为“-1/2”比如我们有一个10类的多分类问题,F设置为10,在第二层有了10维向量后,我们预测这些向量通过softmax函数。Lossfunction的计算方法很简单,就是通过所有标注样本的交叉熵误差来计算,其中Y_{l}是标注节点的集合。层数#layers含义层数是指节点特征可以传输的最远距离。例如,在第1层GCN中,每个节点只能从其邻居那里获取信息。收集信息的过程对每个节点独立进行,对所有节点同时进行。当在第一层之上添加另一层时,我们重复信息收集过程,但这一次,邻居节点已经有了关于他们邻居的信息(来自上一步)。这使得层数成为每个节点可以采用的最大跳数。因此,根据我们认为节点应该从网络获取信息的距离,我们可以为#layers设置适当的数字。但同样,在图表中,通常我们不想走得太远。使用6-7跳的设置,我们几乎可以得到整个图,但这会降低聚合的意义。例子:在收集目标节点i的两层信息的过程中,应该叠加多少层GCN?在论文中,作者还对浅层和深层GCN进行了一些实验。在下图中,我们可以看到使用2层或3层的模型获得了最佳结果。此外,对于深度GCN(超过7层),它们往往会获得较差的性能(蓝色虚线)。一种解决方案是求助于隐藏层(紫线)之间的残余连接。不同层的性能#。图片来自论文[3]TakeNotesGCNsforSemi-SupervisedLearningonGraphs。GCN使用节点特征和结构进行训练。GCN的主要思想是对所有邻居节点(包括自身节点)的特征取加权平均。度数较低的节点获得更多权重。之后,我们通过神经网络训练生成的特征向量。我们可以堆叠更多层以使GCN更深。考虑深度GCN的残差连接。通常,我们会选择2层或3层的GCN。数学笔记:在查看对角矩阵时,请考虑矩阵缩放。这是一个使用StellarGraph库[5]的GCN演示。该存储库还提供了许多其他GNN算法。论文作者的注释该框架目前仅限于无向图(加权或未加权)。然而,有向边和边特征可以通过将原始有向图表示为无向二端图并在原始图中添加表示边的节点来处理。下一步是什么?对于GCN,似乎我们可以同时利用节点特征和图结构。但是,如果图中有不同类型的边怎么办?我们应该区别对待每一种关系吗?在这种情况下如何聚合邻居节点?最近有哪些先进的方法?在下一篇关于图形主题的文章中,我们将研究一些更复杂的方法。如何处理边的不同关系(兄弟,朋友,...)?