当前位置:   article > 正文

图神经网络_图神经网络包括聚合和更新操作,并可以叠加多个层数。

图神经网络包括聚合和更新操作,并可以叠加多个层数。

图神经网络

图神经网络(Graph Neural Network,GNN)是一类用于处理图结构数据的深度学习模型。图结构数据中的实体以节点的形式表示,实体之间的关系以边的形式表示。GNN的目标是从图结构数据中学习有用的表示,并利用这些表示进行各种任务,例如节点分类、图分类、链接预测等。

本文将详细介绍图神经网络的原理、数学公式、Python代码实现以及各部分的原理分析。内容将分为以下几个部分:

一、图神经网络的基本概念
二、图神经网络的主要变体及原理分析
三、图神经网络的数学公式推导
四、图神经网络的Python代码实现
五、图神经网络的应用场景

一、图神经网络的基本概念

图神经网络的核心思想是通过消息传递机制(message-passing mechanism)来聚合节点的邻居信息,并更新节点的特征表示。这个过程通常会进行多轮迭代,以便捕获图中更远距离的信息。最终,每个节点的特征表示将包含其邻居和更远节点的信息

图神经网络的基本组成部分包括:

  • 节点特征矩阵:用于表示图中每个节点的初始特征。
  • 邻接矩阵:用于表示图中节点之间的连接关系。
  • 图卷积层:用于聚合邻居节点的信息并更新节点特征。
  • 输出层:根据任务需求设计的输出层,用于输出预测结果。

二、图神经网络的主要变体及原理分析

图神经网络有多种变体,这里我们介绍三种常见的图神经网络模型及其原理分析。

2.1 图卷积网络(Graph Convolutional Network,GCN)

GCN是图神经网络的一种基础变体,它通过图卷积操作来聚合节点的邻居信息。GCN的图卷积操作可以表示为:
H ( l + 1 ) = ReLU ( D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) ) H^{(l+1)} = \text{ReLU}\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right) H(l+1)=ReLU(D~21A~D~21H(l)W(l))
其中, H ( l ) H^{(l)} H(l)表示第 l l l层的节点特征矩阵, W ( l ) W^{(l)} W(l)表示第 l l l层的权重矩阵, A ~ = A + I \tilde{A}=A+I A~=A+I是邻接矩阵加上自环的结果, D ~ \tilde{D} D~ A ~ \tilde{A} A~的度矩阵,ReLU

是激活函数。

GCN的图卷积操作实现了归一化的邻居信息聚合,其中 D ~ − 1 2 A ~ D ~ − 1 2 \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} D~21A~D~21是归一化邻接矩阵,用于平衡不同度数的节点对信息聚合的贡献。GCN通常包含多层图卷积层,每一层都会更新节点的特征表示。

2.2 图注意力网络(Graph Attention Network,GAT)

GAT引入了注意力机制来为每个节点的邻居分配不同的权重。这使得模型能够根据邻居节点的重要性动态调整信息聚合的方式。GAT的图注意力操作可以表示为:
α i j = exp ⁡ ( LeakyReLU ( a ⊤ [ W h i ∥ W h j ] ) ) ∑ k ∈ N ( i ) exp ⁡ ( LeakyReLU ( a ⊤ [ W h i ∥ W h k ] ) ) \alpha_{ij} = \frac{\exp\left(\text{LeakyReLU}\left(\mathbf{a}^\top [W h_i \Vert W h_j]\right)\right)}{\sum_{k \in \mathcal{N}(i)} \exp\left(\text{LeakyReLU}\left(\mathbf{a}^\top [W h_i \Vert W h_k]\right)\right)} αij=kN(i)exp(LeakyReLU(a[WhiWhk]))exp(LeakyReLU(a[WhiWhj]))
h i ′ = σ ( ∑ j ∈ N ( i ) α i j W h j ) h_i' = \sigma\left(\sum_{j \in \mathcal{N}(i)} \alpha_{ij} W h_j\right) hi=σ jN(i)αijWhj
其中, h i h_i hi h j h_j hj分别表示节点 i i i和节点 j j j的特征向量, a \mathbf{a} a是注意力权重向量, ∥ \Vert 表示向量拼接, α i j \alpha_{ij} αij是节点 i i i和节点 j j j之间的注意力权重, N ( i ) \mathcal{N}(i) N(i)表示节点 i i i的邻居节点集合, σ \sigma σ是激活函数。

