Graph Attention Network (GAT) 图注意力网络 论文详解 ICLR2018

Graph Attention Network (GAT) 图注意力网络 论文详解 ICLR2018

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yyl424525/article/details/100920134

 


论文题目:Graph Attention Network (GAT)

 

时间:2018

期刊:ICLR

论文链接:https://arxiv.org/abs/1710.10903

Github链接:https://github.com/Diego999/pyGAT

1 相关介绍

graph上的deep learning方法无外乎就是希望学习节点特征以及节点在图中的结构特征。

GCN的局限性

  • 无法完成inductive任务,即处理动态图问题。inductive任务是指:训练阶段与测试阶段需要处理的graph不同。通常是训练阶段只是在子图(subgraph)上进行,测试阶段需要处理未知的顶点。(unseen node)
  • 处理有向图的瓶颈,不容易实现分配不同的学习权重给不同的neighbor
  • 对于一个图结构训练好的模型,不能运用于另一个图结构(所以此文称自己为半监督的方法)

本文贡献(创新点)

  • 引入masked self-attentional layers 来改进前面图卷积的缺点
  • 对不同的相邻节点分配相应的权重,既不需要矩阵运算,也不需要事先知道图结构
  • 四个数据集上达到state-of-the-art的准确率Cora、Citeseer、Pubmed、protein interaction

attention 引入目的

  • 为每个节点分配不同权重
  • 关注那些作用比较大的节点,而忽视一些作用较小的节点
  • 在处理局部信息的时候同时能够关注整体的信息,不是用来给参与计算的各个节点进行加权的,而是表示一个全局的信息并参与计算

相关工作

对待图结构的数据有两种方法,谱方法和非谱方法

谱方法 spectral approaches

例如:GCN
Semi-Supervised Classification with Graph Convolutional Networks,ICLR 2017这篇文章中的方法

解析 :Semi-Supervised Classification with Graph Convolutional Networks用图卷积进行半监督分类

非谱方法 non-spectral approaches (基于空间的方法)

例如:GraphSAGE
William L Hamilton, Rex Ying, and Jure Leskovec. Inductive representation learning on largegraphs. Neural Information Processing Systems (NIPS), 2017.

解析:GraphSAGE:Inductive Representation Learning on Large Graphs

这种方法是将相邻节点设置为固定的长度,然后进行specific aggregator,这种方法在几个大的benchmarks上取得了非常好的效果。

注意力机制 self-attention

优点:可以处理任意大小输入的问题,并且关注最具有影响能力的输入。

注意力机制再RNN与CNN之中,都取得了不错的效果,并且可以达到state-of-the-art的性能。

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

2 GAT

Graph Attentional Layer

和所有的attention mechanism一样,GAT的计算也分为两步:计算注意力系数(attention coefficient)和加权求和(aggregate)

input
单个 graph attentional layer的输入是一个节点特征向量集合

Unexpected text node: '  'Unexpected text node: '  'h={h1,h2,,hN},hiRF

其中

  • NNN表示节点的数目
  • FFF表示每个节点的特征的数目

output
并生成一个新的节点特征集合

Unexpected text node: '  'Unexpected text node: '  'h={h1,h2,,hN},hiRF
其中FFF和 FF'F′具有不同的维度。

