[论文分享]图注意力网络Graph Attention Networks

发表于ICLR 2018

  1. tensorflow版:https://github.com/PetarV-/GAT
  2. pytorch版本:https://github.com/Diego999/pyGAT

摘要:本文展示了一个图注意力网络(graph attention networks, GATs),一个新颖的神经网络结构,其在图结构数据上操作,利用了masked self-attentional layers以解决基于图卷积或其近似的现有方法的缺点。通过堆叠那些节点能够参与其邻域特征的层,我们可以(隐式地)为邻域中的不同节点指定不同的权重,而不需要任何类型的昂贵的矩阵运算(例如求逆)或依赖于预先了解的图结构。通过这种方式,本文同时解决了基于谱的图神经网络的几个关键挑战,并使我们的模型易于适用于归纳和传导问题。GAT 模型在四个已建立的传导和归纳图基准问题上取得了或匹配最先进的结果:Cora, Citeseer, Pubmed引文网络数据集,protein-protein interaction数据集。

1. Introduction

卷积神经网络已经成功应用于解决图像分类、语义分割、机器翻译等问题,其中底层数据表示具有类似网格的结构grid-like structure。这些架构通过将其应用到所有输入位置上以有效地重用具有可学习参数的局部滤波器reuse their local filters with learnable parameters。

但是,许多任务的数据依赖于不规则的域irregular domain,不能被grid-like structure表示。比如3D 网格、社交网络、电信网络、生物网络或大脑连接组, 这些数据通常以图表的形式表示。

已经有许多工作将神经网络用于处理任意结构的图数据。早期的工作使用递归神经网络来处理图域中表示为有向无环图的数据。在2005和2009年引入图神经网络作为递归神经网络的概括,可以直接处理更一般的图,例如循环图、有向图和无向图。GNN 由一个迭代过程组成,该过程传播节点状态直至达到平衡,紧接着是一个神经网络根据每个节点的状态生成输出。此后,在2016年,又对GNN进行了改进,在传播步骤中使用门控循环单元。

尽管如此,人们对将卷积推广到图域越来越感兴趣,这个方向的进展通常分为谱方法spectral approaches和非谱方法non-spectral approaches

谱方法spectral approaches: 谱方法使用图的谱表示a spectral representation of the grpahs,并已成功应用于节点分类。 在2014 Bruna一文中,卷积运算是在傅立叶域中定义的,其计算了拉普拉斯图的特征分解(the eigendecomposition of the graph Laplacian),从而导致潜在的密集计算和非空间局部滤波器(non-spatially localized filters)。该问题被接下来的方法所解决。在2015 Henaff一文中,引入了具有平滑系数的光谱滤波器的参数化,以使它们在空间上局部化。2016年,Defferrared提出通过拉普拉斯图的切比雪夫展开来近似滤波器,无需计算拉普拉斯的特征向量并产生空间局部滤波器。最后,2017年,Kipf,Welling通过限制滤波器在每个节点周围的 1 步邻域中运行,简化了之前的方法。但是,以上提到的谱方法,学习到的滤波器都依赖于拉普拉斯特征基Laplacian eigenbasis,而拉普拉斯特征基依赖于图结构。因此,在一个指定结构上训练好的模型无法直接应用于其他的图结构

非谱方法non-spectral approaches直接在图上定义卷积,对空间上邻近的组进行操作。这些方法的挑战之一是定义一个与不同大小的邻域一起工作并保持 CNN 权重共享属性的算子define an operator which works with different sized neighborhoods and maintains the weight sharing property of CNNs。在某些情况下,这需要为每个节点度学习特定的权重矩阵,使用转换矩阵的幂来定义邻域,同时学习每个输入通道和邻域度的权重,或者提取并规范化包含固定数量节点的邻域。Monti等人于2016年提出混合模型CNNs(MoNet),一种空间方法,它提供了 CNN 架构到图的统一概括。2017年Hamilton等人引入GraphSAGE,以归纳性的方式计算节点表达。该技术的工作原理是对每个节点的固定大小的邻域进行采样,然后对其执行特定的聚合器(例如所有采样的邻域的特征向量的平均值,或者通过循环神经网络馈送它们的结果)。 这种方法在多个大规模归纳基准测试中取得了令人印象深刻的性能。