GAT可以计算多个注意力头,从而捕获不同类型的邻居关系,并将多个注意力头的输出进行拼接或平均。

2.3 图同构网络(Graph Isomorphism Network,GIN)

GIN是一种强大的图神经网络模型,它能够捕获图的子结构信息。GIN使用多层感知器(MLP)来聚合节点的邻居信息,并通过迭代更新节点的特征表示。GIN的图卷积操作可以表示为:
h i ( l + 1 ) = MLP ( l ) ( ( 1 + ϵ ( l ) ) ⋅ h i ( l ) + ∑ j ∈ N ( i ) h j ( l ) ) h_i^{(l+1)} = \text{MLP}^{(l)}\left((1 + \epsilon^{(l)}) \cdot h_i^{(l)} + \sum_{j \in \mathcal{N}(i)} h_j^{(l)}\right) hi(l+1)=MLP(l) (1+ϵ(l))hi(l)+jN(i)hj(l)
其中, h i ( l ) h_i^{(l)} hi(l)表示第 l l l层节点 i i i的特征向量, ϵ ( l ) \epsilon^{(l)} ϵ(l)是可学习的参数, MLP ( l ) \text{MLP}^{(l)} MLP(l)是第 l l l层的多层感知器。

GIN通过引入 ϵ ( l ) \epsilon^{(l)} ϵ(l)参数来平衡自身节点特征与邻居节点特征的贡

献,从而更好地捕获图的局部结构信息。

三、图神经网络的数学公式推导

以图卷积网络(GCN)为例,我们推导图卷积操作的数学公式。

GCN的图卷积操作可以表示为:
H ( l + 1 ) = ReLU ( D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) ) H^{(l+1)} = \text{ReLU}\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right) H(l+1)=ReLU(D~21A~D~21H(l)W(l))

其中, A ~ = A + I \tilde{A}=A+I A~=A+I是邻接矩阵加上自环的结果, D ~ \tilde{D} D~ A ~ \tilde{A} A~的度矩阵, H ( l ) H^{(l)} H(l)表示第 l l l层的节点特征矩阵, W ( l ) W^{(l)} W(l)表示第 l l l层的权重矩阵。

我们首先计算归一化邻接矩阵 A ~ norm \tilde{A}_{\text{norm}} A~norm
A ~ norm = D ~ − 1 2 A ~ D ~ − 1 2 \tilde{A}_{\text{norm}} = \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} A~norm=D~21A~D~21

接着,我们进行图卷积操作,聚合邻居节点的信息并更新节点特征:
H ( l + 1 ) = ReLU ( A ~ norm H ( l ) W ( l ) ) H^{(l+1)} = \text{ReLU}\left(\tilde{A}_{\text{norm}} H^{(l)} W^{(l)}\right) H(l+1)=ReLU(A~normH(l)W(l))

这个过程可以迭代多轮,以便捕获图中更远距离的信息。

四、图神经网络的Python代码实现

下面是一个简单的GCN模型的Python代码实现,包含两层图卷积层和一个全连接输出层,用于节点分类任务。

import torch
import torch.nn as nn
import torch.nn.functional as F

class GraphConvolution(nn.Module):
    def __init__(self, in_features, out_features):
        super(GraphConvolution, self).__init__()
        self.weight = nn.Parameter(torch.FloatTensor(in_features, out_features))
        self.reset_parameters()

    def reset_parameters(self):
        nn.init.xavier_uniform_(self.weight)

    def forward(self, input, adj):
        # input: 节点特征矩阵
        # adj: 归一化邻接矩阵
        support = torch.mm(input, self.weight)  # 线性变换
        output = torch.mm(adj, support)  # 邻居信息聚合
        return output

class GCN(nn.Module):
    def __init__(self, nfeat, nhid, nclass):
        super(GCN, self).__init__()
        self.gc1 = GraphConvolution(nfeat, nhid)
        self.gc2 = GraphConvolution(nhid, nclass)

    def forward(self, x, adj):
        x = F.relu(self.gc1(x, adj))  # 第一层图卷积
        x = self.gc2(x, adj)  # 第二层图卷积
       

