读书笔记8:Graph Attention Networks(ICLR 2018)

欢迎关注博主的公众号:happyGirl的异想世界。有更多干货还有技术讨论群哦~

源链接:https://blog.youkuaiyun.com/b224618/article/details/81407969

https://mila.quebec/wp-content/uploads/2018/07/d1ac95b60310f43bb5a0b8024522fbe08fb2a482.pdf

https://arxiv.org/pdf/1710.10903.pdf

这是一篇将attention机制应用到graph convolution中的文章。但是文章中提出的模型其实是利用了attention的一部分思想,而不是和处理sequence的模型应用的attention机制是不完全一样的。

处理sequence的模型引入的attention机制可以分为两类,一类是在输入sequence本身上计算attention的intertext情形;另一类是另外有一个用来计算attention的文本的intertext情形 。本文中的情形是intratext,是在输入的待处理的graph自身上计算attention,在摘要中作者说明了,本文的attention计算的目的是为每个节点neighborhood中的节点分配不同的权重,也就是attention是用来关注那些作用比较大的节点,而忽视一些作用较小的节点。相比之下,在sequence的模型中,attention的计算是为了在处理局部信息的时候同时能够关注整体的信息,计算出来的attention不是用来给参与计算的各个节点进行加权的,而是表示一个全局的信息并参与计算。

和其他graph convolution方向的论文一样,本文的introduction部分也是先介绍CNN多么多么成功,然后指出很多问题中的数据并不是CNN所擅长处理的网格状(grid-like)形式的,而是以一些不规则的形式存在,但是这些数据都可以用graph表示,因此兴起了graph convolution network。接着稍微详细的介绍一下GCN都分为spectral approaches和non-spectralappproaches。然后,作者用一段文字介绍了attention mechanism进来在sequence based tasks中几乎变成了一个常规配备,然后分析了attention mechanism的好处。接下来的一段紧接着就说,受到attention mechanism的启发,我们也要提出一个attention based的模型来在graph structured data上进行节点分类的任务,想法是为每一个节点更新hidden representation的时候,都要对其neighbors进行一下attention的计算,模仿sequence based task中的intratext的attention的思想。作者指出这个框架有三个特点:1. attention机制计算很高效,为每一个节点和其每个近邻节点计算attention可以并行进行。2. 通过指定任意的权重给neighbor,这个模型可以处理拥有不同“度”(每个节点连接的其他节点的数目)节点,也就是说,无论一个节点连接多少个neighbor,这个模型都能按照规则指定权重。3. 这个模型可以直接应用到归纳推理的问题中(inductive learning problem),包括一些需要将模型推广到完全未知的graph的任务中。作者在四个数据集上进行了实验都取得了state-of-the-art的结果。这四个数据集,三个是引用文献的,一个是蛋白质相互作用网络的。作者在introduction的后面提到,本文的工作可以看做是MoNet的具体形式,并且在不同edge上共享计算网络很像Santoro 2017年的relational networks的和Hoshen 2017年的VAIN,之后还简单提到了一些其他的相关工作。

接下来介绍模型。模型的输入是node feature的集合,即,其中N是node的数量,F是每一个node的feature数量,其实也就是feature vector的长度。模型的输出也是一个集合,N是不变的,但是每一个node的feature数量变成了,不一定还是之前的F了。node的原始的feature可能不够好用,因此先用至少一层线性层来为每个node计算一个表达能力更强的feature,也即用一个应用到每一个node的feature上。之后在node上应用self-attention,这个attention mechanism也是复用的,每个节点都用一样的机制。attention coefficient的计算为,用两个node的feature来计算两个node之间有怎样的一个关系。整个过程便是,即两个node feature先是通过线性变换生成新的表达力更强的feature,然后计算attention coefficient,于是,任意两个node之间都有了attention coefficient,本文的这个attention coefficient其实是用来做加权平均的,即卷积的时候,每个node的更新都是其他node的加权平均(不一定是所有node,本文中实际只用了直接相连的node),但是直接用attention coefficient不太好,因此进行一下softmax,得到,这个系数α就是每次卷积时,用来进行加权求和的系数。以上都是一般性的描述,具体来讲,本文采取的计算attention coefficient的函数a是一个单层的前馈网络,参数是,并且使用了LeakyReLU来处理,整个写好就是

其中||表示连接起来。每次卷积时,除了加权求和,还要再弄一个非线性函数,即

