GAT(Graph Attention Network,图注意力网络)是在 GCN 之后提出的 。它由 Petar Veličković 等人于 2017 年 提出(2018 年发表于 ICLR),核心动机正是为了解决你刚才提到的 GCN 的局限性------即 GCN 的聚合权重是固定的、与特征无关的 (αij∝1/didj\alpha_{ij} \propto 1/\sqrt{d_i d_j}αij∝1/didj ),而 GAT 将其升级为数据驱动的、可学习的注意力权重。
1 GAT 单层的具体计算公式如下:
1. 线性变换
首先,对每个节点的输入特征 hih_ihi 做一个共享的线性变换(映射到新的特征空间):
zi=Whiz_i = W h_izi=Whi
2. 计算注意力系数(打分)
对于任意相邻节点对 (i,j)(i, j)(i,j),计算原始注意力分数 eije_{ij}eij。这里是把节点 iii 和邻居 jjj 变换后的特征**拼接(concat)**起来,再通过点积和可学习向量 aaa、LeakyReLU 激活函数来打分:
eij=LeakyReLU(a⊤[zi ∥ zj])e_{ij} = \text{LeakyReLU}\left( a^\top [z_i \,\|\, z_j] \right)eij=LeakyReLU(a⊤[zi∥zj])
3. 归一化得到权重
使用 softmax 对节点 iii 的所有邻居(含自环)的分数进行归一化,得到最终的聚合权重 αij\alpha_{ij}αij(值在 0~1 之间,和为 1):
αij=exp(eij)∑k∈N(i)∪{i}exp(eik)\alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k \in \mathcal{N}(i) \cup \{i\}} \exp(e_{ik})}αij=∑k∈N(i)∪{i}exp(eik)exp(eij)
4. 加权聚合(输出)
最后,将邻居节点(含自身)变换后的特征按学习到的权重 αij\alpha_{ij}αij 加权求和,并通过激活函数 σ\sigmaσ(如 ELU)得到节点 iii 的新特征:
hi′=σ(∑j∈N(i)∪{i}αijzj)h'i = \sigma\left( \sum{j \in \mathcal{N}(i) \cup \{i\}} \alpha_{ij} z_j \right)hi′=σ j∈N(i)∪{i}∑αijzj
与 GCN 的核心区别一目了然:
- GCN :αij\alpha_{ij}αij 是固定 的 1/d^id^j1/\sqrt{\hat{d}_i \hat{d}_j}1/d^id^j ,只取决于图拓扑结构,不随特征变化。
- GAT :αij\alpha_{ij}αij 是动态 计算出来的,依赖于 hih_ihi 和 hjh_jhj 的特征内容(通过 aaa 和 WWW 学习),能自动给不同邻居分配不同的重要性。
此外,GAT 通常还会引入 多头注意力(Multi-head attention),即并行运行多个上述注意力机制然后拼接或取平均,以稳定学习过程,这和 Transformer 的设计哲学也是一致的。
2 '可学习的打分 + 归一化加权求和'构成了注意力
1)注意力的"本质结构"是什么?
任意注意力机制,抽象来说只有三步:
- 打分(score) :给每对 ((i,j)(i,j)(i,j)) 算一个原始分数 (eije_{ij}eij)
→ 表示"(i) 有多关注 (j)" - 归一化(normalize) :把分数变成权重 (αij\alpha_{ij}αij)(如 softmax)
→ 保证"关注的分配"是一个分布 - 加权求和(aggregate) :
hi′=∑jαijvj h_i'=\sum_j \alpha_{ij} v_j hi′=j∑αijvj
只要满足这三点,它就是注意力(不管打分怎么来的)。
2)GAT 里的"点积 + 可学习向量"在做啥?
GAT 的原始形式是:
eij=LeakyReLU(a⊤[zi ∥ zj]) e_{ij}= \mathrm{LeakyReLU}\big(a^\top [z_i\,\|\,z_j]\big)eij=LeakyReLU(a⊤[zi∥zj])
这里的含义是:
- (zi=Whi, zj=Whjz_i=W h_i,\; z_j=W h_jzi=Whi,zj=Whj):先把节点特征映射到新空间
- ([zi∥zj][z_i \| z_j][zi∥zj]):把"中心节点"和"邻居"拼在一起
- (aaa):可学习向量,相当于一个"关注模板"
- (a⊤[zi∥zj]a^\top [z_i\|z_j]a⊤[zi∥zj]):衡量"在当前模板下,(j) 对 (i) 有多重要"
👉 所以这本质上就是一个可学习的相似度/相关性打分函数。
3)那"点积"为什么常用来做打分?
在 Transformer 里你看到的是:
eij=qi⊤kj e_{ij}=q_i^\top k_j eij=qi⊤kj
这其实也是一种"可学习打分":
- (qi=xiWQ, kj=xjWKq_i=x_i W_Q,\;k_j=x_j W_Kqi=xiWQ,kj=xjWK) 已经把特征投影到"查询/键"空间
- 点积衡量:在这个空间里,(qiq_iqi) 与 (kjk_jkj) 方向有多一致
- 方向越一致 → 分数越高 → 关注越多
点积不是必须的,只是:
- 计算快(矩阵乘法)
- 有清晰几何含义(余弦相似度变体)
- 配合 scale((dk\sqrt{d_k}dk ))和 softmax 很稳定
4)为什么"可学习向量 / 可学习投影 + 打分"就算注意力?
因为:
- 固定权重(如 GCN 的 (1/didj1/\sqrt{d_i d_j}1/didj ))=无注意力
- 数据依赖权重(如 GAT / Transformer)=有注意力
- 如果这个权重是通过网络从数据里学出来的,尤其用于对邻居/词分配不同重要性,那就正好是注意力想做的事
所以可以这样记:
固定聚合 → GCN
数据驱动聚合权重 → 注意力
邻居受限 + 可学习打分 → GAT
全局 + 可学习打分 → Transformer
5)一句话总结
用可学习方式给每对 ((i,j)(i,j)(i,j)) 算一个分数,再 softmax 成权重,再加权求和------这才是注意力。*
点积 / 拼接+MLP / 余弦 / 等等,只是不同的"打分实现"。