本章来学习一下图注意力网络GAT,首先对标GCN,来谈谈它们的优缺点。
GCN是处理transductive任务的一把利器,transductive任务是指:训练阶段与测试阶段都基于同样的图结构,如下图所示。
![图片[1]-Graph Attention Networks(GAT)-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/03/20240307195752740.png)
在整个图数据中,假设 k, i, l, d 节点是带有真实标签的节点其它节点不带标签,现在的任务是预测不带标签的节点属性,也就是说,要学习不带标签节点向量的合理表示。通过GCN的处理,每个节点的向量信息都可以通过GCN的方式进行交流和更新,在进行损失函数计算时,只需要计算带有标签的节点损失即可。因为一个合理的直觉是,想要 k, i, l, d 节点学习得到一个正确的向量表示,那么它们邻居节点的向量表示必须也要学好,想要邻居节点的向量表示学好,邻居的邻居节点也要学到一个好的向量表示,进而推广到全图。所以,由于图数据的这个特点,即使只训练了 k, i, l, d 节点的损失,整个图中所有的节点都会得到学习。
可惜的是,GCN无法完成inductive任务,即处理动态图问题。inductive任务是指:训练阶段与测试阶段需要处理的图结构不同。常见于一些推理场景,举例:训练阶段处理的是一些已知标签的药物分子活性,测试阶段要预测其它不带标签的药物分子活性。因为测试阶段需要处理的图的邻接矩阵明显与训练阶段不同,而GCN利用到了拉普拉斯矩阵和度矩阵(基于邻接矩阵),从这种意义上讲它聚合邻居特征的时候,训练出来的权重 W 是考虑了整个图结构的,如果图结构改变,那么就不再适用。GCN的另一个缺点是处理有向图存在瓶颈,因为聚合邻居节点采用的是平均聚合的方式,所以不容易实现分配不同的学习权重给不同的邻居。
GAT则可以处理inductive类型的任务。GAT可以有两种运算方式,一种被称为全局注意力(Global graph attention),顾名思义,就是每一个顶点都对于图上任意顶点都进行attention运算。这样做的优点是完全不依赖于图的结构,即不依赖图的邻接矩阵,对于inductive任务无压力。缺点也很明显:首先,丢掉了图结构的这个特征。其次,当图数据规模很大的时候,运算面临着高昂的成本。第二种被称为掩码图注意力机制(Mask graph attention),这种注意力机制的运算只在邻居顶点上进行,效果会更好一些,接下来主要讲解Mask graph attention机制。
类似于Transformer中的注意力机制,GAT的计算也分为两步:计算注意力系数(attention coefficient)和加权求和(aggregate)。
对于顶点 \(i\), 逐个计算它的邻居们 \(\left(j \in N_i \quad\right.\) 和它的相似系数 \(e_{i j}=\alpha\left(\left[W h_i \| W h_j\right]\right), j \in \mathcal{N}_i\) 。其中, \(W\) 是一个共享参数, 通过一个单层的神经网络层来实现, 可以对节点向量进行线性映射以达到特征增维的目的。 \([\cdot \| \cdot]\) 是对节点 \(i, j\) 的变换后的特征进行了拼接操作(concat)。最后通过 \(\alpha(\cdot)\) 把拼接后的高维特征映射到一个实数上, 也是通过一个单层的神经网络层来实现。
显然学习节点 \(i, j\) 之间的相关性, 就是通过可学习的参数 \(W\) 和 \(\alpha(\cdot)\) 映射完成的, 本质上是通过神经网络模型实现的。有了相关系数, 离注意力系数就差归一化了! 其实就是使用 softmax 做一步映射, 公式如下:
$$
\alpha_{i j}=\frac{\exp \left({LeakyReLU}\left(e_{i j}\right)\right)}{\sum_{k \in \mathcal{N}_i} \exp \left({LeakyReLU}\left(e_{i k}\right)\right)}
$$
至于加权求和的实现也很简单, 根据计算好的注意力系数, 把特征加权求和聚合 (aggregate) 一下。即:
$$
h_i^{\prime}=\sigma\left(\sum_{j \in \mathcal{N}_i} \alpha_{i j} W h_j\right)
$$
\(h_i^{\prime}\) 就是 GAT 输出的对于每个节点 \(i\) 的新特征, 这个新特征的向量表示融合了邻域信息, \(\sigma(\cdot)\) 是激活函数。最后, 与 Transformer一样, GAT 也可以用多头注意力机制来进化增强:
$$
h_i^{\prime}(K)=\|_{k=1}^K \sigma\left(\sum_{j \in \mathcal{N}_i} \alpha_{i j}^k W^k h_j\right)
$$
其中 \(K\) 是注意力机制的头数, 每个头都会维护更新自己的参数, 计算得到自己的结果, \(\|_{k-1}^K\)
表示将所有头的计算结果进行拼接(concat)得到最后更新好的新节点向量。多头注意力机制也可以理解成用了集成学习的方法,就像卷积中,也要靠大量的卷积核才能大显神威一样!
最后通过一个示例来复习一下GAT的计算过程,图数据如下图所示。
![图片[2]-Graph Attention Networks(GAT)-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/03/20240307200225799.png)
假设参数 \(\boldsymbol{W}\) 和 \(\boldsymbol{\alpha}\) 的值为 \(\boldsymbol{W}=[1,1], \boldsymbol{\alpha}=[1,1,1,1]\) 。注意, 这些参数都是可学习的, 随着网络的训练而更新。
首先, 计算注意力系数 \(e_{i j}=\boldsymbol{\alpha}\left(\boldsymbol{W} h_i, \boldsymbol{W} h_j\right)\), 以节点 1 为例, 与其它节点的相关性系数为:
$$
\begin{aligned}
& e_{12}=\alpha \cdot[0.1,0.2,0.2,0.2]=0.7 \\
& e_{13}=\alpha \cdot[0.1,0.2,0.25,0.2]=0.75 \\
& e_{14}=0 \\
& e_{15}=\alpha \cdot[0.1,0.2,0.3,0.8]=1.4 \\
& e_{16}=\alpha \cdot[0.1,0.2,0.5,0.6]=1.4
\end{aligned}
$$
\(e_{14}\) 由于单向性, 即节点 1 指向 2 , 因此在计算时, 相关性为零。然后通过公式 \(\alpha_{i j}=\frac{\exp \left(\operatorname{LeakyReLU}\left(\vec{a}^T\left[W \vec{h}_i \| W \vec{h}_j\right]\right)\right)}{\sum_{k \in N_i} \exp \left(\operatorname{LeakyReLU}\left(\vec{a}^T\left[W \vec{h}_i \| W \vec{h}_k\right]\right)\right)}\), 经过 softmax 的映射计算得到相关性系数, 如:
$$
\alpha_{12}=\frac{\exp \left(\operatorname{LeakyReLU}\left(e_{12}\right)\right)}{\exp \left(\operatorname{LeakyReLU}\left(e_{12}\right)\right)+\exp \left(\operatorname{LeakyReLU}\left(e_{13}\right)\right)+\ldots+\exp \left(\operatorname{LeakyReLU}\left(e_{16}\right)\right)}
$$
然后通过加权求和对某节点的邻居做重要程度的重分配, 即:
$$
\overrightarrow{h_i^{\prime}}=\sigma\left(\sum_{j \in \mathcal{N}_i} \alpha_{i j} W \vec{h}_j\right)
$$
以节点 1 为例:
$$
\vec{h}_1^{\prime Y}=\sigma\left(\alpha_{12} \cdot W \cdot \vec{h}_2+\sigma\left(\alpha_{13} \cdot W \cdot \vec{h}_3 \cdots\right)=\sigma\left(\alpha_{12} \cdot W \cdot[0.2,0.2]+\cdots\right)\right.
$$
最后,谈谈对于GAT的一些深层理解:
(1)GAT与GCN的联系与区别?
本质上而言:GCN与GAT都是将邻居节点的特征聚合到中心节点上(一种aggregate运算),利用图数据上的局部连接性学习新的节点特征表达。不同的是GCN利用了拉普拉斯矩阵 \(\left(\tilde{\boldsymbol{D}}^{-\frac{1}{2}} \tilde{\boldsymbol{A}} \tilde{\boldsymbol{D}}^{-\frac{1}{2}}\right), \mathrm{GAT}\) 利用 attention 系数 \(\left(\alpha_{i j}\right)\)。
。一定程度上而言,GAT会更强,因为节点特征之间的相关性可以被更好地融入到模型中。
(2)为什么GAT适用于有向图?
最根本的原因是GAT的运算方式是逐顶点的运算(node-wise)。每一次运算都需要循环遍历图上的所有顶点来完成。逐顶点运算意味着,摆脱了拉普利矩阵的束缚,使得有向图问题迎刃而解。
(3)为什么GAT适用于inductive任务?
GAT聚合邻居特征的时候仅仅只需要考虑邻居特征,训练出来的参数W和 a是对邻居特征的线性变换参数矩阵,这个参数矩阵针对每一个节点的每一个邻居都是一样的,也就是所谓的共享权重参数。这些仅与节点特征相关,没有直接用到邻接矩阵进行计算。所以测试任务中改变图的结构,对于GAT影响并不大,只需要改变 \(N_i\),重新计算即可。与此相反的是,GCN是一种全图的计算方式,一次计算就更新全图的节点特征(基于邻接矩阵的拉普拉斯矩阵和度矩阵一定程度上代表了全图信息)。学习的参数很大程度与图结构相关,一旦结构改变,学习得的参数将不再适用,这使得GCN在inductive任务上遇到困境。
暂无评论内容