为了使模型更加稳定,文章还提出了multi-head attention机制,这种机制更加有利,这个意思是说不只用一个函数a进行attention coefficient的计算,而是设置K个函数,每一个函数都能计算出一组attention coefficient,并能计算出一组加权求和用的系数,每一个卷积层中,K个attention机制独立的工作,分别计算出自己的结果后连接在一起,得到卷积的结果,即,||依然表示连接在一起的意思,是用第k个计算attention coefficient的函数计算出来的attention coefficient计算出来的。整个过程如下图所示:

 

 

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

接下来作者将模型与其他相关的工作进行了对比,指出attentional layer在几个方面的优点:1. 计算很高效,attention机制在所有边上的计算是可以并行的,输出的feature的计算在所有节点上也可以并行。像特征分解这种非常费资源的操作都不需要。单层的GAT的multi-head的一个head的时间复杂度可以表示为,这里面指的应该是计算attention机制的复杂度,每一个节点计算attention coefficient是O(FF'),然后每个节点都只计算其与周围几个直接连接的近邻节点之间的coefficient,即O(|V|),因此整个就是O(|V|FF'),计算α应该是加上了一个O(|V|)的复杂度。而|E|F'是用来计算卷积的时间复杂度,每个edge都对应将一个node乘上权重并包含到卷积的加权求和中,而每一个node有F'个feature,加进来就是F'次操作,因此整个就是O(|E|F')的复杂度。这个复杂度和Kipf&Welling 2017年的Graph Convolutional Networks(GCNs)的复杂度相当         2. 和GCN不同,本文的模型可以对同一个neighborhood的node分配不同的重要性,使得模型的容量(自由度)大增。并且分析这些学到的attentional weights有利于可解释性(意思可能是分析一下模型在分配不同的权重的时候是从哪些角度着手的),就像机器翻译里的情况(这个其实没看懂是什么意思,作者给了个例子是Bahdanau 2015年的qualitative analysis) 3. attention机制是对于所有edge共享的,不需要依赖graph全局的结构以及所有node的特征(很多之前的方法都有这个缺陷,但是作者没有说是什么方法,这种很笼统的话都不太好懂)。这也表明了两点:一是graph不需要是无向的。二是我们的技术适合inductive learning,包括一些任务中,用来测试的graph在训练阶段完全未知(由于本文做的多是在一个大graph上的node分类,因此训练和测试可能是在一个graph上的)。4. 2017年Hamilton提出的inductive method为每一个node都抽取一个固定尺寸的neighborhood,为了计算的时候footprint是一致的(指的应该是计算的时候处理neighborhood的模式是固定的,不好改变,因此每次都抽样出固定数量的neighbor参与计算),这样,在计算的时候就不是所有的neighbor都能参与其中。此外,Hamilton的这个模型在使用一些基于LSTM的方法的时候能得到最好的结果,这样就是假设了每个node的neighborhood的node一直存在着一个顺序,使得这些node成为一个序列。但是本文提出的方法就没有这个问题,每次都可以将neighborhood所有的node都考虑进来,而且不需要事先假定一个neighborhood的顺序  5. 这个是说明了之前提到的GAT如何被看做MoNet的一个特例,用到了一些MoNet的东西,需要看一下才知道在说啥。

接下来作者介绍了对模型的考量,也就是实验部分。实验分两部分,transductive learning和inductive learning,前者的模型用了两层GAT,网络结构的超参数是在Cora数据集上进行优化的,然后应用到了Citeseer数据集上。第一层8head,F'=8,跟着exponential linear unit (ELU)作为非线性函数,第二层作为分类层,一个attention head,feature数就是C,也就是类别数,后面跟着softmax函数。为了应对数据集小的问题,模型内使用了regularization,训练时使用了λ=0.0005的L2 regularization,此外,两层网络的输入都采用了p=0.6的dropout,这个dropout对normalized attention coefficient也使用了,相当于计算每个node位置的卷积时都是随机的选取了一部分近邻节点参与卷积。在inductive learning任务中,采用了3层的GAT模型,前两层K=4,F‘=256,用了ELU,最后一层用来分类,K=6,F'=121,紧跟着一个logistics sigmoid激活函数。这个任务中,训练集足够大,不需要使用regularization和dropout,但是成功的使用了skip connection(跨过中间一些层传递信息),此外,为了验证attention机制的好处,作者在这里还设了对比组,将所有a(x,y)=1。

两个任务都是用Glorot初始化初始的,并且是用Adam SGD来最小化交叉熵进行优化。

 

