图注意力网络(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∈RN×F{\bf{X}} \in {\mathbb{R}^{N \times F}}XRN×F,其中NNN 表示样本的数量,FFF 表示单个样本对应的特征纬度。 xi{\bf{x}}_ixi表示为单个样本的特征,xi∈RF{{\bf{x}}_i} \in {\mathbb{R}^F}xiRF

att(⋅){\rm{att}}( \cdot )att()表示注意力系数的计算, 一般注意力机制中att(⋅){\rm{att}}( \cdot )att()表示为RH×RH→R{\mathbb{R}^H} \times {\mathbb{R}^H} \to \mathbb{R}RH×RHR。在图注意力网络中,注意力机制系数通过前向传播的神经网络计算得到。
cij=cxiWT⊕xjW {c_{ij}}{\rm{ = }}\begin{matrix}{{c}} {{{\bf{x}}_i}{{\bf{W}}^{\rm{T}}}} \end{matrix} \oplus {{\bf{x}}_j}{\bf{W}} cij=cxiWTxjW
cijc_{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是将cWxiT\begin{matrix}{{c}} {{\bf{W}}{{\bf{x}}_i}^{\rm{T}}} \end{matrix}cWxiT转置得到的结果中第iii个值与Wxj{\bf{W}}{{\bf{x}}_j}Wxj中第jjj个值进行相加。表示cij{c_{ij}}cij节点iii与节点jjj 的注意力系数,j∈Nij \in {{\mathcal N}_i}jNiNi{{\mathcal N}_i}Nijjj的领域节点。
在GAT中,使用LeakyRelu函数,并进行归一化,如下所示:
δij=exp⁡(LeakyReLu(cik))∑k∈Niexp⁡(LeakyReLu(cik)) {\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=1Mσ(∑j∈NiδijmWmxj) {{\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=σ(1M∑m=1M∑j∈NiδijmWmxj) {{\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

注意

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

图注意力网络(Graph Attention Network,GAT)是一种用于处理图结构数据的神经网络模型,其核心思想是引入注意力机制,以更有效地捕捉图中节点之间的关系和特征信息。 ### 原理 GAT 的基本原理是基于图神经网络(GNN)的扩展,但与传统图卷积网络(GCN)不同的是,GAT 不依赖于固定的邻接权重,而是通过可学习的注意力系数来动态地调整每个邻居节点对中心节点的影响。具体而言,GAT 使用多头注意力机制来计算节点之间的相关性,并通过可训练参数来优化注意力权重。 在 GAT 中,节点之间的注意力系数是通过以下公式计算的: $$ e_{ij} = \text{LeakyReLU}(a^T [W h_i \| W h_j]) $$ 其中,$ h_i $ 和 $ h_j $ 分别是节点 $ i $ 和节点 $ j $ 的特征向量,$ W $ 是可学习的线性变换矩阵,$ a $ 是注意力机制中的可学习参数向量,$ \| $ 表示拼接操作,$ e_{ij} $ 是节点 $ j $ 对节点 $ i $ 的未归一化的注意力系数。 随后,使用 softmax 函数对这些注意力系数进行归一化处理: $$ \alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k \in \mathcal{N}(i)} \exp(e_{ik})} $$ 最终,节点 $ i $ 的输出特征向量为: $$ h'_i = \sigma\left(\sum_{j \in \mathcal{N}(i)} \alpha_{ij} W h_j\right) $$ 其中,$ \sigma $ 是激活函数,$ \mathcal{N}(i) $ 表示节点 $ i $ 的邻居集合 [^3]。 为了增强模型的表达能力,GAT 通常采用多头注意力机制,即并行地使用多个注意力头,并将它们的输出进行拼接或平均,从而获得更丰富的节点表示 [^2]。 ### 实现方法 GAT 的实现通常基于深度学习框架,如 PyTorch 或 TensorFlow。以下是一个简化的 GAT 层的实现示例: ```python import torch import torch.nn as nn import torch.nn.functional as F class GATLayer(nn.Module): def __init__(self, in_features, out_features, dropout, alpha): super(GATLayer, self).__init__() self.dropout = dropout self.in_features = in_features self.out_features = out_features self.alpha = alpha self.W = nn.Parameter(torch.zeros(size=(in_features, out_features))) nn.init.xavier_uniform_(self.W.data, gain=1.414) self.a = nn.Parameter(torch.zeros(size=(2*out_features, 1))) nn.init.xavier_uniform_(self.a.data, gain=1.414) self.leakyrelu = nn.LeakyReLU(self.alpha) def forward(self, h, adj): Wh = torch.mm(h, self.W) # h: N x in_features, Wh: N x out_features a_input = self._prepare_attentional_mechanism_input(Wh) e = self.leakyrelu(torch.matmul(a_input, self.a).squeeze(2)) zero_vec = -9e15 * torch.ones_like(e) attention = torch.where(adj > 0, e, zero_vec) attention = F.softmax(attention, dim=1) attention = F.dropout(attention, self.dropout, training=self.training) h_prime = torch.matmul(attention, Wh) return h_prime def _prepare_attentional_mechanism_input(self, Wh): N = Wh.size()[0] Wh_repeated_in_chunks = Wh.repeat_interleave(N, dim=0) Wh_repeated_alternating = Wh.repeat(N, 1) all_combinations = torch.cat([Wh_repeated_in_chunks, Wh_repeated_alternating], dim=1) return all_combinations.view(N, N, 2 * self.out_features) ``` 上述代码实现了一个基本的 GAT 层,包括注意力系数的计算、归一化和特征聚合过程 [^4]。 ### 应用场景 GAT 在多个图结构任务中表现出色,主要应用于以下领域: 1. **节点分类**:GAT 可以利用图结构和节点特征对每个节点进行分类,例如社交网络中用户标签预测。 2. **链接预测**:在知识图谱或社交网络中,GAT 能够预测节点之间可能存在的边或关系。 3. **图分类**:GAT 可用于对整个图进行分类,例如在化学分子结构分析中判断分子是否具有某种特性 [^1]。 4. **推荐系统**:通过建模用户与物品之间的图结构,GAT 能够提升推荐系统的准确性与个性化程度。 5. **自然语言处理**:在语义角色标注、文本分类等任务中,GAT 被用于建模词与词之间的依赖关系。 综上所述,GAT 通过引入注意力机制,提升了图神经网络在处理不规则图结构数据时的灵活性和性能,适用于多种图相关的机器学习任务 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值