’’’ 最近了解了一下GNN,写本文概述以加深理解,主要参考一下两篇综述文章:
清华大学孙茂松组的 Graph Neural Networks: A Review of Methods and Applications
IEEE Fellow, Philip S. Yu的 A Comprehensive Survey on Graph Neural Networks
’’’
符号定义
标记 | 描述 |
---|---|
m维欧式空间 | |
标量,向量,矩阵 | |
矩阵转置 | |
节点v的邻居个数 | |
链接v、w的边 | |
拼接 | |
矩阵对应元素点乘 | |
和 卷积 | |
sigmoid | |
节点v的表示 | |
图的所有节点的特征表示 | |
可学习参数矩阵 | |
邻接矩阵 | |
度矩阵,是一个对角阵 | |
所有的节点 | |
n阶单位阵 | |
傅里叶变换 |
GNN( Graph Neural Networks )简介
之前深度学习主要关注例如文字的序列结构、例如图片的平面结构,现在处理这些数据的做法也比较成熟,关注序列任务的NLP领域多用RNN、Transformer、CNN对数据进行Encoder,而关注平面结构的CV领域更多使用CNN及其各种变体对数据进行Encoder。在现实世界中更多的数据表示并不是序列或者平面这种简单的排列,而是表现为更为复杂的图结构,如社交网络、商品-店铺-人之间的关系、分子结构等等
图是由节点及连接节点的边构成的,现在热门的基于深度学习的GNN就是用来处理图类型数据的网络,而该网络的目标就是学习每个节点v的表示,而每个节点的表示由该节点的特征、与该节点连接的边的特征、该节点的邻居表示和它邻居节点的特征计算得到:
对于关注节点的任务,可以直接拿的表示去完成特定任务,而对于关注整个图的任务这可以通过将所有的节点的表示做Pooling或其他方法获得一个全局的表示信息然后去做相应的任务。
GNN分类–按更新方式分类
] 如图所示,GNN主要分为图卷积网络(GCN)、基于注意力更新的图网络(GAT)、基于门控的更新的图网络、具有跳边的图网络。G
各种GCN
图卷积网络是目前最主要(重要)的图网络,GCN按照更新方式又可以分为基于谱的和基于空间的。
基于谱的GCN
我们常用的GCN模型长这样:
对于这个式子直觉告诉我这和NLP里面的Self-Attention的聚合过程也太像了吧,把换成我们Attention时计算出来的权重矩阵,这就是更新过程,而且从直觉上想若两个节点之间存在一种关系(有边)则对应邻接矩阵A上的一个非零值(权重),如果没有关系则对应0,而在这个式子里面起到的作用就是归一化,单位阵I起到的作用是添加一个自己到自己的边。
这个公式很容易理解,它就是一个图卷积神经网络,是一个卷积核,不过看起来和我们见过的卷积操作好像相差比较大,不过这个公式并不是和我们直觉的想法一样得来的,而是经历了一个漫长的过程。
在继续介绍之前先讲一个图信号处理领域的一个结论:
定义归一化的拉普拉斯矩阵 , 拉普拉斯矩阵是实对称矩阵,可以对其进行谱分解得到, 其中是酉矩阵(即矩阵的列向量两两正交,且)。 图信号是图中第i个节点的表示向量,信号h的图傅里叶变换定义为,逆傅里叶变换为 表示图傅里叶变换对信号h的输出。因为我对这部分数学基础不足,只能根据直觉解释这个过程,在信号处理中,傅里叶变换就是将在时域的信号变换到频域,而所用到的所有的余弦/正弦函数都是正交向量(无穷维向量),每一个正弦/余弦函数就是一个频域的基,所以傅里叶变换终究还是一个变基的过程,就是将信号从一个空间通过改变基的表示映射到另一个空间。上文中提到的矩阵作为一个酉矩阵(列向量两两正交)显然满足作为一组基(且是标准正交基)的条件,我们可以通过矩阵将h映射到另一个空间,该空间就是图的频域空间,至于为什么选择矩阵作为变换矩阵而不是随便选一个酉矩阵作为变换矩阵,显然是因为这个矩阵是和图的结构密切相关的(由该图的归一化拉普拉斯矩阵谱分解得到的)。
对于该结论的严格推倒过程可以参考The Emerging Field of Signal Processing on Graphs这篇论文。
下面开始继续介绍GCN,定义的对每个节点v的卷积操作,,卷积有一个性质:时域的卷积既是在频域的乘积,所以为了计算方便可以先将信号做傅里叶变换到频域之后再做逆变换即可得到卷积结果,其中g是与拉普拉斯矩阵的特征值相关的。
这里如果将参数化为,上式将简化为 ,基于谱的卷积都是如此定义,区别在于的不同选择。
最简单的方法是直接另,此处
这种简单的计算方法每次都要对 矩阵进行谱分解,参数数量和图的大小一致,且每次都是全局卷积学习参数的复杂度会非常高,不仅如此,每次卷积涉及到的大规模矩阵乘法耗时也是。
为了解决上面的问题有人提出一种巧妙地方法即下面要讲的ChebNet.
首先解决参数数量和局部卷积简化参数学习难度的问题。
我们希望用更少的(与图大小无关)的参数来表示卷积核,另
其中(拉普拉斯矩阵的特征值)
这样由:
得
现在的图卷积已经不用进行谱分解了,这里只需要计算,其中是由邻接矩阵导出来的(加上自回归的边后,每个位置是否为0是相同的),我们学习图论的时候知道通过计算邻接矩阵的k次方得到的矩阵非0位置表示两个节点存在长度为k的路径,这样的卷积具有很好的空间局部性,我们可以通过控制k来决定每个节点的表示仅由与其距离不超过k的节点及其关系决定,不像之前的图卷积计算当前节点会用到全局所有节点的信息。
然后解决每次卷积计算复杂度为的问题
这里用到Chebyshev polynomial,该多项式是递归定义的:
为了能够简化卷积的计算复杂度,我们发现卷积核的计算需要计算 , 将卷积核定义为如下可以递归计算的方式可以减少计算量。
其中
然后通过和上面类似的推倒得到递归的卷积:
现在的卷积操作已经能满足上面提出的所有要求了。
在此基础上的变种
很多时候K不需要取的很大就能获得很好的效果,当K=2时,即只取前两项可以得到:
进一步简化,取
则:
这就是本节刚开头提到的形式。
这种形式在堆叠多层时会造成数值上的不稳定及梯度爆炸/消失问题,所以可以用到重归一化技巧:
非基于谱的方法
基于谱的方法需要学习的参数都是与Laplacian矩阵的特征向量和特征值相关的,即取决于图的结构,这样有什么问题呢,如果你在一个大图或者很多同构的小图上进行训练是可以的,这也有很多应用场景。但是如果我们要处理很多不同结构的图,那就不能用同一套参数来学习,不惧泛化性,比如我们对很多树结构的句子进行分类(比如表示为依存句法树或其他),每个句子的表示可能都不同,那就没办法用上面的方法做。
下面介绍几种不依赖于图谱的方法的GNN。
不基于谱最简单的方法就是直接把每个节点的邻居节点直接求和:
这里根据邻居个数的不同用不同的参数W。
DCNN
DCNN的做法也很简单:
其中, P是度归一化后的临接矩阵。不要误会,这里的参数和图的结构没有关系,这里的参数W对应于与该节点不同距离的信息。
GraphSAGE提出了一个更加通用的框架:
这里的AGGREGATE可以取不同的方法,GraphSAGE论文中提到可以用mean,max-pooling, sum,LSTM。 其实这是一个通用框架,本文提到的很多方法都可以套进来。
Attention
图的信息传递当然也可以用attention,通过当前节点的不同邻居与当前节点表示上的关系计算信息流的权重, a为attention参数:
为了获得更充分(不同侧重)的信息,Attention is all you need 提出的multi-head attention,可以表示为下面两种形式
其中表示拼接
Skip connection
相比于传统的网络,GNN的深度一般更浅,原因是GNN的感受野随着深度的增加指数增大在信息传递过程中会引入大量噪声。所以在GNN中也有人尝试加入skip connection来缓解这个问题。下面是一个用Highway的方法的例子:
当前的输出还有一部分来自于上层的输出。
Gate
Highway的方法比较简单,还有更复杂的方法来控制信息的传播,比如可以用GRU,LSTM的门控方式来传递图的信息,这个没啥好解释的,看公式应该写的很明白了,这里只介绍一下基于GRU的GGNN:
其中是临接矩阵中与v有关的值构成的矩阵。
GNN 训练方法
原始的GCN方法每个节点的表示依赖于图中所有的其他节点,计算复杂度过大,且由于依赖于拉普拉斯矩阵训练的网络不惧泛化性。
GraphSAGE对于每个节点的计算不涉及整张图,所以效率更加高,不过为了缓解深度加深感受野指数爆炸的现象,GraphSAGE每次信息计算通过采样只使用部分邻居。
FastGCN对GraphSAGE的随机采样加以改进,针对每个节点连接其他节点个数的不同给定不同的重要性。
还有一些限制感受野的其他方法,咱也不懂.
通用框架
Message Passing
该框架包含3个操作,信息传递操作(M),更新操作(U),读取操作(R):
其中表示边的信息。
上文提到的GGNN用这个框架表示为:
NLNN
何凯明提出的Non-local Neural Networks用来捕捉图像上的non-local信息:
其中用于计算i、j之间的关系, 表示对输入做一个映射, 表示对结果进行归一化。其中可以有不同的计算方式,比如什么Gaussian,Embedded Gaussian, Dot product, Concatenation等。 感觉这个有点牵强。。
Graph Networks
这个就是去年火爆一时的由一群大佬联名的Relational inductive biases, deep learning, and graph networks。
由于这个更复杂更general,先来介绍一下其中的符号表示, 这里V的表示与文章开头定义有所不同:
图:, 其中 表示图中的每个节点的表示,u表示全局信息,, 这其中,
分别针对边、节点、全局节点定义了三种更新函数和三种聚合函数 :
其中, ,
每个操作都很符合直觉,下面给出在该框架下的计算算法:
]
最终返回全局节点、普通节点、边的表示,在该框架下的图任务可以是基于图的也可以是基于节点的还可以是基于边的。
…
以后有时间再补充吧。如果有人看的话,有错误还请指出,共同进步.
^_^