GAT 与图注意力机制

一、为什么图上需要”注意力”

在 CNN、RNN 的前向传播中,每个位置对其他位置的聚合权重是由空间结构或时序距离天然决定的——像素的邻居就是它的欧氏邻域,序列中第 步的隐状态来自前几步。但 图的连接是人为设定的,边权往往只是邻接关系的二元标记(有无边相连),或者是一个固定的、不带语义的距离假设。

这带来一个根本问题:不是所有邻居都同等重要。社交网络中你可能只有几百个好友,但真正影响你观点的可能只有十几个人;在化学分子图中,一个原子是否与电负性强的原子相邻,往往比与普通碳原子相邻更能决定它的反应活性。固定平均聚合(GCN 的 归一化)无法捕捉这种异质性,它假设每条边的信息传递效率一样。

GAT 的核心动机就是:让模型自己学出每条边上该传多少信息


二、从注意力机制推导图注意力

2.1 先有一个直觉:注意力是什么

Attention 的本质是 软寻址(soft addressing)

  1. 给定一个 query(当前节点的状态)
  2. 对所有 key(邻居节点的状态)做相似度打分
  3. 用 softmax 把分数归一化成权重
  4. 用这些权重对 value(邻居节点的表示)做加权求和,得到输出

在 NLP 的 Transformer 里,query、key、value 全部来自文本的不同位置。在图上,这个思想被自然地移植过来——图的结构天然提供了”谁该注意谁”的空间约束,每个节点的 query 只在自己的邻居上做 softmax,而不是在全局做。

2.2 节点间 Attention Score 的计算

设节点 的特征为 ,经线性变换后得到:

其中 是共享的线性映射, 是隐藏维度。

对节点对 ,计算未经归一化的注意力系数(logit)

这里 是一个可学习的注意力向量, 表示拼接。LeakyReLU 的斜率通常取 0.2,用来避免梯度在负区间完全消失。

这个 捕捉的是什么? 它衡量的是:在当前任务目标下,节点 认为节点 的信息对自己有多重要。如果 高,说明模型认为从 传到 的信息是值得重视的。

2.3 softmax 归一化与邻居屏蔽

由于图结构限制了信息流动的范围,只在有边相连的节点对上计算注意力。对于节点 ,把所有邻居 做 softmax:

得到的 就是节点 分配给节点 的注意力权重,满足 。这比 GCN 里固定的 灵活得多——重要邻居会获得更高的权重,噪声邻居的权重会被压制

2.4 注意力权重如何进入消息传递

有了归一化的注意力权重 ,单头 GAT 的输出为:

这里 直接控制了从 的信息流量。如果某条边对应的 ,说明从 传来的信息只贡献 5%;如果 ,说明这次聚合几乎由 主导。

这种机制和 GCN 本质不同:GCN 的聚合权重 是预先设定好的、与任务无关的常数;而 GAT 的 数据驱动、与任务目标联合优化的。GCN 告诉你”和所有人均匀交换信息”,GAT 告诉你”有选择地向重要邻居多学习”。

2.5 多头注意力(Multi-Head Attention)

单头注意力的感受野有限,且表示可能不够稳定。GAT 使用多头注意力来增强表达能力:

其中第 个头的计算为:

常见的聚合方式有两种:

  • 拼接(Catenation)AGGR = \|(纵向拼接),输出维度变成 。适合大多数中间层。
  • 平均(Average)AGGR = \text{Mean},输出维度保持 ,适合最后一层用来输出预测。

从直觉上理解多头:不同的注意力头可以学习不同类型的”重要性”。有的头可能学会了关注度中心性高的邻居,有的头可能专注于结构相似的邻居(如三角闭合中的节点对),有的头可能捕捉某种化学性质的相似性。多头让模型可以在不同子空间同时做多个软寻址,增加了表达能力,同时每条边上 个独立的 也能降低随机噪声的影响。


三、GAT 与 GCN、Transformer 的关系

3.1 GAT vs GCN

GCNGAT
聚合权重固定的 数据驱动的
权重来源度数(结构性信息)可学习注意力(语义相关性)
计算复杂度(多头)
感受野1-邻域(可堆叠扩大)1-邻域(可堆叠扩大)
可解释性弱(结构先验)相对强(但注意力和解释性不等价,见后文)

一个常见的误解:认为 GAT 只是 GCN 的”加了注意力版本”。更准确的理解是:GCN 是一种结构驱动的聚合先验,GAT 是一种语义驱动的聚合机制。它们不是简单的替代关系——GAT 在邻居重要性差异大的图上优势明显,但在结构信息主导的任务上(如PageRank类问题)GCN 类的结构先验可能更有效。

3.2 GAT vs Transformer

结构上的类比非常直接:

