参考博客:Graph Attention Networks学习笔记 - 知乎 (zhihu.com)
在本文中,作者提出了一种基于attention的节点分类网络——GAT。其基本思想是,根据每个节点在其邻节点上的attention,来对节点表示进行更新。GAT具有以下几个特点:(1)计算速度快,可以在不同的节点上进行并行计算;(2)可以同时对拥有不同度的节点进行处理;(3)可以被直接用于解决归纳学习问题,即可以对从未见过的图结构进行处理。
Graph Attentional Layer
输入:
单个的 graph attentional layer 的输入是一个节点特征向量集。其中, 表示节点集中节点的个数, 表示相应的特征向量维度。
输出:
每一层的输出是一个新的节点特征向量集。其中, 表示新的节点特征向量维度(可以不等于 )。
结构图如下:
graph attentional layer首先根据输入的节点特征向量集,进行self-attention处理:
(1)核心公式 1:特征空间变换和注意力系数计算
首先,对每个结点特征左乘一个线性变化矩阵W,将输入特征转换为更加高级别的特征;W的形状为F'×F;将结点特征映射到输出维度,同时也提供了相应的可学习参数。 Eij表示节点j对于节点i的重要程度。公式里的a目前还是一个抽象的代表注意力机制的函数。
(2)核心公式 2:注意力权值计算
因此,对于中心节点i的所有邻居节点,重复公式1,可以得到中心节点和其所有邻居节点的注意力系数。然后通过归一化得到0到1之间的注意力权值。
其中,a 是一个 的映射(文章叫注意力机制),是一个权值矩阵(被所有 所共享)。一般来说,self-attention会将注意力分配到图中所有的节点上,这种做法显然会丢失结构信息。为了解决这一问题,本文使用了一种masked attention的方式——仅将注意力分配到节点 i的邻节点集上(文中用i(包括i)的一阶邻居),即 (在本文中,节点i也是 的一部分)。
(3)核心公式 3:完整公式
这是GAT的完整公式,包含了上述的整个过程。由于 hi和hj经过W映射并拼接后,其长度为2×F’,因此,GAT所使用的注意力向量a的长度也为2×F',相乘后得到一个具体的数值,然后通过LeakyRLU激活函数进行非线性变化,最后通过softmax进行归一化,得到中心节点i和其所有邻居节点的注意力权重。
(4)核心公式 4:基于注意力的邻居节点信息聚合
得到注意力权重后,对于每个邻居节点,对其进行特征变换后乘上相应的注意力权重,最后求和之后通过一个非线性函数得到聚合后的中心节点的特征。
(5)核心公式5 :多头注意力聚合
为了使得注意力机制的训练过程能够具有稳定性,GAT使用了multi-head attention来进行优化。简单来说,就是设置一个循环,循环次数为K,即对一个节点i重复K次公式4,最后将K个节点特征进行拼接,即最后的输出的节点特征维度为K×F';
(6)公式6:多头注意力平均聚合
如果在网络最后一层应用多头注意力,则不再需要拼接操作,而是直接求和取均值,再根据最后的下游任务,如分类问题等,应用不同的激活函数。
待思考和解决的问题:
- 对称的注意力机制如何设计?是否有需要这样设计的实际应用场景?
- 节点特征映射的过程中如何保证特征信息不会损失或冗余?
- 节点的聚合顺序如何界定,在聚合一阶邻居节点的同时,一阶邻居节点同时又是二阶邻居节点的中心节点