https://blog.csdn.net/wsp_1138886114/article/details/100700887
最近的图深度学习(Graph Deep Learning)关注的趋势增大。它主要包括以下五大类模型:
半监督方法:包括图神经网络(GNN)和图卷积网络(GCN)
无监督方法:图自动编码器(GAE)
图递归神经网络(Graph RNN)和图强化学习(Graph RL)
图嵌入(graph embedding)、网络嵌入(network embedding)、网络表示学习(network representation learning),这三个概念从原理上来说其实表达的是同一件事,核心思想就是“通过深度学习技术将图中的节点(或边)映射为向量空间中的点,进而可以对向量空间中的点进行聚类、分类等处理”。而接下来讲的图卷积神经网络就属于图嵌入技术的一种。
一、GNN概述
GNN 论文:https://github.com/thunlp/GNNPapers
GNN是Graph Neural Network的简称,是用于学习包含大量连接的图的联结主义模型。当信息在图的节点之间传播时GNN会捕捉到图的独立性。与标准神经网络不同的是,GNN会保持一种状态,这个状态可以代表来源于人为指定的深度上的信息。
图神经网络处理的数据就是图(Graph),而图是一种对节点和节点间关系建模的数据结构,是机器学习中唯一的非欧几里得数据,由顶点 (vertices) 和 边 (edges) 两个部件组成的一种数据结构,图分析可用于节点分类、链接预测和聚类。一个图 G 可以用它包含的 顶点 V 和边 E(有向或无向) 的集合来描述。
GNN的目标是学习到每个节点的邻居的状态嵌入,这个状态嵌入是向量且可以用来产生输出。GNN就是一种在图域上操作的深度学习方法。
图神经网络(Graph NNs)可能解决图灵奖得主Judea Pearl指出的深度学习无法做因果推理的核心问题。
1.1 GNN特点
基于CNN与graph embedding两种思想
- CNN特征提取:CNN可以提取大量本地紧密特征并组合为高阶特征,但CNN只能够操作欧几里得数据。CNN的关键在于局部连接、权值共享、多层使用;
- graph embedding降维操作:在低维向量上学习表示图节点、边或者子图。思想源于特征学习和单词嵌入,第一个图嵌入学习方法是DeepWalk,它把节点看做单词并在图上随机游走,并且在它们上面使用SkipGram模型;
GNN会在图结构上聚合信息,因此可以对输入/输出的元素及元素间的独立性进行建模。GNN还可以同时使用RNN核对图上的扩散过程进行建模。GNN也需要防止过拟合和欠拟合,由于图数据通常过大,所以可以采用随机游走的方式,来获取图的特征。
- GNN的优势
- 标准神经网络(CNN、RNN)无法解决图输入无序性,因为它们将点的特征看做是特定的输入;
- 两点之间的边代表着独立信息,在标准神经网络中,这种信息被看做是点的信息,而GNN可以通过图结构来进行传播,而不是将其看做是特征;通常而言,GNN更新隐藏节点的状态,是通过近邻节点的权值和;
- 高级人工只能需要更高的可解释性;标准神经网络可以生成合成图像或文档,但无法生成图;GNN可以生成无结构的数据(多种应用:文字分类、神经机器翻译、关系提取、图像分类);
- GNN不足
- 更新节点的隐藏状态是低效的;
- 在迭代中使用相同的参数,更新节点隐藏状态是时序的;
- 在边上有一些信息化的特征无法在原始GNN中建模;如何学习边的隐藏状态也是问题;
1.2 图类型与传播
原始GNN的输入图是带有标记信息的节点和无向边:
-
有向图(Directed Graphs ):信息更紧密;
图形的第一个变体是有向图。无向边可以看作是两个有向边,表明两个节点之间存在着关系。然而,有向边比无向边能带来更多的信息。例如,在一个知识图中,边从head实体开始到tail实体结束,head实体是tail实体的父类,这表明我们应该区别对待父类和子类的信息传播过程。有向图的实例有ADGPM (M. Kampffmeyer et. al. 2018)。 - 异质图(Heterogeneous Graphs):包含几种不同的节点,最简单的处理方式是one-hot feature vector;
- 带边信息的图(Edge-informative Graph):每个边也有信息、权值和类型,我们可以将边也变成节点,或者当传播时在不同的边上使用不同的权重矩阵;例如G2S和R-GCN。
1.3 训练方法与GNN变体
原始的图神经网络在训练和优化步骤有缺陷,它需要完整的图拉普拉斯,对大图而言计算力消耗大。更多的,层L上的节点嵌入是递归计算的,通过嵌入它的所有L-1层的邻居。因此,单层节点是成倍增长的,因此对节点的计算消耗巨大。且GCN是对每个固定图进行独立训练的,因此泛化能力不好。
使用不同训练方法的图变体
以下是几种改善方式:
- GraphSAGE:将全图拉普拉斯替换为可学习聚合函数,是使用信息传递并生长到未见节点的关键,GraphSAGE还使用了邻居采样来避免接收域爆炸;
- FastGCN:对采样算法做了更深的改进,FastGCN为每层直接采样接受域,而非对每个节点进行邻居采样;
- control-variate based stochastic approximation:使用节点的历史激励作为控制随机数,此方法限制接受域为1跳邻居,但使用历史隐藏状态作为可接受最优化方法;
-
Co-Training GCN and Self-Training GCN:
用于解决GCN需要许多额外的有标记数据及卷积过滤器的局部特征的限制,因此使用了此方法来扩大训练数据集,Co-Training方法为训练数据找到最近的邻居,Self-Training则采用了类似boosting的方法。
1.4 传播步骤与GNN变体
-
对GNN而言,传播步骤是非常重要的,它可以获得节点(边)的隐藏状态。传播步骤使用的方法通常是不同的聚合函数(在每个节点的邻居收集信息)和特定的更新函数(更新节点隐藏状态)。
-
在传播步骤进行修改的GNN变体
卷积操作
- 光谱方法:光谱方法在图的光谱表示上运行,学习的过滤器是基于拉普拉斯特征权重的,因此与图的结构紧密相关,难以泛化;
- 非光谱方法:直接在图上定义卷积,对紧密相近的节点进行操作,主要的挑战就是非光谱方法在不同大小的邻居上的定义和保持CNN的局部变量,非光谱方法具有点分类和图分类两种;
Gate闸门机制
- 在GNN中使用门限机制是为了减少限制并改善长期的图结构上的信息传递。
Attention注意力机制
- 注意力机制已经成功的应用于基于时序的任务,例如机器翻译、机器阅读等。GAT在传播步骤使用了注意力机制,会通过节点的邻居来计算节点的隐藏状态,通过自注意策略。
Skip connection
- 许多机器学习的应用都会使用多层神经网络,然而多层神经网络不一定更好,因为误差会逐层累积,最直接定位问题的方法,残差网络,是来自于计算机视觉。即使使用了残差网络,多层GCN依旧无法像2层GCN一样表现良好。
- 有一种方法是使用高速路GCN(Highway GCN),它像高速路网络一样使用逐层门限。
二、GNN框架
框架的目的是集合不同的模型。
有论文提出message passing neural network(MPNN),可以同一化多种图神经网络和图卷积网络方法。
non-local neural network(NLNN)则同一化了几个自注意方法。
graph network(GN)统一了MPNN和NLNN
还有其他的Interaction Networks,Neural Phsics Engine,CommNet, structure2vec,GGNN,Relation Network,Deep Sets和Point Net。
2.1 GNN的三大通用框架
MPNN
J. Gilmer等人(J. Gilmer et. al. 2017)提出了消息传递神经网络(message passing neural network, MPNN),统一了各种图神经网络和图卷积网络方法。
MPNN是监督学习的框架,它抽象了几个最流行的用于处理图结构数据的模型的相似性。模型包括两个阶段,信息传递阶段和读出阶段。
- 信息传递阶段:
就是传播阶段,会运行T次。是以信息传递函数和端点更新函数为定义的。 - 读出阶段:
读出阶段会使用读出函数来对整个图计算特征向量。
NLNN
X. Wang等人(X. Wang et. al. 2017)提出了非局部神经网络(non-local neural network, NLNN),它结合了几种“self-attention”风格的方法。
NLNN是用来对深度神经网络的长范围的独立性。non-local操作来源于经典non-local mean操作在计算机视觉上的应用。non-local操作会在一个位置上计算响应,同时加权了的特征和在所有点上。这些位置可以是空间、时间或者空间时间。因此NLNN可以看做是不同的自注意方法的统一。
一般的,non-local操作被如下定义:
hi′=1C(h)∑∀jf(hi,hj)g(hj)\mathbf{h}_i' = \frac{1}{ \mathcal{C}(\mathbf{h})} \sum_{\forall_j}f(\mathbf{h}_i,\mathbf{h}_j)g(\mathbf{h}_j)hi′=C(h)1∀j∑f(hi,hj)g(hj)
其中,i是输出位置的索引,j是指出所有可能位置的索引,f函数计算i和j之间的缩放值,这可以代表他们之间的联系,g函数代表了输入的变换以及公式的系数用于正则化结果。当使用不同的f和g函数时,将得到不同的non-local操作实例,最简单的g函数就是线性变换了。以下是一些可能选择的f函数:
- Gaussian;
- Embedded Gaussian;
- Dot product;
- Concatenation;
P. W. Battaglia等人(P. W. Battaglia et. al. 2018)提出了图网络(graph network, GN),它统一了统一了MPNN和NLNN方法以及许多其他变体,如交互网络(Interaction Networks),神经物理引擎(Neural Physics Engine),CommNet,structure2vec,GGNN,关系网络(Relation Network),Deep Sets和Point Net。
GN
首先是图的定义然后是GN块,核心GN计算单元,计算步骤,最后是GN的基本设计原则。
- Graph definition:
图被定义为三元组,(全局属性,节点集合,边集合); - GN block:
GN块包括三个更新函数和三个聚合函数; - Computation steps;
- Design Principles:
- GN的设计基于三个基本原则:
- flexible representation
configurable within-block structure
composable multi-block architectures
三、GNN的应用场景
GNN的应用场景非常多,因为GNN是应用于图信息的,而多种多样的数据都可以划分为图数据。以下是GNN的应用场景:
社交网络;
知识图谱;
推荐系统;
文字分类;
神经网络翻译;
关系提取;
图分类;
…
GNN 在对图形中节点间的依赖关系进行建模方面能力强大,使得图分析相关的研究领域取得了突破性进展。
在这里我们对GNN的应用进行简单的介绍,首先我们将其划分为三种场景的应用:
- 结构化场景:数据有明显的联系结构;
-
非结构化场景:联系结构不明显,例如图像、文字等;
GNN在非结构场景中的应用,但我们没有找到从原始数据中生成图的最佳方法。在图像域中,一些研究可以利用CNN获取特征图,然后对其进行上采样,形成超像素作为节点,还有的直接利用一些对象检测算法来获取对象节点。在文本域中,有些研究使用句法树作为句法图,还有的研究采用全连接图。因此,关键是找到图生成的最佳方法,使GNN在更广泛的领域发挥更大的作用。 - 其他的应用场景:生成模型、组合最优化问题等;
启发
- GNN是对图数据进行处理的深度学习神经网络,它可以实现对异构数据的学习与表示,这里的图数据与我们通常所说的图是不一样的,这里的图指的是数据结构中的那种图以及离散数学中图论,其中不同的节点表示不同的信息。因此,图即代表实体及实体之间的联系。
在我们的日常生活中,图是无处不在的。而图结构数据具有一定的复杂性,因为图结构的数据节点通常具有是具有不同的类型的,因此对普通的神经网络而言处理起来具有一定的难度。
https://www.jianshu.com/p/f864bac6cb7a
拉普拉斯矩阵是图论中用到的一种重要矩阵,给定一个有n个顶点的图 G=(V,E),其拉普拉斯矩阵被定义为 L = D-A,D其中为图的度矩阵,A为图的邻接矩阵。例如,给定一个简单的图,如下(例子来自wiki百科):

