论文解读7——Graph Attention Networks(GAT)


在这里插入图片描述

1、文章贡献

提出了图注意力网络GAT,通过引入注意力机制计算出每个节点和与之相关联节点间的重要性系数,从而解决GCN中对每个节点同等重要的问题。

2、GAT优点

1.可以通过注意力机制根据与节点相关的不同特征去分配不同的权重
2.可以作用在有向图上(原先GCN中的拉普拉斯矩阵要想特征分解依赖于无向图计算出的对称阵)
3.计算效率更高,注意力机制在输入上可以实现并行化(不用再像GCN特征分解了)

而且GAT是空域上的模型,GCN是谱域的,一开始纠结GAT改进后的式子怎么没卷积了,看了半天好吧是我傻了,还是再理解理解注意力机制

3、GAT结构

  • 输入特征
    在这里插入图片描述
  • 输出特征
    在这里插入图片描述
  • 计算注意力系数(将输入特征线性变换后执行self-attention机制)
    在这里插入图片描述
    将上述算出的系数通过softmax归一化操作(结果在0,1间更容易比较)
    在这里插入图片描述
    通过非线性层后计算的注意力系数
    在这里插入图片描述
    将计算的系数跟对应的特征相乘求和后通过非线性变换得到输出特征
    在这里插入图片描述
  • 上面整体的结构图
    在这里插入图片描述

为了让自注意力过程更加稳定,文中参考2017年那篇attention is all you need中的多头注意力机制对多个独立的注意力进行拼接

  • 下面就是将k个独立的注意力机制拼接的公式(其中 || 是拼接的符号)
    在这里插入图片描述
  • 文中说跟拼接相比,还是求k个平均更有意义
    在这里插入图片描述
  • multi-head attention的结构图如下
    这里不同颜色的连接符号代表的是多个不同的head,图上k=3 heads,将每个头的聚合特征拼接或取平均得到输出特征
    在这里插入图片描述

说实话当看到文中这部分的时候还是有点蒙,感觉只是讲了讲公式的作用并没有说清楚背后的运算是咋来的,就比如 self-attention和 multi-head attention当时就是没搞懂,后来看了transformer那篇原文、看了很多关于注意力机制的博客和b站李宏毅老师的讲解,开始有点弄明白了,关于注意力机制的理解就写在另一篇博客上了
论文解读8——Attention Is All You Need

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用PyTorch实现GAT的代码示例: ``` python import torch import torch.nn as nn import torch.nn.functional as F class GATLayer(nn.Module): def __init__(self, in_dim, out_dim): super(GATLayer, self).__init__() self.in_dim = in_dim self.out_dim = out_dim self.W = nn.Parameter(torch.zeros(size=(in_dim, out_dim))) self.a = nn.Parameter(torch.zeros(size=(2*out_dim, 1))) nn.init.xavier_uniform_(self.W.data, gain=1.414) nn.init.xavier_uniform_(self.a.data, gain=1.414) def forward(self, h, adj): Wh = torch.mm(h, self.W) a_input = self._prepare_attentional_mechanism_input(Wh) e = F.leaky_relu(torch.matmul(a_input, self.a).squeeze(2)) zero_vec = -9e15*torch.ones_like(e) attention = torch.where(adj > 0, e, zero_vec) attention = F.softmax(attention, dim=1) h_prime = torch.matmul(attention, Wh) return h_prime def _prepare_attentional_mechanism_input(self, Wh): N = Wh.size()[0] Wh_repeated_in_chunks = Wh.repeat_interleave(N, dim=0) Wh_repeated_alternating = Wh.repeat(N, 1) all_combinations_matrix = torch.cat([Wh_repeated_in_chunks, Wh_repeated_alternating], dim=1) return all_combinations_matrix.view(N, N, 2*self.out_dim) class GAT(nn.Module): def __init__(self, n_feat, n_hid, n_class, dropout, alpha, n_heads): super(GAT, self).__init__() self.dropout = dropout self.attentions = [GATLayer(n_feat, n_hid) for _ in range(n_heads)] for i, attention in enumerate(self.attentions): self.add_module('attention_{}'.format(i), attention) self.out_att = GATLayer(n_hid*n_heads, n_class) self.alpha = alpha def forward(self, x, adj): x = F.dropout(x, self.dropout, training=self.training) x = torch.cat([att(x, adj) for att in self.attentions], dim=1) x = F.dropout(x, self.dropout, training=self.training) x = F.elu(self.out_att(x, adj)) return F.log_softmax(x, dim=1) ``` 在此示例中,我们实现了一个包含多头注意力机制的GAT模型。其中,GATLayer是GAT的核心组件,每个GATLayer都包含一个注意力头。在GAT模型中,我们将多个注意力头的输出连接在一起,再通过一个输出层进行分类。在forward函数中,我们首先对输入进行dropout,然后通过多个GATLayer进行特征提取,最后通过输出层进行分类并使用log_softmax进行预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值