GRAPH ATTENTION NETWORKS
(2018ICLR)
代码地址:https://github.com/PetarV-/GAT.
摘要贡献
1.引入masked self-attentional layers 来改进前面图卷积graph convolution的缺点
2.对不同的相邻节点分配相应的权重(隐式的),既不需要矩阵运算(如求逆运算),也不需要事先知道图结构。
四个数据集上达到state of the art的准确率Cora、Citeseer、Pubmed citation 、protein interaction。
self-attention
优点:在许多基于序列的任务中,注意力机制几乎已成为事实上的标准。注意机制的一个好处是,它允许处理可变大小的输入,将注意力集中在输入中最相关的部分以做出决策。当一个注意机制被用来计算单个序列的表示时,它通常被称为自我注意或内部注意。
GAT
图注意层
方法理念:针对每一个节点运算相应的隐藏信息,在运算其相邻节点的时候引入注意力机制:
层的输入与输出
特征提取与注意力机制
为了获得足够的表达能力将输入特征转换为更高层次的特征,至少需要一个可学习的线性变换。为此,作为一个初始步骤,对每个节点应用一个共享的线性变换,由一个权重矩阵参数化。
然后我们在节点上进行自我注意——共享注意机制:
注意力互相关系数为attention coefficients:
这表明了节点j的特征对节点i的重要性。
作者通过masked attention将这个注意力机制引入图结构之中,**masked attention的含义 :**只计算节点 i 的相邻的节点 j。节点 j ∈N
i
_i
i,其中N
i
_i
i为节点i的所有相邻节点。为了使得互相关系数更容易计算和便于比较,我们引入了softmax对所有的i的相邻节点j进行正则化:
实验之中,注意力机制a是一个单层的前馈神经网络,通过权值向量来确定,并且加入了 LeakyRelu的非线性激活,这里小于零斜率为0.2。(这里我们回顾下几种Relu函数,relu:小于0就是0,大于零斜率为1;LRelu:小于零斜率固定一个值,大于零斜率为1;PRelu:小于零斜率可变,大于零斜率为1;还有CRelu,Elu,SELU)。注意力机制如下:
也就是的带入式子。
解释
1.其中丨丨表示concatenation operation.(串联操作)
2.转置表示为T
3.
注意力代码
def forward(self, x):
# [B_batch,N_nodes,C_channels]
B, N, C = x.size()
# h = torch.bmm(x, self.W.expand(B, self.in_features, self.out_features)) # [B,N,C]
h = torch.matmul(x, self.W) # [B,N,C]
a_input = torch.cat([h.repeat(1, 1, N).view(B, N * N, C), h.repeat(1, N, 1)], dim=2).view(B, N, N,
2 * self.out_features) # [B,N,N,2C]
# temp = self.a.expand(B, self.out_features * 2, 1)
# temp2 = torch.matmul(a_input, self.a)
attention = self.leakyrelu(torch.matmul(a_input, self.a).squeeze(3)) # [B,N,N]
attention = F.softmax(attention, dim=2) # [B,N,N]
attention = F.dropout(attention, self.dropout, training=self.training)
h_prime = torch.bmm(attention, h) # [B,N,N]*[B,N,C]-> [B,N,C]
out = F.elu(h_prime + self.beta * h)
return out
输出特征
通过上面,运算得到了正则化后的不同节点之间的注意力互相关系数normalized attention coefficients,可以用来预测每个节点的output feature:
其中,
-
W为与feature相乘的权值矩阵
-
a为前面算得的注意力互相关系数
-
sigema为非线性激活
-
遍历的j 表示所有与i 相邻的节点
-
这个公式表示就是,该节点的输出feature与与之相邻的所有节点有关,是他们的线性和的非线性激活
-
这个线性和的线性系数是前面求得的注意力互相关系数
多头attention
Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Lukasz Kaiser, and Illia Polosukhin. Attention is all you need. arXiv preprint arXiv:1706.03762, 2017.
在上面的output feature加入计算multi-head的运算公式:
具体来说,K个独立注意机制执行等式(4)的变换,然后将它们的特征串联起来,得到如下输出特征表示:
-
concate操作为||
-
第k个注意力机制为a k ^k k
-
共 K 个注意力机制需要考虑,小 k 表示 K 中的第 k 个
-
输入特征的线性变换表示为W k ^k k
-
最终的输出为h’ 共由KF’ 个特征影响
特别的,如果我们在网络的最终(预测)层上执行多头注意力,则串联不再合理,我们采用平均值,并延迟应用最终非线性(通常是针对分类问题的softmax或logistic sigmoid):
例如,K=3时候,结构如下:
例如此图,节点1在邻域中具有多端注意机制,不同的箭头样式表示独立的注意力计算,通过连接或平均每个head获取 h1
优势
对比GraphSAGE中的LSTM聚合器
- 2017年Hamilton提出的inductive method为每一个node都抽取一个固定尺寸的neighborhood(GraphSAGE),为了计算的时候footprint是一致的(指的应该是计算的时候处理neighborhood的模式是固定的,不好改变,因此每次都抽样出固定数量的neighbor参与计算),这样,在计算的时候就不是所有的neighbor都能参与其中。此外,Hamilton的这个模型在使用一些基于LSTM的方法的时候能得到最好的结果,这样就是假设了每个node的neighborhood的node一直存在着一个顺序,使得这些node成为一个序列。但是本文提出的方法就没有这个问题,每次都可以将neighborhood所有的node都考虑进来,而且不需要事先假定一个neighborhood的顺序。
三、实验与评估
实验分成两部分,transductive learning(半监督学习)和inductive learning(归纳学习)。模型用了两层的GAT。
3.1 数据集
3.2 半监督学习transductive learning
- 两层 GAT
- 在Cora 数据集上优化网络结构的超参数,应用到Citeseer 数据集
- 第一层 8 head, F`=8 , ELU 作为非线性函数
- 第二层为分类层,一个 attention head 特征数C,后跟 softmax 函数,为了应对小训练集,正则化(L2)
- 两层都采用 0.6 的dropout,相当于计算每个node位置的卷积时都是随机的选取了一部分近邻节点参与卷积
结果
3.3 归纳学习inductive learning
- 三层GAT 模型
- 前两层 K=4, F’=256(共1024个特征) ,ELU作为非线性函数
- 最后一层用来分类 K=6, F’=121 , 激活函数为sigmoid
- 该任务中,训练集足够大不需要使用 正则化 和 dropout
结果(F1值)
GraphSAGE*对应于我们只需修改其架构就可以获得的最佳GraphSAGE结果。
Const-GAT对应于一个与GAT具有相同体系结构的模型,但具有恒定的注意机制(对每个邻居分配相同的重要性;类似GCN的归纳算子)。
两个任务都是用Glorot初始化初始的,并且是用Adam SGD来最小化交叉熵进行优化
可视化
在Cora数据集上预先训练的GAt模型的第一个隐藏层的计算特征表示的t-SNE图。节点颜色表示类。边缘厚度表示节点i和j之间的聚集规范化注意系数,跨越所有八个注意头。