Transformer 组件GAT 对应
Query(查询)目标节点 的变换表示
Key(键)邻居节点 的变换表示
Value(值)邻居节点 的变换表示
Attention score 经过 LeakyReLU
softmax 归一化图上局部 softmax(只对邻居做)
多头多头注意力
全序列 attend只在邻接边上 attend

关键区别

  1. attend 的范围不同:Transformer 的注意力是全局的,每个 token 可以 attend 到序列中任意位置;GAT 的注意力被图的边结构严格限制,每个节点只能 attend 到它的邻居。这意味着 Transformer 需要位置编码(因为它不知道 token 之间的空间关系),而 GAT 直接利用图结构。

  2. 计算瓶颈不同:Transformer 的 的,全序列两两之间都要算;GAT 的 只在有边的节点对上计算,是 的。但在稀疏图上, 仍然可能很大(尤其是 dense 的稀疏图),这是 GAT 的主要工程挑战。

  3. 任务目标不同:Transformer 的注意力是学习序列中 token 之间的语义关联;GAT 的注意力除了捕捉语义相似性外,还要受图结构的约束——它是在”哪些节点本来就有连接”这个先验下,学习”连接着的边上该传多少信息”。


四、注意力可解释性:注意力不等于重要性

这是一个需要特别澄清的点:GAT 学到的注意力权重 不能直接拿来当节点间重要性或因果解释

原因有三:

  1. 注意力是相对的,不是绝对的。对节点 来说, 的意思是”在我所有的邻居中,我认为 相对重要性的softmax概率”,但这个概率的大小受所有邻居的竞争影响。如果一个节点有 100 个邻居,其中一个邻居的 (看起来不高),但在只有 2 个邻居的情况下,这个 可能意味着”这个邻居对我几乎没影响”。看单点注意力值而不看整体分布容易误读。

  2. 注意力权重不是任务相关的ground truth。它只是模型在当前优化目标下学到的”一种”有用的聚合方式,但”有用”不代表它捕捉了真正因果的连接关系。模型可能因为欠拟合而把注意力放在错误的邻居上,或者因为过拟合而利用了数据中的伪相关(如数据增强带来的伪边)。

  3. 缺乏直接监督信号。在监督训练中 没有独立的目标函数来约束它,它只是作为链式法则的一部分参与反向传播。这意味着注意力权重可能会被”带偏”——比如某些维度上的表示变换对最终 loss 的贡献更大,那么对应的注意力就会偏向那些维度。

正确的用法:可以用注意力权重做探索性分析(哪些邻居被 attend 得多),可以和其他解释方法(如 GNNExplainer)结合使用,但不能直接把 当作”这条边有多重要”的结论性证据。


五、工程实现关键

5.1 稀疏邻接上的注意力计算

直接实现逐边计算注意力并做 softmax 的朴素做法是低效的。实践中通常用以下策略:

批量(Batch)处理配合掩码:在 PyTorch Geometric、DGL 等库中,每个 batch 构造一个形状为 的邻居表示矩阵,用掩码矩阵控制哪些节点对不该参与 softmax(如无边相连)。这避免了 Python 循环遍历边列表。

消息传递范式:GAT 的计算天然符合”消息传递”框架——每个节点作为 sender 向邻居发送自己的消息 ,邻居作为 receiver 汇总所有收到的消息。底层库会自动处理稀疏邻接的索引问题,只需正确注册 message function 和 reduce function。

稀疏矩阵乘法优化:注意力计算中的 可以用稀疏-密集矩阵乘法(SpMM)高效实现,库如 PyTorch Sparse(torch.sparse)提供了相关 API。

5.2 图大小增加后的计算瓶颈

当图的边数 增长时,GAT 的主要瓶颈是:

瓶颈原因应对策略
注意力 score 计算 每条边都要做一次 MLP(拼接+线性+LeakyReLU)使用线性注意力(Performer、Linformer 等近似方法)或共享 key-value 投影
softmax 归一化每条边涉及的邻居集合不同,不能批量矩阵化分组softmax:按度数桶分组处理
显存 O()需要存储所有头的 梯度检查点(gradient checkpointing)、分阶段释放中间结果
多头 concat 显存最后一层的 拼接成大矩阵使用均值而非拼接,或在深层适当减少头数

核心矛盾:当图非常稠密时(如 ),GAT 的计算量接近 Transformer 的全局注意力,丢失了在稀疏图上的效率优势。

5.3 调参建议