return F.log_softmax(x, dim=1)  # 输出层

# 定义模型参数
nfeat = X.shape[1]  # 节点特征维度
nhid = 16  # 隐藏层维度
nclass = num_classes  # 类别数量

# 实例化模型
model = GCN(nfeat=nfeat, nhid=nhid, nclass=nclass)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

# 训练模型
for epoch in range(100):
    optimizer.zero_grad()
    output = model(X, A_hat)  # X: 节点特征矩阵, A_hat: 归一化邻接矩阵
    loss = criterion(output, labels)  # labels: 节点的真实标签
    loss.backward()
    optimizer.step()
    if epoch % 10 == 0:
        print("Epoch [{}/100], Loss: {:.4f}".format(epoch+1, loss.item()))

# 评估模型
model.eval()
with torch.no_grad():
    output = model(X, A_hat)
    _, predicted = torch.max(output, 1)
    correct = (predicted == labels).sum().item()
    accuracy = correct / len(labels)
    print("Accuracy: {:.4f}".format(accuracy))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

在上述代码中,我们首先定义了图卷积层GraphConvolution,该层实现了图卷积操作。接着,我们定义了GCN模型,该模型包含两个图卷积层和一个全连接输出层。在训练过程中,我们使用交叉熵损失函数和Adam优化器进行模型训练。最后,我们评估模型的准确率。

需要注意的是,这段代码仅作为示例,实际使用时需要根据具体的图结构数据和任务进行调整。例如,需要根据实际的节点特征矩阵X、归一化邻接矩阵A_hat和节点标签labels进行训练和评估。

五、图神经网络的应用场景

图神经网络在各种实际应用中取得了成功,包括但不限于以下几个方面:

  • 节点分类:预测图中每个节点的类别标签。
  • 图分类:预测整个图的类别标签。
  • 链接预测:预测图中两个节点之间是否存在边。
  • 图生成:生成新的图结构。
  • 社交网络分析:分析社交网络中的用户行为和社群结构

Question:图卷积操作如何来

图卷积操作是图神经网络中的一种核心操作,它的目标是通过聚合邻居节点的信息来更新每个节点的特征表示。图卷积操作的灵感来源于传统的卷积神经网络(CNN)中的卷积操作,但由于图数据具有不规则的结构,因此无法直接应用传统的卷积操作。因此,图卷积操作是对传统卷积操作的一种泛化,以适应图结构数据。

图卷积网络(GCN)中的图卷积操作是一种典型的图卷积操作,它的公式如下:
H ( l + 1 ) = ReLU ( D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) ) H^{(l+1)} = \text{ReLU}\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right) H(l+1)=ReLU(D~21A~D~21H(l)W(l))
其中, H ( l ) H^{(l)} H(l)表示第 l l l层的节点特征矩阵, W ( l ) W^{(l)} W(l)表示第 l l l层的权重矩阵, A ~ = A + I \tilde{A}=A+I A~=A+I是邻接矩阵加上自环的结果, D ~ \tilde{D} D~ A ~ \tilde{A} A~的度矩阵。

下面解释图卷积操作的推导过程:

  1. 邻接矩阵加自环: A ~ = A + I \tilde{A}=A+I A~=A+I这一步的目的是在图中引入自环,使得每个节点在聚合邻居信息时也能保留自身的信息

  2. 计算归一化邻接矩阵: D ~ − 1 2 A ~ D ~ − 1 2 \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} D~21A~D~21。这一步的目的是对邻接矩阵进行归一化,以平衡不同度数的节点对信息聚合的贡献。其中, D ~ \tilde{D} D~ A ~ \tilde{A} A~的度矩阵, D ~ − 1 2 \tilde{D}^{-\frac{1}{2}} D~21表示 D ~ \tilde{D} D~矩阵的逐元素平方根的逆。

  3. 线性变换: H ( l ) W ( l ) H^{(l)} W^{(l)} H(l)W(l)。这一步的目的是对每个节点的特征进行线性变换,其中 W ( l ) W^{(l)} W(l)是可学习的权重矩阵

  4. 邻居信息聚合: D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)} D~21A~D~21H(l)W(l)。这一步的目的是通过归一化邻接矩阵对邻居节点的信息进行聚合。

  5. 激活函数: ReLU ( ⋅ ) \text{ReLU}(\cdot) ReLU()。这一步的目的是引入非线性激活函数,增强模型的表达能力。

