本章主要内容:
本章主要介绍了GNN的设计空间design space,也就是设计一个GNN模型中的各种选择条件。(下一章继续讲这个)
本章首先讲了GNN单层的设计选择。
一层GNN包含信息转换和信息聚合两个部分。
讲了三种典型实例GCN、GraphSAGE、GAT。
GCN相当于用权重矩阵和节点度数归一化实现信息转换,用邻居节点求平均的方式实现聚合。
GraphSAGE可选用多种聚合方式来聚合邻居信息,然后聚合邻居信息和节点本身信息。在GraphSAGE中可以选用L2正则化。
GAT使用注意力机制为邻居对节点的信息影响程度加权,用线性转换后的邻居信息加权求和来实现节点嵌入的计算。注意力权重用一个可训练的模型attention mechanism计算出两节点间的attention coefficient,归一化得到权重值。此外可以应用多头机制增加鲁棒性。
在GNN层中还可以添加传统神经网络模块,如Batch Normalization、Dropout、非线性函数(激活函数)等。
然后讲了GNN多层堆叠方式。
叠太多层会导致过平滑问题。感受野可以用来解释这一问题。
对于浅GNN,可以通过增加单层GNN表现力、增加非GNN层来增加整体模型的表现力。
可以应用skip connections实现深GNN。skip connections可以让隐节点嵌入只跳一层,也可以全部跳到最后一层。
1. A General Perspective on Graph Neural Networks
- 我对design space的理解大概就是在设计模型的过程中,可以选择的各种实现方式所组成的空间。比如说可以选择怎么卷积,怎么聚合,怎么将每一层网络叠起来,用什么激活函数、用什么损失函数……用这些选项组合出模型实例,构成的空间就是design space。
在后期还有一个design space的课程。对于design space的进一步理解可以看Jure的论文 You, J., Ying, R., & Leskovec, J. (2020). Design Space for Graph Neural Networks. ArXiv, abs/2011.08843.
- 对deep graph encoders、GNN、聚合邻居信息等内容不再赘述。
- 通用GNN框架
(GNN的一层就是指计算图上的一层)
- 对GNN的一个网络层:要经历message(信息转换)和aggregation(信息聚合)两个环节,不同的实例应用不同的设计方式(如GCN,GraphSAGE,GAT……)
instantiation实例化(就是类似于Java编程里用类创建一个对象,将抽象的类具象化为对象……这样)
- 连接GNN网络层:可以逐层有序堆叠,也可以添加skip connections
- 图增强graph sugmentation:使原始输入图和应用在GNN中的计算图不完全相同(即对原始输入进行一定处理后,再得到GNN中应用的计算图)。
图增强分为:图特征增强 / 图结构增强
- 学习目标:有监督/无监督目标,节点/边/图级别目标
- A General GNN Framework
2. A Single Layer of GNN
- 再回顾一遍在第一节中写过的GNN单层网络的设计空间:message transformation + message aggregation
- GNN单层网络的目标是将一系列向量(上一层的自身和邻居的message)压缩到一个向量中(新的节点嵌入)
完成这个目标分成两步:信息处理,信息聚合(这里的聚合方法是需要ordering invariant的,也就是邻居节点信息聚合,聚合的顺序应当和结果无关)
- 经典GNN层(公式中橘色部分为信息聚合,红色部分为信息转换)
- GAT示例:Cora Citation Net
attention机制可应用于多种GNN模型中。在很多案例中表现出了结果的提升。
如图显示,将节点嵌入降维到二维平面,节点不同颜色表示不同类,边的宽度表示归一化后的attention coefficient(8个attention head计算后求和)
t-SNE是一种降维技术
- 实践应用中的GNN网络层:往往会应用传统神经网络模块,如在信息转换阶段应用Batch Normalization(使神经网络训练稳定)、Dropout(预防过拟合)、Attention / Gating3(控制信息重要性)等。
concretely具体地; 具体; 具体的; 有形地;
- Batch Normalization:对一个batch的输入数据(节点嵌入)进行归一化,使其平均值为0,方差为1
- Dropout:在训练阶段,以概率p随机将神经元置为0;在测试阶段,用所有的神经元来进行计算
- GNN中的Dropout:应用在信息转换过程中的线性网络层上
- 可以通过 GraphGym 来测试不同的GNN设计实例(我还没用过这个包)。
3. Stacking Layers of a GNN
- 再回顾一下第一节写的连接GNN网络层部分:
- 连接GNN网络层的标准方式:按序堆叠
输入原始节点特征,输出L层后计算得到的节点嵌入向量
- 过平滑问题the over-smoothing problem6:如果GNN层数太多,不同节点的嵌入向量会收敛到同一个值(如果我们想用节点嵌入做节点分类任务,这就凉了)GNN的层跟别的神经网络的层不一样,GNN的层数说明的是它聚集多少跳邻居的信息
- GNN的感受野receptive field:决定该节点嵌入的节点组成的集合。
对K层GNN,每个节点都有一个K跳邻居的感受野。如图可见K越大,感受野越大
- 对两个节点来说,K变大,感受野重合部分会迅速变大
- 感受野 & 过平滑
节点嵌入受其感受野决定,两个节点间的感受野越重合,其嵌入就越相似。
堆叠很多GNN网络层→节点具有高度重合的感受野→节点嵌入高度相似→过平滑问题
- 由于过平滑问题,我们需要谨慎考虑增加GNN层。
第一步:分析解决问题所需的必要感受野(如测量图的直径7)
第二步:设置GNN层数 L 略大于我们想要的感受野
- 既然GNN层数不能太多,那么我们如何使一个浅的GNN网络更具有表现力呢?
- 方法1:增加单层GNN的表现力,如将信息转换/信息聚合过程从一个简单的线性网络变成深度神经网络(如3层MLP)
- 方法2:添加不是用来传递信息的网络层,也就是非GNN层,如对每个节点应用MLP(在GNN层之前或之后均可,分别叫 pre-process layers 和 post-process layers)
pre-processing layers:如果节点特征必须经过编码就很重要(如节点表示图像/文字时)
post-processing layers:如果在节点嵌入的基础上需要进行推理和转换就很重要(如图分类、知识图谱等任务中)colab28中的图分类任务就都有,用AtomEncoder作为pre-processing layer,池化层作为post-processing layer
- 如果实际任务还是需要很多层GNN网络,那么可以在GNN模型中增加skip connections9
通过对过平滑问题进行观察,我们可以发现,靠前的GNN层可能能更好地区分节点。(就很明显嘛这事)
因此我们可以在最终节点嵌入中增加靠前GNN层的影响力,实现方法是在GNN中直接添加捷径,保存上一层节点的嵌入向量(看后文应该是指在激活函数前,在聚合后的结果的基础上再加上前一层的嵌入向量)
- skip connections原理10:
相当于制造了多个模型(如图所示),N个skip connections就相当于创造了2 N 2^N2
N
条路径,每一条路径最多有N个模块。
这些路径都会对最终的节点嵌入产生影响,相当于自动获得了一个浅GNN和深GNN的融合模型。
- skip connections也可以跨多层,直接跨到最后一层,在最后一层聚合之前各层的嵌入(通过concat / pooling / LSTM)