GAT基本原理与tensorflow2.0实现

Attention的基本形式

图注意力模型(Graph Attention Network GAN)将attention引入图神经网络。在GAN中有两种思路:

(1)Global graph attention

即在更新图中某一个节点的Embedding时,图上的每一个顶点 i i i 都参与到attention运算。

优点:完全不依赖于图的结构,对于inductive任务无压力

缺点:忽略了图结构的这个特征,影响最终的效果,计算代价大。

(2)Mask graph attention

注意力机制的运算只在邻居顶点上进行,这是论文中采用的方法。

GAT基本原理

回顾nlp中的attention机制:深入理解 Bert核心:Self-Attention与transformer ,基本思路相同,都是先计算注意力系数,然后进行加权求和。然后映入多头机制,增强学习能力。

1、计算attention系数

首先,计算顶点 i i i与邻居节点 ( j ∈ N i ) (j \in \mathcal N_i) (jNi) 之间的相似系数:
e i j = a ( [ W h ⃗ i ∣ ∣ W h ⃗ j ] )    j ∈ N i e_{i j}=a\left( \left[\mathbf{W} \vec{h}_{i}|| \mathbf{W} \vec{h}_{j} \right]\right) \;j \in \mathcal N_i eij=a([Wh iWh j])jNi
其中, W W W是共享参数,相当于对 h j h_j hj特征进行了增强, [ . ∣ ∣ . ] [.||.] [..]表示对变换后的特征进行concatenate; a ( ⋅ ) a(\cdot) a()把拼接后的特征映射到一个实数上。

通过这个方式,选取合适和 W 和 a ( ) W和a() Wa(),可以有效的捕捉到顶点 i , j i,j i,j之间的相关性。

在进行加权求和之前还要进行归一化操作:
α i j = softmax ⁡ j ( e i j ) = exp ⁡ ( e i j ) ∑ k ∈ N i exp ⁡ ( e i k ) = exp ⁡ ( LeakyReLU ⁡ ( a → T [ W h ⃗ i ∥ W h ⃗ j ] ) ) ∑ k ∈ N i exp ⁡ ( LeakyReLU ⁡ ( a → T [ W h ⃗ i ∥ W h ⃗ k ] ) ) \begin{aligned} \alpha_{i j}&=\operatorname{softmax}_{j}\left(e_{i j}\right)\\ &=\frac{\exp \left(e_{i j}\right)}{\sum_{k \in N_{i}} \exp \left(e_{i k}\right)}\\ &=\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 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)} \end{aligned} αij=softmaxj(eij)=kNiexp(eik)exp(eij)=kNiexp(LeakyReLU(a T[Wh iWh k]))exp(LeakyReLU(a T[Wh iWh j]))
整个过程如下图所示:

在这里插入图片描述

2、加权求和

这个比较简单,直接根据得到的权重,对邻居特征进行加权求和,如下图:
h ⃗ i ′ = σ ( ∑ j ∈ N i α i j W h ⃗ j ) \vec{h}_{i}^{\prime}=\sigma\left(\sum_{j \in N_{i}} \alpha_{i j} \mathbf{W} \vec{h}_{j}\right) h i=σjNiαijWh j
这样,GAT输出的对于每个顶点 i i i 的新特征就融合了邻域信息。

3、引入多头机制的GAT

通过初始化 k k k 个不同的权重 W W W,从不同的角度对原有的embedding进行增强,提取到不同的注意力参数,在进行加权求和。对于不同的注意力系数,又有两种方法对邻居节点进行聚合。

(1)直接横向拼接,这样新的embeddin向量的维度是原来的 k k k倍:
h ⃗ i ′ = ∥ k = 1 K σ ( ∑ j ∈ N i α i j k W k h ⃗ j ) \vec{h}_{i}^{\prime}=\|_{k=1}^{K} \sigma\left(\sum_{j \in N_{i}} \alpha_{i j}^{k} \mathbf{W}^{k} \vec{h}_{j}\right) h i=k=1KσjNiαijkWkh j
(2)k个注意力机制的结果取均值:
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 N_{i}} \alpha_{i j}^{k} \mathbf{W}^{k} \vec{h}_{j}\right) h i=σK1k=1KjNiαijkWkh j
具体计算过程如下:

在这里插入图片描述

GAT的原理

1、引入注意力机制,在聚合时,为邻居节点分配不同的权重,得到更具有代表性的Embedding。

2、可以实现inductive任务,即处理动态图问题,不需要事先得到整个图结构或所有顶点的特征。

tensorflow2.0 实现GAT

完整实现代码

参考

向往的GAT(图注意力模型)

深入理解图注意力机制

GNN-report

Graph Attention Network (GAT) 的Tensorflow版代码解析

GAT

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用TensorFlow 2.0实现GAT(Graph Attention Network)的代码: ``` python import tensorflow as tf from tensorflow.keras import layers class GAT(layers.Layer): def __init__(self, units, num_heads, activation='relu'): super(GAT, self).__init__() self.units = units self.num_heads = num_heads self.activation = activation self.W = [] self.attention = [] for i in range(self.num_heads): self.W.append(layers.Dense(units)) self.attention.append(layers.Dense(1)) self.dropout = layers.Dropout(0.5) self.add = layers.Add() def call(self, inputs): # inputs shape: (batch_size, num_nodes, input_dim) h = inputs outputs = [] for i in range(self.num_heads): Wh = self.W[i](h) a = self.attention[i](Wh) e = tf.nn.leaky_relu(a) alpha = tf.nn.softmax(e, axis=1) alpha = self.dropout(alpha) h_prime = tf.matmul(alpha, Wh, transpose_a=True) outputs.append(h_prime) if self.num_heads > 1: h_prime = self.add(outputs) else: h_prime = outputs[0] if self.activation is not None: h_prime = tf.nn.relu(h_prime) return h_prime ``` 该代码定义了一个GAT层,包含`units`个神经元和`num_heads`个头。在每个头中,会通过全连接层`W`和注意力层`attention`得到一个注意力系数`alpha`,然后将`alpha`和输入`h`做矩阵乘法和加权求和,得到新的节点表示`h_prime`。最后,将所有头得到的`h_prime`加起来,得到最终的输出。在计算`alpha`时,使用了LeakyReLU激活函数和softmax归一化。为了防止过拟合,还使用了dropout。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值