综上所述,图卷积操作的核心思想是通过邻接矩阵实现信息在图中的传递,并通过线性变换和激活函数对节点特征进行更新。这个过程可以迭代多轮,以便捕获图中更远距离的信息。

需要注意的是,图卷积操作的公式并不是唯一的,不同的图神经网络模型可能会采用不同的图卷积操作。例如,图注意力网络(GAT)引入了注意力机制来为每个节点的邻居分配不同的权重,从而实现动态的信息聚合。

总的来说,图卷积操作是一种灵活且强大的操作,它能够适应各种复杂的图结构数据,并在各种图相关任务中取得优异的性能。

Question:图神经网络的基本组成部分的例子

下面我们以一个具体的例子来说明图神经网络的基本组成部分:

假设我们有一个社交网络图,其中包含4个用户(节点),他们之间存在一些好友关系(边)。我们希望通过图神经网络对每个用户进行性别分类(男或女)。

节点特征矩阵

节点特征矩阵用于表示图中每个节点的初始特征。在这个例子中,每个用户节点可以具有以下特征:

  • 年龄
  • 城市(用独热编码表示)

假设用户的特征如下:

用户1:年龄=25,城市=北京
用户2:年龄=30,城市=上海
用户3:年龄=22,城市=北京
用户4:年龄=28,城市=深圳
  • 1
  • 2
  • 3
  • 4

则节点特征矩阵可以表示为:

X = [[25, 1, 0, 0],
     [30, 0, 1, 0],
     [22, 1, 0, 0],
     [28, 0, 0, 1]]
  • 1
  • 2
  • 3
  • 4

邻接矩阵

邻接矩阵用于表示图中节点之间的连接关系。在这个例子中,假设用户之间的好友关系如下:

用户1和用户2是好友
用户2和用户3是好友
用户3和用户4是好友
  • 1
  • 2
  • 3

则邻接矩阵可以表示为:

A = [[0, 1, 0, 0],
     [1, 0, 1, 0],
     [0, 1, 0, 1],
     [0, 0, 1, 0]]
  • 1
  • 2
  • 3
  • 4

图卷积层

图卷积层用于聚合邻居节点的信息并更新节点特征。在这个例子中,我们可以使用图卷积网络(GCN)中的图卷积层。该层的操作可以表示为:

H^(l+1) = ReLU(A_hat * H^(l) * W^(l))
  • 1

其中,H(l)是第l层的节点特征矩阵,W(l)是第l层的权重矩阵,A_hat是归一化邻接矩阵(加上自环),ReLU是激活函数。

输出层

输出层根据任务需求设计,用于输出预测结果。在这个例子中,我们的任务是对每个用户进行性别分类(男或女),因此输出层可以设计为全连接层+Softmax激活函数,用于输出每个用户的性别概率。

假设图卷积层的输出为:

H = [[0.5, -0.2],
     [-0.3, 0.4],
     [0.1, -0.1],
     [-0.2, 0.3]]
  • 1
  • 2
  • 3
  • 4

其中,每一行表示一个用户的特征表示。

输出层的权重矩阵为:

W_out = [[0.8, -0.5],
         [0.6, 0.7]]
  • 1
  • 2

输出层的计算公式为:

output = Softmax(H * W_out)
  • 1

计算得到的输出结果为:

output = [[0.62, 0.38],
          [0.42, 0.58],
          [0.55, 0.45],
          [0.45, 0.55]]
  • 1
  • 2
  • 3
  • 4

其中,每一行表示一个用户的性别预测概率,第一列表示男性的概率,第二列表示女性的概率。

通过这个例子,我们可以看到图神经网络的基本组成部分以及它们在实际任务中的应用。需要注意的是,这个例子是一个简化的示例,实际应用中的图神经网络可能会更加复杂,并且可能包含多个图卷积层以及其他类型的层。

Question:Laplace矩阵(Laplacian matrix)在图神经网络(GNN)中的应用

