背景
作为对比算法被应用在我们的算法中
Veličković P, Cucurull G, Casanova A, et al. Graph attention networks[J]. arXiv preprint arXiv:1710.10903, 2017.(应该是发表在了ICLR)
模型
图注意力网络 (Graph Attention Networks)被提出\upcite{18}。 X {\bf{X}} X 表示所有样本对应的特征, X ∈ R N × F {\bf{X}} \in {\mathbb{R}^{N \times F}} X∈RN×F,其中 N N N 表示样本的数量, F F F 表示单个样本对应的特征纬度。 x i {\bf{x}}_i xi表示为单个样本的特征, x i ∈ R F {{\bf{x}}_i} \in {\mathbb{R}^F} xi∈RF。
a
t
t
(
⋅
)
{\rm{att}}( \cdot )
att(⋅)表示注意力系数的计算, 一般注意力机制中
a
t
t
(
⋅
)
{\rm{att}}( \cdot )
att(⋅)表示为
R
H
×
R
H
→
R
{\mathbb{R}^H} \times {\mathbb{R}^H} \to \mathbb{R}
RH×RH→R。在图注意力网络中,注意力机制系数通过前向传播的神经网络计算得到。
c
i
j
=
c
x
i
W
T
⊕
x
j
W
{c_{ij}}{\rm{ = }}\begin{matrix}{{c}} {{{\bf{x}}_i}{{\bf{W}}^{\rm{T}}}} \end{matrix} \oplus {{\bf{x}}_j}{\bf{W}}
cij=cxiWT⊕xjW
c
i
j
c_{ij}
cij的计算方式如下所示,seq_fts是特征进行一次映射之后得到的结果:
f_1 = tf.layers.conv1d(seq_fts, 1, 1)
f_2 = tf.layers.conv1d(seq_fts, 1, 1)
logits = f_1 + tf.transpose(f_2, [0, 2, 1])
⊕
\oplus
⊕是将
c
W
x
i
T
\begin{matrix}{{c}} {{\bf{W}}{{\bf{x}}_i}^{\rm{T}}} \end{matrix}
cWxiT转置得到的结果中第
i
i
i个值与
W
x
j
{\bf{W}}{{\bf{x}}_j}
Wxj中第
j
j
j个值进行相加。表示
c
i
j
{c_{ij}}
cij节点
i
i
i与节点
j
j
j 的注意力系数,
j
∈
N
i
j \in {{\mathcal N}_i}
j∈Ni,
N
i
{{\mathcal N}_i}
Ni是
j
j
j的领域节点。
在GAT中,使用LeakyRelu函数,并进行归一化,如下所示:
δ
i
j
=
exp
(
L
e
a
k
y
R
e
L
u
(
c
i
k
)
)
∑
k
∈
N
i
exp
(
L
e
a
k
y
R
e
L
u
(
c
i
k
)
)
{\delta _{ij}} = \frac{{\exp ({\rm{LeakyReLu(}}{c_{ik}}{\rm{)}})}}{{\sum\nolimits_{k \in {{\mathcal N}_i}} {\exp ({\rm{LeakyReLu(}}{c_{ik}}{\rm{)}})} }}
δij=∑k∈Niexp(LeakyReLu(cik))exp(LeakyReLu(cik))
通过注意力计算后,得到的新的特征表示为:
KaTeX parse error: Undefined control sequence: \cal at position 62: …imits_{j \in {{\̲c̲a̲l̲ ̲N}_i}} {{\delta…
σ
\sigma
σ是一个非线性的激活函数。引入多头注意力机制如下
h
′
i
=
∣
∣
m
=
1
M
σ
(
∑
j
∈
N
i
δ
i
j
m
W
m
x
j
)
{{\bf{h'}}_i}{\rm{ = }}\mathop {{\rm{||}}}\limits_{m = 1}^M \sigma {\rm{(}}\sum\limits_{j \in {{\mathcal N}_i}} {\delta _{_{ij}}^m{{\bf{W}}^m}{{\bf{x}}_j}} {\rm{)}}
h′i=m=1∣∣Mσ(j∈Ni∑δijmWmxj)
h
′
i
{{\bf{h'}}_i}
h′i 表示多头注意力通过拼接得到的结果,
∣
∣
{\rm{||}}
∣∣表示拼接。最终,对多头注意力做平均,如下所示
h
′
′
i
=
σ
(
1
M
∑
m
=
1
M
∑
j
∈
N
i
δ
i
j
m
W
m
x
j
)
{{\bf{h''}}_i}{\rm{ = }}\sigma {\rm{(}}\frac{1}{M}\sum\limits_{m = 1}^M {\sum\limits_{j \in {{\mathcal N}_i}} {\delta _{_{ij}}^m{{\bf{W}}^m}{{\bf{x}}_j}} } {\rm{)}}
h′′i=σ(M1m=1∑Mj∈Ni∑δijmWmxj)
h
′
′
i
{{\bf{h''}}_i}
h′′i表示多头注意力机制平均得到的结果。
图注意力网络通过自注意力机制解决图网络中的卷积运算。注意力机制在计算上不需要进行矩阵运算操作,通过邻域节点的重要性进行节点特征表示。除此以外,注意力机制可以被用来研究模型的可解释性。
代码
邻接矩阵处理方式
size:[2708]
adj: [1,2708,2708]
def adj_to_bias(adj, sizes, nhood=1):
nb_graphs = adj.shape[0]
mt = np.empty(adj.shape) #mt is [1, 2708, 2708]
for g in range(nb_graphs): #nb_graphs is 1
mt[g] = np.eye(adj.shape[1]) #mt变为单位矩阵
for _ in range(nhood):
mt[g] = np.matmul(mt[g], (adj[g] + np.eye(adj.shape[1])))
#d=
for i in range(sizes[g]):
for j in range(sizes[g]):
if mt[g][i][j] > 0.0:
mt[g][i][j] = 1.0
return -1e9 * (1.0 - mt)
github链接
包含使用torch实现的gat代码
https://github.com/ChenaniahMe/codes/tree/main/GNN/comgat
注意
模型部分为本人整理内容,转载请注明出处。