GAT 与图注意力机制
一、为什么图上需要”注意力”
在 CNN、RNN 的前向传播中,每个位置对其他位置的聚合权重是由空间结构或时序距离天然决定的——像素的邻居就是它的欧氏邻域,序列中第
这带来一个根本问题:不是所有邻居都同等重要。社交网络中你可能只有几百个好友,但真正影响你观点的可能只有十几个人;在化学分子图中,一个原子是否与电负性强的原子相邻,往往比与普通碳原子相邻更能决定它的反应活性。固定平均聚合(GCN 的
GAT 的核心动机就是:让模型自己学出每条边上该传多少信息。
二、从注意力机制推导图注意力
2.1 先有一个直觉:注意力是什么
Attention 的本质是 软寻址(soft addressing):
- 给定一个 query(当前节点的状态)
- 对所有 key(邻居节点的状态)做相似度打分
- 用 softmax 把分数归一化成权重
- 用这些权重对 value(邻居节点的表示)做加权求和,得到输出
在 NLP 的 Transformer 里,query、key、value 全部来自文本的不同位置。在图上,这个思想被自然地移植过来——图的结构天然提供了”谁该注意谁”的空间约束,每个节点的 query 只在自己的邻居上做 softmax,而不是在全局做。
2.2 节点间 Attention Score 的计算
设节点
其中
对节点对
这里
这个
2.3 softmax 归一化与邻居屏蔽
由于图结构限制了信息流动的范围,只在有边相连的节点对上计算注意力。对于节点
得到的
2.4 注意力权重如何进入消息传递
有了归一化的注意力权重
这里
这种机制和 GCN 本质不同:GCN 的聚合权重
2.5 多头注意力(Multi-Head Attention)
单头注意力的感受野有限,且表示可能不够稳定。GAT 使用多头注意力来增强表达能力:
其中第
常见的聚合方式有两种:
- 拼接(Catenation):
AGGR = \|(纵向拼接),输出维度变成。适合大多数中间层。 - 平均(Average):
AGGR = \text{Mean},输出维度保持,适合最后一层用来输出预测。
从直觉上理解多头:不同的注意力头可以学习不同类型的”重要性”。有的头可能学会了关注度中心性高的邻居,有的头可能专注于结构相似的邻居(如三角闭合中的节点对),有的头可能捕捉某种化学性质的相似性。多头让模型可以在不同子空间同时做多个软寻址,增加了表达能力,同时每条边上
三、GAT 与 GCN、Transformer 的关系
3.1 GAT vs GCN
| GCN | GAT | |
|---|---|---|
| 聚合权重 | 固定的 | 数据驱动的 |
| 权重来源 | 度数(结构性信息) | 可学习注意力(语义相关性) |
| 计算复杂度 | ||
| 感受野 | 1-邻域(可堆叠扩大) | 1-邻域(可堆叠扩大) |
| 可解释性 | 弱(结构先验) | 相对强(但注意力和解释性不等价,见后文) |
一个常见的误解:认为 GAT 只是 GCN 的”加了注意力版本”。更准确的理解是:GCN 是一种结构驱动的聚合先验,GAT 是一种语义驱动的聚合机制。它们不是简单的替代关系——GAT 在邻居重要性差异大的图上优势明显,但在结构信息主导的任务上(如PageRank类问题)GCN 类的结构先验可能更有效。
3.2 GAT vs Transformer
结构上的类比非常直接:
| Transformer 组件 | GAT 对应 |
|---|---|
| Query(查询) | 目标节点 |
| Key(键) | 邻居节点 |
| Value(值) | 邻居节点 |
| Attention score | |
| softmax 归一化 | 图上局部 softmax(只对邻居做) |
| 多头 | 多头注意力 |
| 全序列 attend | 只在邻接边上 attend |
关键区别:
-
attend 的范围不同:Transformer 的注意力是全局的,每个 token 可以 attend 到序列中任意位置;GAT 的注意力被图的边结构严格限制,每个节点只能 attend 到它的邻居。这意味着 Transformer 需要位置编码(因为它不知道 token 之间的空间关系),而 GAT 直接利用图结构。
-
计算瓶颈不同:Transformer 的
是 的,全序列两两之间都要算;GAT 的 只在有边的节点对上计算,是 的。但在稀疏图上, 仍然可能很大(尤其是 dense 的稀疏图),这是 GAT 的主要工程挑战。 -
任务目标不同:Transformer 的注意力是学习序列中 token 之间的语义关联;GAT 的注意力除了捕捉语义相似性外,还要受图结构的约束——它是在”哪些节点本来就有连接”这个先验下,学习”连接着的边上该传多少信息”。
四、注意力可解释性:注意力不等于重要性
这是一个需要特别澄清的点:GAT 学到的注意力权重
原因有三:
-
注意力是相对的,不是绝对的。对节点
来说, 的意思是”在我所有的邻居中,我认为 相对重要性的softmax概率”,但这个概率的大小受所有邻居的竞争影响。如果一个节点有 100 个邻居,其中一个邻居的 (看起来不高),但在只有 2 个邻居的情况下,这个 可能意味着”这个邻居对我几乎没影响”。看单点注意力值而不看整体分布容易误读。 -
注意力权重不是任务相关的ground truth。它只是模型在当前优化目标下学到的”一种”有用的聚合方式,但”有用”不代表它捕捉了真正因果的连接关系。模型可能因为欠拟合而把注意力放在错误的邻居上,或者因为过拟合而利用了数据中的伪相关(如数据增强带来的伪边)。
-
缺乏直接监督信号。在监督训练中
没有独立的目标函数来约束它,它只是作为链式法则的一部分参与反向传播。这意味着注意力权重可能会被”带偏”——比如某些维度上的表示变换对最终 loss 的贡献更大,那么对应的注意力就会偏向那些维度。
正确的用法:可以用注意力权重做探索性分析(哪些邻居被 attend 得多),可以和其他解释方法(如 GNNExplainer)结合使用,但不能直接把
五、工程实现关键
5.1 稀疏邻接上的注意力计算
直接实现逐边计算注意力并做 softmax 的朴素做法是低效的。实践中通常用以下策略:
批量(Batch)处理配合掩码:在 PyTorch Geometric、DGL 等库中,每个 batch 构造一个形状为
消息传递范式:GAT 的计算天然符合”消息传递”框架——每个节点作为 sender 向邻居发送自己的消息
稀疏矩阵乘法优化:注意力计算中的
5.2 图大小增加后的计算瓶颈
当图的边数
| 瓶颈 | 原因 | 应对策略 |
|---|---|---|
| 注意力 score 计算 | 每条边都要做一次 MLP(拼接+线性+LeakyReLU) | 使用线性注意力(Performer、Linformer 等近似方法)或共享 key-value 投影 |
| softmax 归一化 | 每条边涉及的邻居集合不同,不能批量矩阵化 | 分组softmax:按度数桶分组处理 |
| 显存 O( | 需要存储所有头的 | 梯度检查点(gradient checkpointing)、分阶段释放中间结果 |
| 多头 concat 显存 | 最后一层的 | 使用均值而非拼接,或在深层适当减少头数 |
核心矛盾:当图非常稠密时(如
5.3 调参建议
| 超参数 | 建议范围 | 说明 |
|---|---|---|
| 多头数 | 4–8(中间层),1(输出层) | |
| 隐藏维度 | 64–256 | 太小欠拟合,太大容易过拟合。在 Cora/PubMed 上 8–16 就够;大规模分子图/社交图可能需要 128–256。 |
| Dropout | 0.1–0.5 | 注意力权重上也要 dropout(通常叫 attention dropout),否则容易过拟合。建议 0.1–0.2。 |
| 层数 | 2–4 | GAT 的感受野随层数扩大(和 GCN 一样),但超过 4 层后提升有限且梯度可能变差。 |
| 学习率 | 0.005–0.01(Adam) | GAT 对学习率比较敏感,建议从 0.005 开始,配合 warmup 或 weight decay 0.0005。 |
| 激活函数 | ELU 或 PReLU | LeakyReLU(原始论文用)是经验选择,有些实现改用 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,当且仅当:
- 你有足够的特征信息来支撑学习不同邻居的重要性(如果节点只有 one-hot 度数特征,注意力学不到什么东西)
- 你的任务中确实存在”邻居的重要性是可变的”这个先验
- 你有足够的计算预算(多头 GAT 的计算和显存开销约为 GCN 的 K 倍)
继续选 GCN 或其变体,当:
- 图结构本身是任务的核心驱动力(如只用拓扑结构做节点分类)
- 数据量小,GAT 更容易过拟合
- 图过于稠密,GAT 的效率优势丧失
七、训练常见坑与解决方案
坑 1:注意力权重趋于均匀( attention collapse)
症状:所有
原因:模型没有学到有意义的邻居重要性区分。可能是因为:(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。
原因:
解法:
- 在 softmax 前对
减去过大的偏移(如减去 ,数值稳定化技巧) - 检查初始化,
和 的初始化不能太大 - 降低学习率
坑 4:多头之间学到的表示高度冗余
症状:不同头的
解法:
- 不同的头使用不同的初始化
- 考虑 Sparse Attention 或故意让不同头 attend 不同类型的邻居(如通过 mask 引导)
八、总结:注意力到底在图上学什么
回到最初的问题:注意力在图上学的是什么?
它学的不是”图的结构”(那是 GCN 做的事),也不是”全局语义关联”(那是 Transformer 做的事),而是 “在给定图结构的约束下,节点 A 应该从节点 B 获取多少任务相关的信息”。
这个”多少”是由两个因素共同决定的:
- 语义相关性:从特征层面,
的表示是否和 相似或互补(拼接后经 MLP 学到的 捕捉这一点) - 优化目标:这个相关性是否对当前的下游任务有贡献(梯度反向传播调整注意力参数,使其服务于最终 loss)
因此,GAT 的 attention 不是解释性工具,而是 一个灵活的信息流量控制器。它让模型第一次有能力在保留图结构约束的同时,学习到”谁对谁更重要”这个对下游任务至关重要的模式。这正是它从 2017 年提出至今仍被广泛使用的主要原因。