注意力机制已经近乎成为许多序列任务的标准。注意力机制的一个优势是他们允许处理可变长度的输入,聚焦于输入中最相关的部分来做出决策。当一个注意力机制被用于计算单序列的表达时,常被记为self-attention或者intra-attention。和RNN/卷积一起工作,自注意力已经被证明在机器阅读和学习句子表达上是有用的。但是,Vaswani等人展示不仅自注意力可以改进基于 RNN 或卷积的方法,而且足以构建强大的模型,在机器翻译任务上获得最先进的性能。

受到最近工作的启发,我们引入了一个基于注意力的架构以执行图结构数据的节点分类问题。具体地,通过关注其邻居并遵循自注意力策略来计算图中每个节点的隐藏表示。注意力架构有以下几个属性:(1)该操作是高效的,因为它可以跨节点-邻居对并行化;(2)通过为邻居指定任意权重,它可以应用于具有不同度数的图节点;(3)可以直接应用于归纳性学习问题,包括模型必须推广到完全看不见的图的任务。我们验证了提出的方法在4个数据集上,包括Cora, Citeseer, Pubmed引文网络数据集,protein-protein interaction数据集等。

2. GAT architecture

在本节中,将介绍用于构造任意图注意网络的构建块层(通过堆叠该层),并直接概述与神经图处理领域的先前工作相比其理论和实践的优点和局限性。

2.1 Graph attentional layer

 

 

2.2 Comparisons to related work

正如2.1节中所描述的图注意力层,直接解决了几个在先前方法中出现的问题:

(1) 计算高效的:自注意力层的操作可以跨所有边并行,并且输出特征的计算可以跨所有节点并行。不需要特征分解或类似的昂贵的矩阵运算。其计算复杂度和Graph Convolutional Network一样的。应用多头注意力将存储和参数要求storage and parameter requirements乘以 K 倍,而各个头的计算是完全独立的并且可以并行化。

(2) 可解释性的好处:和GCNs相反,我们的模型允许(显式地)对一个相同邻域内的节点分配不同的重要性,实现模型量的飞跃。此外,分析学习到的注意力权重可能会带来可解释性的好处。

(3) 注意力机制以共享的方式应用于图中的所有边,因此不依赖于对全局图结构或其所有节点(的特征)的预先访问(许多现有技术的限制)。 这有几个含义:

-应用的图不需要是无向的,i.e.,如果边 j -> i 不存在,我们可以简单地省略计算 αij )。

-使我们的技术直接适用于归纳学习,包括在训练期间完全看不到的图表上评估模型的任务。

(4) Hamilton 等人于2017年发表的归纳方法对每个节点的固定大小邻域进行采样,以保持其计算足迹一致,这不允许它在执行推理时访问整个邻域。此外,这个技术实现了一些最好的结果当一个基于LSTM的邻域继承器被使用。这假设跨邻域存在一致的顺序节点排序,并且作者通过一致地将随机排序的序列输入 LSTM 来纠正它。我们的技术不会遇到这些问题——它适用于整个邻域(以可变的计算足迹为代价,这仍然与 GCN 等方法相同),并且不假设其中有任何顺序。

我们能够生成一个利用稀疏矩阵运算的 GAT 层版本,将存储复杂性降低到节点和边数的线性关系,并能够在更大的图形数据集上执行 GAT 模型。然而,我们使用的张量操作框架仅支持 2 阶张量的稀疏矩阵乘法,这限制了当前实现的层的批处理能力(特别是对于具有多个图的数据集)。妥善解决这一制约因素是今后工作的重要方向。 根据现有图形结构的规律性,在这些稀疏场景中,与 CPU 相比,GPU 可能无法提供主要的性能优势。还应该注意的是,我们模型的“感受野”的大小受到网络深度的上限(与 GCN 和类似模型类似)。 然而,诸如跳跃连接(He et al., 2016)之类的技术可以很容易地应用于适当扩展深度。最后,跨所有图边的并行化,尤其是以分布式方式,可能涉及大量冗余计算,因为邻域通常在感兴趣的图中高度重叠。