Laplace矩阵(Laplacian matrix)在图神经网络(GNN)中的应用主要与图信号处理和谱图卷积有关。谱图卷积是一种基于图的谱表示(即图的Laplace矩阵的特征分解)的图卷积方法。

Laplace矩阵的定义如下:
L = D − A L = D - A L=DA
其中, L L L是Laplace矩阵, D D D是图的度矩阵(对角矩阵,对角线元素为每个节点的度数), A A A是图的邻接矩阵。

Laplace矩阵是一个实对称矩阵,因此可以对其进行特征分解:
L = U Λ U T L = U \Lambda U^T L=UΛUT
其中, U U U是Laplace矩阵的特征向量矩阵, Λ \Lambda Λ是对角矩阵,其对角线元素为Laplace矩阵的特征值。

谱图卷积的基本思想是在图的谱域(即Laplace矩阵的特征空间)中进行卷积操作。具体而言,谱图卷积可以表示为:
X ^ = U g ( Λ ) U T X \hat{X} = U g(\Lambda) U^T X X^=Ug(Λ)UTX
其中, X ^ \hat{X} X^是卷积后的节点特征矩阵, X X X是原始节点特征矩阵, g ( Λ ) g(\Lambda) g(Λ)是一个对角矩阵,其对角线元素由滤波器函数 g g g作用在Laplace矩阵的特征值上得到。

图卷积网络(GCN)可以看作是谱图卷积的一种简化和近似。GCN的图卷积操作可以表示为:
H ( l + 1 ) = ReLU ( D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) ) H^{(l+1)} = \text{ReLU}\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right) H(l+1)=ReLU(D~21A~D~21H(l)W(l))
其中, A ~ = A + I \tilde{A}=A+I A~=A+I是邻接矩阵加上自环的结果, D ~ \tilde{D} D~ A ~ \tilde{A} A~的度矩阵, H ( l ) H^{(l)} H(l)表示第 l l l层的节点特征矩阵, W ( l ) W^{(l)} W(l)表示第 l l l层的权重矩阵。

可以发现,GCN中的归一化邻接矩阵 D ~ − 1 2 A ~ D ~ − 1 2 \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} D~21A~D~21与Laplace矩阵的特征分解有关。实际上,GCN的图卷积操作可以看作是在图的谱域中使用一个简单的线性

滤波器对节点特征进行卷积。这种简化和近似使得GCN能够在空间域中直接进行计算,从而避免了昂贵的特征分解操作。

总的来说,Laplace矩阵在图神经网络中的应用与谱图卷积密切相关,它提供了一种基于图的谱表示进行图卷积的方法。而图卷积网络(GCN)则是谱图卷积的一种简化和近似,它在空间域中直接进行计算,降低了计算复杂度。

图注意力网络(Graph Attention Network,GAT)是一种图神经网络模型,它引入了注意力机制来动态计算节点与其邻居之间的权重,从而实现自适应的信息聚合。下面我们详细介绍GAT的原理、数学公式、计算过程以及代码实现。

Question:GCN(Graph Convolutional Network)的图卷积操作可以看作是在图的谱域中使用一个简单的线性滤波器对节点特征进行卷积?

GCN(Graph Convolutional Network)的图卷积操作可以看作是在图的谱域中使用一个简单的线性滤波器对节点特征进行卷积。这个观点的理解需要从谱图卷积的原理出发,并了解GCN的图卷积操作是如何近似于谱图卷积的。

首先,我们回顾一下谱图卷积的原理。谱图卷积是基于图的拉普拉斯矩阵(Laplacian matrix)的特征分解进行的。对于无向图,标准化的图拉普拉斯矩阵定义为:
L sym = I − D − 1 2 A D − 1 2 L_{\text{sym}} = I - D^{-\frac{1}{2}} A D^{-\frac{1}{2}} Lsym=ID21AD21
其中, L sym L_{\text{sym}} Lsym是标准化的图拉普拉斯矩阵, I I I是单位矩阵, D D D是图的度矩阵, A A A是图的邻接矩阵。

标准化的图拉普拉斯矩阵是实对称矩阵,因此可以进行特征分解:
L sym = U Λ U T L_{\text{sym}} = U \Lambda U^T Lsym=UΛUT
其中, U U U是特征向量矩阵, Λ \Lambda Λ是特征值矩阵。

