如何使用图卷积网络对图进行深度学习(代码片段)

点PY 点PY     2023-02-01     597

关键词:

简介

由于高度复杂但信息丰富的图结构,图上的机器学习是一项艰巨的任务。这篇文章是关于如何使用图卷积网络 (GCN) 对图进行深度学习的系列文章中的第一篇,GCN 是一种强大的神经网络,旨在直接处理图并利用其结构信息。

在这篇文章中,我会给出一个1.产品我到GCNs和说明如何信息是通过使用编码示例的GCN的隐藏层传播。我们将看到 GCN 如何聚合来自前几层的信息,以及这种机制如何生成图中节点的有用特征表示。

什么是图卷积网络?

GCN 是一种非常强大的神经网络架构,用于图上的机器学习。事实上,它们是如此强大,以至于即使是随机启动的 2 层 GCN也可以产生网络中节点的有用特征表示。下图说明了由这种 GCN 生成的网络中每个节点的二维表示。请注意,即使没有任何训练,网络中节点的相对接近度也保留在二维表示中。


更正式地说,图卷积网络 (GCN)是一种对图进行操作的神经网络。给定一个图G = (V, E),一个 GCN 作为输入

  • 一个输入特征矩阵N × F⁰特征矩阵,X,其中N是节点的数量,F⁰是每个节点的输入特征的数量,并且

  • 图结构的N × N矩阵表示,例如G.[1]的邻接矩阵A

因此,GCN 中的隐藏层可以写为Hⁱ = f( H ⁱ⁻¹, A )),其中H ⁰ = X并且f是 传播 [1]。每层Hⁱ对应一个N × F ⁱ特征矩阵,其中每一行是一个节点的特征表示。在每一层,使用传播规则f聚合这些特征以形成下一层的特征。通过这种方式,每个连续层的特征变得越来越抽象。在这个框架中,GCN 的变体仅在传播规则f [1]的选择上有所不同。

一个简单的传播规则

最简单的传播规则之一是 [1]:

其中Wⁱ是第i层的权重矩阵,σ是非线性激活函数,例如ReLU 函数。权重矩阵的维度为F ⁱ × Fⁱ ⁺ ¹;换句话说,权重矩阵的第二维的大小决定了下一层的特征数量。如果您熟悉卷积神经网络,此操作类似于过滤操作,因为这些权重在图中的节点之间共享。

简化

让我们在最简单的级别上检查传播规则。让

  • i = 1 , st f是输入特征矩阵的函数,
  • σ是恒等函数,并且
  • 选择权重 st AH ⁰ W ⁰ = AXW ⁰ = AX。

换句话说,f( X , A ) = AX。这个传播规则可能有点太简单了,但我们稍后会添加缺失的部分。作为旁注,AX现在相当于多层感知器的输入层。

一个简单的图形示例

作为一个简单的例子,我们将使用下图:


下面是它的numpy邻接矩阵表示。

A = np.matrix([
    [0, 1, 0, 0],
    [0, 0, 1, 1], 
    [0, 1, 0, 0],
    [1, 0, 1, 0]],
    dtype=float
)

接下来,我们需要特征!我们根据每个节点的索引为每个节点生成 2 个整数特征。这使得稍后手动确认矩阵计算变得容易。

In [3]: X = np.matrix([
            [i, -i]
            for i in range(A.shape[0])
        ], dtype=float)
        X
Out[3]: matrix([
           [ 0.,  0.],
           [ 1., -1.],
           [ 2., -2.],
           [ 3., -3.]
        ])

应用传播规则

好吧!我们现在有一个图,它的邻接矩阵A和一组输入特征X。让我们看看当我们应用传播规则时会发生什么:

In [6]: A * X 
Out[6]: matrix([ 
            [ 1., -1.], 
            [ 5., -5.], 
            [ 1., -1.], 
            [ 2., -2. ]]

发生了什么? 每个节点(每一行)的表示现在是其邻居特征的总和!换句话说,图卷积层将每个节点表示为其邻域的聚合。我鼓励你自己检查计算。请注意,在这种情况下,如果存在从v到n的边,则节点n是节点v的邻居。

存在的问题

您可能已经发现了问题:

  • 节点的聚合表示不包括其自身的特征!该表示是邻居节点特征的聚合,因此只有具有自循环的节点才会在聚合中包含自己的特征。
  • 度数大的节点在其特征表示中将具有较大的值,而度数较小的节点将具有较小的值。这可能会导致梯度消失或爆炸 [1, 2],但对于通常用于训练此类网络并对每个输入特征的尺度(或值范围)敏感的随机梯度下降算法也存在问题。

在下文中,我将分别讨论这些问题中的每一个。

添加自循环

为了解决第一个问题,可以简单地为每个节点添加一个自循环 [1, 2]。实际上,这是通过在应用传播规则之前将单位矩阵添加I到邻接矩阵A来完成的。

In [4]: I = np.matrix(np.eye(A.shape[0]))
        I
Out[4]: matrix([
            [1., 0., 0., 0.],
            [0., 1., 0., 0.],
            [0., 0., 1., 0.],
            [0., 0., 0., 1.]
        ])
In [8]: A_hat = A + I
        A_hat * X
Out[8]: matrix([
            [ 1., -1.],
            [ 6., -6.],
            [ 3., -3.],
            [ 5., -5.]])

由于该节点现在是自己的邻居,所以在总结其邻居的特征时,包括该节点自己的特征!

规范化特征表示

通过将邻接矩阵A乘以逆度矩阵D[1],可以通过节点度对特征表示进行归一化。因此,我们简化的传播规则如下所示 [1]:

让我们看看发生了什么。我们首先计算度矩阵。

In [9]: D = np.array(np.sum(A,axis=0))[0] 
        D = np.matrix(np.diag(D)) 
        D 
Out[9]: matrix([ 
            [1. , 0., 0., 0.], 
            [0., 2., 0., 0.], 
            [0., 0., 2., 0.], 
            [0., 0., 0., 1 .] 
        ])

在应用规则之前,让我们看看变换后的邻接矩阵会发生什么。

A = np.matrix([ 
    [0, 1, 0, 0], 
    [0, 0, 1, 1], 
    [0, 1, 0, 0], 
    [1, 0, 1, 0]], 
    dtype=float

In [10]: D**-1 * A 
Out[10]: matrix([ 
             [ [0. , 1. , 0. , 0. ], 
             [0. , 0. , 0.5, 0.5], 
             [0. , 0.5, 0. , 0. ], 
             [0.5, 0. , 0.5, 0. ] 
])

观察到邻接矩阵每一行的权重(值)已经除以该行对应的节点的度数。我们将传播规则与变换后的邻接矩阵一起应用

In [11]: D**-1 * A * X 
Out[11]: matrix([ 
             [ [ 1. , -1. ], 
             [ 2.5, -2.5], 
             [ 0.5, -0.5], 
             [ 2. , - 2.] 
         ])

并得到与相邻节点特征的均值相对应的节点表示。这是因为(转换后的)邻接矩阵中的权重对应于相邻节点特征的加权总和中的权重。我再次鼓励您亲自验证这一观察结果。

把它放在一起

我们现在结合自循环和归一化技巧。此外,我们将重新引入我们之前丢弃的权重和激活函数,以简化讨论。

加回权重

首要任务是应用权重。注意这里D_hat是 的度矩阵A_hat = A + I,即A强制自环的度矩阵。

In [45]: W = np.matrix([
             [1, -1],
             [-1, 1]
         ])
         D_hat**-1 * A_hat * X * W
Out[45]: matrix([
            [ 1., -1.],
            [ 4., -4.],
            [ 2., -2.],
            [ 5., -5.]
        ])

如果我们想减少输出特征表示的维度,我们可以减少权重矩阵的大小W:

In [46]: W = np.matrix([
             [1],
             [-1]
         ])
         D_hat**-1 * A_hat * X * W
Out[46]: matrix([[1.],
        [4.],
        [2.],
        [5.]]
)

添加激活函数

我们选择保留特征表示的维度并应用ReLU激活函数。

In [51]: W = np.matrix([ 
             [1, -1], 
             [-1, 1] 
         ]) 
         relu(D_hat**-1 * A_hat * X * W) 
Out[51]: matrix([[ 1., 0.], 
        [4., 0.], 
        [2., 0.], 
        [5., 0.]])

瞧!一个带有邻接矩阵、输入特征、权重和激活函数的完整隐藏层!

回到现实

现在,我们终于可以在真实图上应用图卷积网络了。我将向您展示如何生成我们在文章早期看到的特征表示。

扎卡里的空手道俱乐部

Zachary 的空手道俱乐部是一个常用的社交网络,其中节点代表空手道俱乐部的成员,边缘代表他们之间的相互关系。在 Zachary 学习空手道俱乐部时,管理员和教练之间发生了冲突,导致俱乐部一分为二。下图显示了网络的图形表示,节点根据俱乐部的哪个部分进行标记。管理员和讲师分别标有“A”和“I”。

构建 GCN

现在让我们构建图卷积网络。我们实际上不会训练网络,而是简单地随机初始化它以产生我们在本文开头看到的特征表示。我们将使用networkx它具有易于获得的俱乐部图形表示,并计算A_hat和D_hat矩阵。

from networkx import karate_club_graph, to_numpy_matrix
zkc = karate_club_graph()
order = sorted(list(zkc.nodes()))
A = to_numpy_matrix(zkc, nodelist=order)
I = np.eye(zkc.number_of_nodes())
A_hat = A + I
D_hat = np.array(np.sum(A_hat, axis=0))[0]
D_hat = np.matrix(np.diag(D_hat))

接下来,我们将随机初始化权重。

W_1 = np.random.normal( 
    loc=0, scale=1, size=(zkc.number_of_nodes(), 4)) 
W_2 = np.random.normal( 
    loc=0, size=(W_1.shape[1], 2))

堆叠 GCN 层。我们在这里仅使用单位矩阵作为特征表示,即每个节点都表示为一个单热编码的分类变量。

def gcn_layer(A_hat, D_hat, X, W):
    return relu(D_hat**-1 * A_hat * X * W)
H_1 = gcn_layer(A_hat, D_hat, I, W_1)
H_2 = gcn_layer(A_hat, D_hat, H_1, W_2)
output = H_2

我们提取特征表示。

feature_representations = 
    node: np.array(output)[node] 
    for node in zkc.nodes()

瞧!将 Zachary 的空手道俱乐部中的社区很好地分开的特征表示。而且我们还没有开始训练呢!

Zachary 的空手道俱乐部中节点的特征表示

我应该注意到,对于这个例子,随机初始化的权重很可能在 x 轴或 y 轴上给出 0 值作为 ReLU 函数的结果,因此需要一些随机初始化来生成上图。

结论

在这篇文章中,我对图卷积网络进行了高级介绍,并说明了 GCN 中每一层节点的特征表示如何基于其邻域的聚合。我们看到了如何使用 numpy 构建这些网络以及它们有多么强大:即使是随机初始化的 GCN 也可以将 Zachary 的空手道俱乐部中的社区分开。

参考
https://towardsdatascience.com/how-to-do-deep-learning-on-graphs-with-graph-convolutional-networks-7d2250723780

深度学习与图神经网络核心技术实践应用高级研修班-day3图神经网络(gnn)(代码片段)

...2图神经网络的思想和工作原理1.3图神经网络的应用场景2.图卷积神经网络2.1图卷积神经网络的定义2.2图卷积神经网络的卷积方式2.3卷积神经网络与图卷积神经网络的区别2.4图卷积神经网络的卷积方式2.5图卷积神经网络的原理与理... 查看详情

基于图卷积网络的图深度学习

基于图卷积网络的图深度学习先简单回顾一下,深度学习到底干成功了哪些事情!深度学习近些年在语音识别,图片识别,自然语音处理等领域可谓是屡建奇功。ImageNet:是一个计算机视觉系统识别项目,是目前世界上图像识别... 查看详情

从图(graph)到图卷积(graphconvolution):漫谈图神经网络模型(代码片段)

...于图神经网络的系列文章,文章目录如下:从图(Graph)到图卷积(GraphConvolution):漫谈图神经网络模型(一)从图(Graph)到图卷积(GraphConvolution):漫谈图神经网络模型(二)从图(Graph)到图卷积(GraphConvolution):漫谈图神经网络模型(三)笔者最... 查看详情

深入浅出图神经网络|gnn原理解析☄学习笔记图信号处理与图卷积神经网络(代码片段)

...网络|GNN原理解析☄学习笔记(五)图信号处理与图卷积神经网络文章目录深入浅出图神经网络|GNN原理解析☄学习笔记(五)图信号处理与图卷积神经网络矩阵乘法的三种形式图信号与图的拉普拉斯矩阵图傅里叶... 查看详情

深度学习100例|第52天-图卷积神经网络(gcn):实现论文分类

查看详情

gcn-图卷积神经网络算法简单实现(含python代码)(代码片段)

...程讲解三、代码实现和结果分析1.导入包2.数据准备¶3. 图卷积层定义4.GC 查看详情

图卷积神经网络gcn的一些理解以及dgl代码实例的一些讲解(代码片段)

...f0c;因此,图神经网络的学习也是必不可少的。GCNGCN是图卷积神经网络, 查看详情

gcn图卷积网络入门详解

...们有节点特征(代表节点的数据)和图的结构(表示节点如何连接)。对于节点来说,我们可以很容易地得到每个节点的数据。但是当涉及到图的结构时,要从中提取有用的信息就不是一件容易的事情了。例如,如果2个节点彼... 查看详情

《python深度学习》第二章笔记(代码片段)

...要素)逐元素运算广播张量点积张量变形3.神经网络如何通过反向传播与梯度下降进行学习随机梯度下降链式求导:反向传播算法1.第一个神经网络示例我们来看一个具体的神经网络示例,使用Python的Ker 查看详情

图卷积网络gcn

GCNCNN中的卷积本质上就是共享参数的过滤器,可以较为有效地提取空间特征而很多其他的研究中还有很多非欧拉结构的数据1.CNN无法处理非欧拉结构的数据,传统的离散卷积在NonEuclideanStructure的数据上无法保持平移不变性... 查看详情

图卷积神经网络(gcn)综述与实现(pytorch版)(代码片段)

图卷积神经网络(GCN)综述与实现(PyTorch版)本文的实验环境为PyTorch=1.11.0+cu113,PyG=2.0.4,相关依赖库和数据集的下载请见链接。一、图卷积神经网络介绍1.1传统图像卷积卷积神经网络中的卷积(Convolution)指的是... 查看详情

《深度学习100例》数据和代码(代码片段)

...xff08;RNN)🚀生成对抗网络篇(GAN)🎎图卷积神经网络(GCN)🔥卷积神经网络篇(CNN)✨深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别|第1天数据:📂数据会在运... 查看详情

keras深度学习实战——使用长短时记忆网络构建情感分析模型(代码片段)

...构建多层LSTM进行情感分类相关链接0.前言我们已经学习了如何使用循环神经网络(Recurrentneuralnetworks,RNN)构建情感分析模型,为了将循环神经网络与长短时记忆网络(LongShortTermMemory,LSTM)的性能进行对 查看详情

译:localspectralgraphconvolutionforpointsetfeaturelearning-用于点集特征学习的局部谱图卷积

标题:LocalSpectralGraphConvolutionforPointSetFeatureLearning作者:ChuWang,BabakSamari,KaleemSiddiqi译者:ElliottZheng来源:ECCV2018Abstract点云的特征学习已经显示出巨大的希望,引入了有效且可推广的深度学习框架,例如pointnet++。然而,到目前为止... 查看详情

深度学习项目演练:如何使用python和opencv进行人脸识别(代码片段)

本文将和大家一起分享如何使用Python进行人脸识别-在实时实时视频中检测和识别出一个人。在这个深度学习项目中,我们将学习如何使用Python识别实时视频中的人脸。我们将使用pythondlib的面部识别网络构建这个项目。Dlib是... 查看详情

带你换个角度理解图卷积网络

摘要:本文带大家从另一个角度来理解和认识图卷积网络的概念。本文分享自华为云社区《技术综述十二:图网络的基本概念》,原文作者:一笑倾城。基础概念笔者认为,图的核心思想是学习一个函数映射f(... 查看详情

从图(graph)到图卷积(graphconvolution):漫谈图神经网络模型

...于图神经网络的系列文章,文章目录如下:从图(Graph)到图卷积(GraphConvolution):漫谈图神经网络模型(一)从图(Graph)到图卷积(GraphConvolution):漫谈图神经网络模型(二)从图(Graph)到图卷积(GraphConvolution):漫谈图神经网络模型(三)在上一... 查看详情

空域图卷积模型

...后,与相同数量的卷积核参数相乘求和。对于图结构数据如何定义卷积操作?  1)构建邻域;  2)对邻域的点与卷积核参数内积;GNN,构建邻域的大小为p,p个固定数量的卷积核参数。GNN使用随机游走的方法,为每个结点... 查看详情