当前位置: 首页 > news >正文

从零开始构建图注意力网络:GAT算法原理与数值实现详解

图数据在机器学习中的地位越来越重要。社交网络的用户关系、论文引用网络、分子结构,这些都不是传统的表格或序列数据能很好处理的。现实世界中实体之间的连接往往承载着关键信息。

图神经网络(GNN)的出现解决了这个问题,它让每个节点可以从邻居那里获取信息来更新自己的表示。图卷积网络(GCN)是其中的经典代表,但GCN有个明显的限制:所有邻居节点的贡献都是相等的(在归一化之后)。

这个假设在很多情况下并不合理。比如在社交网络中,不同朋友对你的影响程度肯定不一样;在分子中,也不是所有原子对化学性质的贡献都相同。

图注意力网络(GAT)就是为了解决这个问题而设计的。它引入注意力机制,让模型自己学会给不同邻居分配不同的权重,而不是简单地平均处理。用一个比喻来说,GCN像是"听取所有朋友的建议然后求平均",而GAT更像是"重点听那些真正懂行的朋友的话"。

本文文会详细拆解GAT的工作机制,用一个具体的4节点图例来演示整个计算过程。如果你读过原论文觉得数学公式比较抽象,这里的数值例子应该能让你看清楚GAT到底是怎么运作的。

GAT的核心思想
GAT的设计目标很直接:让每个节点能够智能地选择从哪些邻居那里获取信息,以及获取多少信息。

任何图都包含三个基本要素:节点(V)代表图中的实体,边(E)表示实体间的关系,特征(X)是每个节点的属性向量。

GAT层的工作流程可以概括为:输入节点特征,通过线性变换投影到新的特征空间,计算节点间的注意力分数,用softmax进行归一化,最后按注意力权重聚合邻居信息得到新的节点表示。

我们用一个简单的4节点图来演示这个过程。节点A、B、C、D的连接关系如下图所示:

为了便于手工计算,我们设定每个节点的特征维度为3:

节点A:[1.0, 0.5, 0.2]
节点B:[0.9, 0.1, 0.3]
节点C:[0.4, 0.7, 0.8]
节点D:[0.2, 0.3, 0.9]
把这些特征向量按行排列,就得到了特征矩阵 X ∈ ℝ⁴ˣ³:

矩阵的每一行对应一个节点,每一列对应一个特征维度。我们有4个节点,每个节点3个特征,所以是4×3的矩阵。

线性变换:特征投影
GAT计算注意力之前,需要先对节点特征进行线性变换。这一步用共享的权重矩阵W将原始特征投影到新的特征空间。

线性变换的作用有两个:一是让模型能学到更好的特征表示,二是可以调整特征维度来适应不同任务的需要。数学表达式是:

我们设定原始特征维度F=3,变换后的维度F′=2,权重矩阵W的值为(实际应用中这些权重是随机初始化然后训练得到的):

以节点A为例,它的原始特征向量是:

与权重矩阵W相乘得到:

对所有节点进行同样的变换:

变换后的特征矩阵是:

现在每个节点都从3维特征变成了2维特征。

注意力分数计算
有了变换后的特征,接下来要计算注意力分数。这些分数反映了在信息聚合时,一个节点对另一个节点的重要程度。

对于边(i,j),注意力分数的计算公式是:

这里eij可以理解为邻居j对节点i的"原始重要性分数"。

设定变换后的特征维度F′=2,注意力向量a为(实际中这个向量也是训练学习得到的):

使用前面得到的变换特征:

计算边A→B的注意力分数。首先将节点A和B的特征连接起来:

然后与注意力向量a做点积:
0.5(0.26) + 0.6(0.77) + 0.7(0.20) + 0.8(0.59) = 1.204

应用LeakyReLU激活函数(由于结果是正数,值保持不变):

用同样的方法计算其他边的注意力分数:

到这里得到的是未归一化的注意力分数,它们可以是任意实数。下一步需要用softmax对这些分数进行归一化,让它们变成类似概率的形式,便于比较和使用。
更多案例:
vk.com/topic-232893491_55286496
vk.com/topic-232893500_54843508
vk.com/topic-232893488_54258247
vk.com/topic-232893494_53776735
vk.com/topic-232893492_54477835
vk.com/topic-232893486_54128716
vk.com/topic-232893499_54437457
vk.com/topic-232893495_53685925
vk.com/topic-232893485_53685924
vk.com/topic-232893483_54080043
vk.com/topic-232893487_54971955
vk.com/topic-232893489_54437454
vk.com/topic-232893497_54971953
vk.com/topic-232893496_54128715
vk.com/topic-232893493_54080040
vk.com/topic-232893484_53776731
vk.com/topic-232893490_54843503
vk.com/topic-232893491_55286488
vk.com/topic-232893500_54843500
vk.com/topic-232893488_54258237
vk.com/topic-232893494_53776727
vk.com/topic-232893492_54477829
vk.com/topic-232893486_54128711
vk.com/topic-232893499_54437448
vk.com/topic-232893495_53685917
vk.com/topic-232893485_53685916
vk.com/topic-232893483_54080034
vk.com/topic-232893487_54971942
vk.com/topic-232893489_54437446

http://www.hskmm.com/?act=detail&tid=19273

相关文章:

  • 关于Leetcode 812题的简单思考
  • Laravel5.8 利用 snappyPDF 生成PDF文件
  • 25秋周总结4
  • Python 潮流周刊#121:工程师如何做出高效决策?
  • 饥荒联机版
  • iSCSI网络存储——基于VM17下麒麟V10SP1与SP2的共享配置
  • 微信二次开发文档
  • CSP-S1 2025
  • 金币
  • 课后作业2
  • 加密货币技术革命:揭秘数字复兴时代
  • 详细介绍:CTFshow系列——PHP特性Web113-115(123)
  • 第六篇
  • 6378:删除数组中的元素(链表)
  • DiffDock 环境安装和启用教程
  • [题解]P11533 [NOISG 2023 Finals] Topical
  • day20_修改 删除功能
  • [题解]P10231 [COCI 2023/2024 #4] Putovanje
  • # Windows CMD 基本指令参考手册
  • P13019 [GESP202506 八级] 树上旅行
  • 完整教程:负载均衡式的在线OJ项目编写(二)
  • Java语法基础课程动手动脑及课后实验问题整理文档
  • 安装包制作流程-final
  • 让YOLO飞起来:从CPU到GPU的配置指南
  • 记录这辈子见到的第一道从上到下的树上倍增
  • 06.容器存储 - 教程
  • 1748:约瑟夫问题
  • Ansible + Docker 部署 Apache Nifi 1.28 单用户集群
  • 候机的队伍
  • Keil uVision5 设置 hex 输出路径,不放Objects目录下