为了得到相应的输入与输出的转换,需要根据输入的feature至少一次线性变换得到输出的feature,所以我们需要对所有节点训练一个权值矩阵:WRF×FW\in R^{F^{'}\times F}WRF×F,这个权值矩阵就是输入与输出的F个feature与输出的F’个feature之间的关系:

hi⃗ =Whi⃗ \vec{h_i^{'}}=\mathbf{W}\vec{h_i}hi=Whi

为了获得足够的表达能力以将输入特征变换为更高级别的特征,需要至少一个可学习的线性变换。为此,作为初始步骤,一个共享的线性变换参数矩阵WRF×F\mathbf{W}\in R^{F^{'}\times F}WRF×F被应用于每一个节点。

计算注意力系数(attention coefficient)

针对每个节点执行 self-attention机制,机制aaa为

a:RF×RFRa:R^{F^{'}}\times R^{F^{'}}\to Ra:RF×RFR

计算注意力互相关系数attention coefficients:

eij=a(Whi⃗ ,Whj⃗ )(1)\tag{1} e_{ij}=a(\mathbf{W}\vec{h_i}, \mathbf{W}\vec{h_j})eij=a(Whi,Whj)(1)
其中

  • 注意力系数eije_{ij}eij表示的节点jjj对于节点iii的重要性
  • 向量h就是 feature向量
  • aaa是一个RF×RFRR^{F^{'}}\times R^{F^{'}}\to RRF×RFR的映射
  • WRF×F\mathbf{W}\in R^{F^{'}\times F}WRF×F,使用W\mathbf{W}W将每个特征转换为可用的表达性更强的特征

论文里说,self-attention是一种Global graph attention,会将注意力分配到图中所有的节点上,这种做法显然会丢失结构信息。通过self-attention注意力机制可以计算任意两个样本的关系,使一个样本用其他所有样本来表示,但是第一,基于空间相似假设,一个样本与一定范围内的样本关系较密切,第二,样本较多的时候,计算量非常大。为了解决这一问题,作者使用了一种 masked attention 的方法,对于一个样本来说只利用邻域内的样本计算注意力系数和新的表示,即仅将注意力分配到节点的邻居节点集上。

为了使得注意力系数更容易计算和便于比较,引入了softmax对所有的iii的相邻节点jjj进行正则化:

αij=softmaxj(eij)=exp(eij)kNiexp(eik)(2)\tag{2} \alpha_{ij} = \mathrm{softmax}_j (e_{ij}) = \frac{\exp(e_{ij})}{\sum_{k \in \mathcal{N}_i} \exp(e_{ik})}αij=softmaxj(eij)=kNiexp(eik)exp(eij)(2)
其中

  • Ni\mathcal{N_i}Ni表示节点iii的邻居节点集合
  • 这个系数α\alphaα就是每次卷积时,用来进行加权求和的系数

实验中,注意力机制aaa是一个单层的前馈神经网络,通过权值向量来确定a⃗ R2F\vec{\text{a}} \in \mathbb{R}^{2F'}aR2F′,并且加入了 LeakyRelu的非线性激活,这里小于零斜率为0.2。(回顾下几种Relu函数,relu:小于0就是0,大于零斜率为1;LRelu:小于零斜率固定一个值,大于零斜率为1;PRelu:小于零斜率可变,大于零斜率为1;还有CRelu,Elu,SELU)。

αij=exp(LeakyReLU(a⃗ T[Wh⃗ iWh⃗ j]))kNiexp(LeakyReLU(a⃗ T[Wh⃗ iWh⃗ k]))(3)\tag{3} \alpha_{ij} = \frac{ \exp{ ( \mathrm{LeakyReLU} ( \vec{\text{a}}^T [\mathbf{W} \vec{h}_i \Vert \mathbf{W} \vec{h}_j ] ))}}{\sum_{k \in \mathcal{N_i}} \exp{(\mathrm{LeakyReLU}(\vec{\text{a}}^T [\mathbf{W} \vec{h}_i \Vert \mathbf{W} \vec{h}_k]))}}αij=kNiexp(LeakyReLU(aT[WhiWhk]))exp(LeakyReLU(aT[WhiWhj]))(3)
其中

  • ||表示concatenation操作(串联)

下图就是表示Wh⃗ i\mathbf{W} \vec{h}_iWhiWh⃗ j\mathbf{W} \vec{h}_jWhj经过串联以后,再和权值向量a⃗ R2F\vec{\text{a}} \in \mathbb{R}^{2F'}aR2F′相乘后,最后进行一个softmax归一化处理后的示意图。

这部分代码为

    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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

加权求和(aggregate)

得到归一化的注意力系数后,使用归一化的值计算对应特征的线性组合,作为每个顶点最后的输出特征(最后可以加一个非线性层,σ\sigmaσ):

h⃗ i=σ(jNiαijWh⃗ j)(4)\tag{4} \vec{h}'_i = \sigma(\sum_{j \in \mathcal{N}_i} \alpha_{ij} \mathbf{W} \vec{h}_j)hi=σ(jNiαijWhj)(4)
h⃗ i\vec{h}'_ihi就是GAT输出的节点iii 融合了邻域信息的新特征

multi-head attention机制

为了使self-attention 的学习过程更稳定,发现使用 multi-head attention来扩展注意力机制是很有效的。

使用K个独立的 attention 机制执行公式式4这样的变换,然后他们的特征连(concatednated)在一起,就可以得到如下的输出:

h⃗ i=Kk=1σ(jNiαkijWkh⃗ j)(5)\tag{5} \vec{h}'_i = \Vert^{K}_{k=1} \sigma(\sum_{j \in \mathcal{N}_i} \alpha^k_{ij} \mathbf{W}^k \vec{h}_j)hi=k=1Kσ(jNiαijkWkhj)(5)
其中

  • 最后的返回输出hh'h′,每个顶点都会有KFKF'KF′维的特征(不是FF'F′)

下图表示K=3K=3K=3时的multi-head attention机制示意图。例如此图,节点1在邻域中具有多端注意机制,不同的箭头样式表示独立的注意力计算,通过连接或平均每个head获取h⃗ 1\vec{h}_1h1

对于最后一个卷积层,如果还是使用multi-head attention机制,那么就不采取连接的方式合并不同的attention机制的结果了,而是采用求平均的方式进行处理,即

h⃗ i=σ(1KKk=1jNiαkijWkh⃗ j)(6)\tag{6} \vec{h}'_i = \sigma(\frac{1}{K} \sum^K_{k=1} \sum_{j \in \mathcal{N}_i} \alpha^k_{ij} \mathbf{W}^k \vec{h}_j)hi=σ(K1k=1KjNiαijkWkhj)(6)

和当前工作的对比

  • 计算高效:self-attention层的操作可以在所有的边上并行,输出特征的计算可以在所有顶点上并行。没有耗时的特征值分解。单个的GAT计算FF'F′个特征的时间复杂度可以压缩至O(VFF+EF)O(|V|FF'+|E|F')O(VFF+EF),F是输入的特征数,|V|和|E|是图中顶点数和边数。复杂度与Kipf & Welling, 2017的GCN差不多。
    尽管 multi-head 注意力将存储和参数个数变为了K倍,但是单个head的计算完全独立且可以并行化。
  • 鲁棒性更强:和GCN不同,本文的模型可以对同一个 neighborhood的node分配不同的重要性,使得模型的capacity大增。
  • 注意力机制以一种共享的策略应用在图的所有的边上,因此它并不需要在之前就需要得到整个图结构或是所有的顶点的特征(很多之前的方法的缺陷)。因此GAT 也是一种局部模型。也就是说,在使用 GAT 时,无需访问整个图,而只需要访问所关注节点的邻节点即可,解决了之前提出的基于谱的方法的问题。因此这个方法有几个影响:
    • 图不需要是无向的,可以处理有向图(若jij\to iji不存在,仅需忽略αij\alpha_{ij}αij即可)
    • 可以直接应用到 inductive learning:包括在训练过程中在完全未见过的图上评估模型的任务上。
  • 2017年Hamilton提出的归纳学习方法(GraphSAGE)为每一个node都抽取一个固定尺寸的neighborhood,为了计算的时候footprint是一致的(指的应该是计算的时候处理neighborhood的模式是固定的,不好改变,因此每次都抽样出固定数量的neighbor参与计算),这样,在计算的时候就不是所有的neighbor都能参与其中。此外,Hamilton的这个模型在使用一些基于LSTM的方法的时候能得到最好的结果,这样就是假设了每个node的neighborhood的node一直存在着一个顺序,使得这些node成为一个序列。但是本文提出的方法就没有这个问题,每次都可以将neighborhood所有的node都考虑进来,而且不需要事先假定一个neighborhood的顺序
    解析:GraphSAGE:Inductive Representation Learning on Large Graphs
  • 和MoNet(Monti et al., 2016)相比,GAT模型使用顶点特征计算相似性,而不是顶点的结构特征

3 实验和评价

实验分成两部分,transductive learning(半监督学习)和inductive learning(归纳学习)。

数据集

图结构的数据集,以及数据集之中的信息如下:

半监督学习transductive learning

  • 两层 GAT
  • 在Cora 数据集上优化网络结构的超参数,应用到Citeseer数据集
  • 第一层 8 head, F’=8 , ELU 作为非线性函数
  • 第二层为分类层,一个 attention head 特征数C,后跟 softmax 函数,为了应对小训练集,正则化(L2)
  • 两层都采用 0.6 的dropout,相当于计算每个node位置的卷积时都是随机的选取了一部分近邻节点参与卷积
  • 用Glorot初始化初始的,并且是用Adam SGD来最小化交叉熵进行优化

归纳学习inductive learning

  • 三层GAT 模型
  • 前两层 K=4, F’=256 ,ELU作为非线性函数
  • 最后一层用来分类 K=6, F`=121 , 激活函数为sigmoid
  • 该任务中,训练集足够大不需要使用 正则化 和 dropout
  • 用Glorot初始化初始的,并且是用Adam SGD来最小化交叉熵进行优化

最后,使用t-SNE(Maaten & Hinton, 2008)在Cora数据集上进行一层GAT模型的输出变换图如下所示

4 总结

GAT模型的特点

  • 计算高效:self-attention层的操作可以在所有的边上并行,输出特征的计算可以在所有顶点上并行。没有耗时的特征值分解。单个的GAT计算FF'F′个特征的时间复杂度可以压缩至O(VFF+EF)O(|V|FF'+|E|F')O(VFF+EF),F是输入的特征数,|V|和|E|是图中顶点数和边数。复杂度与Kipf & Welling, 2017的GCN差不多。
    尽管 multi-head 注意力将存储和参数个数变为了K倍,但是单个head的计算完全独立且可以并行化。
  • 鲁棒性更强:和GCN不同,本文的模型可以对同一个 neighborhood的node分配不同的重要性,使得模型的capacity大增。
  • 注意力机制以一种共享的策略应用在图的所有的边上,因此它并不需要在之前就需要得到整个图结构或是所有的顶点的特征(很多之前的方法的缺陷)。因此GAT 也是一种局部模型。也就是说,在使用 GAT 时,无需访问整个图,而只需要访问所关注节点的邻节点即可,解决了之前提出的基于谱的方法的问题。因此这个方法有几个影响:
    • 图不需要是无向的,可以处理有向图(若jij\to iji不存在,仅需忽略αij\alpha_{ij}αij即可)
    • 可以直接应用到 inductive learning:包括在训练过程中在完全未见过的图上评估模型的任务上。

GAT模型的局限及未来的研究方向

  • 使用稀疏矩阵操作的GAT层,可以将空间复杂度降低到顶点和边数的线性级别,使得GAT模型可以在更大的图数据集上运行。然而,文中使用的tensor操作框架只支持二阶tensor的稀疏矩阵乘法,限制了当前实现的版本的模型能力(尤其在有多个图的数据集上)。解决这个问题是未来的一个重要研究方向。在这些使用稀疏矩阵的场景下,在某些图结构下GPU的运算并不能比CPU快多少。
  • 另一个需要注意的地方是GAT模型的感受野的大小的上界取决于网络的深度(与GCN和其他模型相似)。像skip connections(He et al., 2016)这样的技术可以来近似的扩展模型的深度。
  • 在所有边上的并行计算,尤其是分布式的计算可以设计很多冗余的计算,因为图中的邻居往往高度重叠。
  • 扩展GAT模型从顶点分类到图分类也是一个更具应用性的方向
  • 扩展GAT模型到整合边的信息(可能表示节点之间的关系)可以处理更多的问题

最后,欢迎加微信进群交流GNN相关问题,只为一起学习,不含任何商业推广。

posted on 2019-09-20 10:16  曹明  阅读(4536)  评论(1编辑  收藏  举报