图神经网络:GAT图注意力网络原理和源码解读(tensorflow)

原理初步理解
(1)从GNN,GCN到GAT
  • GNN学习的是邻居节点聚合到中心的方式,传统的GNN对于邻居节点采用求和/求平均的方式,各个邻居的权重相等为1
  • GCN进行了改造邻居聚合方式为邻接矩阵做对称归一化,也是类似求平均,但是它考虑到了节点的度大小,度越大权重往小了修正,是一种避免单节点链接巨量节点导致计算失真的调整方式,仅仅通过度+规则对权重做了修改,而没有考虑到因为节点的影响大小去调整权重的大小。
  • GAT认为
    (1)不同邻居对中心节点的影响是不一样的,且它想通过注意力自动地去学习这个权重参数,从而提升表征能力
    (2)GAT使用邻居和中心节点各自的特征属性来确定权重,中心节点的所有邻居的权重相加等于1

GAT示意图

视频作者举例两个节点的权重需要基于两个节点的特征

(2)注意力机制

key-value注意力机制

在注意力机制中Source代表需要处理的信息,Query代表某种条件或者先验信息,Attention Value是通过先验信息和Attention机制从Source中提取的信息,Source中的信息通过key-value对的形式表达出来,可以将key类比为信息的摘要,value类比为信息的全部内容。注意力机制的定义如下

注意力机制公式

从公式来看,注意力机制就是先计算出前提条件和每个要接受的信息的摘要部分的相关程度,以相关程度为权重再学习要接受的每个全部信息,最后每条信息加权求和得到结果

(3)GNN中的注意力机制

类比Key-Value注意力机制,再图结构中,中心节点就是Query,所有邻居节点的信息就是Source,Attention Value就是中心节点经过聚合之后的特征向量,Key和Value相同,就是邻居节点的特征向量。目标就是针对中心节点(Query)学习邻居节点(Source)的权重,再加权求和汇总到中心节点上形成新的特征向量表达(Attention Value)。

GAT示意图公式

这个公式先简单理解一下,这个图旋转90度就是个逻辑回归一样的全连接。hihj代表的节点的特征向量或者当下的特征表达,i为中心节点,j为邻居节点,目标是计算eij两个节点之间的权重,Whi代表使用一个模型自己学习的共享的W向量来对原始特征向量做维度转换,比如原始是(512, 128),W为(128, 64),最终转化为(512, 64),i和j都转化之后拼接,再用一个全连接作为相似计算函数,激活函数为LeakyRelu,此时全连接之后产出一个值,所有的全连接值再做softmax归一化得到最终ij节点的权重值。为了保留图结构的连接关系,注意力只再中心节点和邻居节点之间计算,且一个注意力机制的a,W是共享的

(4)多头注意力机制

在计算出节点间的attention权重值之后新的中心节点表达如下,每个邻居的特征向量点乘一个维度转换向量参数之后,再乘上attention的权重,最后加权求和套一个激活函数输出下一层中心节点的特征表达

带有注意力机制的中心节点表达

为了防止Attention过拟合,引入多个Attention,引入多套W和a,使得模型更加稳定

多头注意力机制GNN图示

如图所示h1有h2,h3,h4,h5,h6这几个邻居,每个都算了三套三种颜色的Attention权重,最后拼接/平均得出下一层的h1表达

多头注意力机制GNN公式

公式里面K就是几套注意力机制,||代表向量拼接,下面一种是求平均


源码跟读
root@ubuntu:/home/gp/git/GAT# python execute_cora.py
Dataset: cora
----- Opt. hyperparams -----
lr: 0.005
l2_coef: 0.0005
----- Archi. hyperparams -----
nb. layers: 1
nb. units per layer: [8]
nb. attention heads: [8, 1]
residual: False
nonlinearity: <function elu at 0x7fd6bfeaf950>
model: <class 'models.gat.GAT'>
(2708, 2708)
(2708, 1433)
...
Training: loss = 1.13271, acc = 0.60000 | Val: loss = 1.00691, acc = 0.80200
Training: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值