谱图卷积的操作可以表示为:
X ′ = g ( Λ ) U T X X' = g(\Lambda) U^T X X=g(Λ)UTX
其中, X X X是输入的节点特征矩阵, X ′ X' X是卷积后的节点特征矩阵, g ( Λ ) g(\Lambda) g(Λ)滤波器函数

接下来,我们来看GCN的图卷积操作。GCN的图卷积操作可以表示为:
H ( l + 1 ) = ReLU ( D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) ) H^{(l+1)} = \text{ReLU}\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right) H(l+1)=ReLU(D~21A~D~21H(l)W(l))
其中, A ~ = A + I \tilde{A}=A+I A~=A+I是邻接矩阵加上自环的结果, D ~ \tilde{D} D~ A ~ \tilde{A} A~的度矩阵, H ( l ) H^{(l)} H(l)表示第 l l l层的节点特征矩阵, W ( l ) W^{(l)} W(l)表示第 l l l层的权重矩阵。

可以观察到,GCN的图卷积操作中的归一化邻接矩阵 D ~ − 1 2 A ~ D ~ − 1 2 \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} D~21A~D~21与标准化的图拉普拉斯矩阵 L sym L_{\text{sym}} Lsym具有相同的特征分解。因此,GCN的图卷积操作可以看作是在图的谱域中使用一个简单的线性滤波器对节点特征进行卷积

具体来说,GCN的滤波器函数可以看作是一个简单的线性函数:
g ( Λ ) = I g(\Lambda) = I g(Λ)=I
其中, I I I是单位矩阵。这意味着GCN的滤波器在谱域中是一个恒等变换,不会改变特征值的大小。

将这个简单的线性滤波器应用到谱图卷积的公式中,我们可以得到:
X ′ = g ( Λ ) U T X = U T X X' = g(\Lambda) U^T X = U^T X X=g(Λ)UTX=UTX

由于 D ~ − 1 2 A ~ D ~ − 1 2 \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} D~21A~D~21 L sym L_{\text{sym}} Lsym具有相同的特征分解,因此我们可以将上式改写为:
X ′ = D ~ − 1 2 A ~ D ~ − 1 2 X X' = \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} X X=D~21A~D~21X

这正是GCN的图卷积操作的一部分。当然,GCN的图卷积操作还包括权重矩阵 W ( l ) W^{(l)} W(l)的乘法和ReLU激活函数,这些操作是在空间域中进行的。

总的来说,GCN的图卷积操作可以看作是在图的谱域中使用一个简单的线性滤波器对节点特征进行卷积。这种简化和近似使得GCN能够在空间域中直接进行计算,从而避免了昂贵的特征分解操作。同时,GCN也能够捕获图中的局部结构信息,并在各种图相关任务中取得优异的性能。

GAT

一、GAT的原理

GAT的核心思想是为每个节点的邻居分配不同的注意力权重,以便根据邻居节点的重要性动态调整信息聚合的方式。这使得模型能够更好地捕获图中的复杂结构和关系。

GAT中的注意力权重是通过一个可学习的注意力机制计算得到的,该机制考虑了节点自身的特征以及邻居节点的特征。此外,GAT可以计算多个注意力头,从而捕获不同类型的邻居关系。

二、GAT的数学公式

