图的概念
图论介绍
图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
图论的基本研究对象——图
图(Graph)是表示物件与物件之间的关系的数学对象,是图论的基本研究对象。一个不带权图中若两点不相邻,邻接矩阵相应位置为0,对带权图(网),相应位置为。
对于一个拥有n个顶点的无向连通图,它的边数一定多于n-1条。若从中选择n-1条边,使得无向图仍然连通,则由n个顶点及这n-1条边(弧)组成的图被称为原无向图的生成树。
图的定义
二元组的定义
图G是一个有序二元组(VE),其中V称为顶集(Vertices Set),E称为边集(Edges set),E与V不相交。它们亦可写成V(G)和E(G)。E的元素都是二元组,用(x,y)表示,其中x,y∈V。
三元组的定义
图G是指一个三元组(V,E,I),其中V称为顶集,E称为边集,E与V不相交;I称为关联函数,将E中的每一个元素映射到V×V。如果e被映射到(u,v),那么称边e连接顶点u,v,而u, v则称作e的端点,u,v此时关于e相邻。同时,若两条边ij有一个公共顶点u,则称i,j关于u相邻。
图的分类
有/无向图
如果给图的每条边规定一个方向,那么得到的图称为有向图。在有向图中,与一个节点相关联的边有出边和入边之分。相反
边没有方向的图为无向图。
单图
一个图如果任意两顶点之间只有一条边(在有向图中为两顶点之间每个方向只有一条边);边集中不含环,则称为单图。
图数据
除了一些社交网络等直观的可以表达为图的数据,很多别的数据也可以表示为图,如图片和文本。尽管有悖直觉,但通过将图像和文本视为图,可以了解更多关于它们的对称性和结构的信息,并建立一种直觉,有助于理解其他不太像网格的图数据。
图片作为图数据
一般我们认为图片是具有多个通道的矩形栅格,以数组(array)的形式来表示。另一种方法是将图片看做有着规则结构的图,其中每个像素代表一个节点,不同节点之间通过边与相邻像素连接。每个非边界上的像素点都有8个邻居,因此存储在每个节点的信息是一个三维向量,分别对应RGB三个通道值。 一种可视化图连接性的方式是邻接矩阵(adjacency matrix)。以一张5*5的单通道图片为例,总共有5×5=25个像素,可以构造一个25×25的邻接矩阵并填充两个节点共享一条边的单元。
文本作为图数据
通过给每个字符/单词/token赋予一个数值索引,从而将文本用一串索引表示。这一方法创建了一个简单的有向图,其中每个字符/索引是一个节点(node)并通过一条边连接到后一个节点。
【实际中,并不会真的采用上述两种方式编码图片和文本。因为图片和文本都具有非常规律的结构,这样表示会带来大量的冗余:图片在其邻接矩阵中有一个带状结构,因为所有节点(像素)都连接在一个网格中。文本的邻接矩阵只是一条对角线,因为每个单词只与前一个单词连接,并连接到一个单词。】
异构结构作为图数据
现实中很多数据是异构结构(heterogeneously structured)的。此时,每个节点的邻居数量可能都是不同的,这样的数据很难以图以外的方式表征。现实中这样的例子有:
- 分子作为图 分子是由原子和电子构成的,所有的粒子是相互作用的,但当一对原子以稳定的距离存在时,我们说它们共享一个共价键。不同的源自对和共价键有不同的距离(如单键和双键)。这种3D结构很容易抽象为一个图,其中节点是原子而边则是共价键。
- 社交网络作为图 社交网络是研究人们、机构和组织的集体行为模式的工具。我们可以构建由个体作为节点,相互之间的关系作为边的图。
- 论文引用网络作为图 可以将论文看做节点,每个有向边代表文章之间的引用。此外还可以向每个节点添加进入节点的每篇文章的信息,比如摘要的embedding。
- 其它 在计算机视觉中,我们有时想要标记视觉场景中的对象。然后,我们可以通过将这些对象视为节点并将它们的关系视为边来构建图形。机器学习模型,编程代码以及数学方程也可以被解释为图,图中变量作为节点,边代表以这些变量作为输入和输出的运算。
【深度学习中模型图是以操作作为节点,变量沿边在节点之间流动。】
图数据相关的任务
图上的预测任务一般分为三种类型:图层面、节点层面和边层面。 在图层面任务,我们为整张图预测一些性质;对于节点层面的任务,我们为图中的每个节点预测一些性质;对于边层面任务,我们预测边的形式(比如是否存在)。
图层面任务
在图层面任务,我们预测整张图的性质。例如,对于一个分子结构图,我们可能想去预测这个分子的气味,或者它是否会与与疾病有关的受体结合。
节点层面任务
节点级任务与预测图中每个节点的角色有关。节点级预测问题的一个典型例子是 Zach 的空手道俱乐部,预测问题是在争执之后对给定成员是否忠于 Mr. Hi 或 John H 进行分类。在这种情况下,节点与教练或管理者之间的距离与此标签高度相关。 节点层面的预测问题类比于图片分割问题,在图片分割中我们要给图片中每个像素的角色打标签。文本问题中一个相似的任务是预测句子中每个单词的词性(例如名词、动词、副词等)。
边层面任务
边层面推理的一个例子是图片场景理解。除了识别图片中的物体,深度学习模型还可以被用于预测它们之间的关系。我们可以将这一任务看做一个边层面的分类任务:给定代表图片中物体的节点,我们希望预测哪些节点共享一条边或者这条边的值是多少。如果我们想发现实体之间的联系,我们可以将图看做全部相互连接的,然后基于预测的结果来对图进行修剪以获得一个稀疏的图。
图结构数据
图结构数据是由节点和边组成的数据。节点可以表示为个体、实体或概念,边可以表示为这些节点之间的关系。例如,社交网络、化学分子、知识图谱等都可以用图结构数据进行表示。
邻居聚合
邻居聚合是图神经网络中的基本操作之一,它通过将节点的邻居节点的信息聚合起来,以更新节点的表示。聚合方式可以是平均值、最大值、加权和等。
如何用神经网络解决图任务
首要问题是思考如何让图的表示与神经网络结构兼容。机器学习模型通常采用规整数组作为输入。图具有多达四种类型的信息可以用于预测:节点、边、全局上下文和连通性(connectivity)。前三种是相对直观的:比如,使用节点,我们可以通过为每个节点分配一个索引 i 并来构建一个节点特征矩阵N并将节点node_i 的特征存储到该矩阵中。虽然这些矩阵具有可变数量的例子,但它们不需任何特殊技术就能处理。 相比之下,表示图的连通性要更加复杂一些。最明显的方法是使用邻接矩阵,因为它更容易张量化。然而这一方法有一些缺点:当节点的数量特别多时,矩阵会变得很大;每个节点的连接数变化很大,通常会产生很稀疏的矩阵,浪费存储空间。 另一个问题是,有许多邻接矩阵可以编码相同的连通性(比如不同的分配node index的方式),并且不能保证这些不同的矩阵会在深度神经网络中产生相同的结果(也就是说,它们不是排列不变(permutation invariant)的)。 一个更内存友好的表达稀疏矩阵连的方法是邻接列表。邻接列表的第k项是一个元组(i,j),代表了节点n_i和n_ j之间的边e_k。因为我们知道边的数量要远小于邻接矩阵的规模(n^2_node),这样做避免了图中不连通部分的计算和存储。
GNN(基于循环结构)的理论基础——不动点理论
GNN的理论基础是不动点(the fixed point)理论,这里的不动点理论专指巴拿赫不动点定理(Banach's Fixed Point Theorem)。
巴拿赫不动点定理
定义
巴拿赫不动点定理,又称为压缩映射定理或压缩映射原理,是度量空间理论的一个重要工具。它保证了度量空间的一定自映射的不动点的存在性和唯一性,并提供了求出这些不动点的构造性方法。这个定理是以斯特凡·巴拿赫命名的,他在1922年提出了这个定理。
定理内容
设(X,d)为非空的完备度量空间。设T:X→X为X上的一个压缩映射,即,存在一个非负的实数q<1,使得对于所有X内的x和y,都有:d(T(x), T(y))≤q·d(x,y)
那么映射T在X内有且只有一个不动点x(这就是说,Tx=x)。更进一步,这个不动点可以用以下的方法来求出:从X内的任意一个元素x0开始,并定义一个迭代序列xn=Txn-1,对于n=1,2,3……。这个序列收敛,且极限为x。以下的不等式描述了收敛的速率:
等价地:
且
满足以上不等式的最小的q有时称为利普希茨常数。
注意对于所有不同的x和y都有d(Tx,Ty)< d(x,y)的要求,一般来说是不足以保证不动点的存在的,例如映射T:[1,∞)→[1,∞),T(x)=x 1/x,就没有不动点。但是,如果空间X是紧的,则这个较弱的假设也能保证不动点的存在。
当实际应用这个定理时,最艰难的部分通常是恰当地定义X,使得T实际上把元素从X映射到X,也就是说,Tx总是X的一个元素。
图神经网络的发展
图神经网络的概念首先由Gori等人(2005)提出,并由Scarselli等人(2009)进一步阐明。这些早期的研究以迭代的方式通过循环神经架构传播邻近信息来学习目标节点的表示,直到达到稳定的固定点。该过程所需计算量庞大,而近来也有许多研究致力于解决这个难题。
Bruna等人(2013)提出了关于图卷积网络的第一项重要研究,他们基于谱图论(spectral graph theory)开发了一种图卷积的变体。自此,基于谱的图卷积网络不断改进、拓展、进阶。由于谱方法通常同时处理整个图,并且难以并行或扩展到大图上,基于空间的图卷积网络开始快速发展.
图神经网络概念(定义)
GNN是对图的所有属性(节点、边、全局上下文)的可优化转换,它保留了图的对称性(排列不变性,permutation invariance)。GNN采用的“图进,图出”的架构意味着这些模型采用一张加载了信息到节点、边和全局上下文的图作为输入,然后在不改变输入图的连通性的条件下渐进地对这些embedding做变换。
图神经网络的框架
图神经网络的框架通常由以下几个部分组成:
(1)图卷积层(Graph Convolutional Layer)
图卷积层是图神经网络的基本构成单元,它通过将节点特征聚合到其邻居节点,并使用非线性变换更新节点的表示。具体地,给定一个节点i及其邻居节点集合N(i),图卷积层首先将节点i的特征表示为Vi,然后将其与邻居节点的特征进行聚合,得到更新后的节点i的特征表示V'i。通常,聚合操作使用权重聚合方式,如式(1)所示:
V’i=σ(WuVi b)(1)
其中,W和b是可学习的参数,u是聚合权重,它由节点i和邻居节点之间的边的信息及节点本身的特征决定。σ是激活函数,如ReLU等。
(2)图注意力层(Graph Attention Layer)
图注意力层是一种基于注意力机制的图神经网络,它通过动态地学习节点与邻居节点之间的权重,从而更好地捕捉节点之间的重要关系。具体地,给定一个节点i及其邻居节点集合N(i),图注意力层首先将节点i的特征表示为Vi,然后计算节点i与其邻居节点之间的权重,得到更新后的节点i的特征表示V'i。通常,计算权重使用注意力分数机制,如式(2)所示:
eij=Vi⊗Vj(2)
其中,eij表示节点i与节点j之间的注意力分数,⊗是特征张量的对应元素相乘。接着,使用Softmax函数对所有注意力分数进行归一化处理,得到节点i与其邻居节点之间的权重。最后,将权重加权求和邻居节点的特征得到更新后的节点i的特征表示V'i。
(3)池化层(Pooling Layer)
池化层用于将节点的特征进行池化处理,从而减少节点的特征维度。常用的池化方式有最大池化和平均池化等。池化层的目的是减少节点特征的维度和计算复杂度,同时保留重要信息。
(4)全连接层(Fully Connected Layer)
全连接层用于将经过池化层处理的节点特征进行分类或回归等任务。它通过将节点特征映射到目标空间中,得到每个节点的预测结果。全连接层通常使用线性变换和非线性变换结合的方式进行计算。
GNN原理
图神经网络(Graph Neural Network,简称GNN)是一种用于处理图结构数据的深度学习模型。它通过学习节点之间的关系和图的拓扑结构来进行节点分类、图分类和链接预测等任务。原理基于消息传递和节点更新的思想,每个节点将周围节点的信息进行聚合和传递,以更新自身的表征向量。具体来说,图神经网络通过定义节点聚合函数和更新函数来控制信息的传递和更新过程,使节点能够从邻居节点中获得信息并更新自身的表征。这个过程在整个图中迭代多次,直到模型达到收敛。
与传统的卷积神经网络(Convolutional Neural Network,简称CNN)和循环神经网络(Recurrent Neural Network,简称RNN)不同,图神经网络能够有效地处理不定长的图结构数据,并利用节点之间的关系来进行学习和推理。它能够捕捉到图的局部结构和全局拓扑特征,从而提取更丰富的特征表示,进而提升各种图分析任务的性能。
(1)聚合
GNN的输入一般是每个节点的起始特征向量和表示节点间关系的邻接矩阵。而所谓的聚合,其实就是将周边与节点Vi有关联的节点{V a, V b, . . . }加权到Vi上,当作一次特征更新。
(2)更新
根据聚合得到的数据,更新所有图节点的特征,同理,对图中的每个节点进行聚合操作,更新所有图节点的特征。
(3)循环
一次图节点聚合操作与 w加权,可以理解为一层,后面再重复进行聚合、加权,就是多层迭代了。一般GNN只要3~5层即可,所以训练GNN对算力要求很低。
设计图神经网络
可以从多个层面来自定义不同的GNN模型:
- GNN层数,也叫做深度
- 每个属性更新后的维度。更新函数是带有ReLU激活函数以及一个LayerNorm层用来标准化激活函数输出的一层MLP
- 用于Pooling的聚合函数:max,mean或sum
- 要更新的图属性或message passing的方式:节点,边以及全局表征。可以通过boolean开关来控制这些内容
GNN性能的下界随着层的增加有时反而降低,这可能是因为:具有较多层数的GNN将以更远的距离传播信息,并可能在许多连续迭代中使其节点表示被“稀释”。一般来说,图属性之间的消息传递越多,模型的性能会越好。
图神经网络的种类
- multi-edge graph(或称multigraph),其中一对节点可以共享多种类型的边。这一类型网络用于我们想基于节点类型建模它们之间交互的场景。例如对于社交网络,我们可以基于关系类型(熟人,朋友,家人)来指定边的类型。
- nested graph(或hierarchical graph),这种网络对于表示层级信息很有用。例如,我们可以考虑一个分子网络,其中一个节点代表一个分子,如果我们有一种(反应)方式将其中一个分子转化成另外一种时,两个节点之间共享一条边。此时,我们可以通过一个GNN学习分子层面的表征,另一个网络学习网络交互层面的表征,然后在训练过程中交替地学习两个GNN来在嵌套图上学习。
- hypergraph,这种图中一条边可以连接到多个节点而不仅仅只是两个。对于给定的一个图,我们可以通过识别节点社群并分配一条与社群内所有节点相连的hyper-edge(汇聚点叫做hyper-node)。超图的边hyper-edge是任意非空顶点集。一个k-超图的超边,它们恰好连接了k个顶点;因此,正常图是 2 超图(因为一条边连接 2 个顶点)。
图神经网络的应用
图神经网络不仅可以直接应用在社交网络上,还可以应用在推荐系统,计算机视觉,自然语言处理等诸多领域。
图神经网络典型的应用场景
Node-level输出用于点回归和分类任务。
Edge-level输出与边分类和链路预测任务相关。
Graph-level输出和图分类任务相关,比如图表示。
GNN的训练流程
从将图输入到GNN中到得到输出结果主要可以分为两步:
第一步是传播(propagation)过程,即节点表示随时间的更新过程;
第二步是输出(output)过程,即根据最终的节点表示得到目标输出(如每个节点的类别)的过程。
在这两步中,传播过程要更为重要,其设计也要受到一定的约束(要保证整个图上的状态映射是一个压缩映射(contraction map)。在展开图中,传播过程对应于从t到T的更新过程(注意,T并不是确定的,而是对应于整个图的状态到达不动点的时刻),不同时间步的连接则由图中的连接来决定(可以是有向的,也可以是无向的)。
GNN训练
GNN的学习是通过Almeida-Pineda算法实现的。该算法的特点在于,首先通过传播过程使整个图收敛,然后在收敛解上计算相应的梯度。这样,我们就无需存储梯度计算过程所需的中间状态了。但是,必须保证整个图的映射是压缩的,以保证传播过程有一个收敛解。
利用networkx简单生成一个无向图:
代码语言:python代码运行次数:2复制# -*- coding: utf-8 -*-
"""
@Time : 2021/12/21 11:23
@Author :KI
@File :gnn_basic.py
@Motto:Hungry And Humble
"""
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
G = nx.Graph()
node_features = [[2, 3], [4, 7], [3, 7], [4, 5], [5, 5]]
edges = [(1, 2), (1, 3), (2, 4), (2, 5), (1, 3), (3, 5), (3, 4)]
edge_features = [[1, 3], [4, 1], [1, 5], [5, 3], [5, 6], [5, 4], [4, 3]]
colors = []
edge_colors = []
# add nodes
for i in range(1, len(node_features) 1):
G.add_node(i, feature=str(i) ':(' str(node_features[i-1][0]) ',' str(node_features[i-1][1]) ')')
colors.append('#DCBB8A')
# add edges
for i in range(1, len(edge_features) 1):
G.add_edge(edges[i-1][0], edges[i-1][1], feature='(' str(edge_features[i-1][0]) ',' str(edge_features[i-1][1]) ')')
edge_colors.append('#3CA9C4')
# draw
fig, ax = plt.subplots()
pos = nx.spring_layout(G)
nx.draw(G, pos=pos, node_size=2000, node_color=colors, edge_color='black')
node_labels = nx.get_node_attributes(G, 'feature')
nx.draw_networkx_labels(G, pos=pos, labels=node_labels, node_size=2000, node_color=colors, font_color='r', font_size=14)
edge_labels = nx.get_edge_attributes(G, 'feature')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=14, font_color='#7E8877')
ax.set_facecolor('deepskyblue')
ax.axis('off')
fig.set_facecolor('deepskyblue')
plt.show()
每一个节点都有自己的一些特征,比如在社交网络中,每个节点(用户)有性别以及年龄等特征。
5个节点的特征向量依次为:
代码语言:python代码运行次数:0复制[[2, 3], [4, 7], [3, 7], [4, 5], [5, 5]]
6条边的特征向量为:
代码语言:python代码运行次数:0复制[[1, 3], [4, 1], [1, 5], [5, 3], [5, 6], [5, 4], [4, 3]]
变量定义:
特征向量实际上也就是节点或者边的标签,这个是图本身的属性,一直保持不变。
代码理解GNN的训练过程
GNN的“模拟卷积核”在每个节点做的事情就是按照连接关系对每个节点进行聚合:
new_node_embedding = α ∗old _ node_embedding β ∗f ( around_nodes_embeddings)
其中f可以看作是对其周围所有节点的一种操作方式,α , β 以及f内部对应的参数都可以成为训练的对象。
这就是GNN做的事情。
代码语言:python代码运行次数:0复制import numpy as np
# 这个图是一个有向无环图(DAG)
# -1 代表什么也不连
# 图用二维列表,第一行代表节点编号,第二行为对应节点的指向节点
graph = [
[0,0,1,2,3],
[1,2,3,3,4]
]
# 定义5个节点的初始特征值
embeddings = [
[1,2,3],
[2,6,5],
[2,3,7],
[7,8,6],
[1,0,0]
]
# 定义聚合的权重w全为1
w = [1,1,1,1,1]
# 下面开始图神经网络的聚合过程(训练过程)
# 在这里每个节点只按照方向聚合一层
for i in range(len(graph[0])): # 每个节点
# 先寻找指向节点i的节点们
temp_roots = []
for j, eve in enumerate(graph[1]):
if eve == i:
temp_roots.append(graph[0][j])
temp_roots.append(i)
# 此时temp_roots存储了节点i的根节点以及节点i自己的编号
around = [
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]
]
# 将temp_roots中的几点对应的around替换成当前的embedding
for every_node_id in temp_roots:
around[every_node_id] = embeddings[every_node_id]
# 开始更新节点i的特征:自己之前的特征 周围节点特征的平均
embeddings[i] = np.matmul(np.array(w),np.array(around))
# 输出更新一层后的embeddings
print(embeddings)
1) GNN 一般处理的任务是图分类或者节点分类,可以看出GNN一般的处理过程是对节点特征进行的训练。在训练获得图形的节点特征之后,可以通过对所有节点进行max、平均值等池化方式来表示整个图的特征。
2)GNN中的NN学习的是在聚合节点时自己多重要,周围节点多重要,以及周围节点该怎么聚合,这是与图的形状无关的;而NN如何正确学习到这个信息就靠标签或者奖励值了。
3)在搭建GNN网络时,搭建的其实是上面的参数α , β , f alpha,beta,fα,β,f的表示方法,因此这是与图的形状无关的。也就是意味着不同形状的图是可以使用一套GNN网络模型训练的,因为不同图形只是连接关系不一样,但是其权重是可以一样的。
4)值得注意的是,GNN的一层是指节点们的一层embedings的表示,并且大多数GNN都是2-4层。一层相当于对图神经网络在垂直方向进行了一个复制,每一层节点的embeddings维度是一样的,但是不同层的embeddings可以不同:
5)GNN目前大多数使用PyG进行搭建:
代码语言:python代码运行次数:2复制import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Planetoid
dataset = Planetoid(root='/tmp/Cora', name='Cora')
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = GCNConv(dataset.num_node_features, 16)
self.conv2 = GCNConv(16, dataset.num_classes)
def forward(self, data):
x, edge_index = data.x, data.edge_index
x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, training=self.training)
x = self.conv2(x, edge_index)
return F.log_softmax(x, dim=1)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = Net().to(device)
data = dataset[0].to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
model.train()
for epoch in range(200):
optimizer.zero_grad()
out = model(data)
loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
loss.backward()
optimizer.step()
model.eval()
_, pred = model(data).max(dim=1)
correct = int(pred[data.test_mask].eq(data.y[data.test_mask]).sum().item())
acc = correct / int(data.test_mask.sum())
print('Accuracy: {:.4f}'.format(acc))
GNN算法
GNN算法的完整描述如下:Forward向前计算状态,Backward向后计算梯度,主函数通过向前和向后迭代调用来最小化损失。
主函数中:
GNN功能
节点分类和图分类
空域 :空间上考虑图结构的模型,即考虑目标节点和其他节点的几何关系(有无连接)。
模型代表:GAT(Graph Attention Networks)图注意力模型
用注意力机制对邻近节点特征加权求和。邻近节点特征的权重完全取决于节点特征,独立于图结构。
(将卷积神经网络中的池化看成一种特殊的平均加权的注意力机制,或者说注意力机制是一种具有对输入分配偏好的通用池化方法(含参数的池化方法)
图注意力网络
更新公式:
公式(1)对 l 层节点嵌入
做了线性变换,W^((l)) 是该变换可训练的参数
公式(2)计算了成对节点间的原始注意力分数。它首先拼接了两个节点的 z 嵌入,注意 || 在这里表示拼接;随后对拼接好的嵌入以及一个可学习的权重向量 做点积;最后应用了一个 LeakyReLU 激活函数。这一形式的注意力机制通常被称为加性注意力,区别于 Transformer 里的点积注意力。
公式(3)对于一个节点所有入边得到的原始注意力分数应用了一个 softmax 操作,得到了注意力权重。
公式(4)形似 GCN 的节点特征更新规则,对所有邻节点的特征做了基于注意力的加权求和。
频域:
模型代表:GCN(Graph Convolutional Network )图卷积网络
优点:省参数
缺点:不易作用于动态图
(对于同阶的邻域上分配给不同的邻居的权重是完全相同的(无法允许为邻居中的不同节点指定不同的权重)
一次图卷积操作包含对邻节点特征的标准化求和:
其中N(i) 是对节点 i 距离为 1 邻节点的集合。我们通常会加一条连接节点 i 和它自身的边使得 i 本身也被包括在 N(i) 里。
是一个基于图结构的标准化常数;
σ是一个激活函数(GCN 使用了 ReLU);
W^((l)) 是节点特征转换的权重矩阵,被所有节点共享。
由于 c_ij 和图的机构相关,使得在一张图上学习到的 GCN 模型比较难直接应用到另一张图上。
共同步骤:
加工图邻接矩阵
对图邻接矩阵特征分解,得到特征值,
核心区别(如何收集并累和距离为 1 的邻居节点的特征表示 )
将特征向量看作常数,而卷积核作用在特征值上
GAT 用注意力机制替代了图卷积中固定的标准化操作,将原本的标准化常数替换为使用注意力权重的邻居节点特征聚合函数。
图神经网络实现的两种方式
基于空间的:定义指定感受野的滤波器(filter)在图上进行滑动
●与普通的神经网络有很强的类比性,易于理解
●需要定义邻居系统和节点顺序->不直观
基于频域(谱)的:利用傅里叶变换,即时域卷积为频域点乘
●不需要定义邻居系统和节点顺序,易于理解
●有体系化的公式可用
●可以获得严格局部化的滤波器
●无法在不同的图结构间迁移
基于空域的图神经网络GGNN
基于频域的图神经网络GCN
GNN优点
(1)高效的特征提取能力:图神经网络通过层层堆叠的卷积层和池化层,可以有效地提取图像中的特征,从而更好地理解图像内容。
(2)能够处理大规模的图像数据:图神经网络可以同时处理大量的图像数据,而且在处理过程中不需要事先对数据进行降维或变形,这使得它非常适合应对大规模的图像数据集。
(3)具备自适应学习能力:图神经网络可以利用反向传播算法,根据训练数据自适应地调整网络的权重和偏差,从而在处理图像时更加准确和可靠。
GNN的不足
(1)对于不动点隐藏状态的更新是十分低效的
(2)GNN在迭代的过程中用相同的参数,然而大多标准网络在不同的网络层数使用不同的参数
(3)在原始的GNN中存在着一些无法有效建模的边缘信息特征。例如,在知识图谱中边代表这关系类型,不同边缘的消息传递应该根据他们的类型有所不同。怎么样去学习边缘的隐藏状态也是一个重要的问题
(4)如果把重点放在节点的表示而不是图上,就不适合使用不动点,因为不动点上表示的分布会变得非常平滑,且每个节点的信息量也会减少。
(5)训练过程复杂:图神经网络的训练过程需要大量的计算资源和时间,特别是在处理大规模数据集时更需要成本很高的计算资源。
(6)对训练数据的依赖性较强:图神经网络在处理图像时对于训练数据的质量和数量要求较高,如果训练数据集不够全面和多样化,可能会导致网络的泛化能力不足。
由GNN模型发展变化而来的其他模型:
图注意力网络(Graph Attention Network,GAT):这是一种使用注意力机制的图神经网络模型。通过引入注意力机制,动态地学习节点与邻居节点之间的权重,从而更好地捕捉节点之间的重要关系。GAT在处理图结构中的节点分类和图分类任务上表现出色。
GraphSAGE:一种基于消息传递的GNN变体,它使用了一个固定的聚合函数来更新节点的隐藏状态。这是一种基于邻居采样的图神经网络模型,通过在每一层中采样邻居节点,然后聚合邻居的特征来更新节点的表示。它采用了自适应的邻居采样策略,并具有更好的可扩展性。
GCN:(Graph Convolutional Networks,GCN)一种基于图卷积的GNN变体,它使用了一个可学习的聚合函数来更新节点的隐藏状态。图卷积网络是一种常用的图神经网络,它通过将卷积神经网络(CNN)应用于图结构数据上。在GCN中,节点特征被聚合到其邻居节点,然后通过一些非线性变换更新节点的表示。GCN可以有效地捕捉节点之间的局部关系,并具有较好的可扩展性。
VGAE-GCN:一种基于变分自编码器和GCN的混合模型,它使用了一个可学习的编码器和一个可学习的解码器来生成节点嵌入。
MoNet:一种基于门控循环单元(GRU)和MLP的混合模型,它使用了一个可学习的编码器和一个两层MLP来计算节点嵌入。
参考资料:
图神经网络GNN 原理 详解 (一)_gnn 从训练到收敛的过程 黑色的线是真实分布-CSDN博客
图神经网络(GNN)的基本原理_gnn原理_Cyril_KI的博客-CSDN博客
GNN(图神经网络)基本概念_参宿7的博客-CSDN博客
GNN图神经网络的原理及GGNN、GCN原理及发代码分析_多层ggnn-CSDN博客
代码 通俗理解图神经网络GNN_gnn代码_普通攻击往后拉的博客-CSDN博客
(5 封私信) 对新手来说,图神经网络入门容易吗? - 知乎 (zhihu.com)
图神经网络介绍 - 知乎 (zhihu.com)
图神经网络简介 - 知乎 (zhihu.com)
深入解析神经网络(Neural Networks)工作原理_神经网络工作原理-CSDN博客
神经网络模型的工作原理,人脑神经网络模型_人类大脑的功能是如何帮助神经网络的创建的-CSDN博客
深入理解图卷积神经网络(GCN)原理_图卷积原理-CSDN博客