赞
踩
本篇博客是对论文 Velikovi, Petar, Cucurull, Guillem, Casanova, Arantxa,et al. Graph Attention Networks, 2018, ICLR的解读与python复现, 全文阅读约10分钟。
博主关于图神经网络的文章
DeepLearning | 图卷积神经网络(GCN)解析(论文、算法、代码)
DeepLearning | 图注意力网络Graph Attention Network(GAT)论文、模型、代码解析
DeepLearning | 图卷积网络基于拓扑结构的分类(T-GCN)
关于半监督学习
基于分歧的半监督学习方法
机器学习教程 之 半监督学习 Tri-training方法 (论文、数据集、代码)
机器学习教程 之 半监督学习 Co-training 协同训练 (论文、算法、数据集、代码)
机器学习教程 之 半监督学习 Coreg 协同回归算法 (论文、算法、数据集、代码)
机器学习教程 之 半监督学习 基于图正则项的半监督极限学习机
这些博客都提供了算法的讲解和python的代码复现,感兴趣的可以了解一下
图注意力网络(GAT)是作者对图卷积网络(GCN)的改进。它的主要创新点在于利用了注意力机制(Attention Mechanism)来自动的学习和优化节点间的连接关系,这一作法有以下几个优点:
作为一层网络,图注意力层的输入为
首先需要定义一个特征变换矩阵 W ∈ R F × F ′ W \in \mathbb{R}^{F \times {F}'} W∈RF×F′ 用于每一个节点从输入到输出的变换。
GAT中的attention机制被称为self-attention,记为 f f f,其功能如下:
需要说明的是,这里的节点 j j j是节点 i i i的近邻,而节点 i i i可能是拥有多个近邻的,因此就有了下面的 s o f t m a x softmax softmax归一化操
那么说了这么久,这个self-attention机制,也就是我们一开始提到的 a ( W h i , W h j ) a(Wh_{i},Wh_{j}) a(Whi,Whj)是怎么计算的呢?其实也很简单
最后给出图感知层的定义,即
上面就是GAT的attention计算方法了,其中会有两个知识点会影响理解
对于上面这两点,如果知道的话,再结合对GCN的理解,可以很容易的get到GAT的点和含义,如果不清楚的话可能会有点迷糊。
多头attention机制如图所示
模型的核心代码如下
import numpy as np
import tensorflow as tf
from utils import layers
from models.base_gattn import BaseGAttN
class GAT(BaseGAttN):
def inference(inputs, nb_classes, nb_nodes, training, attn_drop, ffd_drop,
bias_mat, hid_units, n_heads, activation=tf.nn.elu, residual=False):
attns = []
for _ in range(n_heads[0]):
attns.append(layers.attn_head(inputs, bias_mat=bias_mat,
out_sz=hid_units[0], activation=activation,
in_drop=ffd_drop, coef_drop=attn_drop, residual=False))
h_1 = tf.concat(attns, axis=-1)
for i in range(1, len(hid_units)):
h_old = h_1
attns = []
for _ in range(n_heads[i]):
attns.append(layers.attn_head(h_1, bias_mat=bias_mat,
out_sz=hid_units[i], activation=activation,
in_drop=ffd_drop, coef_drop=attn_drop, residual=residual))
h_1 = tf.concat(attns, axis=-1)
out = []
for i in range(n_heads[-1]):
out.append(layers.attn_head(h_1, bias_mat=bias_mat,
out_sz=nb_classes, activation=lambda x: x,
in_drop=ffd_drop, coef_drop=attn_drop, residual=False))
logits = tf.add_n(out) / n_heads[-1]
return logits
微信搜索“老和山算法指南”获取下载链接与技术交流群
有问题可以私信博主,点赞关注的一般都会回复,一起努力,谢谢支持。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。