跳转到内容

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:

  1. 打分:对 i 和每个邻居 j,算一个原始分数

    e_ij = LeakyReLU( a^T [ W h_i || W h_j ] )

    || 是拼接,Wa 是可学习参数。直觉:把”我”和”邻居”拼起来过一个小网络,输出一个标量。

  2. 归一化:把 i 所有邻居的分数过 softmax,得到权重

    α_ij = softmax_j(e_ij)

    注意 softmax 只在邻居集合内部做,不是全图。

  3. 加权聚合

    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 看所有 token
GAT: 每个节点只看邻居

把图换成”全连接图”(每个节点都和所有节点相邻),GAT 就退化成 Transformer。

反过来,Transformer 加上”只能看局部邻居”的 mask,就变成 GAT。

这就是为什么后来的图领域几乎平滑过渡到 Graph Transformer——底子是同一套

踩过的坑

  1. 原版 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 提到拼接之后再点积,修复了这个限制。

  2. softmax 归一化让”绝对重要性”丢失:不管邻居多不重要,权重和都是 1。如果一个节点周围全是噪音,模型也只能在噪音里挑一个高的。

  3. 深层 GAT 仍会 over-smoothing:堆 4 层以上,节点表示趋同。这是所有消息传递 GNN 的共病,attention 没解决。

  4. 多头数和 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

学到什么

  1. “邻居加权”是 GNN 的元问题——GCN 写死、GraphSAGE 采样、GAT 学权重,每一代解法换一个角度
  2. Attention 是跨领域通用工具——同一个数学结构,NLP 里叫 self-attention,图里叫 GAT,视觉里叫 ViT
  3. 简单 + 可解释 + 效果好,三样占两样就够发顶会,GAT 占了三样
  4. 后人能继续打补丁:GAT → GATv2 → Graph Transformer,每一步都是发现前一步的限制然后松绑

延伸阅读

关联

  • 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 那样把上下文滚动传下去