![7d88153ab0ad0a2a84a8a2dbdf9c1a9e.png](https://i-blog.csdnimg.cn/blog_migrate/98cb73d384e9faf1ef9c241a5eca57ef.jpeg)
上一篇笔记可见:
除夕:2020 年 4月 新番 图神经网络 GNN Intro - 0zhuanlan.zhihu.com![afaca669b6f4b40af66bc5ce698a4d58.png](https://i-blog.csdnimg.cn/blog_migrate/6a67baa1f14e1662f927d9e0c994f64f.jpeg)
前言:本期内容来自于李宏毅《机器学习》助教姜成翰在这门课上的补充内容。神经网络要如何聚合图结构中的信息呢?之前有说到有两种主流方法:(1) 把CNN的方法泛化,考虑节点周边的邻居关系进行空间上的卷积,比如 GAT。(2) 利用卷积本质是频域上的滤波这一特性,在频域上操作,比如 GCN。这一期我们来说下这两种方法具体怎么做。
Spatial-based GNN
![736abed401f759113d7674220dac29bc.png](https://i-blog.csdnimg.cn/blog_migrate/67d933d50b329faded050a8546f6bcb8.jpeg)
这部分内容会包括 NN4G,DCNN,DGC,GraphSAGE,MoNET,GAT,GIN。它们主要的区分在聚合方式上的操作不同。
![fc970269c100815d72f768db0aceb8e7.png](https://i-blog.csdnimg.cn/blog_migrate/bfb279763bdd4fabe520986fab217d2e.jpeg)
我们先来看下卷积是如何聚合信息的。一个 3×3 的权重矩阵作为滑动窗口,Element-wise 乘上图像对应位置的值后相加求和。它相当于对 (x, y) 这个位置的周边8个方向的邻居,做了加权求和。在图结构中我们没法固定窗口,不过也可以用把邻居信息加权求和的思想来聚合信息。这里的邻居都是在空间上的概念,所以这种方法也叫作 Spatial-based Convolution。
![b954c7989361a2440a86e0fc0825bdcb.png](https://i-blog.csdnimg.cn/blog_migrate/f379b7f3a1d70f48913a68291975d610.jpeg)
一个图的节点通常是用一个嵌入向量来表征的。信息聚合意思是,让包含一个节点信息的嵌入向量,也表征了它周围节点的信息。在 Spatial-based Convolution 中,我们需要有两个信息聚合的操作:一个是用邻居特征更新下一层的隐层,叫 Aggregate,另一个是把所有的节点的特征聚合成一个代表整个图的向量表征,叫Readout。
![48f14cbf9fef251fdb4e8befdf551ade.png](https://i-blog.csdnimg.cn/blog_migrate/05f71ad965516bf0a1661bea35266788.jpeg)
在图神经网络中,对于输入的节点,会先经过一个嵌入层来得到节点的嵌入表征 h。在 Aggregate 上,一个直觉的做法是,把某个节点的邻居的嵌入表征都乘上下一层的可训练权重
![7a7ae0de7ba899c6eca34b25c7dedafa.png](https://i-blog.csdnimg.cn/blog_migrate/2758f0d75fa885473bcb006711da6177.jpeg)
在 Readout 上,我们把每一层节点的特征都加起来取一个平均,再通过一个全连接层作为输出层,做任务上的分类或回归。这个 Aggregate 和 Readout 方法叫作 NN4G。它是 2009 年出的,最早的做 GNN 的想法之一。为什么我们要做相加呢?因为每个图上邻居数量不一样,相加比较好处理。
NN4G 只能聚合到它周边最近邻居的信息,而邻居的邻居信息,比如距离为2的邻居信息,就照顾不到。类比于卷积,我们把能聚合多远邻居的距离称之为感受野。2015 年提出的 DCNN 提出了一种渐进式的聚合方法来扩大 GNN 的感受视野。
![ca6b75f0ba7c70033910bcc95ff0d9fd.png](https://i-blog.csdnimg.cn/blog_migrate/3429f6fa9d17f99ee9aeaacd4ffd263a.png)
对第一层的 Aggregate,它考虑的邻居依赖与 NN4G 一样。在如图所示,v3 节点距离为 1 的邻居是 {v0, v2, v4}。在聚合操作上,NN4G 是把与当前节点距离是 1 的邻居嵌入向量做加权求和。但 DCNN 是先把邻居嵌入加起来求平均后,再乘上权重,得到下一层该节点位置的嵌入向量。图中 h_{0,3} 表示的是在第一层,节点 3 的嵌入向量。
![fd8e29e57f1796cfb76b1b3c1d826c1a.png](https://i-blog.csdnimg.cn/blog_migrate/1cca5c7670d2c2ac68f5ec46764f5010.png)
到了第二层,它会比 NN4G 多往外拓展一层感受野,计算距离为 2 的邻居。也就是{v0, v2, v4} 的除了 v3 的邻居 {v1}。
![f2e0a5866d6ad59976f3724953a73c64.png](https://i-blog.csdnimg.cn/blog_migrate/e1dca5147fb31be69ec4dbb7c3fbf68f.png)
以此类推,我们依次计算距离为3,4……k的邻居。H^K 为在第 K 层所有的叠加向量。
![d107c6cd9404418f636863f6c9270ff0.png](https://i-blog.csdnimg.cn/blog_migrate/9f4170fa2675552d4c9d217775a9eb36.png)
readout的时候,DCNN 是把每一层图的隐层向量拼接起来再接上一个 FC 层进行分类。
![e47b6e754309f98c0348325d2aebf576.png](https://i-blog.csdnimg.cn/blog_migrate/a542b5397ce25602fa4ee432647b4c7b.png)
DGC 与 DCNN 唯一不同在,它在 Readout 这里是把每个隐层加起来做信息聚合。
![e2ed07c8cc4d7dfe7138a072ed20bf0f.png](https://i-blog.csdnimg.cn/blog_migrate/55efdb4414fa6d62196df451d061097f.jpeg)
DCNN 在扩大感受野的过程忽略了一点在,它把每个邻居之间的距离都默认为了1。但事实上,邻居与邻居之间应该有不同的距离权重。MoNET 则考虑了这一点,它使用的是距离的加权求和。MoNET 通过定义某个权重的方式来决定节点与节点之间的距离。我们用 u(x, y) 来表示节点 x 到节点 y 的权重。它是一个二维的向量,维度取值为
![c28f630ca1401f30ba60b24fa83074f4.png](https://i-blog.csdnimg.cn/blog_migrate/9b4e6a0cf5b405db1b2fad353ffcba77.jpeg)
GAT 是在 MoNET 上的延续。它邻居之间边的权重 u(x, y) 是模型自动学出来的。
![21008767dbc314ea49c5ec45e3fff68e.png](https://i-blog.csdnimg.cn/blog_migrate/b24ee10819e644ffc58ef793d39b96ad.jpeg)
GAT 具体的做法是,对于某个节点,它的下一层嵌入是该节点对其邻居做自注意力的结果。这个自注意力得分就是边的距离权重。
![07d2a484954259f87b794db08f3c25ae.png](https://i-blog.csdnimg.cn/blog_migrate/b8a8300528b62a7dc52421a63b0acedc.jpeg)
GraphSAGE 比较了 Aggregate 用 mean, max-pooling 和 LSTM 等各种情况。它尝试把邻居的信息喂给一个 LSTM 取最后的隐层作为输出,来作为聚合后的信息更新每层。它会随机地采样出一个邻居顺序,每次更新都会用不同的顺序。以此来去忽略不同顺序的影响,来学到比较好的聚合信息。
![7fb24ab6180f7e5afc5a98a9904edf1f.png](https://i-blog.csdnimg.cn/blog_migrate/d62a132c6926a2bb5df70be6b9bb37cd.jpeg)
但用 LSTM 的表现不一定非常好。
![b0741d86e9e8bccbb7ec0d0748b070ee.png](https://i-blog.csdnimg.cn/blog_migrate/385ebf63f514c66c267a4407f5ca9418.jpeg)
GIN这篇论文从理论上说明了为什么有些方法会Work,但有些方法不会Work。它证明了最佳的聚合更新方式。对于某个节点 v,它在第 k 层的隐层应该要把它全部的邻居都加起来后,再加上某一个常量乘上节点自身的隐层,再通过一个线性映射。我们要用sum,而不是mean或max,是因为对于有两个邻居的节点和有三个邻居的节点,mean和max都无法区分它们是不同的图。
Spectral-based GNN
![0dfc06c07008cd11a46ab4c232521268.png](https://i-blog.csdnimg.cn/blog_migrate/51eb9b702a8e4af74aebc1fafed06167.jpeg)
另一种给图做卷积的思路是,我们尝试把一个图上的信号(把特征看作是信号),通过傅里叶变换到频域空间,乘上频域空间上的卷积核,再傅里叶逆变换回来。
在讲频域卷积之前,我们需要补充一些《信号与系统》的知识。
![602b56181ad5eccff107a5211b9e62ad.png](https://i-blog.csdnimg.cn/blog_migrate/8d0bda620142c1fdded09f07cdefde71.png)
信号可以看作是一种 N-维空间的向量。这个向量是由一组基向量通过线性组合合成的。当我们想知道它里面每个不同的部分的权重
![6d405b2abcfadea1e4611ee6258d00e1.png](https://i-blog.csdnimg.cn/blog_migrate/443881f53154ee0b7889e3e659644f35.jpeg)
以上是在空间域上的,基向量一般是空间坐标轴 x, y, z。在频域上的基向量一般为 cos 和 sin。
![8db63af1ba52498435125e5a550f7a1c.png](https://i-blog.csdnimg.cn/blog_migrate/ee40f6e5ddd38a1f47507c5da562485b.jpeg)
该图比较了二者的对应关系。对于这一部分,非 EE 专业的我,学得很局限。关于傅里叶变换的更多内容可以参照 3Blue1Brown 的 这个视频。
图结构为节点信号在空间上的关系。我们可以把这个空间上的图转换为频域上的图。对这个图的频谱进行滤波操作后,再转换回空间上的图,就可以实现卷积过程。我们要如何把空间上的图变成频域上的图呢?这里需要了解一下谱图理论。
![b8fed7e6cd9d03bba076162c3894a1d2.png](https://i-blog.csdnimg.cn/blog_migrate/5c812e1d28af448429b61984a5788df6.jpeg)
一个图我们会用邻接矩阵
![a6088b15f0042d3d68658515efe7d7d6.png](https://i-blog.csdnimg.cn/blog_migrate/8f79f0bec9c2fa443deca464d56914a1.png)
如何理解这个
![e28628a0d84258689cd366a29ee00e78.png](https://i-blog.csdnimg.cn/blog_migrate/aaa6e4522b32379926b92db3e97f93f7.jpeg)
图拉普拉斯矩阵被定义为
![5b82cc0bf471dfaef33651933c83e4d3.png](https://i-blog.csdnimg.cn/blog_migrate/84f644472d3116da8e6b9ddfe4b877d7.jpeg)
该图是一个获得 L,Λ 和 U的例子。
![b57675eb1f870a53d315695d48614a73.png](https://i-blog.csdnimg.cn/blog_migrate/6732f0e78023ebe243a77923a65f44b2.jpeg)
我们把上图中的 U 可视化出来,这样我们就得到一个从低频到高频的频谱。频率越低,则
![cb12175e189918686ffa75b4acbfbcc3.png](https://i-blog.csdnimg.cn/blog_migrate/acd6fbdc744cd2729b551ca0d25f7c09.jpeg)
当频率很小的时候,所有信号都朝向一致的方向,且值的方差很小。当频率很大的时候,相邻两点之间的信号变化就会很大,比如图e中,它们的方向完全相反,差为两倍的信号大小。
![00a07e9ab2ab1ba2e4b4611180db45d0.png](https://i-blog.csdnimg.cn/blog_migrate/32676afe314fbe696e6712fc5b5ee11c.jpeg)
我们可以把 L 当作是一个用来对图操作的矩阵。给定一个图的信号f,用 L 与它相乘,Lf = (D-A)f = Df - Af。它所做的操作刚好等价于当前节点与它周边邻居的能量差异之和。频率越大,相邻节点的能量变化也就越大。
![537e6e37d4745506def51ea0c11af095.png](https://i-blog.csdnimg.cn/blog_migrate/f97139db5d42de72ffeff89e6127a905.jpeg)
如果我们让 Lf 再乘上当前节点vi,推导化简下来,会得到该节点与周边节点的信号能量差的加权求和。我们就可以用这个计算的结果来量化某个图信号的频域大小是多少。这就是图傅里叶变换.它做的是让图映射到频域上。当我们的图信号越平滑,相邻两个节点信号的差异会越小。反之图信号越不平滑,相邻两个节点信号的差异就会越大。
![3cfc02810888bf2d6d6ce81a4c15ab6c.png](https://i-blog.csdnimg.cn/blog_migrate/8e57f91f278c19fc34798ba30f817969.jpeg)
神经网络的权重也可以用相同的方法转到频域上。二者相乘就完成了滤波操作。
![af4dfe2a14e5fc3aeba35f6e1e6d76f3.png](https://i-blog.csdnimg.cn/blog_migrate/be1d7c1db2db7dc56ec6582ec6af321a.jpeg)
我们要如何把频域的图转换回来呢?直接把某个节点上的频率U 和其能量大小相乘,再加权求和。
![e0886ed73591f3b0c3698c8a0bc58695.png](https://i-blog.csdnimg.cn/blog_migrate/c8394be065d7494b8f6c13e45fffd66b.jpeg)
整个计算流程如图所示。模型要学习的参数在Λ之中。假如我们让g(L) = log(1 + L),但 Λ 的大小要与输入的图一致。当图很大时,Λ也会变得巨大。这显然不合适。g(L) = cos(L) = 无穷级数。其中
![4585683e12cb7826703205de75b98d06.png](https://i-blog.csdnimg.cn/blog_migrate/503edf2a023ffd428b5ef171d82f1379.jpeg)
为解决这两个问题,出现了 ChebNet。它让 g(L) 是一个多项式函数,来近似计算图卷积。最高次数 K 是定义好的。所以它能够因K的固定而变得局部化。而且它要学的参数空间复杂度为 O(K)。但我们在用它计算y的时候,它需要乘上傅里叶基U,让时间复杂度变成了
![c9f5f3f8ab1f06db7a293494b2eb3744.png](https://i-blog.csdnimg.cn/blog_migrate/d03fcc687e42f634a1ec67d19f770b76.jpeg)
为解决第三个问题,ChebNet用了一个 Chebyshev polynomial 把复杂度降低至O(K|E)。E 为边的数量。这个多项式函数是用一个递归方式定义的。
![7a890099d18da2de95e3dc6314b56542.png](https://i-blog.csdnimg.cn/blog_migrate/9bdd2c4f97a1c60dc64601e509e803d3.jpeg)
我们将卷积运算化简可以发现,切比雪夫多项式矩阵的运算是固定的,可以在预处理阶段完成。而且拉普拉斯矩阵一般是稀疏的,可以使用稀疏张量乘法加速,让整个图卷积的计算复杂度大大降低。
![c451c0bcfa6285a7ba83259f906df3b0.png](https://i-blog.csdnimg.cn/blog_migrate/dca9db678ab5eacbb10a470d03a2036c.jpeg)
受到 ChebNet 的启发,一种更加简单的图卷积变种 GCN 被提出来了。它相当于对一阶切比雪夫图卷积的再近似。我们在切比雪夫卷积核定义基础上,令多项式的阶数为 1,再让拉普拉斯矩阵 L 的最大特征值为2。这样图卷积运算过程可以被进一步简化。GCN 的卷积核变得更小,参数量也更少,计算复杂度也随之减少。它等价于最简的一阶切比雪夫图卷积。在化简中,它使用了一个重归一化技巧。它能将特征值范围进一步缩小使得滤波器变得更加低通。解决的问题是[0,2]范围内的特征值在神经网络中使用多次后,会导致梯度消失和梯度爆炸的问题。ChebNet 虽然比 GCN 复杂度更高,但它的表征能力更强。但我们可以通过堆叠多个 GCN 来扩大图卷积的感受野,所以灵活性比 ChebNet 更高。重要的是复杂度更低的 GCN 会更容易训练,速度快且效果好,实用性强。所以它成为了被提到最多的典型方法。
![afe6de5eafb8e8fb21f2f8025adb58a8.png](https://i-blog.csdnimg.cn/blog_migrate/f867d745c429277e658a82f66c248981.jpeg)
![75c25a8623193bd042b130a1afe3a548.png](https://i-blog.csdnimg.cn/blog_migrate/e01192193c75807bfcf75598420f5ab0.jpeg)
我们再回过头来看 GCN 在 TSP 任务上的 Benchmark。TSP 是一个边分类任务。GCN 在没有加残差连接的情况下,随着层数增加表现是显著下降的。
![c41ae80c9dc0e889f36dbe0f5ef3037e.png](https://i-blog.csdnimg.cn/blog_migrate/6a3764cc17d0695447d2a6be9cc69629.jpeg)
ICLR 2020 有一篇论文探索了图神经网络无法做深的两个原因 (过拟合和过平滑) 并提出了一种简单有效的方法,随机地删除边 DropEDGE。过拟合指的是使用复杂模型去拟合少量数据的时候造成的泛化能力变差的情况。它在深度学习模型中是广泛存在的。过平滑则是指在图神经网络消息传递过程中,所有节点的输入特征会收敛到一个和输入无关的子空间的过程。这一过程会导致输入 GCN 的特征失效并造成梯度消失。过平滑是 GCN 模型特有的问题,它造成了深层图神经网络的训练困难。
![a08456a0e250645de910f82efa28f3c1.png](https://i-blog.csdnimg.cn/blog_migrate/b917a5a295dc52f315a6b4b652847e40.jpeg)
实验结果显示,在使用了 DropEDGE 之后,结果会显著好于没有用 DropEDGE。
总结: ChebNet 那边涉及到的理论基础比较深,没有详细讲。日后有机会再填坑。GAT 和 GCN 为两个比较主流的图神经网络。我们通常不会去考虑太多 GCN 的数学基础,而是在实际中拿来用。GNN 也存在随着层数变深,信息损失严重的问题。最新的学习模型通常都会为了适应数据而做些略微的修改,比如 Deep Graph InfoMatrix, Graph Transformer, GraphBert等等。最后推荐使用 DeepGraphLibrary,一个图神经网络的库,以上模型它都已经写好了。此外,与之类似的库还有 PyTorch 的 PyG。
https://www.dgl.ai/www.dgl.ai https://github.com/rusty1s/pytorch_geometricgithub.com往期回顾:
除夕:2020 年 4月 新番 图神经网络 GNN Intro - 0