热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

注意力机制代码_深入理解图注意力机制

我和人民邮电出版社搞了图神经网络的课程,刚上线,打折中。。。有兴趣的可以看一下https:www.epubit.comcourseDetails?idP
5dabba3a9d6621b90ba97ec08f253e6f.png

我和人民邮电出版社搞了图神经网络的课程,刚上线,打折中。。。有兴趣的可以看一下 https://www.epubit.com/courseDetails?id=PCC72369cd0eb9e7

4ae97e49d8d72f2e9810dedd683c299b.png
4a8a2d3fc6a25d80f8bd6731ba8d71b4.png

本文主要从下面3个方面分析了 18ICLR 图注意力网络 Graph Attention Network, 并附上了代码解析.

  • 非对称的注意权重
  • 可有可无的LeakyRelu?
  • Transformer Vs GAT

介绍

图神经网络已经成为深度学习领域最炽手可热的方向之一。作为一种代表性的图卷积网络,Graph Attention Network (GAT)引入了注意力机制来实现更好的邻居聚合。 通过学习邻居的权重,GAT可以实现对邻居的加权聚合。因此,GAT不仅对于噪音邻居较为鲁棒,注意力机制也赋予了模型一定的可解释性。

下图概述了Graph Attention Network主要做的事情。

23a7ac2d4ef5e6df2ab6e1cfd43c39dc.png

针对节点

和节点
, GAT首先学习了他们之间的注意力权重
(如左图所示); 然后,基于注意力权重
来对节点
的表示
加权平均,进而得到节点
的表示

深入理解图注意力机制

非对称的注意权重

首先,介绍下如何学习节点对

之间的注意力值
。很明显,为了计算
,注意力网络
需要同时考虑两个节点的影响,如下式:

其中,

分别是节点
的表示,
是一个投影矩阵。

注意力网络可以有很多的设计方式,这里作者将节点

的表示进行了拼接,再映射为一个标量。需要注意,这里拼接导致
,也就是说注意力值
是非对称的。

除了拼接操作以外,聚合邻居信息时,需要对每个节点的所有邻居的注意力进行归一化。归一化之后的注意力权重

才是真正的聚合系数。

这里的归一化进一步导致了注意力权重的非对称性。因为在归一化的过程中,每个节点的归一化对象并不一样。

是针对节点
的所有邻居进行归一化, 而
是针对节点
的所有邻居进行归一化。

综上,在求解注意力权重

的过程中,分子和分母都是非对称的,进而
也是非对称的。

这种非对称性在图数据上有什么用呢?一个简单的例子:在社交网络中,有一个大V和一个普通用户互相关注。但是,大V对于普通用户的重要性和普通用户对大V的重要性明显是不一样的。

完整的图注意力公式如下:

也有文章18ArXiv_AGNN_Attention-based Graph Neural Network for Semi-supervised Learning尝试为节点对

设计对称的注意力机制,如下式的
:

这里,

,所以
。相对于拼接得到的
,基于节点对
的相似性得到的
也更加直观。

可有可无的LeakyRelu?

在求

公式中,有一个非常醒目的LeakyReLU激活函数。其实在最初的GAT论文中是没有这个激活函数的。那这里作者为什么突然要加上一个激活函数呢?

我们先拿掉LeakyReLU,再看一下公式中最核心的一项

假设注意力向量

是由两个向量拼接而成,即:
,那么,

如果在没有LeakyReLU的时候对邻居进行归一化

也就是说,分子分母同时约去了节点

的信息,
实际变成了
。这时,节点对
之间的注意力权重实际没有考虑节点
的表示。

如果加上激活函数

(也就是LeakyReLU),那么

后面的归一化就不会约去节点

的信息。

这里对原始GAT论文中的公式进行了展开解读,一是为了更深入的理解图注意力机制,二是后面的代码解读需要用到这种展开。

Transformer Vs GAT

NLP中大火的Transformer和GAT本质在做一样的事情。Transformer利用self-attention机制将输入中的每个单词用其上下文的加权来表示,而GAT是利用self-attention机制将每个节点用其邻居的加权来表示。下面是经典的Transformer公式,

这里的

是一个单词的三种描述, 其中,
是当单词作为上下文的中心位置时的表示,
是当单词作为上下文时的表示,
是当单词作为加权输入时的表示。

因此,

其实代表了单词之间的相似性,在经过softmax归一化之后就可以得到注意力权重。有了注意力权重,我们再对上下文单词的表示进行加权,就可以得到单词的表示了。

上述过程和GAT的核心思想非常相似:都是通过探索输入之间的关联性(注意力权重),通过对上下文信息(句子上下文/节点邻居)进行聚合,来获得各个输入(单词/节点)的表示。