把此“图”转换为邻接矩阵的形式,记为A:

把W的每一列元素加起来得到N个数,然后把它们放在对角线上(其它地方都是零),组成一个N×N的对角矩阵,记为度矩阵D,如下图所示。其实度矩阵(对角线元素)表示的就是原图中每个点的度数,即由该点发出的边之数量。

根据拉普拉斯矩阵的定义L = D-A,可得拉普拉斯矩阵L 为:

显然,拉普拉斯矩阵都是对称的。此外,另外一种更为常用的拉普拉斯矩阵形式是正则化的拉普拉斯矩阵(Symmetric normalized Laplacian),定义为:

该矩阵中的元素由下面的式子给出:

https://blog.csdn.net/u012325865/article/details/102466223

近年来,图神经网络(GNN)在社交网络、知识图、推荐系统甚至生命科学等各个领域得到了越来越广泛的应用。GNN在对图节点之间依赖关系进行建模的强大功能,使得与图分析相关的研究领域取得了突破。本文介绍了图神经网络的基本原理,以及两种高级的算法,DeepWalk和GraphSage。
图(Graph)
在讨论GNN之前,我们先来了解一下什么是图。在计算机科学中,图是由顶点和边两部分组成的一种数据结构。图G可以通过顶点集合V和它包含的边E来进行描述。
根据顶点之间是否存在方向依赖关系,边可以是有向的,也可以是无向的。
图 1有向图
顶点也称为节点,在本文中,这两个术语是可以互换。
图神经网络
图神经网络是一种直接作用于图结构上的神经网络。GNN的一个典型应用是节点分类,本质上,图中的每个节点都与一个标签相关联,我们希望预测未标记节点的标签。本文将介绍该论文中描述的算法,
在节点分类问题中,每个节点v都可以用其特征x_v表示并且与已标记的标签t_v相关联。给定部分标记的图G,目标是利用这些标记的节点来预测未标记的节点标签。它通过学习得到每个节点的d维向量(状态)表示为h_v,同时包含其相邻节点的信息。
x_co[v] 代表连接顶点v的边的特征,h_ne[v]代表顶点v的邻居节点的嵌入表示,x_ne[v]代表顶点v的邻居节点特征。f是将输入投影到d维空间的转移函数,由于要求出h_v的唯一解,我们应用Banach不动点理论重写上述方程进行迭代更新。
H和X分别表示所有h和x的连接,通过将状态h_v以及特征x_v传递给输出函数g来计算GNN的输出。
这里的f和g都可以解释为全连接前馈神经网络,L1损失可以直接表述为如下函数:
它可以通过梯度下降进行优化,但是该论文指出的原始GNN有三个主要局限:
1.如果放宽了“固定点”的假设,则可以利用多层感知器来学习更稳定的表示,并删除迭代更新过程。 这是因为在原始方法中,不同的迭代使用转移函数f的相同参数,而不同MLP层中的不同参数允许分层特征提取;
2.不能处理边缘信息(例如知识图谱中的不同边可能表示节点之间的不同关系);
3. 固定点会限制节点分布的多样化,因此可能不适合学习节点表示。
虽然现在已经提出了几种GNN变体来解决上述问题。 但是他们不是论文的重点。
DeepWalk
DeepWalk是第一个以无监督学习的节点嵌入算法。它在训练过程中类似于词嵌入。它的目的是让图中的节点分布和语料库中的单词分布都遵循幂律,如下图所示:
算法包括两个步骤:
1. 在图中的节点上执行随机游走生成节点序列;
2. 运行skip-gram,根据步骤1中生成的节点序列学习每个节点的嵌入;
在随机游走过程中,下一个节点是从前一节点的邻居统一采样。然后将每个序列截短为长度为2 | w |+1的子序列,其中w表示skip-gram中的窗口大小。如果您不熟悉skip-gram,我之前的博客文章已经向您介绍它的工作原理。
在论文中,分层softmax用于解决由于节点数量庞大而导致的softmax计算成本过高的问题。为了计算每个单独输出元素的softmax值,我们必须为所有元素k计算ek。
图 2 softmax的定义
因此,原始softmax的计算时间是 O(|V|) ,其中其中V表示图中的顶点集。
多层的softmax利用二叉树来解决softmax计算成本问题。 在二叉树中,所有叶子节点(上面所说的图中的v1,v2,... v8)都是图中的顶点。 在每个内部节点中(除了叶子节点以外的节点,也就是分枝结点),都通过一个二元分类器来决定路径的选取。 为了计算某个顶点v_k的概率,可以简单地计算沿着从根节点到叶子节点v_k的路径中的每个子路径的概率。 由于每个节点的孩子节点的概率和为1,因此在多层softmax中,所有顶点的概率之和等于1的特性仍然能够保持。如果n是叶子的数量,二叉树的最长路径由O(log(n))限定,因此,元素的计算时间复杂度将减少到O(log | V |)。
图 3多层softmax
在训练DeepWalk GNN之后,模型已经学习到了每个节点的表示,如下图所示。不同的颜色在输入图中(图a)表示不同标签。 我们可以看到,在输出图中,具有相同标签的节点聚集在一起,而具有不同标签的大多数节点被正确分开。
然而,DeepWalk的主要问题是它缺乏泛化能力。每当有新节点加入到图中时,它必须重新训练模型以正确表示该节点。因此,这种GNN不适用于图中节点不断变化的动态图。
GraphSage
GraphSage提供了解决上述问题的方案,它以归纳方式学习每个节点的嵌入。具体来讲,它将每个节点用其邻域的聚合重新表示。因此,即使在训练期间未出现的新节点,也仍然可以由其相邻节点正确地表示。下图展示了GraphSage的算法过程:
外层for循环表示更新迭代次数,而 h^k_v 表示节点v在迭代第 k次时的本征向量。在每次迭代时,将通过聚合函数,前一次迭代中v和v领域的本征向量以及权重矩阵W^k来更新h^k_v。这篇论文提出了三种聚合函数:
1.均值聚合器:
均值聚合器取一个节点及其邻域的本征向量的平均值。
与原始方程相比,它删除了上述伪代码中第5行的连接操作。这种操作可以被视为"skip-connection" ("跳连接"),这篇论文后面将证明其可以在很大程度上提高模型的性能。
2. LSTM聚合器:
由于图中的节点没有任何顺序,因此他们通过互换这些节点来随机分配顺序。
3.池聚合器:
此运算符在相邻顶点集上执行逐元素池化函数。下面显示了最大池的例子:
可以用平均池或任何其他对称池函数替换这种最大池函数。尽管均值池和最大池聚合器性能相似,但是池聚合器(也就是说采用最大池函数)被实验证明有最佳的性能。 论文使用max-pooling作为默认聚合函数。损失函数定义如下:
其中u 和v 共同出现在一定长度的随机游走中,而 v_n 是不与u共同出现的负样本。这种损失函数鼓动节点在投影空间中更靠近嵌入距离更近的节点,而与那些相距很远的节点分离。通过这种方法,节点将获得越来越多其邻域的信息。
GraphSage通过聚合其附近的节点,可以为看不见的节点生成可表示的嵌入位置。它让节点嵌入的方式可以被应用于涉及动态图的研究领域,这类动态图的图的结构是可以不断变化的。例如,Pinterest采用了GraphSage的扩展版本PinSage作为他们的内容探索系统的核心。
https://blog.csdn.net/Frank_LJiang/article/details/95194733
1 简单的图的参数介绍
G=(V,E,A)\mathcal { G } = ( V , E , A )G=(V,E,A)
- V(N个)是节点集合, 只描述了存在的节点
- E是边集合, 只描述了存在的连接(边)
- A(NxN)是图的邻接矩阵, 描述了节点之间的连接关系, 当对应的边eij(连接vi,vj的边)存在的时候, 则对应的Aij = wij> 0, 若eij不存在, 则Aij = 0
- D(NxN)是图的度矩阵, 描述了节点自身连接的边的数目, 是对角矩阵,Dii=(∑Ai)D_{ii} = ( \sum A_i)Dii=(∑Ai)(度矩阵和邻接矩阵的关系可以参考这里)
- X(NxF)是节点属性矩阵, 每个节点对应拥有一个长为F的属性向量, L=D−A,Ln=In−D−1/2AD−1/2L=D-A, L_n=I_n-D^{-1/2}AD^{-1/2}L=D−A,Ln=In−D−1/2AD−1/2,图可以用节点属性来关联
- L(NxN)是图的拉普拉斯矩阵, 归一化的拉普拉斯矩阵是图的一个鲁棒的数学表示.
归一化图拉普拉斯矩阵具有实对称半正定的性质,也就是可以进行特征分解得到特征值和特征向量.
2 图神经网络分类
图网络有很多结构, 这里按照最新的综述论文 A Comprehensive Survey on Graph Neural Networks 文中的分类方式, 主要分为:
- graph convolution networks
- graph attention networks
- graph auto-encoders
- graph generative networks(图生成网络)
- graph spatial-temporal networks(图时空网络)
这里主要介绍图卷积网络GCN. 因为GCN在捕获结构化依赖上扮演着中心角色.
3 GCN: 由谱方法到空域方法
Inspired by the huge success of convolutional networks in the computer vision domain, a large number of methods that re-define the notation of convolutionfor graph data have emerged recently.
These approaches are under the umbrella of graph convolutional networks (GCNs). The first prominent research on GCNs is presented in Bruna et al. (2013), which develops a variant of graph convolution based on spectral graph theory [20]. Since that time, there have been increasing improvements, extensions, and approximations on spectral-based graph convolutional networks [12], [14],[21], [22], [23].
As spectral methods usually handle the whole graph simultaneously and are difficult to parallel or scale to large graphs, spatial-based graph convolutional networks have rapidly developed recently [24], [25], [26],[27]. These methods directly perform the convolution in the graph domain by aggregating the neighbor nodes’ information. Together with sampling strategies, the computation can be performed in a batch of nodes instead of the whole graph[24], [27], which has the potential to improve the efficiency.
译文:
受卷积网络在计算机视觉领域取得巨大成功的启发,最近出现了大量重新定义图形数据卷积表示法的方法。
这些方法属于图卷积网络(GCNs)的范畴。Bruna等人(2013)首次提出了对GCNs的突出研究,该研究基于频谱图理论[20]开发了一种图形卷积的变体。从那时起,基于频谱的图卷积网络[12]、[14]、[21]、[22]、[23]得到了越来越多的改进、扩展和逼近。
由于频谱方法通常同时处理整个图,且难以并行或缩放到大型图,因此基于空间的图卷积网络近年来发展迅速。这些方法通过聚集相邻节点的信息,直接在图域中进行卷积。结合采样策略,可以在一批节点中进行计算,而不是整个图[24]、[27],具有提高效率的潜力。
3.1 GCN概述
将应用于传统数据的卷积操作, 泛化到了图数据上面. 关键是学习一个函数f, 来通过集成自己和邻居的特征生成节点的表示. GCN在构建其他复杂的图神经网络的任务上, 扮演着重要的角色. 包括auto-encoder-based models, generative models, spatial-temporal networks等.
对于GCN而言, 在集成邻居的过程的时候, 使用的权重是无参数的, 而GAN(图注意力网络)使用了一个端到端神经网络架构捕获的权重, 来使得更重要的节点拥有更大的权重.(这里更多的是表述空域的GCN)
对于图卷积网络, 其实是在尝试通过图谱理论或者局部空间来定义图卷积的方式来在图数据上复制CNN的成功.
3.2 GCN的输出机制
使用图结构和节点内容信息作为输入, GCN的输出使用以下不同的机制, 可以关注于不同的图分析任务.
- 节点级输出与节点回归和分类任务相关. 图卷积模块直接给出节点潜在的表达, 多层感知机或者softmax层被用作最终的GCN层.
- 边级输出与边分类和连接预测任务相关. 为了预测边的标记和连接强度, 一个附加函数将会把来自图卷积模块的两个节点的潜在表达作为输入.
- 图级输出与图分类任务有关. 为了获取一个图级的紧凑表达, 池化模块被用来粗化图到子图, 或用来加和/平均节点表达.
这里有一个总结的表, 总结了主要方法的情况:
对于图卷积网络, 是可以通过半监督/全监督/无监督的方式进行端到端训练的, 注意取决于学习任务和标签信息的获取.
3.3 GCN的不同方法
- 谱方法通过从图信号处理的视角引入滤波器来定义图卷积, 这里图卷积操作被解释为移除图信号中的噪声
- 空域方法将图卷积表达为从邻域中集成特征信息的过程.
- 当GCN在节点等级上操作的时候, 图池化模块, 可以超入到GCN层中, 来粗化图到高级的子图.这样一个结构被用来提取图级表达和处理图分类任务.
3.3.1 基于谱方法的GCN
3.3.1.1 初始
基于图信号处理的知识, 图上的卷积可以被定义为: x∗Ggθ=UgθUTx\mathbf { x } * _ { G } \mathbf { g } _ { \theta } = \mathbf { U } \mathbf { g } _ { \theta } \mathbf { U } ^ { T } \mathbf { x }x∗Ggθ=UgθUTx
其中gθ=diag(UTg)\mathbf { g } _ { \theta } = \operatorname { diag } \left( \mathbf { U } ^ { T } \mathbf { g } \right)gθ=diag(UTg)表示滤波器. 可以看做是L特征值的函数, 也就是 gθ(Λ)g _ { \theta } ( \Lambda )gθ(Λ).
这里有x∈RN\mathbf { x } \in \mathbf { R } ^ { N }x∈RN, xi表示第i个节点的值(这里相当于节点的特征向量长度只有1).
这个等式计算消耗大, 计算L的特征分解对于大图来说可能是非常昂贵的.
在后续的改进中, 这里的信号的设定被进一步扩展, 输入信号表示为: Xk∈RN×fk−1\mathbf { X } ^ { k } \in \mathbf { R } ^ { N \times f _ { k - 1 } }Xk∈RN×fk−1, 这里fk−1f_k-1fk−1表示输入通道数, fkf_kfk表示输出通道数. 滤波器也整合表示为gθ=Θi,jk\mathbf { g } _ { \theta } = \Theta _ { i , j } ^ { k }gθ=Θi,jk, 表示为:
X:,jk+1=σ(∑i=1fk−1UΘi,jkUTXs,ik)(j=1,2,⋯ ,fk)\mathbf { X } _ { : , j } ^ { k + 1 } = \sigma \left( \sum _ { i = 1 } ^ { f _ { k - 1 } } \mathbf { U } \Theta _ { i , j } ^ { k } \mathbf { U } ^ { T } \mathbf { X } _ { \mathbf { s } , i } ^ { k } \right) \quad \left( j = 1,2 , \cdots , f _ { k } \right)X:,jk+1=σ(∑i=1fk−1UΘi,jkUTXs,ik)(j=1,2,⋯,fk)
这里的 σ 表示的是一个非线性转换.
3.3.1.2 切比雪夫K阶截断: ChebNet
之后有人利用切比雪夫多项式来近似表示了滤波器, 进一步简化了公式的计算:
gθ=∑i=1KθiTk(Λ~)\mathbf { g } _ { \theta } = \sum _ { i = 1 } ^ { K } \theta _ { i } T _ { k } ( \tilde { \boldsymbol { \Lambda } } )gθ=∑i=1KθiTk(Λ~),whereΛ~=2Λ/λmax−IN\tilde { \boldsymbol { \Lambda } } = 2 \Lambda / \lambda _ { \max } - \mathbf { I } _ { \mathrm { N } }Λ~=2Λ/λmax−IN
Chebyshev polynomials are defined recursively by Tk(x)=2xTk−1(x)−Tk−2(x)T _ { k } ( x ) = 2 x T _ { k - 1 } ( x ) - T _ { k - 2 } ( x )Tk(x)=2xTk−1(x)−Tk−2(x) with T0(x)=1T _ { 0 } ( x ) = 1T0(x)=1 and T1(x)=xT _ { 1 } ( x ) = xT1(x)=x
因此卷积操作进一步表示为:
x∗Ggθ=U(∑i=1KθiTk(Λ~))UTx=∑i=1KθiTi(L~)x where L~=2L/λmax−IN\begin{aligned} \mathbf { x } * _ { G } \mathbf { g } _ { \theta } & = \mathbf { U } \left( \sum _ { i = 1 } ^ { K } \theta _ { i } T _ { k } ( \tilde { \boldsymbol { \Lambda } } ) \right) \mathbf { U } ^ { T } \mathbf { x } \\ & = \sum _ { i = 1 } ^ { K } \theta _ { i } T _ { i } ( \tilde { \mathbf { L } } ) \mathbf { x } \\ \text { where } \tilde { \mathbf { L } } = 2 \mathbf { L } / \lambda _ { \max } - \mathbf { I } _ { \mathrm { N } } \end{aligned}x∗Ggθ where L~=2L/λmax−IN=U(i=1∑KθiTk(Λ~))UTx=i=1∑KθiTi(L~)x
这个时候, 可以看这个表达式, 这个卷积的计算只依赖于中心节点的K阶邻居.(K步以内可达的节点). 而且这样定义的滤波器也是稀疏的.
3.3.1.3 一阶ChebNet
当前面的公式中, K=1的时候, 并且使得λmax=2\lambda_{max}=2λmax=2, 则进一步简化为:
x∗Ggθ=θ0x−θ1D−12AD−12x\mathbf { x } * _ { G } \mathbf { g } _ { \theta } = \theta _ { 0 } \mathbf { x } - \theta _ { 1 } \mathbf { D } ^ { - \frac { 1 } { 2 } } \mathbf { A } \mathbf { D } ^ { - \frac { 1 } { 2 } } \mathbf { x }x∗Ggθ=θ0x−θ1D−21AD−21x
为了进一步减少参数, 以避免过拟合, 这里进行了进一步简化, 让两个 θ 相反. 也就是θ=θ0=−θ1\theta = \theta _ { 0 } = - \theta _ { 1 }θ=θ0=−θ1, 这就得到了最终简化后的定义:
x∗Ggθ=θ(In+D−12AD−12)x\mathbf { x } * _ { G } \mathbf { g } _ { \theta } = \theta \left( \mathbf { I } _ { \mathbf { n } } + \mathbf { D } ^ { - \frac { 1 } { 2 } } \mathbf { A } \mathbf { D } ^ { - \frac { 1 } { 2 } } \right) \mathbf { x }x∗Ggθ=θ(In+D−21AD−21)x
这里最终表示为:
Xk+1=A~XkΘ\mathbf { X } ^ { \mathbf { k } + \mathbf { 1 } } = \tilde { \mathbf { A } } \mathbf { X } ^ { \mathbf { k } } \ThetaXk+1=A~XkΘ
where A~=IN+D−12AD−12\tilde { \mathbf { A } } = \mathbf { I } _ { \mathbf { N } } + \mathbf { D } ^ { - \frac { 1 } { 2 } } \mathbf { A } \mathbf { D } ^ { - \frac { 1 } { 2 } }A~=IN+D−21AD−21
通过一阶ChebNet定义的图卷积在空间上是局部的, 这弥补了谱方法与空域方法的差别. 输出的每行表示每个节点通过一个加权集成了自身和相邻节点的信息了的线性转换来获得的潜在表征.
然而, 一阶ChebNet主要的问题是, 在批量训练过程中,随着1stChebNet层数的增加,计算代价呈指数增长. 最后一层中的每个节点必须在以前的层中递归地扩展其邻域. 一些工作已这对这些问题进行了改进.
3.3.1.4 自适应图卷积网络AGCN
为了探索没有被图拉普拉斯矩阵指定的隐藏结构关系, 有人提出了AGCN, AGCN用一个所谓的残差图来扩充一个图,这个图是通过计算节点之间的成对距离来构造的, 尽管能够捕获互补的关系信息, 但是它的计算复杂度为O(N2)O(N^2)O(N2).
3.3.1.5 谱方法小结
谱方法主要依赖于拉普拉斯矩阵的分解, 它有三种影响:
- 首先,对图的任何扰动都会导致特征基的改变。
- 其次,学习的过滤器是域相关的,这意味着它们不能应用于具有不同结构的图。
- 第三,特征分解需要O(N3)O(N^3)O(N3)的计算和O(N2)O(N^2)O(N2)的内存。
对于谱方法, 通常它们都需要载入整个图到内存中, 来应用图卷积, 这对于处理大的图来说, 不是很有效率.
3.3.2 基于空域方法GCN
空域方法定义卷积主要基于节点的空间关系. 为了关联图和图像, 图像的每个像素认为是节点. 每个像素直接连接到它的相邻像素.
由于相邻节点的特殊排序,可训练权值可以在不同的位置共享。类似地,对于一般图,基于空间的图卷积采用中心节点表示和其邻居表示的聚合来获得该节点的新表示。为了探索节点感受域的深度和宽度,通常的做法是将多个图形卷积层堆叠在一起.
根据卷积层叠加方法的不同,空间GCN又可分为基于递归(recurrent-based)的GCN和基于合成(composition-based)的空间GCN两大类. 基于递归的方法使用相同的图卷积层来更新隐藏表示,而基于合成的方法使用不同的图卷积层来更新隐藏表示.
3.3.2.1 基于递归的空间GCN(Recurrent-based Spatial GCNs)
基于递归的方法主要想法是更新节点节点的隐藏状态直到得到一个稳定的固定点. 这是通过施加对递归函数的约束,或者使用门控递归单元结构,或者异步地和随机地更新节点潜在表示。
图神经网络GNN(特指早期的一种结构)
这是图神经网络的早期工作, GNN递归更新节点的潜在表征, 直到收敛. 换句话说,从扩散过程的角度来看,每个节点与邻居交换信息直到达到平衡为止。
为了处理异质图(heterogeneous graph), 这类GNN的空间图卷积被定义为
hvt=f(1v,1co[v],hnet−1[v],lne[v])\mathbf { h } _ { v } ^ { t } = f \left( 1 _ { \mathbf { v } } , 1 _ { c o } [ v ] , \mathbf { h } _ { n e } ^ { t - 1 } [ v ] , \mathbf { l } _ { n e } [ v ] \right)hvt=f(1v,1co[v],hnet−1[v],lne[v])
这里使用了针对节点v的标签属性, 边的标签属性, 其邻居在时间步t的隐藏表征, 以及其邻居的标签属性.
为了确保收敛, 递归函数必须是一个约束映射, 这个会在映射之后压缩两点之间的距离. 若f()是一个神经网络, 那么一个惩罚项就会使用在参数的Jacobian矩阵上.
Jacobian矩阵是一阶偏导数以一定的方式排列成的矩阵.
GNN使用Almeida-Pineda算法来训练模型. 核心思想是通过运行传播过程到达固定点,然后给出收敛解的后向过程.
门控图神经网络(GGNN)
GGNN使用门控递归单元(GRU)作为递归函数, 来讲递归降低为一个固定的步数.
GGNN的空间图卷积定义为:
hvt=GRU(hvt−1,∑u∈N(v)Whut)\mathbf { h } _ { v } ^ { t } = G R U \left( \mathbf { h } _ { v } ^ { t - 1 } , \sum _ { u \in N ( v ) } \mathbf { W h } _ { u } ^ { t } \right)hvt=GRU(hvt−1,∑u∈N(v)Whut)
不同于GNN, GGNN使用基于时间的反向传播算法(BPTT) 来学习参数, 它的优势在于不用再学习约束参数来确保收敛了. 然而,BPTT训练的缺点是它 牺牲了时间和存储的效率. 尤其是在处理大图的时候, GGNN会在所有节点上运行递归函数多次, 需要所有节点的中间态被存储下来.
随机稳态嵌入SSE
为了提升学习效率, SSE算法用来随机地更新节点的潜在表征, 以一种异步的方式. 下面是SSE的迭代算法.
如上, SSE迭代评估节点潜在表征并且使用抽样的批数据更新参数.
为了确保收敛到稳态, 递归函数被定义为一个历史状态和新状态的加权平均
hvt=(1−α)hvt−1+αW1σ(W2[xv,∑u∈N(v)[hut−1,xu]])  (10)\mathbf { h } _ { \mathbf { v } } ^ { t } = ( 1 - \alpha ) \mathbf { h } _ { \mathbf { v } } ^ { t - 1 } + \alpha \mathbf { W } _ { \mathbf { 1 } } \sigma \left( \mathbf { W } _ { 2 } \left[ \mathbf { x } _ { \mathbf { v } } , \sum _ { u \in N ( v ) } \left[ \mathbf { h } _ { \mathbf { u } } ^ { t - 1 } , \mathbf { x } _ { \mathbf { u } } \right] \right] \right) \; (10)hvt=(1−α)hvt−1+αW1σ(W2[xv,∑u∈N(v)[hut−1,xu]])(10)
上式中, 第二项是新的结果, 结合第一项的历史状态, 可以得到新的真正的状态.
虽然对邻域信息的求和隐含地考虑了节点度,但这种求和的规模是否影响该算法的稳定性仍是个问题.
3.3.2.2 基于合成的空间GCN(Composition Based Spatial GCNs)
基于合成的方法更新节点表征, 通过堆叠多个图卷积层.
消息传递神经网络(MPNN)
MPNN包含两个阶段, 消息传送阶段(message passing phase)和读出阶段(readout phase). 消息传送阶段实际上运行T步的空间图卷积. 图卷积操作通过消息函数Mt()M_t()Mt()和一个更新函数Ut()U_t()Ut()来定义:
hvt=Ut(hvt−1,∑w∈N(v)Mt(hvt−1,hwt−1,evw))\mathbf { h } _ { v } ^ { t } = \mathbf { U } _ { t } \left( \mathbf { h } _ { v } ^ { t - 1 } , \sum _ { w \in N ( v ) } M _ { t } \left( \mathbf { h } _ { v } ^ { t - 1 } , \mathbf { h } _ { w } ^ { t - 1 } , \mathbf { e } _ { v w } \right) \right)hvt=Ut(hvt−1,∑w∈N(v)Mt(hvt−1,hwt−1,evw))
通过函数M传递来自旧状态的消息得到新的状态, 使用U来结合新旧状态进行更新, 得到当前时间的真正状态.
这里的读出阶段实际上是一个池化操作, 产生了一个整个图的表征, 基于每个单独节点的隐藏表征. 它被定义为:
y^=R(hvT∣v∈G)\hat { \mathbf { y } } = R \left( \mathbf { h } _ { v } ^ { T } | v \in G \right)y^=R(hvT∣v∈G)
通过函数R的输出, 最终的表征y被用来处理图级预测任务. 很多的其他工作都可以看做是使用了U,M的不同形式的结果.
GraphSage
引入了聚合函数的概念来定义图的卷积, 聚合函数实质上是聚合节点的邻域信息. 它必须对节点顺序的排列具有不变性, 例如求均值、和、极大值函数等.
这样的图卷积操作可以被定义为:
hvt=σ(Wt⋅aggregatek(hvt−1,{huk−1,∀u∈N(v)})\mathbf { h } _ { v } ^ { t } = \sigma \left( \mathbf { W } ^ { t } \cdot aggregate _ { k } \left( \mathbf { h } _ { v } ^ { t - 1 } , \left\{ \mathbf { h } _ { u } ^ { k - 1 } , \forall u \in \mathcal { N } ( v ) \right\} \right)\right.hvt=σ(Wt⋅aggregatek(hvt−1,{huk−1,∀u∈N(v)})
GraphSage并没有在所有节点上更新状态, 而是提出了一个批学习算法, 这个提升了对于大图的可扩展性. 其学习过程主要有三步:
- 首先,对节点的局部k跳邻域进行固定大小的采样。
- 其次,它通过聚合中心节点的邻居特征信息来获得中心节点的最终状态。
- 最后,它使用中心节点的最终状态进行预测并反向传播错误。
对于GraphSage而言, 计算损耗随着跳的阶段的增加, 而呈指数增长. 这导致该算法不能有太深的结构, 然而, 实际测试, 跳两步的GraphSage已经可以是实现很高的性能了.
3.3.2.3 空域GCN的其他变体
扩散卷积神经网络(DCNN)
- 扩散卷积神经网络(DCNN)提出了一种图卷积网络,它封装了图的扩散过程。
- A hidden node representation is obtained by independently convolving inputs with power series of transition probability matrix.(通过将输入与转移概率矩阵的幂级数进行独立卷积,得到了一个隐藏节点表示。)
- Though covering a larger receptive field through higher orders of transition matrix, the DCNN model needs O(N2mH) memory, causing severe problems when applying it to large graphs.(DCNN模型虽然通过更高阶的转换矩阵覆盖了更大的接受域,但需要O(N2mH)内存,在应用于大图时存在严重的问题。)
PATCHY-SAN
- uses standard convolution neural network (CNN) to solve graph classification tasks. To do this, it converts graph-structured data into grid-structured data.(使用标准卷积神经网络(CNN)求解图的分类任务。为此,它将图形结构数据转换为网格结构数据。)
- Finally, after the grid-structured data with fixed-size is formed, PATCHY-SAN employed standard CNN to learn the graph hidden representations.(最后,在固定大小的网格结构数据形成后,PATCHY-SAN使用标准CNN学习图形隐藏表示。)
- Utilizing standard CNN in GCNs has the advantage of keeping shift-invariance, which relies on the sorting function.(在GCNs中使用标准CNN具有保持移位不变性的优点,它依赖于排序函数。)
- As a result, the ranking criteria in the node selection and ordering process is of paramount importance. In PATCHY-SAN, the ranking is based on graph labellings. However, graph labellings only take graph structures into consideration, ignoring node feature information.(因此,节点选择和排序过程中的排序标准至关重要。在PATCHY-SAN,排名是基于图表标签。然而,图标签只考虑图的结构,忽略了节点特征信息。)
大规模图卷积网络(LGCN)
- 在后续工作中,LGCN提出了一种基于节点特征信息的排序方法.
- Unlike PATCHY-SAN, LGCN uses standard CNN to generate node-level outputs.(与PATCHY-SAN不同,LGCN使用标准CNN生成节点级输出。)
- For each node, LGCN assembles a feature matrix of its neigborhood and sortes this feature matrix along each column. The first k rows of the sorted feature matrix are taken as the input grid-data for the target node.(对于每个节点,LGCN组装其邻近域的特征矩阵,并沿着每一列对该特征矩阵进行排序。将排序后的特征矩阵的前k行作为目标节点的输入网格数据。)
- 最后,LGCN将一维CNN应用于最终的输入,得到目标节点的隐藏表示.
- 虽然在Patchy-SAN中导出图标签需要复杂的预处理,但在LGCN中对特征值进行排序不需要预处理步骤,从而使其效率更高。
- 为了适应大规模图的情况,LGCN提出了一种子图训练策略,将采样的子图放入一个小批处理中.
混合模型网络(MoNet)
- 将标准CNN与非欧几里得域上的卷积结构统一起来.
- 在融合邻域特征信息时,有几种基于空间的方法忽略了节点与邻域之间的相对位置,而MoNet引入了伪坐标和权函数,使得节点的邻域权重由节点与其邻域之间的相对位置(伪坐标)来确定.
- 在图上例如GCN, DCNN(扩散卷积神经网络)都可以被泛化为一个特殊MoNet的例子.
- However these approaches under the framework of MoNet have fixed weight functions. MoNet instead proposes a Gaussian kernel with learnable parameters to freely adjust the weight function.(但这些方法在MoNet框架下具有固定的权重函数。MoNet提出了一种参数可学习的高斯核函数来自由调整权函数。)
3.3.2.4 空域方法小结
空域方法定义图卷积, 通过集成来自邻居的特征信息. 更具不同的堆叠图卷积层的方式, 主要分类两种, 一种是基于递归的要获得节点的稳态的方法, 一种是基于组合的要去合并更高阶的邻域信息的方法.
在训练时, 每一层中, 两种方法都必须更新所有节点的隐藏状态. 然而, 将所有的中间状态存储到内存中并不是一个有效的策略. 为了解决这个问题, 一些训练策略被提出来, 包括针对组合方法的子图训练(GraphSage)和针对递归方法的随机异步训练(SSE)
4 图池化模块
泛化卷积神经网络到图结构数据的另一个关键点, 那就是图池化模块了. 尤其是对于图级分类任务.
和原始CNN中的池化模块类似, 图池化模块可以容易的减少方差和通过从原始特征数据中下采样来减少计算复杂度.
Mean/max/sum池化是实现这一点的最原始和最有效的方法,因为在池化窗口中计算均值/最大/和值是快速的。
hG=mean/max/sum(h1T,h2T,…,hnT)\mathbf { h } _ { G } = m e a n / \max / \operatorname { sum } \left( \mathbf { h } _ { 1 } ^ { T } , \mathbf { h } _ { 2 } ^ { T } , \ldots , \mathbf { h } _ { n } ^ { T } \right)hG=mean/max/sum(h1T,h2T,…,hnT)
-
Henaff等人证明了在网络的开始加入一个简单的max/mean池化, 对于降低图的维度和减轻昂贵的图傅里叶变换操作的损耗是尤其重要的.
-
而Defferrard(ChebNet)等人, 进一步优化了max/min池化操作, 设计了一种有效的池化策略.
- 使用设计的粗化操作经过粗化后,将输入图及其粗化版本的顶点转化为一棵平衡的二叉树.
- 在最粗糙的层次上对节点进行任意排序,然后在平衡二叉树中将这种排序传播到较低的层次,最终在最精细的层次上产生一个规则的排序.
- 池化这样的重排的1D信号比原始的效率要高得多。
-
SortPooling操作也被在架构DGCNN中提出, 也是进行了类似的重排操作, 将顶点重排到更有意义的顺序. 不同于ChebNet,这里是根据顶点图中的结构化的角色来进行的排序.
- 这个方法将来自空间图卷积的图的无序顶点特征看做一个连续的WL颜色, 并且用来对顶点排序.
- 除了对顶点特征进行排序外,它还通过截断/扩展图的特征张量将图的大小统一为k. 如果n>k,则删除最后的n-k行, 否则添加k-n零行.
- 该方法通过求解一个具有挑战性的底层图结构任务,即置换不变量,增强了池化网络以提高GCN的性能.
-
DIFFPOOL池化模块, 可以生成图的层次表达,它不仅可以与CNN相结合,而且可以与各种(various)图型神经网络进行端到端的结合.
- 与以前的所有粗化方法相比,DIFFPOOL并不简单地将节点聚集在一个图中,而是为一组广泛的输入图的分层池节点提供了一个通用的解决方案.
- DIFFPOOL通过使用两个GNN对节点进行集群来重新定义图池模块. 任何标准的GCN模块都能够与DIFFPOOL相结合,不仅可以提高性能,而且可以加快卷积运算的速度.
5 谱方法与空域方法的比较
作为针对图数据的早期卷积网络, 谱方法已经在许多图相关分析任务中取得了不错的结果. 这些模型出现在已有的在图信号处理的理论基础上. 通过设计新的图信号滤波器, 可以设计新的图卷积网络.
作为最早的图形数据卷积网络,基于谱的模型在许多与图形相关的分析任务中取得了令人印象深刻的结果. 这些模型具有很好的吸引力,因为它们具有图形信号处理的理论基础. 通过设计新的图信号滤波器[23],我们可以从理论上设计新的图卷积网络。
然而,基于谱的模型有几个缺点, 我们从效率、一般性和灵活性三个方面来说明这一点:
- 在效率方面,基于谱的模型的计算代价随着图的大小而急剧增加,因为它们要么需要进行特征向量计算,要么需要同时处理整个图,这使得它们很难并行或扩展到大图.基于空间的模型具有处理大图的潜力,因为它们通过聚集相邻节点直接在图域中执行卷积。计算可以在一批节点上进行,而不是在整个图形中进行.当相邻节点数目增加时,可以发展采样技术以提高效率.
- 在通用性方面,基于谱的模型假设一个固定的图,这使得它们不能很好地推广到新的或不同的图.另一方面,基于空间的模型在每个节点上局部执行图形卷积,其中的权重可以方便地在不同的位置和结构之间共享.
- 在灵活性方面,基于谱的模型仅限于处理无向图.有向图上的Laplacian矩阵没有明确的定义,因此将基于谱的模型应用于有向图的唯一方法就是将有向图转换为无向图.基于空间的模型在处理多源输入(如边缘特征和边缘方向)方面更为灵活,因为这些输入可以合并到聚合函数中.
因此,空间模型近年来受到越来越多的关注.
6 未来的方向
更深
- The success of deep learning lies in deep neural architectures.(深度学习的成功在于深度神经结构。)
- However, when it comes to graphs, experimental studies have shown that with the increase in the number of layers, the model performance drops dramatically.(然而,当涉及到图形时,实验研究表明,随着层数的增加,模型性能急剧下降。)
- According to [Deeper insights into graph convolutional networks for semi-supervised learning], this is due to the effect of graph convolutions in that it essentially pushes representations of adjacent nodes closer to each other so that, in theory, with an infinite times of convolutions, all nodes’ representations will converge to a single point.(根据图的【深入理解半监督学习图卷积网络】,这是由于图形旋转的影响,它本质上推表示相邻节点互相接近,因此,从理论上讲,与无限旋转的时候,所有节点表示将收敛于一个点。)
- This raises the question of ** whether going deep is still a good strategy for learning graph-structured data**.(这就提出了一个问题:深入研究图表结构数据是否仍然是一种好的学习策略。)
感受野
- 节点的感受域是指包括中心节点及其邻居在内的一组节点. 节点的邻居数服从幂律分布.
某些节点可能只有一个邻居,而其他节点的邻居可能多达数千个. - Though sampling strategies have been adopted, how to select a representative receptive field of a node remains to be explored.(虽然已经采用了抽样策略,但如何选择节点具有代表性的接受域仍有待探索。)
扩展性
- 多数图神经网络不能适应于大图. 主要原因在于当多层图卷积堆叠时, 节点的最终状态涉及到了大量的相邻接点的隐含状态,导致了反向传播的高复杂性.
- 虽然有几种方法试图通过快速采样和子图训练来提高模型的效率, 但是它们的可扩展性仍然不足以处理具有大图的深度体系结构。
动态与异构
- 目前大多数的图神经网络都是用静态的同质图(homogeneous graph)来处理的. 一方面,图的结构被假定是固定的;另一方面,假设图中的节点和边来自单个源.
- 然而,这两个假设在许多情况下是不现实的. 在社交网络中,新的人可以随时进入网络,现有的人也可以退出网络.在推荐系统中,产品可能有不同的类型,其输入可能有不同的形式,如文本或图像. 因此,需要开发新的方法来处理动态的、异构的图(dynamic and heterogeneous graph)结构。
一些新词
- permutation invariant: 置换不变量
- heterogeneous graph: 异构图
- homogeneous graph: 同构图
···································································································
注意:之前对于公式用LATEX编写,复制的图片,不知怎么就显示不出,凡是框框的地方,用文字表示了公式。
1.为什么我们需要图神经网络:
图 1
当前,深度学习技术已经在语音识别、机器翻译、图像分析和计算机视觉等方向取得了重要成果,之所以CNN、RNN等模型能够在图像、音频等处理中取得很好地效果,其一个重要原因是:图像、音频等数据都可以很好地在欧氏空间中进行表示,并且以规则的栅栏结构呈现,CNN等可以很自然的在这些数据上进行操作。
而也有很多数据,如社交网络数据、生物化学图结构和引文网络等,这些只能在非欧空间中表示,图(Graph)是其中一个典型的表示方式。
图结构数据的表示一般是不规则,传统的CNN等模型无法直接运用在图数据上,所以需要在图上重新定义卷积操作。其中要着重考虑感受野如何定义,节点的顺序性如何定义,如何进行池化操作等等,这方面大家可以参考论文论文[3],其中有比较详细的讨论。
2.图神经网络发展的一些历史
图 2
①最早的图神经网络是Network Embedding的形式,它的核心思想是通过表征学习的方式,在保持当前空间一些几何特性的前提下,把数据转换到一个低维的、更加有判别能力的空间。常见的方法有LLE、DeepWalk、SNE、Graph Factorization等方法。更多可以参考,这篇知乎(谢谢该作者):
苏一:图嵌入(Graph embedding)综述这方面强烈建议看一下DeepWalk这篇论文,是network embedding中非常重的一篇论文,该方法借鉴NLP的思想,使用random walk和SkipGram来提取社交网络数据中的结构信息。
这些方法的通病是对那些拥有节点特征的数据不感冒,有些方法加入节点特征的处理,但其实效果都不是特别好。
②在之后出现了Recurrent graph neural networks,这种方法的主要思想是假设一个节点不断地与邻居节点交换信息直到达到一个平衡,其大多借鉴了LSTM、GRU这些RNN模型,然后改进并运用到 图数据上,这方面我没有具体看过论文。大家如果有兴趣可以参考论文[1],然后再去查看相关论文。
③在2013年nips上,论文[4]提出使用图信号处理技术来定义谱图卷积,其核心思想是通过图傅里叶变换将图信号从空间域转换到频域,进而在频域上定义图卷积操作,其具体操作可以可以参考这篇知乎:
如何理解 Graph Convolutional Network(GCN)?我们直接看结果:
图 3
图 3 上方的第一行式子就是对图数据x进行的谱图卷积操作,其中U代表拉普拉斯矩阵的特征向量,Lambda表示拉普拉斯矩阵的特征值矩阵,拉普拉斯矩阵是对称矩阵,所以他一定可以进行对角化。
表示图卷积的卷积核,最初始的卷积核定义有两种形式
- 第一种为图3左下角形式为一个拥有N(节点数)个参数的对角阵,这种形式比较简单,但是会遇到几个问题:(i)参数数量与图节点数量挂钩,在处理大图时会产生参数过多的问题(ii)解释性极差;(iii)需要计算特征向量,并进行多次矩阵乘法,计算复杂度高。
- 为了解决1中的问题,提出了第二种图3右下角的形式,这种形式看似复杂,但是可以通过对角化性质进行化简成:
这是式子中,对于每个K只有一个参数,L的j次幂可以表示节点的j阶连通性,这也带来了较好的解释性:中心节点聚合其K阶邻居的信息,所以K可以理解为感受野,且参数数量等于K(一般K很小,例如K=2)。但是这个卷积核形式带来一些问题如:需要计算L的幂,造成了较高的计算复杂度。
自此GNN变得可以一边提取结构特征、一边提取节点特征。
3. Basic Model
图 4
论文[5]提出了ChebNet(图4左侧),该模型对于图卷积的改进在于使用切比雪夫多项式来近似计算拉普拉斯矩阵的幂运算,原来的幂运算可以通过递归的形式来求得,简化了运算。
论文[6]是图卷积领域一篇非常经典的论文,将图卷积应用于半监督学习中。我们这里不讨论其半监督学习的方法。该论文在论文[5]的基础上进行了一阶近似,即每次卷积操作只对节点的一阶邻居进行信息聚合,并且省略了部分参数。除此之外,作者在层与层之间加入了线性变化矩阵和激活函数的操作,并使用softmax和交叉熵损失完成节点分类任务。图4右侧展示了模型的核心计算公式,可以看到卷积核几乎消失了。论文[1]中也因此称该论文为连接谱图卷积和空间域卷积的桥梁。除此之外,该式中的 为经过标准化和增加自连接的拉普拉斯矩阵,可以起到稳定计算的作用。具体细节可以查询具体论文。
值得一提的是,从半监督的角度来看这篇论文,也可以解释为使用图卷积提取结构信息来达到使用少量标签数据完成节点分类任务的目的。但是这篇论文在半监督上做的并不是特别好,我在做实验的时候发现模型对于标签数据的依赖性还是很大的,当减少训练集的标签数据时,模型效果会明显的下降。所以现在半监督领域有许多改进CN的工作,想办法用更少的标签来训练GCN,这些论文一个通常的特征就是做实验的时候会摆出训练集的分割比。
目前提到的方法存在着很多问题:
- 无法进行分批训练,其原因是
的存在,无法对分批的数据完成运算,这也对应了该方法的灵活性差,无法处理大图。
- 模型基于transductive,即在训练过程中,测试集的数据也有参与,这造成模型的泛化能力很差。
- 无法通过加深网络层数来加强网络,这是GNN领域的一个重要问题。Shallow or Deep?这方面在文末会顺带一提,相关论文也非常之多。
基于以上前两个两个比较致命的缺点,研究者使用空间域卷积来解决。空间域卷积的论文也比较多:DCNN(扩散卷积)、GraphSage、GAT(基于self-attention)、LGCN(邻居采样+top-k selection+ 1DCNN)等等,其实后面讲的模型都是空间域卷积,有比较有代表性的模型即GraphSAGE:
图 5
该模型指出,以前的模型的目标是为每个不同的节点学习到一个唯一的Embedding,这导致模型的可扩展性很差。本论文[7]提出GraphSAGE将目标定于学习聚合器,聚合器的任务在于完成邻居节点的信息聚合,因此GraphSAGE不会因为新节点的加入而造成模型无法工作。除此之外,GraphSAGE支持分批训练。
如图5,该模型的工作步骤可以分为:
- 分批采样若干源节点,对于其中一个中心节点来说,首先对其一阶邻居采样固定数目个节点,若感受野为2,则在对中心节点的每个一阶邻居的邻居节点进行固定数目的采样,采样数目为超参数。一般感受野的大小K=2.
- 采样结束后,对节点的邻居节点进行聚合,其聚合方式应该具有排列不变性,作者提供了三种:(i)mean,(ii)max, (iii)lstm,其中mean的聚合方式让模型近似等价于论文[6],lstm不具有排列不变性。
- 中心节点的K阶邻域聚合完毕后,通过concat或sum的形式两者进行融合,获得最后的embdding,然后用于半监督学习或者无监督学习。
其分批算法流程可以表示为:
图 6
具体的算法细节,大家可以参考源码,这篇论文十分适合落地。
值得一提,这篇论文也存在着一定的缺陷,后面会提到。
下面在分别讲一下几个重要的研究方向,分类可能不太对,大家凑活着看。
3. Analysis
图 7
论文[8]提出了一种描述GNN的通用框架即信息传递机制。其核心思想很简单,通过中心节点、其一个邻接节点和它们之间的边信息生成一个信息M,然后将中心节点能生成的所有信息加和得到m,然后将该信息传递给中心节点做一个融合得到新的Embedding。若是做图分类任务,则再加入一个Readout层来做一个全局的池化。其实这种思想在论文[9]中也有提高过。
作者认为大家的模型都应该按照他的框架来,红红火火恍恍惚惚红红火火\(^o^)/~。
在通用框架方面,还有非常多的代表性论文,Relational Inductive Biases, Deep Learning, and Graph Networks.arxiv 2018.paper,这篇论文中也提出了非常多的框架。
图 8
论文[10]探讨了什么样的模型能够有更强大的表达能力。早在GraphSAGE中,作者就提出了空间域卷积的操作与Weisfeiler-Lehman test十分相似, WL test的流程如下:
- 聚合节点的节点与他们邻居节点的标签。
- 对聚合结束后的新标签进行hash操作。
- 迭代1、2几次,观察标签的分布来判断图是否同构。
如图8中间的图所示,GNN的聚合和WL test都能得到一个类似树的结构,作者认为拥有不同子树的根节点应该拥有不同的Embedding。
这就引出了作者的一个理论:
图 9
简单一点说,聚合函数f、 、readout的函数映射是单射的。
作者据此,设计了一种能够发挥最大表达能力的模型,即图8最下方的模型。该模型聚合函数使用了加和(作者在论文中对比了mean、max和sum的优劣),使用了MLP,readout使用了跨层级的加和操作。
图 10
论文[11] 探讨了强大的图神经网络的必要性问题,作者在文中去除了那些复杂的聚合操作,之加入一些线性变化和激活函数,在readout层使用MLP来增强网络。
网络的输入数据有进行更改,其数据位节点度、节点信息,节点K接邻居信息的concat结果,可以认为作者仅仅通过在输入数据中加入度信息和邻居信息,而用线性变化和激活函数代替邻域节点聚合操作仍能在图分类任务上取得很好地效果。(后面有篇论文特别强调了度信息的重要性)。从这点看来,图神经网络应该是什么样的还处于混沌状态。我们怎么才能更加有效地、更加高效率的获取数据中的结构信息呢。
4 Efficiency
图神经网络领域还有一个关于模型效率的方向。
图 11
首先引入一个概念Embedding utilization,该概念最早提出在论文[12]中。如果一个节点在l层中被采样计算,并且在l+1层重复利用u次,我们说节点利用率为u。这个指标可以很好地衡量模型的时间复杂度,embedding utilization跟采样图中边数量成正比。
这里说一个事实,虽然GraphSAGE采用了分批训练极大地提升了模型的的收敛速度,但是其每个epoch的时间却比FullGCN[6]要慢很多,这用Embedding utilization可以很好地解释。
可以很容易的想到,在GraphSAGE中的u是很小的,这一层采样的节点在下一层也被采样的几率是不大的。而对于FullGCN这种全采样的方法,u是节点度的平均值,很明显要大于GraphSAGE,所以GraphSAGE的per-epoch time要更长。
接下来介绍几种重要的采样方式:
图 12- Node-wise:其代表就是GraphSAGE,每次采样中心节点固定数目的邻居节点,这种方法面临的问题是,当网络层数变深时,模型的复杂程度指数增加。
- Layer-wise:该方法进行层间独立采样,在每一层中都单独采样固定数目的节点,这样就不会有指数级的复杂度,并且采样遵循重要性采样方法(具体见论文[13]、[14])。这种方法面临的问题是,节点间的关系可能很稀疏,导致模型的效果下降。
- Layer-wise x Node-wise: 论文[15]提出一种方法,在层间独立采样的基础上,在第一层采样固定数目节点,然后下一层的采样在第一层所有节点的邻居节点中采样固定数目节点,这样可以同时减少复杂度、减弱稀疏。
- 基于图划分:论文[15]提出了一种基于图划分的方式,首先使用METIS划分算法对图进行划分,划分结果趋向于拥有更多的边,然后在这个图划分中完成图卷积操作可以有效提升节点利用率。有一个问题,划分之间的关系很可能损失掉,这会导致模型性能下降,作者采用将多个划分合并的方法来减弱这种趋势。
这个研究领域的成果其实并不是具体的模型,而是一种训练方法,这是需要注意的。
5.Pooling
对应于传统深度学习中的pooling,GNN中也有池化操作,这方面我看的论文不是很多,简单介绍一下。Pooling常用于图分类任务中。
图 13
Pooling常用于readout中进行全局池化,最基本的方法有Max-pooling、SUM-pooling、mean-pooling等。
论文[16]首次将attention加入到pooling操作中(在这之前有GAT网络用于图卷积,大家有兴趣可以查看相关论文)。该方法的步骤如下:
- 使用FullGCN进行操作得到每个节点的一个Embedding。
- 根据Embedding计算top-k节点,然后删除剩余节点。
- 将top-k进行Max-pooling、Mean-pooling进行池化,在用MLP进行映射进而完成图分类任务。
作者在论文中给出了两种模型搭建方式,可分别应用于大图数据和小图数据中,具体大家可以参考论文。
这里说一下attention的问题,attention最近在GNN领域的应用非常多,比较有代表性的就是GAT这个模型,具体的大家可以看论文。这里我想说一下我理解的attention在GNN中作用:一是帮助结构特征的提取,帮助我们得知哪个邻居更加重要,需要更大的权重。二是帮助构造节点序列,在CNN中卷积核中心节点的周围节点都因为相对位置而获得顺序,但是图节点的邻居并没有顺序,这时候通过attention机制可以帮助我们搞定节点顺序选择问题。attention我觉得可以作为一个小trick用到各种模型中来加强模型效果。
有研究者发现,目前的pooling方法没有类似于传统pool的层级结构,论文[19]就此提出了DiffPool模型。
图 14
模型的思想是这样的,在模型的前向传播过程中,加入一个矩阵S,S的作用是将当前层的节点进行划分,划分后节点的数目减少,在网络的最后划分数目变为1。其计算过程如图14左侧所示,更加具体的操作细节,可以参考论文原文。
这个S如何获得呢,答案是通过学习获得。模型被分为两部分,一部分学习节点的embedding,一部分用于学习矩阵S(其中用到了top-k的思想),其计算模型如图14中间所示。
作者在训练过程中,发现模型很难收敛,遂加入一个新的损失项,该损失基于假设:邻居节点应该尽可能的被分在同一个划分中。
6.About Experiment
看这方面论文很惊悚,让我感觉以前的实验真的白做了。
图 15
论文[18]做了这样一个工作,他在一个统一的实验设置下,对当前重要的模型进行测试。
论文指出现今的模型存在一个问题,他们的实验设置非常不同,不同的实验导致会导致模型效果天差地别,并且缺少可再现性。。最近自己在做实验的时候也深有体会,无论如何也无法复现一些论文中的效果,增加训练集节点数目会让效果天差地别。
作者将模型评价分为两个阶段:(i)model selection (ii) model assessment。前者为超参数的选择阶段,后者为模型结果测试阶段。一个合格的评价流程可以提高模型的可再现性。
就此作者提出了一套基于交叉验证的评测流程,如图15所示。
除此之外,我还得知了并非所有的数据都有节点特征,像如reddit这样的社交网络数据是缺少节点特征的,论文采用的方法是将节点特征设置为相同值或者度的独热编码。
论文在完成测试后,得到两个重要结论:
- 一些没有适用结构特征提取的方法在某些情境下,效果优于GNN,所以这告诉我们当前的GNN模型没有充分提取结构信息。
- 节点的度是一个非常重要的特征,能够显著提升模型效果,这也印证了之前的GFN模型。
现在在图神经网络领域还缺少一个像ImageNet这样的评测平台,不可否认的是ImageNet对于计算机视觉的发展推动十分大。所以我们需要这样一个平台。
图 16
论文[19]做了一个benchmark。
该论文指出当前工作常用的引文网络数据集存在很大的问题,它的数据规模太小了,这对于开发更加复杂的图神经网络模型是十分不利的。一些好的模型会在这些数据集上趋向于过拟合而不是提升泛化能力。
所以作者在计算机视觉、生物信息、社交网络等领域建立了多个中等规模的数据集,并使用一致的评测流程来保证公平,希望这个benchmark可以促进图神经网络的发展。
7.GNN领域中的一些问题:
- 训练方式问题(sampling):目的是寻找一种训练方式,使得收敛速度加快、time per epoch时间降低,并且不明显损耗效果。值得一提VR-GCN在重要性采样这一方面已经做到了方差为0,很不错了。
- Deep network : GNN现在一般的层数为2-3层,研究者发现加深网络会导致模型的效果变差。我理解的有以下几种解释方法:(1)拉普拉斯矩阵的幂运算在指数很大时,
变化很小。(2)GCN它基于假设:让相邻的节点尽可能的处于同一类,如果加深层数会导致距离比较远(不属于同一类)的节点成为同类,这明显会损耗GNN效果。(3)当GNN的层数加深,会聚集更多节点的noise information。(4)当GNN层数加深时,中心节点的节点特征会慢慢地被丢弃,所以有工作通过加多个自旋的方式来加深层数。(5)统计学常识:参数越多,需要的数据越多,然而没有大型图数据集。解决加深GNN层数的问题主要使用skip connection的方法,如残差网络,hightway network,Dilated 等方法。
- 异质图:异质图中的节点和边拥有不同的类型,异质图问题一般很复杂,现在也有很多相关的工作,其中一个重要思想是先想办法将节点和边分类,然后进行类内的信息聚合,然后在进行类间的节点聚合。
- 有向图:前面提到的很多GNN模型只面向无向图,要想处理有向图,就必须考虑child和father这一项信息。
- 动态图:图中的节点信息、节点存在与否动态变化,这要求模型泛化能力极强并且拥有很好的灵活性。
- 有信息的边:遇到带信息的边,需要考虑边带有的信息。现在有这么几个方法:(i)将边变为一个节点和两条边,这样就去掉了信息边。(ii)不同的边拥有不同的参数矩阵(需要考虑参数数量问题)。
其github的地址:
GitHub - graphdeeplearning/benchmarking-gnns: Repository for benchmarking graph neural networks其配置流程可以参考我的一篇文章:
dongZheX:Win10安装配置Benchmark for GNN给大家推荐一个库pyG,大家可以用这个库来实现baseline模型,能够很好的提升效率。
https://github.com/rusty1s/pytorch_geometric给大家推荐一个找论文的好地方:
GitHub - thunlp/GNNPapers: Must-read papers on graph neural networks (GNN)ppt的链接:
链接:https://pan.baidu.com/s/1zo0cwk9DKKlRxQyoMwwKnw
提取码:eddm
我感觉我写的脉络性不是特别的强,如果想系统学习一下可以参考一些综述,推荐几篇:
- A Comprehensive Survey on Graph Neural Networks.arxiv 2019.paper
- Relational Inductive Biases, Deep Learning, and Graph Networks.arxiv 2018.paper
- Geometric Deep Learning: Going beyond Euclidean data.IEEE SPM 2017.paper
写写代码可以先看这个github,自己写写试试:
https://github.com/FighterLYL/GraphNeuralNetwork大概就说这么多啦,最新的论文还没看,心情不好,忙着搞毕设呢,以后再更。这是初稿,欢迎大家指出不准确的地方。
参考论文:
[1] Wu Z, Pan S, Chen F, et al. A comprehensive survey on graph neural networks[J]. arXiv preprint arXiv:1901.00596, 2019.
[2] Monti, Federico, Boscaini, Davide, Masci, Jonathan,等. Geometric deep learning on graphs and manifolds using mixture model CNNs[J].
[3] Niepert M, Ahmed M, Kutzkov K. Learning convolutional neural networks for graphs[C]//International conference on machine learning. 2016: 2014-2023.
[4] Bruna, Joan, Zaremba, Wojciech, Szlam, Arthur,等. Spectral Networks and Locally Connected Networks on Graphs[J]. Computer Science, 2013.
[5] Defferrard M, Bresson X, Vandergheynst P. Convolutional neural networks on graphs with fast localized spectral filtering[C]//Advances in neural information processing systems. 2016: 3844-3852.
[6] Kipf T N, Welling M. Semi-supervised classification with graph convolutional networks[J]. arXiv preprint arXiv:1609.02907, 2016.
[7] Hamilton W, Ying Z, Leskovec J. Inductive representation learning on large graphs[C]//Advances in Neural Information Processing Systems. 2017: 1024-1034.
[8] Gilmer J , Schoenholz S S , Riley P F , et al. Neural Message Passing for Quantum Chemistry[J]. 2017.
[9] Relational Inductive Biases, Deep Learning, and Graph Networks. Battaglia, Peter W and Hamrick, Jessica B and Bapst, Victor and Sanchez-Gonzalez, Andrea and Raposo, David and Santoro, Adam and Faulkner, Ryan and others. 2018. Paper
[10] Xu K, Hu W, Leskovec J, et al. How powerful are graph neural networks?[J]. arXiv preprint arXiv:1810.00826, 2018.
[11] Chen, Ting, Bian, Song, Sun, Yizhou. Are Powerful Graph Neural Nets Necessary? A Dissection on Graph Classification[J].
[12] Chiang W L, Liu X, Si S, et al. Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph Convolutional Networks[J]. arXiv preprint arXiv:1905.07953, 2019.
[13] Chen J, Ma T, Xiao C. Fastgcn: fast learning with graph convolutional networks via importance sampling[J]. arXiv preprint arXiv:1801.10247, 2018.
[14] Stochastic training of graph convolutional networks with variance reduction[J]. arXiv preprint arXiv:1710.10568, 2017
[15] Layer-Dependent Importance Sampling for Training Deep and Large Graph Convolutional Networks[C]//Advances in Neural Information Processing Systems. 2019: 11247-11256.
[16] Lee, Junhyun, Inyeop Lee, and Jaewoo Kang. "Self-attention graph pooling."arXiv preprint arXiv:1904.08082(2019).
[17] Ying Z, You J, Morris C, et al. Hierarchical graph representation learning with differentiable pooling[C]//Advances in neural information processing systems. 2018: 4800-4810.
[18] Errica F, Podda M, Bacciu D, et al. A fair comparison of graph neural networks for graph classification[J]. arXiv preprint arXiv:1912.09893, 2019.
[19] Dwivedi V P, Joshi C K, Laurent T, et al. Benchmarking Graph Neural Networks[J]. arXiv preprint arXiv:2003.00982, 2020.
https://zhuanlan.zhihu.com/p/79637787
GraphSAGE算法原理
GraphSAGE 是Graph SAmple and aggreGatE的缩写,其运行流程如上图所示,可以分为三个步骤
1. 对图中每个顶点邻居顶点进行采样
2. 根据聚合函数聚合邻居顶点蕴含的信息
3. 得到图中各顶点的向量表示供下游任务使用
采样邻居顶点
出于对计算效率的考虑,对每个顶点采样一定数量的邻居顶点作为待聚合信息的顶点。设采样数量为k,若顶点邻居数少于k,则采用有放回的抽样方法,直到采样出k个顶点。若顶点邻居数大于k,则采用无放回的抽样。
当然,若不考虑计算效率,我们完全可以对每个顶点利用其所有的邻居顶点进行信息聚合,这样是信息无损的。
生成向量的伪代码
这里K是网络的层数,也代表着每个顶点能够聚合的邻接点的跳数,如K=2的时候每个顶点可以最多根据其2跳邻接点的信息学习其自身的embedding表示。
在每一层的循环k中,对每个顶点v,首先使用v的邻接点的k-1层的embedding表示 来产生其邻居顶点的第k层聚合表示
,之后将
和顶点v的第k-1层表示
进行拼接,经过一个非线性变换产生顶点v的第k层embedding表示
。
聚合函数的选取
由于在图中顶点的邻居是天然无序的,所以我们希望构造出的聚合函数是对称的(即改变输入的顺序,函数的输出结果不变),同时具有较高的表达能力。
- MEAN aggregator
上式对应于伪代码中的第4-5行,直接产生顶点的向量表示,而不是邻居顶点的向量表示。 mean aggregator将目标顶点和邻居顶点的第k-1层向量拼接起来,然后对向量的每个维度进行求均值的操作,将得到的结果做一次非线性变换产生目标顶点的第k层表示向量。
- Pooling aggregator
Pooling aggregator 先对目标顶点的邻接点表示向量进行一次非线性变换,之后进行一次pooling操作(maxpooling or meanpooling),将得到结果与目标顶点的表示向量拼接,最后再经过一次非线性变换得到目标顶点的第k层表示向量。
- LSTM aggregator
LSTM相比简单的求平均操作具有更强的表达能力,然而由于LSTM函数不是关于输入对称的,所以在使用时需要对顶点的邻居进行一次乱序操作。
参数的学习
在定义好聚合函数之后,接下来就是对函数中的参数进行学习。文章分别介绍了无监督学习和监督学习两种方式。
- 无监督学习形式
基于图的损失函数希望临近的顶点具有相似的向量表示,同时让分离的顶点的表示尽可能区分。 目标函数如下
其中v是通过固定长度的随机游走出现在u附近的顶点, 是负采样的概率分布,
是负样本的数量。
与DeepWalk不同的是,这里的顶点表示向量是通过聚合顶点的邻接点特征产生的,而不是简单的进行一个embedding lookup操作得到。
- 监督学习形式
监督学习形式根据任务的不同直接设置目标函数即可,如最常用的节点分类任务使用交叉熵损失函数。
GraphSAGE的实现
这里以MEAN aggregator简单讲下聚合函数的实现
features, node, neighbours = inputs
node_feat = tf.nn.embedding_lookup(features, node)
neigh_feat = tf.nn.embedding_lookup(features, neighbours)
concat_feat = tf.concat([neigh_feat, node_feat], axis=1)
concat_mean = tf.reduce_mean(concat_feat,axis=1,keep_dims=False)
output = tf.matmul(concat_mean, self.neigh_weights)
if self.use_bias:
output += self.bias
if self.activation:
output = self.activation(output)
对于第 层的aggregator,
features为第 层所有顶点的向量表示矩阵,
node和neighbours分别为第k层采样得到的顶点集合及其对应的邻接点集合。
首先通过embedding_lookup操作获取得到顶点和邻接点的第 层的向量表示。然后通过
concat将他们拼接成一个(batch_size,1+neighbour_size,embeding_size)的张量,使用reduce_mean对每个维度求均值得到一个(batch_size,embedding_size)的张量。
最后经过一次非线性变换得到output,即所有顶点的第 层的表示向量
- GraphSAGE 下面是完整的GraphSAGE方法的代码
def GraphSAGE(feature_dim, neighbor_num, n_hidden, n_classes, use_bias=True, activation=tf.nn.relu,
aggregator_type=\'mean\', dropout_rate=0.0, l2_reg=0):
features = Input(shape=(feature_dim,))
node_input = Input(shape=(1,), dtype=tf.int32)
neighbor_input = [Input(shape=(l,),dtype=tf.int32) for l in neighbor_num]
if aggregator_type == \'mean\':
aggregator = MeanAggregator
else:
aggregator = PoolingAggregator
h = features
for i in range(0, len(neighbor_num)):
if i > 0:
feature_dim = n_hidden
if i == len(neighbor_num) - 1:
activation = tf.nn.softmax
n_hidden = n_classes
h = aggregator(units=n_hidden, input_dim=feature_dim, activation=activation, l2_reg=l2_reg, use_bias=use_bias,
dropout_rate=dropout_rate, neigh_max=neighbor_num[i])(
[h, node_input,neighbor_input[i]])#
output = h
input_list = [features, node_input] + neighbor_input
model = Model(input_list, outputs=output)
return model
其中feature_dim表示顶点属性特征向量的维度,neighbor_num是一个list表示每一层抽样的邻居顶点的数量,n_hidden为聚合函数内部非线性变换时的参数矩阵的维度,n_classes表示预测的类别的数量,aggregator_type为使用的聚合函数的类别。
GraphSAGE应用
本例中的训练,评测和可视化的完整代码在下面的git仓库中
shenweichen/GraphNeuralNetwork
这里我们使用引文网络数据集Cora进行测试,Cora数据集包含2708个顶点, 5429条边,每个顶点包含1433个特征,共有7个类别。
按照论文的设置,从每个类别中选取20个共140个顶点作为训练,500个顶点作为验证集合,1000个顶点作为测试集。 采样时第1层采样10个邻居,第2层采样25个邻居。
- 节点分类任务结果
通过多次运行准确率在0.80-0.82之间。
- 节点向量可视化