<think>好的,用户想了解2018年提出的图注意力网络(Graph Attention Networks)的相关信息或论文,特别是关于实现的部分。首先,我需要回忆一下GAT的基本结构和主要贡献。GAT由Velickovic等人在2018年提出,核心是使用注意力机制来动态计算节点之间的重要性权重,替代了传统的基于图结构的方法,比如GCN中的固定归一化。 接下来,用户提到的是论文的实现,所以需要详细说明模型的架构,特别是多头注意力机制和参数共享的部分。记得要引用用户提供的参考资料中的相关部分,比如引用[4]提到的注意力机制公式,这可能与GAT中的注意力函数有关。需要确认引用中的符号是否与GAT论文一致,例如$a(W\vec{h_i}, W\vec{h_j})$,这里可能对应GAT中的注意力系数计算。 然后,用户可能需要代码示例,所以应该提供一个简单的PyTorch实现,包括图注意力层的定义和前向传播过程。要注意代码中的关键部分,比如线性变换、注意力系数的计算、LeakyReLU激活函数以及softmax的应用。同时,多头注意力的实现可能需要将多个注意力头的结果拼接或平均,这部分也需要在代码中体现。 用户的问题中还提到了相关问题的生成,需要根据GAT的特点和应用场景来设计问题。例如,GAT与GCN的区别、多头注意力的作用、如何处理动态图等。这些问题需要简洁明了,能够引导用户进一步探索。 另外,需要检查是否有遗漏的要点,比如训练方法。引用[3]提到了使用REINFORCE算法训练策略网络,但GAT通常使用监督学习,可能需要指出这点差异。同时,引用[1]和[2]提到的图网络结构和双层GCN可能作为对比,说明GAT的灵活性和优势。 最后,确保回答符合系统级指令,数学公式用$...$,独立公式用$$...$$,正确使用中文,并且引用标识正确添加。例如,在提到注意力机制时引用[4],在讨论图卷积网络时引用[2]。</think># 图注意力网络(GAT) 2018论文实现解析 ## 一、核心机制 2018年提出的图注意力网络(Graph Attention Networks, GAT)[^4] 创新性地将注意力机制引入图神经网络,其核心是通过$α_{ij}$注意力系数动态计算节点间关系: $$e_{ij} = \text{LeakyReLU}(\vec{a}^T[W\vec{h_i}||W\vec{h_j}])$$ $$α_{ij} = \text{softmax}_j(e_{ij}) = \frac{\exp(e_{ij})}{\sum_{k∈\mathcal{N}_i}\exp(e_{ik})}$$ 其中$\vec{a}∈\mathbb{R}^{2F'}$是可训练参数向量,$W∈\mathbb{R}^{F'×F}$是共享线性变换矩阵[^4] ## 二、模型架构 ### 2.1 单头注意力层 ```python import torch import torch.nn as nn import torch.nn.functional as F class GraphAttentionLayer(nn.Module): def __init__(self, in_features, out_features, dropout=0.6): super().__init__() self.W = nn.Linear(in_features, out_features) self.a = nn.Linear(2*out_features, 1) self.dropout = nn.Dropout(dropout) self.leakyrelu = nn.LeakyReLU(0.2) def forward(self, h, adj): Wh = self.W(h) # [N, out_features] N = Wh.size(0) # 构造所有节点对 Wh_repeated = Wh.unsqueeze(1).repeat(1, N, 1) # [N, N, out_features] Wh_repeated_transposed = Wh_repeated.transpose(0,1) concat = torch.cat([Wh_repeated, Wh_repeated_transposed], dim=2) # [N, N, 2*out_features] e = self.leakyrelu(self.a(concat).squeeze(2)) # [N, N] zero_vec = -9e15*torch.ones_like(e) attention = torch.where(adj > 0, e, zero_vec) attention = F.softmax(attention, dim=1) attention = self.dropout(attention) h_prime = torch.matmul(attention, Wh) # [N, out_features] return F.elu(h_prime) ``` ### 2.2 多头注意力机制(论文关键创新) $$h_i' = \|_{k=1}^K σ(\sum_{j∈\mathcal{N}_i} α_{ij}^k W^k h_j)$$ 其中$\|$表示拼接操作,$K$为注意力头数量[^4] ## 三、训练要点 1. 参数初始化:使用Glorot初始化权重矩阵 2. 正则化:在注意力系数上应用dropout(0.6概率) 3. 激活函数:ELU非线性激活 4. 优化器:Adam优化器(初始学习率0.005) ## 四、性能优势 与GCN相比,GAT具有三大优势: 1. 隐式指定不同邻居的权重,无需预先知道图结构 2. 适用于inductive学习任务 3. 多头注意力机制增强模型稳定性 ## 五、典型应用场景 1. 蛋白质相互作用网络分析 2. 社交网络用户行为预测 3. 知识图谱补全 4. 交通流量预测[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值