图注意力网络(GAT)

背景

作为对比算法被应用在我们的算法中

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}} XRN×F,其中 N N N 表示样本的数量, F F F 表示单个样本对应的特征纬度。 x i {\bf{x}}_i xi表示为单个样本的特征, x i ∈ R F {{\bf{x}}_i} \in {\mathbb{R}^F} xiRF

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×RHR。在图注意力网络中,注意力机制系数通过前向传播的神经网络计算得到。
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=cxiWTxjW
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} jNi 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=kNiexp(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{)}} hi=m=1Mσ(jNiδijmWmxj)
h ′ i {{\bf{h'}}_i} hi 表示多头注意力通过拼接得到的结果, ∣ ∣ {\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{)}} hi=σ(M1m=1MjNiδijmWmxj)
h ′ ′ i {{\bf{h''}}_i} hi表示多头注意力机制平均得到的结果。
图注意力网络通过自注意力机制解决图网络中的卷积运算。注意力机制在计算上不需要进行矩阵运算操作,通过邻域节点的重要性进行节点特征表示。除此以外,注意力机制可以被用来研究模型的可解释性。

代码

邻接矩阵处理方式
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

注意

模型部分为本人整理内容,转载请注明出处。

你可能感兴趣的:(人工智能,人工智能,算法)