Transformer和GAT的主要区别是:

  • 在GAT中,作者对自注意力进行了简化。每个节点无论是作为中心节点/上下文/聚合输出,都只用一种表示
    。也就是说,在GAT中,
  • 在图上,节点的邻居是一个集合,具有不变性。Transformer将文本隐式的建图过程中丢失了单词之间的位置关系,这对NLP的一些任务是很致命的。为了补偿这种建图损失的位置关系,Transformer用了额外了的位置编码来描述位置信息。

核心代码解读

Graph Attention Network的作者开源了代码 https://github.com/PetarV-/GAT。但是,这份代码对于初学者来说较难理解。这里对GAT的核心代码进行简要的解读和介绍。

作者在GAT/utils/layers.py中的attn_head实现了GAT核心模块:注意力机制。

def attn_head(seq, out_sz, bias_mat,activation, in_drop=0.0, coef_drop=0.0, residual=False):

这里有3个比较核心的参数:

  • seq 指的是输入的节点特征矩阵,大小为[num_graph, num_node, fea_size]
  • out_sz指的是变换后的节点特征维度,也就是
    后的节点表示维度。
  • bias_mat是经过变换后的邻接矩阵,大小为[num_node, num_node]。

作者首先将原始节点特征seq进行变换得到了seq_fts。这里,作者使用卷积核大小为1的1D卷积模拟投影变换,投影变换后的维度为out_sz。注意,这里投影矩阵

是所有节点共享,所以1D卷积中的多个卷积核也是共享的。

seq_fts = tf.layers.conv1d(seq, out_sz, 1, use_bias=False)

也就是说,seq_fts的大小为[num_graph, num_node, out_sz]。

回顾前面的公式展开

,
也可以认为是投影变换,只不过投影到1维表示。注意,这里节点及其邻居的投影是分开的,有两套投影参数
,对应下面两个conv1d中的参数。

f_1 = tf.layers.conv1d(seq_fts, 1, 1)
f_2 = tf.layers.conv1d(seq_fts, 1, 1)

经过tf.layers.conv1d(seq_fts, 1, 1)之后的f_1和f_2维度均为[num_graph, num_node, 1]。

将f_2转置之后与f_1叠加,通过广播得到的大小为[num_graph, num_node, num_node]的logits,就是一个注意力矩阵,

按照GAT的公式,我们只要对logits进行softmax归一化就可以拿到注意力权重

,也就是代码里的coefs。但是,这里为什么会多一项bias_mat呢?

coefs = tf.nn.softmax(tf.nn.leaky_relu(logits) + bias_mat)

因为的logits存储了任意两个节点之间的注意力值,但是,归一化只需要对每个节点的所有邻居的注意力进行(下式标红的部分)。所以,引入了bias_mat就是将softmax的归一化对象约束在每个节点的邻居上,如下式的红色部分。

那么,bias_mat是如何实现的呢?直接的想法就是只含有0,1的邻接矩阵与注意力矩阵相乘,从而对邻居进行mask。但是,直接用0,1mask会有问题。

假设注意力权值[1.2, 0.3, 2.4]经过[0,1,1]的乘法mask得到[0, 0.3, 2.4],再送入到softmax归一化,实际上变为

,这里本应该被mask掉的1.2变成了
=1,还是参与到了归一化的过程中。

作者这里用一个很大的负数,如

,将原始邻居矩阵进行下面的变换, 见 utils/process.py/adj_to_bias

def adj_to_bias(adj, sizes, nhood=1):......return -1e9 * (1.0 - mt)

然后,将bias_mat和注意力矩阵相加,进而将非节点邻居进行mask。

例如,[1.2, 0.3, 2.4]经过

加法mask得到
。这样softmax就达到了我们的目的。

因为

。最后,将mask之后的注意力矩阵coefs与变换后的特征矩阵seq_fts相乘,即可得到更新后的节点表示vals。

vals = tf.matmul(coefs, seq_fts)

代码中的train_mask,val_mask,test_mask

train_mask,val_mask,test_mask是为了划分训练,验证和测试的。因为AX一次会得到所有节点的表示,但是计算loss只在部分节点上进行(训练集)。

总结

Graph Attention Network作为首次将图注意力机制引入到图神经网络中的工作,已经在很多领域得到了广泛应用。 受益于注意力机制,GAT能够过滤噪音邻居,提升模型表现并可以对结果实现一定的解释。

更多关于图神经网络/图表示学习/推荐系统, 欢迎关注我的公众号 【图与推荐】

96d77932993c734415e905dd398e8e86.png
f72e583d9e197987723d3674afa00c8a.png



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 老牌医药收割AI红利:先投个15亿美元抢中国人才
    萧箫发自凹非寺量子位报道|公众号QbitAI没想到,一场大会把我的“刻板印象”攻破了。2021世界人工智能大会现场,能看见不少熟悉的身影, ... [详细]
  • 3年半巨亏242亿!商汤高估了深度学习,下错了棋?
    转自:新智元三年半研发开支近70亿,累计亏损242亿。AI这门生意好像越来越不好做了。近日,商汤科技已向港交所递交IPO申请。招股书显示& ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
author-avatar
心韵怡怡雅琦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有