超参数建议范围说明
多头数 4–8(中间层),1(输出层) 增大能提升表达力,但显存和计算量线性增长。中间层 4–8 是经验安全区。
隐藏维度 64–256太小欠拟合,太大容易过拟合。在 Cora/PubMed 上 8–16 就够;大规模分子图/社交图可能需要 128–256。
Dropout0.1–0.5注意力权重上也要 dropout(通常叫 attention dropout),否则容易过拟合。建议 0.1–0.2。
层数2–4GAT 的感受野随层数扩大(和 GCN 一样),但超过 4 层后提升有限且梯度可能变差。
学习率0.005–0.01(Adam)GAT 对学习率比较敏感,建议从 0.005 开始,配合 warmup 或 weight decay 0.0005。
激活函数ELU 或 PReLULeakyReLU(原始论文用)是经验选择,有些实现改用 ELU/PReLU 效果更稳定。
邻居采样大图必用如 GraphSAINT 随机采样子图,避免 batch 内邻居数方差过大导致显存峰值。

六、GAT 更适合哪些场景

6.1 异质邻居重要性差异明显的图

这是 GAT 的原生优势场景:邻居对当前节点的影响不是均匀的,且这种影响可以从节点特征中推断

  • 引用网络(Cora、PubMed、CiteSeer):论文的重要性由引用它的其他论文的质量和主题决定,而不只是”被多少篇论文引用”。
  • 化学分子图:原子是否与电负性原子(如 O、N、S)相邻,强烈影响它的化学环境;但同一个原子可能有多个相同类型的邻居,注意力会自动学习区分。
  • 推荐系统(User-Item 二部图):用户对不同 item 的偏好差异极大,且这种偏好可以从 item 的 side information(类别、价格、描述)中学习。
  • 交通网络:路口的拥堵程度受上游几个关键路口影响,而不是所有上游路口均等。

6.2 GAT 相对于 GCN 的决策点

选 GAT 而非 GCN,当且仅当

  1. 你有足够的特征信息来支撑学习不同邻居的重要性(如果节点只有 one-hot 度数特征,注意力学不到什么东西)
  2. 你的任务中确实存在”邻居的重要性是可变的”这个先验
  3. 你有足够的计算预算(多头 GAT 的计算和显存开销约为 GCN 的 K 倍)

继续选 GCN 或其变体,当

  • 图结构本身是任务的核心驱动力(如只用拓扑结构做节点分类)
  • 数据量小,GAT 更容易过拟合
  • 图过于稠密,GAT 的效率优势丧失

七、训练常见坑与解决方案

坑 1:注意力权重趋于均匀( attention collapse)

症状:所有 都接近 ,退化为 GCN 的均匀聚合。

原因:模型没有学到有意义的邻居重要性区分。可能是因为:(a) 特征区分度不够(输入特征太相似);(b) 学习率过大,softmax 的温度过高;(c) 任务本身邻居重要性差异本来就不大。

解法

  • 检查输入特征的区分度,如果太相似考虑加特征工程或预训练表示
  • 调低学习率,加 weight decay
  • 在损失函数中加正则项,惩罚注意力分布的熵(鼓励更集中的注意力)

坑 2:过拟合,尤其在小图上

症状:训练 loss 很低但验证集 accuracy 差几个点。

解法

  • 增加 dropout(0.3–0.5),包括注意力 dropout
  • 减少隐藏维度或头数
  • 减少 GAT 层数(从 3 层减到 2 层)
  • 使用 label smoothing

坑 3:数值不稳定(NaN/Inf)

症状:训练几步后 loss 突然变 NaN。

原因 的值过大导致 exp 溢出;或者多头拼接后数值尺度差异大。

解法

  • 在 softmax 前对 减去过大的偏移(如减去 ,数值稳定化技巧)
  • 检查初始化, 的初始化不能太大
  • 降低学习率

坑 4:多头之间学到的表示高度冗余

症状:不同头的 分布几乎一样,模型退化为单头。

解法

  • 不同的头使用不同的初始化
  • 考虑 Sparse Attention 或故意让不同头 attend 不同类型的邻居(如通过 mask 引导)

八、总结:注意力到底在图上学什么

回到最初的问题:注意力在图上学的是什么?

它学的不是”图的结构”(那是 GCN 做的事),也不是”全局语义关联”(那是 Transformer 做的事),而是 “在给定图结构的约束下,节点 A 应该从节点 B 获取多少任务相关的信息”

这个”多少”是由两个因素共同决定的:

  1. 语义相关性:从特征层面, 的表示是否和 相似或互补(拼接后经 MLP 学到的 捕捉这一点)
  2. 优化目标:这个相关性是否对当前的下游任务有贡献(梯度反向传播调整注意力参数,使其服务于最终 loss)

因此,GAT 的 attention 不是解释性工具,而是 一个灵活的信息流量控制器。它让模型第一次有能力在保留图结构约束的同时,学习到”谁对谁更重要”这个对下游任务至关重要的模式。这正是它从 2017 年提出至今仍被广泛使用的主要原因。