课程主页:CS224W | Home
课程视频链接:斯坦福CS224W《图机器学习》课程(2021) by Jure Leskovec
1 前言
上篇文章介绍了怎样设计一个单层的神经网络,大致包括消息转换和消息聚合两步操作,还讨论了一些可用于优化神经网络训练的深度学习方法。
本篇文章将学习如何将单个的神经网络层一层一层地堆叠起来,学习添加skip connections的方法。
2 堆叠GNN的神经网络层
连接GNN网络层的标准方式:按序堆叠
输入原始节点特征,输出L层后计算得到的节点嵌入向量:
2.1 过平滑问题
但是,当太多GNN层堆叠在一起,就会产生过平滑问题(The Over-smoothing Problem):不同节点的嵌入向量会收敛到非常相同的一个值,所有不同节点都有相同的输出,导致我们无法通过节点嵌入来区分不同的节点,影响下游预测任务(如节点分类)。
和过度平滑问题相关的还有感受野(Receptive Field):决定该节点嵌入的所有节点组成的集合。
对K层的GNN来说,每个节点都有一个K跳邻居的感受野。如上图可见,K越大,感受野越大。
对两个节点来说,如果要进行链接预测,我们将K(层数)变大,感受野的重合部分会迅速变大:
从上面两个图上都可以看到,当K=3时,几乎整个图上的节点都包含在感受野内,我们所关心的单个节点的嵌入与图上绝大部分节点都有联系,所以当网络在聚集邻居的信息时,所有神经网络基本都得到相同的输入,所以越来越难区分出节点嵌入的不同。
结论:节点的嵌入取决于它的感受野。当堆叠很多GNN网络层时,两个节点的感受野将会高度重合,它们的嵌入也会高度相似,进而难以区分不同的节点,导致我们所说的过平滑问题。
那么如何解决过平滑问题呢?
2.2 设计GNN网络层间的连接方式
2.2.1 思路1:谨慎地增加GNN的网络层
与其他领域的神经网络(比如用于图像分类的CNN)不同,增加更多的神经网络层并不能让GNN产生更好的效果。
- 第一步:先分析解决问题所需的必要感受野(如测量图的直径:任意两个顶点间距离的最大值)
- 第二步:设置GNN的层数 L 略大于我们想要的感受野
既然GNN层数不能太多,那么我们如何使一个浅的GNN更具有表现力呢?
方法1:增加GNN每个层的表现力
在我们先前的讨论中,每个信息转换和信息聚合函数仅包含一个线性层。我们可以将转换和聚合本身拓展成深度的神经网络,比如三层的MLP:
方法2:添加不传递信息的网络层
一个GNN模型不必只有GNN层,比如我们可以在GNN层之前或之后(分别叫预处理层Pre-process layers 和后处理层Post-process layers),对每个节点添加不传递信息的MLP层:
- Pre-processing layers:如果节点特征必须经过编码就很重要(如永节点表示图像/文字时)
- Post-processing layers:如果在节点嵌入的基础上需要进行推理或转换就很重要(如图分类、知识图谱等任务中)
在实践中,将经典的神经网络层和GNN结合起来也取得了不错的效果。
如果在实际任务还是需要很多层GNN网络应该如何处理呢?
2.2.2 思路2:在GNN中添加skip connections
在过平滑问题中我们发现,靠前的GNN层得到的节点嵌入能很好地将节点区分开。因此,我们可以增加靠前的GNN层对最终节点嵌入的影响力,实现方法是在GNN中添加捷径:
在Skip connection后,保存了上一层节点的嵌入向量,使线性转换前的嵌入和转换后的嵌入进行了汇总。
也就是说,每次Skip connection都会创建一个混合模型(比如上层和本层信息的加权组合),如下图所示:
N个skip connections相当于创建了条路径,且每个路径最多有N个模块,这些路径都会对最终的节点嵌入产生影响,相当于自动获得了一个浅GNN和深GNN的融合模型。
Skip connection传送门:Residual Networks Behave Like Ensembles of Relatively Shallow Networks
举例:在GCN上使用Skip connection
除此之外,我们还可以直接跳到最后一层,在最后一层聚合之前各层的嵌入:
3 总结
本篇文章主要学习如何将单个的神经网络层堆叠连接起来,介绍了过平滑问题并提出了多种解决策略,包括:增强单个层的表现力、添加非GNN层、在GNN中添加skip connections等方法。
4 参考资料
http://web.stanford.edu/class/cs224w/slides/07-GNN2
cs224w(图机器学习)2021冬季课程学习笔记9 Graph Neural Networks 2: Design Space_诸神缄默不语的博客