GAT — 让图神经网络的邻居自带权重
是什么
GAT(Graph Attention Network)是把 attention 机制搬进图神经网络的一份工作。
日常类比:你在班里要写自我介绍,于是参考周围同学的简历。
- 旧办法(GCN):每个邻居贡献一样多,按”班里有多少人”平均
- GAT:你给每个邻居打一个分数——“这个人和我更像,多看两眼;那个人离我远,少看一点”——分数是学出来的
一句话:邻居权重不再固定,而是由网络自己学。
为什么重要
2017 年 6 月,Vaswani 那群人发了 Transformer。同一年 10 月,Veličković 这群人挂出 GAT。两边没串通,但都收敛到一个想法:
用 attention 决定”谁该看谁、看多重”
这是 GNN 与 Transformer 第一次合流的早期信号。后来的 Graph Transformer / Graphormer / GraphGPS 把这条线挑明——Transformer 本质上就是”全连接图上的 GAT”。
不理解 GAT,下面这些事讲不清:
- 为什么 GNN 圈 2018 之后突然全跟着加 attention
- 为什么 Transformer 后来反过来”侵入”图领域,几乎没遇到阻力
- 为什么”邻居加权聚合”这个想法可以同时解释推荐、蛋白质、社交网络
核心要点
GAT 的一层做三件事,对每个节点 i:
-
打分:对 i 和每个邻居 j,算一个原始分数
e_ij = LeakyReLU( a^T [ W h_i || W h_j ] )||是拼接,W和a是可学习参数。直觉:把”我”和”邻居”拼起来过一个小网络,输出一个标量。 -
归一化:把 i 所有邻居的分数过 softmax,得到权重
α_ij = softmax_j(e_ij)注意 softmax 只在邻居集合内部做,不是全图。
-
加权聚合:
h'_i = σ( Σ_j α_ij · W h_j )
多头 attention:上面这套并行做 K 份(K 个独立 W, a),中间层把 K 个输出拼接,输出层把 K 个输出取平均。和 Transformer 的多头一模一样。
对比 GCN(前作):GCN 的权重是 1/√(d_i d_j)(按度归一化),写死。GAT 把这一项换成可学习的 α。
实践案例
案例 1:Cora 引文网络节点分类
Cora 是经典图数据集——2708 篇论文(节点)、引用关系(边)、要分到 7 个主题。
GAT 的两层结构(论文配置):
输入: 1433 维 bag-of-words → 第一层 8 头 × 8 维 (concat) = 64 维 → 第二层 1 头 × 7 维 (类别)关键观察:每个 attention head 学会关注不同模式的邻居。可视化时能看到,head A 偏向引用同主题的论文,head B 偏向高被引的”权威”邻居。
案例 2:PPI 蛋白质互作(inductive)
PPI 任务:训练在一组图上,测试在完全没见过的新图。
- GCN 不行——它的权重
1/√(d_i d_j)依赖训练图的度分布,换图就崩 - GraphSAGE 行,但靠采样邻居 + 简单聚合
- GAT:F1 大幅领先,因为 attention 是和图无关的函数,新图直接套
这个差别叫 transductive vs inductive。GAT 是 inductive 阵营里的早期标志性工作。
案例 3:Transformer 视角看 GAT
Transformer self-attention: 每个 token 看所有 tokenGAT: 每个节点只看邻居把图换成”全连接图”(每个节点都和所有节点相邻),GAT 就退化成 Transformer。
反过来,Transformer 加上”只能看局部邻居”的 mask,就变成 GAT。
这就是为什么后来的图领域几乎平滑过渡到 Graph Transformer——底子是同一套。
踩过的坑
-
原版 GAT 的 attention 是”静态”的:仔细看 e_ij 的公式,
a^T [W h_i || W h_j]拆开是a_1 W h_i + a_2 W h_j。前一项只依赖 i——意味着不同 i 排出的邻居重要性顺序,最强邻居总是同一个。GATv2 (Brody 2022) 把 LeakyReLU 提到拼接之后再点积,修复了这个限制。 -
softmax 归一化让”绝对重要性”丢失:不管邻居多不重要,权重和都是 1。如果一个节点周围全是噪音,模型也只能在噪音里挑一个高的。
-
深层 GAT 仍会 over-smoothing:堆 4 层以上,节点表示趋同。这是所有消息传递 GNN 的共病,attention 没解决。
-
多头数和 head 维度的取舍:8 头 × 8 维 ≠ 1 头 × 64 维。论文经验是多头更稳,但参数量近似时哪个更好要看任务。
适用 vs 不适用场景
适用:
- 节点/边重要性显著不均(社交网络的 KOL、引文网络的高被引)
- inductive 任务(要泛化到新图)
- 需要可解释——attention 系数能拿来可视化”模型看了哪个邻居”
不适用:
- 极大规模图(百万节点):每条边算 attention 太贵,需要邻居采样或换 GraphSAINT 类方法
- 边特征很丰富的场景:原版 GAT 没用边特征,要扩展
- 需要长距离依赖:堆深层会 over-smoothing,不如直接上 Graph Transformer
历史小故事(可跳过)
- 2017 年 6 月:Vaswani et al. “Attention Is All You Need”,Transformer 在 NLP 引爆
- 2017 年 9 月:Kipf & Welling 的 GCN 正式发表,GNN 开始火
- 2017 年 10 月 30 日:Veličković 把 GAT 挂上 arXiv,作者列里有 Yoshua Bengio
- 2018 年 4 月:ICLR 2018 接收
- 2022 年:Brody, Alon, Yahav 发 “How Attentive are Graph Attention Networks?” 提出 GATv2,PyTorch Geometric 默认换成 v2
GAT 的 GitHub 实现(TensorFlow 1.x)至今还能跑,但工程上推荐用 PyTorch Geometric 的 GATConv / GATv2Conv。
学到什么
- “邻居加权”是 GNN 的元问题——GCN 写死、GraphSAGE 采样、GAT 学权重,每一代解法换一个角度
- Attention 是跨领域通用工具——同一个数学结构,NLP 里叫 self-attention,图里叫 GAT,视觉里叫 ViT
- 简单 + 可解释 + 效果好,三样占两样就够发顶会,GAT 占了三样
- 后人能继续打补丁:GAT → GATv2 → Graph Transformer,每一步都是发现前一步的限制然后松绑
延伸阅读
- 论文 PDF:arXiv 1710.10903
- 一作博客:Petar Veličković — GAT(含动图、附原始 TF 代码)
- GATv2 修正:Brody, Alon, Yahav 2022
- 工程实现:PyG GATConv 文档
- gcn-2017 —— GAT 的前身,邻居等权聚合
- attention —— attention 机制本身的源流
关联
- gcn-2017 —— GAT 直接对照的前作,把”度归一化”换成”学权重”
- attention —— GAT 用的就是 Bahdanau-Vaswani 这条线的 attention
- transformer-xl-2019 —— Transformer 后续延伸;和 GAT 是 attention 在 NLP/图两端的并行展开
- flash-attention —— 工程上让 attention 更便宜,对大图 GAT 同样适用
反向链接
- attention —— Attention Is All You Need
- flash-attention —— FlashAttention — 不改算法,只改数据怎么进 GPU
- gcn-2017 —— GCN 2017 — 把卷积搬到图结构上的最简版本
- transformer-xl-2019 —— Transformer-XL — 让 Transformer 像 RNN 那样把上下文滚动传下去