本文提出一种图注意力网络 (GAT), 可用于图结构数据的节点分类任务, 解决了先前基于图卷积模型的缺点. 注意力机制能够给每个邻节点不同的可学习的权重, 增强了网络的表达能力, 避免了大规模的矩阵运算.
链接: https://arxiv.org/abs/1710.10903v3
开源代码: https://github.com/Diego999/pyGAT
自注意力机制的一大优势是它能够聚焦于最相关的部分来帮助做决策. 自我注意已被证明对于诸如机器阅读 (Cheng et al., 2016) 和语句表达 (Lin et al., 2017)之类的任务很有用. Vaswani et al. (2017) 等人表明注意力不仅可以改进基于 RNN 或卷积的方法, 而且对于构建一个强大的机器翻译模型也足够了.
有不少与本文工作相似的研究. 例如 Duan et al. (2017) and Denil et al. (2017) 等人提出使用邻居注意力操作来计算注意力系数.
与 GCNs (Kipf & Welling, 2017) 模型相比, 本文的模型具有可学习的注意力机制, 大大提升了网络的表达能力, 并且正如在机器翻译任务中的注意力机制一样, 具有更多的可解释性.
首先定义一个节点的特征为
h = { h ⃗ 1 , h ⃗ 2 , … , h ⃗ N } , h ⃗ i ∈ R F . \mathbf{h}=\left\{\vec{h}_{1}, \vec{h}_{2}, \ldots, \vec{h}_{N}\right\}, \vec{h}_{i} \in \mathbb{R}^{F}. h={h1,h2,…,hN},hi∈RF.
其中 N N N 为节点数目, F F F 代表每一个节点特征向量的维数. 当前层最终输出的特征记为 h ′ = { h ⃗ 1 ′ , h ⃗ 2 ′ , … , h ⃗ N ′ } , h ⃗ i ′ ∈ R F ′ \mathbf{h}^{\prime}=\left\{\vec{h}_{1}^{\prime}, \vec{h}_{2}^{\prime}, \ldots, \vec{h}_{N}^{\prime}\right\}, \vec{h}_{i}^{\prime} \in \mathbb{R}^{F^{\prime}} h′={h1′,h2′,…,hN′},hi′∈RF′.
为了获得更强的表达能力, 有必要引入一个可学习的线性变换 W ∈ R F ′ × F \mathbf{W} \in \mathbb{R}^{F^{\prime}} \times F W∈RF′×F, 这个变换在当前层所有节点之间是共享的. 然后再对变换后的节点特征应用注意力机制 a : R F ′ × R F ′ → R a: \mathbb{R}^{F^{\prime}} \times \mathbb{R}^{F^{\prime}} \rightarrow \mathbb{R} a:RF′×RF′→R 来计算节点之间的注意力系数, 即
e i j = a ( W h ⃗ i , W h ⃗ j ) , e_{i j}=a\left(\mathbf{W} \vec{h}_{i}, \mathbf{W} \vec{h}_{j}\right), eij=a(Whi,Whj),
注意, 对每个节点 i i i, 我们只计算它与相邻节点的注意力系数. 为了使得注意力系数更有对比性, 有必要对其进行归一化:
α i j = softmax j ( e i j ) = exp ( e i j ) ∑ k ∈ N i exp ( e i k ) . \alpha_{i j}=\operatorname{softmax}_{j}\left(e_{i j}\right)=\frac{\exp \left(e_{i j}\right)}{\sum_{k \in \mathcal{N}_{i}} \exp \left(e_{i k}\right)}. αij=softmaxj(eij)=∑k∈Niexp(eik)exp(eij).
注意力系数通过一个单层的前馈神经网络来获得, 即网络的权重为一个向量 a → ∈ R 2 F ′ \overrightarrow{\mathbf{a}} \in \mathbb{R}^{2 F^{\prime}} a∈R2F′. 详细的表达如下:
α i j = exp ( LeakyReLU ( a → T [ W h ⃗ i ∥ W h ⃗ j ] ) ) ∑ k ∈ N i exp ( LeakyReLU ( a → T [ W h ⃗ i ∥ W h ⃗ k ] ) ) , \alpha_{i j}=\frac{\exp \left(\operatorname{LeakyReLU}\left(\overrightarrow{\mathbf{a}}^{T}\left[\mathbf{W} \vec{h}_{i} \| \mathbf{W} \vec{h}_{j}\right]\right)\right)}{\sum_{k \in \mathcal{N}_{i}} \exp \left(\operatorname{LeakyReLU}\left(\overrightarrow{\mathbf{a}}^{T}\left[\mathbf{W} \vec{h}_{i} \| \mathbf{W} \vec{h}_{k}\right]\right)\right)}, αij=∑k∈Niexp(LeakyReLU(aT[Whi∥Whk]))exp(LeakyReLU(aT[Whi∥Whj])),
其中 ∥ \| ∥ 是连接操作 (concatenation operation).
计算得到注意力系数之后, 便可以按照系数对邻居节点按系数做加权求和:
h ⃗ i ′ = σ ( ∑ j ∈ N i α i j W h ⃗ j ) . \vec{h}_{i}^{\prime}=\sigma\left(\sum_{j \in \mathcal{N}_{i}} \alpha_{i j} \mathbf{W} \vec{h}_{j}\right). hi′=σ⎝⎛j∈Ni∑αijWhj⎠⎞.
与 Vaswani et al. (2017) 等人的工作相似, 为了使得自注意力机制在训练上更加稳定, 引入多头自注意力机制, 假设有 K K K 个头, 对每个头都有一个权重矩阵 W k \mathbf{W}^k Wk, 将每个头的聚合结果连接起来, 即
h ⃗ i ′ = ∏ k = 1 K σ ( ∑ j ∈ N i α i j k W k h ⃗ j ) . \vec{h}_{i}^{\prime}=\prod_{k=1}^{K} \sigma\left(\sum_{j \in \mathcal{N}_{i}} \alpha_{i j}^{k} \mathbf{W}^{k} \vec{h}_{j}\right). hi′=k=1∏Kσ⎝⎛j∈Ni∑αijkWkhj⎠⎞.
最后得到的特征 h ′ \mathbf{h}^{\prime} h′ 的维度为 K F ′ KF^{\prime} KF′. 特别指出的是, 对于最后的输出层, 我们需要进行分类, 则输出向量的维数应等于类别数, 那么多头产生的特征不是连接起来, 而是求平均值
h ⃗ i ′ = σ ( 1 K ∑ k = 1 K ∑ j ∈ N i α i j k W k h ⃗ j ) . \vec{h}_{i}^{\prime}=\sigma\left(\frac{1}{K} \sum_{k=1}^{K} \sum_{j \in \mathcal{N}_{i}} \alpha_{i j}^{k} \mathbf{W}^{k} \vec{h}_{j}\right). hi′=σ⎝⎛K1k=1∑Kj∈Ni∑αijkWkhj⎠⎞.