3. Evaluation

在4个基于图的benchmark任务(transductive as well as inductive),本文实现了很好的效果。

3.1 Datasets

Transductive learning. 使用了3个标准的引文网络数据集——Cora, Citeseer and Pubmed。在这些数据集中,节点对应于引文网络中的文档,边对应于论文的(无向)引用。节点特征对应于文档的词袋表示的元素(elements of a bag-of-words representation of a document)。 每个节点都有一个类标签。本文只允许每类20个节点用于训练——然而,遵循the transductive setup,训练算法可以访问所有节点的特征向量。(1) Cora有2708个节点,5429条边,7类,每个节点1433个特征;(2)Citeseer数据集包含3327个节点,4732条边,6类,每个节点3703个特征;(3)Pubmed数据集包括19717个节点,44338条边,3类,每个节点500个特征。

Inductive learning. 使用了PPI,protein-protein数据集,包含了对应于不同人类组织的图。有20个图用于训练,2个图用于验证,2个图用于测试。每个图中的平均节点数量是2372。每个节点有50个特征,这些特征由位置基因集、基序基因集和免疫学特征组成。每个节点集有 121 个来自基因本体的标签,这些标签是从分子特征数据库(Subramanian et al., 2005)收集的,并且一个节点可以同时拥有多个标签。

4. 核心Code(以pytorch框架为例)

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

GAT的整个模型如下:由8个GraphAttentionLayer堆叠而成,最后一个GraphAttentionLayer将前8个GraphAttentionLayer的结果进行集成。

每个GraphAttentionLayer的细节:

class GraphAttentionLayer(nn.Module):
    """
    Simple GAT layer, similar to https://arxiv.org/abs/1710.10903
    """
    def __init__(self, in_features, out_features, dropout, alpha, concat=True):
        super(GraphAttentionLayer, self).__init__()
        self.dropout = dropout
        self.in_features = in_features
        self.out_features = out_features
        self.alpha = alpha
        self.concat = concat

        self.W = nn.Parameter(torch.empty(size=(in_features, out_features)))
        nn.init.xavier_uniform_(self.W.data, gain=1.414)
        self.a = nn.Parameter(torch.empty(size=(2*out_features, 1)))
        nn.init.xavier_uniform_(self.a.data, gain=1.414)

        self.leakyrelu = nn.LeakyReLU(self.alpha)

    def forward(self, h, adj):
        Wh = torch.mm(h, self.W) # h.shape: (N, in_features), Wh.shape: (N, out_features)
        e = self._prepare_attentional_mechanism_input(Wh)

        zero_vec = -9e15*torch.ones_like(e)
        attention = torch.where(adj > 0, e, zero_vec)
        attention = F.softmax(attention, dim=1)
        attention = F.dropout(attention, self.dropout, training=self.training)
        h_prime = torch.matmul(attention, Wh)

        if self.concat:
            return F.elu(h_prime)
        else:
            return h_prime

    def _prepare_attentional_mechanism_input(self, Wh):
        # Wh.shape (N, out_feature)
        # self.a.shape (2 * out_feature, 1)
        # Wh1&2.shape (N, 1)
        # e.shape (N, N)
        Wh1 = torch.matmul(Wh, self.a[:self.out_features, :])
        Wh2 = torch.matmul(Wh, self.a[self.out_features:, :])
        # broadcast add
        e = Wh1 + Wh2.T
        return self.leakyrelu(e)

    def __repr__(self):
        return self.__class__.__name__ + ' (' + str(self.in_features) + ' -> ' + str(self.out_features) + ')'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值