GAT的图注意力操作可以表示为以下几个步骤:

  1. 线性变换:对每个节点的特征进行线性变换。
    h i ′ = W h i h_i' = W h_i hi=Whi
    其中, h i h_i hi是节点 i i i的输入特征向量, W W W是可学习的权重矩阵, h i ′ h_i' hi是线性变换后的特征向量。

  2. 注意力权重计算:计算节点 i i i和节点 j j j之间的注意力权重。
    e i j = LeakyReLU ( a ⊤ [ h i ′ ∥ h j ′ ] ) e_{ij} = \text{LeakyReLU}\left(\mathbf{a}^\top [h_i' \Vert h_j']\right) eij=LeakyReLU(a[hihj])
    其中, a \mathbf{a} a是注意力权重向量, ∥ \Vert 表示向量拼接, e i j e_{ij} eij是未归一化的注意力权重。

  3. 归一化注意力权重:对注意力权重进行归一化。
    α i j = exp ⁡ ( e i j ) ∑ k ∈ N ( i ) exp ⁡ ( e i k ) \alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k \in \mathcal{N}(i)} \exp(e_{ik})} αij=kN(i)exp(eik)exp(eij)
    其中, α i j \alpha_{ij} αij是节点 i i i和节点 j j j之间的归一化注意力权重, N ( i ) \mathcal{N}(i) N(i)表示节点 i i i的邻居节点集合。

  4. 信息聚合:根据归一化的注意力权重聚合邻居节点的信息。
    h i ′ ′ = σ ( ∑ j ∈ N ( i ) α i j h j ′ ) h_i'' = \sigma\left(\sum_{j \in \mathcal{N}(i)} \alpha_{ij} h_j'\right) hi′′=σ jN(i)αijhj
    其中, h i ′ ′ h_i'' hi′′是节点 i i i的输出特征向量, σ \sigma σ是激活函数。

  5. 多头注意力:计算多个注意力头并将它们拼接或平均。
    h i multi-head = Concat ( head 1 , head 2 , … , head K ) h_i^{\text{multi-head}} = \text{Concat}(\text{head}_1, \text{head}_2, \ldots, \text{head}_K) himulti-head=Concat(head1,head2,,headK)

    h i multi-head = 1 K ∑ k = 1 K head k h_i^{\text{multi-head}} = \frac{1}{K} \sum_{k=1}^{K} \text{head}_k himulti-head=K1k=1Kheadk

其中, head k \text{head}_k headk表示第 k k k个注意力头的输出, K K K是注意力头的数量, Concat \text{Concat} Concat表示向量拼接。

三、GAT的代码实现

下面是一个简单的GAT层的PyTorch代码实现:

import torch
import torch.nn as nn
import torch.nn.functional as F

class GraphAttentionLayer(nn.Module):
    def __init__(self, in_features, out_features, dropout, alpha, concat=True):
        super(GraphAttentionLayer, self).__init__()
        self.in_features = in_features
        self.out_features = out_features
        self.dropout = dropout
        self.alpha = alpha
        self.concat = concat

        self.W = nn.Parameter(torch.zeros(size=(in_features, out_features)))
        self.a = nn.Parameter(torch.zeros(size=(2*out_features, 1)))
        self.leakyrelu = nn.LeakyReLU(self.alpha)

        self.reset_parameters()

    def reset_parameters(self):
        nn.init.xavier_uniform_(self.W.data, gain=1.414)
        nn.init.xavier_uniform_(self.a.data, gain=1.414)

    def forward(self, input, adj):
        h = torch.mm(input, self.W)
        N = h.size()[0]

        a_input = torch.cat([h.repeat(1, N).view(N * N, -1), h.repeat(N, 1)], dim=1).view(N, -1, 2 * self.out_features)
        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, h)

        if self.concat:
            return F.elu(h_prime)
        else:
            return h_prime

    def __repr__(self):
        return self.__class__.__name__ + ' (' + str(self.in_features) + ' -> ' + str(self.out_features) + ')'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

在上述代码中,我们首先定义了图注意力层GraphAttentionLayer,该层实现了图注意力操作。我们使用线性变换、注意力权重计算、归一化注意力权重和信息聚合等步骤来实现图注意力机制。此外,我们还提供了一个选项concat来决定是否对多头注意力进行拼接。

四、GAT的应用场景

GAT由于其自适应的信息聚合方式,在各种图相关任务中都表现出优异的性能,包括但不限于以下几个方面:

  • 节点分类:预测图中每个节点的类别标签。
  • 图分类:预测整个图的类别标签。
  • 链接预测:预测图中两个节点之间是否存在边。
  • 知识图谱补全:预测知识图谱中实体之间的关系。

总的来说,图注意力网络(GAT)是一种强大且灵活的图神经网络模型,它通过引入注意力机制来实现自适应的信息聚合,从而能够更好地捕获图中的复杂结构和关系。GAT在各种图相关任务中都取得了优异的性能,并成为了图神经网络研究中的重要基础模型之一。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/916262
推荐阅读
相关标签
  

闽ICP备14008679号