前言
题目: Graph Attention Networks
会议: International Conference on Learning Representations, 2018
论文地址:Graph Attention Networks
在前面的几篇文章中,主要介绍了GCN以及GraphSAGE两种结构:
其中GCN通过聚合相邻节点的特征来形成节点新的特征,GraphSAGE通过对节点的邻居进行采样,然后对采样节点的特征执行某种特定方式的聚合,最后再与本身特征结合以形成自身新的特征。无论是GCN还是GraphSAGE,其在聚合邻居节点特征的过程中都是同等看待每个邻居节点。
为此,我们很容易想到引入Attention机制来给不同的邻居节点赋予不同的重要性,然后节点在聚合邻居节点特征的过程中会更多地提取重要邻居的特征,从而带来整体效果的提示。在这种背景下,GAT(Graph Attention Networks)便被提了出来。
1. GAT
GAT是通过堆叠多层graph attentional layer,也就是图注意力层来实现节点的特征变换。
1.1 图注意力层
图注意力层的输入定义为: h = { h ⃗ 1 , h ⃗ 2 , . . . , h ⃗ N } h=\left\{\vec{h}_1,\vec{h}_2,...,\vec{h}_N \right\} h={h1,h2,...,hN},其中 h ⃗ i ∈ R F \vec{h}_i \in R^F hi∈RF, h h h为节点特征集合。
图注意力层的输出为经过变换后的节点特征集合: h ′ = { h ⃗ 1 ′ , h ⃗ 2 ′ , . . . , h ⃗ N ′ } h^{'}=\left\{\vec{h}_1^{'},\vec{h}_2^{'},...,\vec{h}_N ^{'}\right\} h′={h1′,h2′,...,hN′},其中 h ⃗ i ′ ∈ R F ′ \vec{h}_i^{'} \in R^{F^{'}} hi′∈RF′。
在图注意力层中,节点输入的特征首先要经过一个线性变换: W h ⃗ i W\vec{h}_i Whi,其中 W ∈ R F ′ × F W \in R^{F^{'} \times F} W∈RF′×F,也就是说经过一个线性变换后,所有节点的特征维度从原来的 F F F变成了 F ′ F^{'} F′。
接着,需要对节点执行自注意力机制以计算注意力系数:
e
i
j
=
a
(
W
h
⃗
i
,
W
h
⃗
j
)
e_{ij}=a(W\vec{h}_i, W\vec{h}_j)
eij=a(Whi,Whj)
这里
e
i
j
e_{ij}
eij表示节点
j
j
j的特征对节点
i
i
i的重要性,是一个具体的数。有了上述公式后,我们就可以计算图中所有节点特征对节点
i
i
i的重要性,但一般来讲,我们只需要计算节点
i
i
i一阶邻居节点特征对节点
i
i
i的重要性。
在利用上述公式计算得到节点
i
i
i所有邻居节点的特征对节点
i
i
i的重要性之后,为了便于比较这些节点的重要性,我们可以使用softmax函数对所有重要性进行规范化:
α
i
j
=
s
o
f
t
m
a
x
j
(
e
i
j
)
=
e
x
p
(
e
i
j
)
∑
k
∈
N
i
e
x
p
(
e
i
k
)
\alpha_{ij}=softmax_j(e_{ij})=\frac{exp(e_{ij})}{\sum_{k\in N_i}exp(e_{ik})}
αij=softmaxj(eij)=∑k∈Niexp(eik)exp(eij)
在GAT中,注意力机制
a
a
a用于计算两个节点特征向量的相关度,是一个单层前馈神经网络,其权重为一个向量
a
⃗
∈
R
2
F
′
\vec{a}\in R^{2F^{'}}
a∈R2F′,特征向量经过单层神经网络后再经过一个LeakyRELU激活函数,就能得到最终的相关度,即:
α
i
j
=
e
x
p
(
e
i
j
)
∑
k
∈
N
i
e
x
p
(
e
i
k
)
\alpha_{ij}=\frac{exp(e_{ij})}{\sum_{k\in N_i}exp(e_{ik})}
αij=∑k∈Niexp(eik)exp(eij)
中的注意力系数
e
i
j
e_{ij}
eij的计算公式为:
e
i
j
=
L
e
a
k
y
R
E
L
U
(
a
⃗
T
[
W
h
⃗
i
∣
∣
W
h
⃗
j
]
)
e_{ij}=LeakyRELU(\vec{a}^T[W\vec{h}_i||W\vec{h}_j])
eij=LeakyRELU(aT[Whi∣∣Whj])
其中
∣
∣
||
∣∣表示连接操作。
也就是说,为了计算两个节点特征向量间的注意力系数,首先将其经过一个线性变换 W W W,将其特征从输入时的 F F F变成 F ′ F^{'} F′,然后再将两个向量连接在一起变成一个维度为 2 F 2F 2F的向量,接着经过一个前馈神经网络 a a a和一个LeakyRELU激活函数,最终得到一个数 e i j e_{ij} eij,这个数用于衡量节点 j j j特征对节点 i i i的重要性。
最后,使用softmax函数对所有注意力系数
e
i
j
e_{ij}
eij进行归一化处理,得到归一化注意力系数
α
i
j
\alpha_{ij}
αij,然后使用这些
α
i
j
\alpha_{ij}
αij对节点
i
i
i的所有邻居节点
j
j
j的特征进行线性加权,以得到更新后节点
i
i
i的特征
h
⃗
i
′
\vec{h}_i^{'}
hi′:
h
⃗
i
′
=
σ
(
∑
j
∈
N
i
α
i
j
W
h
⃗
j
)
\vec{h}_i^{'}=\sigma(\sum_{j\in N_i}\alpha_{ij}W\vec{h}_j)
hi′=σ(j∈Ni∑αijWhj)
上述整个过程可以用下图概括:
1.2 多头注意力
为了使注意力学习过程更加稳定,一般会考虑使用多头注意力机制。具体来讲,
K
K
K个独立的注意力机制来对节点特征进行更新,然后将结果拼接到一起:
需要注意的是,经过拼接后,节点更新后的特征的维度不再是之前的
F
′
F^{'}
F′,而是
K
F
′
KF^{'}
KF′。
如果我们在最后一层图注意力层执行多头注意力机制,那么输出将没有意义,因此,我们一般是将它们求平均:
2. GAT与现有工作的比较
GAT与现有GNN相比,主要解决了以下几个问题:
- 计算高效:自注意力层的操作可以在所有边上并行化,不需要特征分解或者类似的代价高昂的矩阵操作。
- 与GCN不同,GAT可以对不同邻居赋予不同的重要性,这大大提升了模型性能。
- 注意力机制以共享的方式应用于图中的所有边,因此它不依赖于对全局图结构或其所有节点(特性)的前期访问。因此,使用GAT时,图不需要无向,也可以用作归纳学习。
3. 实验
数据集:
实验分为Transductive learning和Inductive learning。
Transductive learning只能够在一张固定的图上来学习节点的嵌入表示,并不能直接泛化到未知节点,也不能够跨图进行节点表示学习。代表方法有GCN、MLP、DeepWalk等,实验结果如下所示:
Inductive learning,也就是归纳学习方法,这种方法可以直接计算出新节点的嵌入表示,而不需要经过重新训练,代表方法有GraphSAGE,实验结果如下表所示: