课程主页:CS224W | Home
课程视频链接:斯坦福CS224W《图机器学习》课程(2021) by Jure Leskovec
1 前言
上节课学习的是GNN的通用框架:
GNN通用框架包括以下几个方面,它们共同构成了GNN的设计空间(Design Space):
- 单个层:每一层都包含信息转换(Message)和信息聚合(Aggregation)两个概念,根据对这两个概念的不同定义,产生了GCN、GraphSAGE、GAT等不同架构的GNN模型;
- 层之间的连接:逐层堆叠或添加Skip Connections;
- 图增强(Augmentation):使原始输入图和应用在GNN中的计算图不完全相同(即对原始输入进行一定处理后,再得到GNN中应用的计算图)。图增强分为:图特征增强、图结构增强;
- 学习目标函数:分为有监督、无监督的目标;还可以分为节点、边、图级别的目标
上述是设计一个GNN模型中的各种选择条件,之后的学习也将从以上几个方面进一步展开。
本篇将要学习如何对GNN的单个层进行定义,并进一步设计多种不同的GNN模型。
2 GNN单个层的设计
2.1 通用的单层设计
单层网络的设计目标是将一系列向量(上一层的自身和邻居的message)压缩到一个新的向量(新的节点嵌入)中,完成这个目标分成两步:信息转换和信息聚合。
- 重要细节1:在聚合时不考虑邻居节点的顺序,即聚合的结果是Permutation Invariant的
- 重要细节2:输入的不仅仅是上一层邻居节点的嵌入,还包括节点本身在上一层的嵌入
第一步:信息转换
思路:每个节点都会创建并转换一条信息,并将该信息发送到下一层的其他节点。
举例:MSG可以是一个线性变换,即乘以一个权重矩阵W。
转换后的消息记作
第二步:信息聚合
思路:每个节点都会聚集来自其邻居节点的信息(这里的信息是指经过第一部转换后的)。
举例:AGG可以是求和、取平均、取最大值等等。
但是上述过程中并未包含节点v自身的信息,因为对的计算不直接依赖于
,所以上边的两步计算需要进一步改进为:
- 在第一步信息转换中,新增一个对于节点v自身的转换函数
;
- 在第二步信息聚合中,新增一个拼接函数CONCAT,把节点自身信息连接进去。
小结
GNN单层网络就是合并上述两步:对每个节点,先计算出其自身与邻居的节点信息,然后计算其邻居与本身的信息聚合。
注:在这两步上都可以用非线性函数(激活函数)来增加其表现力。
2.2 GCN的单层设计
GCN传送门:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS
GCN模型的聚合采用了取平均的方式:
但是,上述式子现在不符合Message + Aggregation的形式,我们可以把分配到内部作为一个线性转换得到:
在这个式子中,Message和Aggregation分别为:
存疑:这里为什么没有包含节点自身的信息?
2.3 GraphSAGE的单层设计
GraphSAGE传送门:Inductive Representation Learning on Large Graphs
GraphSAGE是在GCN基础上的扩展,该模型的聚合方式AGG有多种选择(而不是简单地只取平均),而且该模型还保留了节点本身的信息,增加了表现力。
在这个式子中,Message和Aggregation分别为:
信息转换的过程包含在函数AGG中(如下图),信息聚合的过程分为两步,第一步聚合邻居节点的信息,第二步连接节点自身的信息。
那么,GraphSAGE的聚合方式有哪些选择呢?通常有以下三种:
(Pool和LSTM还没学,原理在之后的课程中逐渐补充吧)
除此之外,GraphSAGE还增加了L2归一化的概念:
对每一层的嵌入都使用L2归一化:
正则化之前,嵌入向量的比例和长度是不同的,使用L2正则化之后,所有向量的长度都将变为1,提高了嵌入的性能。
2.4 GAT(Gpaph Attention Network,图注意力网络)的单层设计
GAT原文传送门:GRAPH ATTENTION NETWORKS
GAT在GCN的基础上做了改进,为每个节点的邻居节点指定了不同的权重:
其中,是注意力权重,表示邻居节点u的信息对于节点v的重要性。
也就是说,不同,表示来自不同节点的信息具有不同的权重。
attention机制的思路:一个节点的邻居节点并非同等重要,我们的模型应该在小而重要的数据上投入更多的算力,而注意力机制引入的目的是为图上每个节点的不同邻居指定不同的权重,使得我们更关注输入数据的重要部分。
在先前讨论的GCN / GraphSAGE中,注意力权重因子,直接基于图结构(节点度数)显式定义注意力权重,相当于认为节点v的所有邻居节点u都同等重要(每个节点的注意力权重一样大)。
2.4.1 注意力机制
上面介绍了GAT的基本思路,那么怎么计算注意力权重呢?还需要引入注意力系数
,这个系数通过u和v两个节点上一层的嵌入来计算:
其中,是一个注意力机制函数(后文将介绍),
表示节点u的信息对节点v的重要性。例子:
接着,我们使用Softmax函数对进行归一化就得到注意力权重
,也使得
最后进行求和就得到了GAT的单层神经网络函数:
例子:
关于前文提到的注意力机制 可以有很多种选择,比如采用简单的单层神经网络:
与此同时,Linear中的权重参数让 变成一个可训练的函数。
2.4.2 多头注意力机制
使用简单的注意力机制有时很难收敛,所以将注意力的概念扩展到多头注意力(Multi-head attention),能让训练的过程更加稳定,在实践中的平均表现更好。
重要细节:每个注意力机制必须使用不用的 的函数,且每个
的起始参数必须使用随机值初始化,让多头注意力机制有更强的鲁棒性。
接着,再将输出进行聚合(通过concatenation或加总):
下图是三头注意力机制的实现方式,三条不同颜色的线代表三种不同的注意力机制,最后以连接或取平均的形式得到下一层的嵌入:
2.4.3 注意力机制的优势
- 核心优势:为不同邻居指定不同的重要性;
- 计算高效:对注意力系数e的计算可以在邻居节点传入信息的过程中并行计算(对于每个邻居传入的信息,我们都通过
函数计算其注意力权重);另外,聚合过程也可以在所有节点上同步运算;
- 储存高效:稀疏矩阵运算需要存储的元素总数不超过
,注意力机制函数
的参数数量也是固定的,与图的大小无关;
- 局部性:注意力机制仅对网络中的邻居节点赋予权重,而无需对整个网络进行运算;
- 推导能力:得到注意力函数
的过程不依赖于图结构,也就是说我们通过这种方式提取的注意力函数
可应用于图的其他部分或者其他不同的图结构上。
3 在实践中设计GNN的单个层
在实践中设计一个GNN的网络层时,通常考虑以下几个现代的深度学习模块,这些模块可以让GNN网络层有更好的表现:
比如:Batch Normalization(使神经网络训练稳定)、Dropout(预防过拟合)、Attention / Gating(控制信息的重要性)等…
3.1 批标准化(Batch Normalization)
Batch Normalization详解:BatchNormalization详解_CZTSummer的博客
目标:稳定神经网络的训练过程,加快模型收敛速度。
做法:对一个batch的输入数据(节点嵌入)进行归一化,使其平均值为0,方差为1
3.2 Dropout
目标:防止神经网络过拟合。
做法:
- 在训练阶段,以概率p随机将神经元置为0(不考虑部分节点);
- 在测试阶段,用所有的神经元来进行计算 。
在GNN中,Dropout应用在消息转换函数的线性层中:
3.3 非线性激活函数(Non-linear Activation)
- 最常用的是ReLU
- Sigmoid用于限制嵌入的范围
- 参数化的ReLU中有可训练的参数,表现优于ReLU
4 总结
本篇文章主要介绍了GNN单个神经网络层的不同设计方法,提出了GCN、GraphSAGE、GAT等GNN模型;还介绍了许多现代深度学习技术来使GNN获得更好的性能。
最后,我们可以通过 GraphGym 来测试不同的GNN设计实例。
5 参考资料
http://web.stanford.edu/class/cs224w/slides/07-GNN2.pdf
cs224w(图机器学习)2021冬季课程学习笔记9 Graph Neural Networks 2: Design Space_诸神缄默不语的博客