对于图卷积网络,图卷积运算产生邻居节点特征的归一化和。

$$ h_i^{(l+1)}=\sigma\left(\sum_{j \in N (i)} \frac{1}{c_{i j}} W^{(l)} h_j^{(l)}\right) $$

其中 $N (i)$ 是其一跳邻居的集合(要在集合中包含 $v_i$,只需向每个节点添加一个自循环),$c_{i j}=\sqrt{| N (i)|} \sqrt{| N (j)|}$ 是基于图结构的归一化常数,$\sigma$ 是激活函数(图卷积网络使用 ReLU),$W^{(l)}$ 是节点级特征的共享权重矩阵转变。

图注意力网络引入了注意力机制来替代静态归一化卷积运算。下面是根据层 $l$ 的嵌入计算层 $l+1$ 的节点嵌入 $h_i^{(l+1)}$ 的方程。

注意力机制.png

$$ z_i^{(l)}=W^{(l)} h_i^{(l)}\qquad(1) $$

$$ e_{i j}^{(l)}=\operatorname{LeakyReLU}\left(\vec{a}^{(l)^T}\left(z_i^{(l)} \| z_j^{(l)}\right)\right)\qquad(2) $$

$$ \alpha_{i j}^{(l)}=\frac{\exp \left(e_{i j}^{(l)}\right)}{\sum_{k \in N (i)} \exp \left(e_{i k}^{(l)}\right)}\qquad(3) $$

$$ h_i^{(l+1)}=\sigma\left(\sum_{j \in N (i)} \alpha_{i j}^{(l)} z_j^{(l)}\right)\qquad(4) $$

方程(1)是下层嵌入$h_i^{(l)}$的线性变换,$W^{(l)}$是其可学习的权重矩阵。方程(2)计算两个邻居之间的成对非标准化注意力得分。

方程 1:

def edge_attention(self, edges):
    z2 = torch.cat([edges.src['z'], edges.dst['z']], dim=1)
    a = self.attn_fc(z2)
    return {'e' : F.leaky_relu(a)}

方程 2:

def edge_attention(self, edges):
    z2 = torch.cat([edges.src['z'], edges.dst['z']], dim=1)
    a = self.attn_fc(z2)
    return {'e' : F.leaky_relu(a)}

在这里,它首先连接两个节点的 $z$ 嵌入,其中 || 表示串联,然后取它和可学习权重向量 $\vec{a}^{(l)}$ 的点积,最后应用 $LeakyReLU$。这种形式的注意力通常称为附加注意力,与 Transformer 模型中的点积注意力形成对比。方程(3)应用 softmax 来标准化每个节点传入边上的注意力分数。方程(4)与图卷积网络类似。来自邻居的嵌入被聚合在一起,并按注意力分数进行缩放。

方程 3 和 4:

def reduce_func(self, nodes):
    alpha = F.softmax(nodes.mailbox['e'], dim=1)
    h = torch.sum(alpha * nodes.mailbox['z'], dim=1)
    return {'h' : h}

图注意力网络引入多头注意力来丰富模型容量并稳定学习过程。每个注意力头都有自己的参数,它们的输出可以通过两种方式合并:

$$ h_i^{(l+1)}=\|{k=1}^K \sigma\left(\sum{j \in N (i)} \alpha_{i j}^k W^k h_j^{(l)}\right) $$