| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【图神经网络】图神经网络(GNN)学习笔记:图分类 -> 正文阅读 |
|
[人工智能]【图神经网络】图神经网络(GNN)学习笔记:图分类 |
图神经网络GNN学习笔记:图分类图分类问题是一个重要的图层面的学习任务,需要关注图数据的全局信息,包括图的结构信息以及各个节点的属性信息。 给定多张图,以及每张图对应的标签,图分类任务需要通过学习得出一个由图到相应标签的图分类模型,重点在于如何通过学习得出一个优秀的全图表示向量。 在图分类任务中实现层次化池化的机制,是GNN需要解决的基础问题。 1. 基于全局池化的图分类在MPNN中,除了为图中节点的表示学习提供了一般框架外,作者也涉及了一个 另一种方式是引入一个与所有结点都相连的 显然,读出机制丢失了图数据里丰富的结构信息,其本质是将输入数据看作一种平整且规则的结构数据,所有的结点都被同等看待,这与图数据本身相违背。因此,读出机制更适应对小图数据的学习,一方面是因为小图数据结构信息单一,另一方面是经过K轮消息传播机制的迭代之后,图中各个结点的表达会更加接近全局表达,此时读出机制也能较好地提取全局信息,而且,读出机制易于实现,非常适合作为图分类的基准模型。 2. 基于层次化池化的图分类列举3中不同的思路介绍能够实现图数据层次化池化的方案: 2.1 基于图坍缩的池化机制1 图坍缩假设对于图G,通过某种划分策略得到K个子图
{
G
(
k
)
}
k
=
1
K
\{G^{(k)}\}_{k=1}^K
{G(k)}k=1K?,
N
k
N_k
Nk?表示子图
G
(
k
)
G^{(k)}
G(k)中的节点数,
Γ
(
k
)
\Gamma^{(k)}
Γ(k)表示子图
G
(
k
)
G^{(k)}
G(k)的节点列表。
假设定义在G上的一维图信号为 x ∈ R N x\in R^N x∈RN,下列两式分别完成了对图信号的下采样于上采样操作: x ( k ) = ( C ( k ) ) T x , x ˉ = C ( k ) x ( k ) x^{(k)}=(C^{(k)})^Tx,\bar{x}=C^{(k)}x^{(k)} x(k)=(C(k))Tx,xˉ=C(k)x(k),上述左式完成了对图信号在子图 G ( k ) G^{(k)} G(k)上的采样(切片)功能;右式完成了子图信号 x ( k ) x^{(k)} x(k)在全图的上采样功能。该操作保持子图中节点的信号值不变,同时将不属于该子图的其他节点的值设置为0。显然,该采样算子也适用于多维信号矩阵 X ∈ R N × d X\in R^{N\times d} X∈RN×d。 有了采样算子的定义,对于子图 G ( k ) G^{(k)} G(k)的邻接矩阵 A ( k ) ∈ R N k × N k A^{(k)}\in R^{N_k\times N_k} A(k)∈RNk?×Nk?,可以通过下式获得(事实上, A ( k ) A^{(k)} A(k)也可以通过对A进行矩阵的双向切片操作获得): A ( k ) = ( C ( k ) ) T A C ( k ) A^{(k)}=(C^{(k)})^TAC^{(k)} A(k)=(C(k))TAC(k) 通过 A c o a r = S T A S A_{coar}=S^TAS Acoar?=STAS和 A ( k ) = ( C ( k ) ) T A C ( k ) A^{(k)}=(C^{(k)})^TAC^{(k)} A(k)=(C(k))TAC(k)可以确定簇内的邻接关系以及簇间的邻接关系。进一步讲,如果能够确定簇内信号的融合方法,将结果表示为超级节点上的信号,那么迭代地重复上述过程,就能够获得越来越全局的图信号了。 上图即为图塌缩与GNN结合的过程:该图展示了一个经过3个池化层最后坍缩成一个超级节点,然后进行图分类任务的GNN模型。在得到最后一个超级节点的特征向量之后,使用了一个三层的MLP网络进行图分类任务的学习。 目前 2 DIFFPOOLDIFFPOOL是首个将图坍缩过程与GNN结合起来进行图层面任务学习的算法。DIFFPOOL提出了一个 有了上述两个式子的输出结果,可以对图进行坍缩: DIFFPOOL具有排列不变性:假设 P ∈ { 0 , 1 } n × n P\in \{0,1\}^{n\times n} P∈{0,1}n×n是一个任意的排列矩阵,只需要保证前面用到的GNN层是排列不变的,DIFFPOOL层就具有排列不变性,即 D I F F P O O L ( A , Z ) = D I F F P O O L ( P A P T , P X ) DIFFPOOL(A,Z)=DIFFPOOL(PAP^T, PX) DIFFPOOL(A,Z)=DIFFPOOL(PAPT,PX),排列矩阵的作用是对图中节点进行重排序,比如一个仅有两个节点向量的图,如果我们需要将两个节点的编号进行对调,则对应的排列矩阵 P = [ 0 1 1 0 ] P=\begin{bmatrix}0 & 1\\1 & 0\end{bmatrix} P=[01?10?],排列矩阵是正交的,即 P T P = I P^TP=I PTP=I。可以通过 P X , P A P T PX, PAP^T PX,PAPT来分别获得重排序之后的特征矩阵与邻接矩阵。 总的来说,节点是否重新排序并不应该影响节点聚合成簇的结果。 有了上述DIFFPOOL层的定义,就可以模仿CNN分类模型的结构设计,不断组合堆叠GNN层与DIFFPOOL层,实现一种可导的、层次化池化的学习机制,并逐渐获得图的全局表示。 3. EigenPoolingEigenPooling是一种基于图坍缩的池化机制。它没有对图分类模型引入任何需要学习的参数,这种非参的池化机制与视觉模型中的各类池化层具有很高的类比性。
EigenPooling的具体过程中,其核心步骤在于作用域的选取以及池化操作,作用域是通过划分子图的方式对图进行分区得到的,这等价于图坍缩的过程,通过这一步可以得到新的超级节点之间的邻接矩阵。池化操作需要考虑的是对作用域内的信息进行融合,通过这一步可以得到关于新的超级节点的特征矩阵。 图信号的频谱展示了图信号在各个频率分量上的强度,它是将图的结构信息与信号本身的信息统一考虑进去,而得到的一种关于图信号的标识信息。因此,EigenPooling选用了 假设子图
G
(
k
)
G^{(k)}
G(k)的拉普拉斯矩阵为
L
(
K
)
L^{(K)}
L(K),对应的特征向量为
u
?
1
(
k
)
,
u
?
2
(
k
)
,
.
.
.
,
u
?
N
k
(
k
)
\vec{u}_1^{(k)}, \vec{u}_2^{(k)},..., \vec{u}_{N_k}^{(k)}
u1(k)?,u2(k)?,...,uNk?(k)?,然后,使用上采样算子
C
(
k
)
C^{(k)}
C(k)将该特征向量(子图上的傅里叶基)上采样到整个图: 有了池化算子的矩阵形式,池化过程可描述为:
X
l
=
Θ
l
T
X
X_l=\Theta_l^TX
Xl?=ΘlT?X 为了提高计算效率,选择使用前H个特征向量对应的池化结果,一般为
H
<
<
N
m
a
x
H<<N_{max}
H<<Nmax?: 同DIFFPOOL一样,如果EigenPooling的前置GNN层选用GCN的话,EigenPooling整体也将具有排列不变性。总的来说,EigenPooling作为一种不带任何学习参数的池化机制,可以非常方便地整合到一般的GNN模型中,实现对图信息的层次化抽取学习。与DIFFPOOL相比,主要优势在保持了超级节点之间连接的稀疏性,同时提高了计算效率,在进行池化操作时,兼顾了子图的结构信息与属性信息,相比DIFFPOOL具有更高的价值。 2.2 基于TopK的池化机制基于TopK的池化机制,是一个不断丢弃节点的过程,其抓住的是图不同尺度的信息。和CNN中基于局部滑窗的池化操作不同的是,TopK池化将作用域放到全图节点上。具体来说,首先设置一个表示池化率的超参数
k
,
k
∈
(
0
,
1
)
k,k\in (0,1)
k,k∈(0,1),接着学习出一个表示节点重要度的值
z
z
z并对其进行降排序,然后将全图中N个节点下采样至
k
N
kN
kN个节点。用公式表示如下: 不同于DIFFPOOL,若将N个节点分配给 k N kN kN个簇,会使得模型需要 k N 2 kN^2 kN2的空间复杂度来分配簇信息,而基于TopK的池化机制,每次只需要从原图中丢弃 ( 1 ? k ) N (1-k)N (1?k)N个节点即可。 如何学习节点的重要度?作者为图分类模型设置了一个全局的基向量
p
?
\vec{p}
p?,将节点特征向量在该基向量上的投影当作重要度: 论文中给出的TopK的模型结构为: 与基于图坍缩的池化机制相比,gpool层采取了层层丢弃节点的做法来提高远距离节点的融合效率,但是这种做法会使得其缺乏对所有节点进行有效信息融合的手段。因此,为了实现有效融合,在gpool层后面再加上一个readout层实现对该尺度下的图的全局信息的一次性聚合。readout层的具体实现方式是将全局平均池化与全局最大池化拼接起来: 如上图所示的模型结构中,使用了两层gpool层,相应地设置了两层readout层,之后对两层readout层的输出进行相加得到全图的向量表示,然后送到一个MLP里面进行图分类的任务学习。 关于丢弃节点的池化机制,一种新的方式是: 2.3 基于边收缩的池化机制
存在的一个问题是:每个节点有多条边,但是每个节点只能从属于一条边进行收缩,那么该如何选择每个节点所丛属的边呢?EdgePool对每条边设计了一个分数,依据该分数进行非重复式的挑选与合并。具体操作如下: 对每条边,计算原始分数
r
i
,
j
r_{i,j}
ri,j?: 合并之后新节点的特征向量 h ? i j \vec{h}_{ij} hij?为: h ? i j = max ? { s i j , s j i } ? ( h ? i + h ? j ) \vec{h}_{ij}=\max\{s_{ij},s_{ji}\}\cdot (\vec{h}_i+\vec{h}_j) hij?=max{sij?,sji?}?(hi?+hj?) EdgePool与DIFFPOOL一样,都是不断对图中所有节点进行融合学习,不同的是DIFFPOOL需要自行设置聚类簇数,而EdgePool利用边收缩的原理,仅将邻居节点进行归并,并将归并比率严格控制在0.5,既保留了图的结构信息,有保证了图中连接的稀疏性,空间复杂度更低。 参考资料[1] 图神经网络的池化操作 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 20:43:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |