文章目录

  • 8. 图分类
    • 8.1 基于全局池化的图分类
    • 8.2 基于层次化池化的图分类
      • 8.2.1 基于图坍缩的池化机制
        • 1.图坍缩
        • 2.DIFFPOOL
        • 3.EigenPooling
      • 8.2.2 基于TopK的池化机制
      • 8.2.3 基于边收缩的池化机制

8. 图分类

对于非规则结构的图数据,之前的固定大小滑窗形式的池化操作不再适用,在图分类中实现层次化池化的机制,是GNN需要解决的基础问题。

8.1 基于全局池化的图分类

读出机制对经过K轮迭代的所有节点进行一次性聚合操作,从而输出图的全局表示:
y=R(hi(k)∣∀vi∈V)y=R({\pmb h_i^{(k)} |\forall v_i\in V }) y=R(hhhi(k)viV)
读出机制可以使用MAX、SUM等函数;

还有一种做法是引入一个与所有节点相连的虚拟节点,将全图的表示等价于这个虚拟节点的表示。

注意:损失结构信息;适合小图数据。

8.2 基于层次化池化的图分类

三种方案:

  1. 基于图坍缩的池化机制:将图划分为不同的子图,然后将子图视为超级节点,从而形成一个坍缩的图。
  2. 基于TopK的池化机制:对图中的每个节点学习出一个分数,基于这个分数的排序丢弃一些低分数的节点,这类方法借鉴了CNN最大池化的思想:将更重要的信息筛选出来。不同的是图数据种难以实现局部滑窗操作,因此使用分数筛选;
  3. 基于边收缩的池化机制:边收缩是指并行地将图中的边移除,并将被移除边的两个节点合并,保持它们的连接关系,其思路是通过归并操作来逐步学习图的全局信息的方法。

8.2.1 基于图坍缩的池化机制

1.图坍缩

图G,某种划分得到K个子图{G(k)}k=1K\{{G^{(k)}} \}_{k=1}^K{G(k)}k=1K,Γ(k)\Gamma^{(k)}Γ(k)表示子图G(k)G^{(k)}G(k)中的节点列表。

簇分配矩阵S∈RN×KS\in R^{N\times K}SRN×K,其定义如下:Sij=1S_{ij}=1Sij=1当且仅当vi∈Γ(j)v_i\in \Gamma^{(j)}viΓ(j).

STASS^TASSTAS的意义:第i个簇与第j个簇的连接强度。
Acoar=STASA_{\text{coar}}=S^TAS Acoar=STAS
表述了图坍缩之后的超级节点之间的连接强度,其中包含了超级节点自身内部的连接强度,如果只需要考虑超级节点之间的连接强度Acoar[i,i]=0A_{\text{coar}}[i,i]=0Acoar[i,i]=0

采样算子C∈RN×NkC\in R^{N\times N_k}CRN×Nk,其定义为:Cij(k)=1C_{ij}^{(k)}=1Cij(k)=1,当且仅当Γj(k)=vi\Gamma_j^{(k)}=v_iΓj(k)=vi.

C是节点在原图和子图中顺序关系的一个指示矩阵。

下采样:
x(k)=(C(k))Tx\pmb x^{(k)}=(C^{(k)})^T\pmb x xxx(k)=(C(k))Txxx
上采样:
xˉ=C(k)x\bar{\pmb x}=C^{(k)}\pmb x xxxˉ=C(k)xxx
邻接矩阵A的划分使用采样算子:
A(k)=(C(k))TAC(k)A^{(k)}=(C^{(k)})^TAC^{(k)} A(k)=(C(k))TAC(k)
这样就可以计算簇内之间的连接关系。

确定簇内节点的融合方法,可以将结果表示为超级节点上的信号。迭代重复上述过程,就能获得越来越全局的图信号。一个实例如下:

2.DIFFPOOL

首个将图坍缩与GNN结合起来的图层面任务学习的算法。DIFFPOOL提出了一个可学习的簇分配矩阵。具体来说,首先通过一个GNN对每个节点进行特征学习,然后通过另一个GNN为每个节点学习出所属各个簇的概率分布:
Z(l)=GNNl,embed(A(l),H(l))S(l)=softmax(GNNl,pool(A(l),H(l)))H(l+1)=S(l)TZ(l)A(l+1)=S(l)TAS(l)Z^{(l)}=GNN_{l,embed}(A^{(l)},H^{(l)})\\ S^{(l)}=\text{softmax}({GNN_{l,pool}}(A^{(l)},H^{(l)}))\\ H^{(l+1)}={S^{(l)}}^TZ^{(l)}\\ A^{(l+1)}={S^{(l)}}^TA{S^{(l)}} Z(l)=GNNl,embed(A(l),H(l))S(l)=softmax(GNNl,pool(A(l),H(l)))H(l+1)=S(l)TZ(l)A(l+1)=S(l)TAS(l)
后两个公式被称为DIFFPOOL层,前一个是融合,明显是加和节点特征,后一个是簇间邻接矩阵的计算。

前两个式子是通过GNN学习得到的,学习目的不同,参数不同。

DIFFPOOL有一个非常重要的特性:排列不变性。GCN也是具有排列不变性的,因此上述使用GNN若是GCN,那么节点是否重新排列并不影响节点聚合成簇的结果。

3.EigenPooling

图坍缩使用谱聚类算法来进行划分,基本思路是先将数据变换到特征空间以凸显更好的区分度,然后执行聚类操作(比如选择Kmeans算法进行聚类,此时簇分配就是一种硬分配,保证了稀疏性)。

池化操作选用频谱信息来表示子图信息的统一整合:

假设子图G(k)G^{(k)}G(k)的拉普拉斯矩阵为L(k)L^{(k)}L(k),对应特征向量u1(k),u2(k),...,uNk(k)\pmb u_1^{(k)},\pmb u_2^{(k)},...,\pmb u_{N_k}^{(k)}uuu1(k),uuu2(k),...,uuuNk(k),可以使用上采样算子C(k)C^{(k)}C(k)将该特征向量(子图上的傅里叶基)上采样到整个图:
uˉl(k)=C(k)ul(k)\bar {\pmb u}_l^{(k)}=C^{(k)}{\pmb u}_l^{(k)} uuuˉl(k)=C(k)uuul(k)
池化算子Θl∈RN×K\Theta_l\in R^{N\times K}ΘlRN×K,我们将所有子图的第lll个特征向量按行方向组织起来形成矩阵Θl\Theta_lΘl,即:
Θl=[ul(1),...,ul(k)]\Theta_l=[{\pmb u}_l^{(1)},...,{\pmb u}_l^{(k)}] Θl=[uuul(1),...,uuul(k)]
由于子图的节点数量不同,因此特征向量的数量也不同。用Nmax=max⁡k=1,...,KNkN_{max}=\max_{k=1,...,K}N_kNmax=maxk=1,...,KNk表示子图中的最大节点数。然后,若子图G(k)G^{(k)}G(k)的节点数小于NmaxN_{max}Nmax,可以将ul(k)(Nk<l<Nmax)\pmb u_l^{(k)}(N_k<l<N_{max})uuul(k)(Nk<l<Nmax)设置为0∈RNk×1\pmb 0\in R^{N_k\times 1}000RNk×1.

池化过程如下:
Xl=ΘlTXX_l=\Theta_l^TX Xl=ΘlTX
XlX_lXl在每个子图第lll个特征向量作用下得到的,XlX_lXl的第k行表示的是第k个超级节点在Θl\Theta_lΘl的作用下的表示向量。按照该机制,我们需要设计NmaxN_{max}Nmax个池化算子进行同样的操作,再进行列方向拼接,结果如下:
Xpooled=[X0,...,XNmax]X_{pooled}=[X_0,...,X_{N_{max}}] Xpooled=[X0,...,XNmax]
具体实例可见下图:

由于低频信息的有效性,取H<<Nmax⁡H<<N_{\max}H<<Nmax
Xcoar=Xpooked=[X0,...,XH]X_{\text{coar}}=X_{pooked}=[X_0,...,X_H] Xcoar=Xpooked=[X0,...,XH]
设全图上的信号为x\pmb xxxx,有
(uˉl(k))Tx=(ul(k))T(C(k))Tx=(ul(k))Tx(k)(\bar {\pmb u}_l^{(k)})^T\pmb x=({\pmb u}_l^{(k)})^T(C^{(k)})^T\pmb x=({\pmb u}_l^{(k)})^T\pmb x^{(k)} (uuuˉl(k))Txxx=(uuul(k))T(C(k))Txxx=(uuul(k))Txxx(k)
其输出表示子图上的信号在子图上对应的第lll个特征向量上的傅里叶系数。

8.2.2 基于TopK的池化机制

这是一个不断丢弃节点的过程。具体来说,首先设置一个表示池化率的超参数kkk,k∈(0,1)k\in (0,1)k(0,1),接着学习出一个表示节点重要度的值z并并对其进行降序排序,将全图NNN个节点下采样到kNkNkN​个节点。
i=top−rank(z,kN)X′=Xi,:A′=Ai,i\pmb i=\text{top}-\text{rank}(\pmb z,kN)\\ X^{'}=X_{i,:}\\ A^{'}=A_{i,i} iii=toprank(zzz,kN)X=Xi,:A=Ai,i
Xi,:X_{i,:}Xi,:表示按照向量i的值对特征矩阵进行行切片,Ai,iA_{i,i}Ai,i表示按照向量i\pmb iiii的值对邻接矩阵同时进行行切片和列切片。DIFFPOOL分配同样的问题需要kN2kN^2kN2的空间复杂度来分配簇信息,而基于Topk的池化机制,每次只需要从原图中丢弃(1−k)N(1-k)N(1k)N的节点即可。

节点重要度的计算:

a.为图分类模型设置一个全局的基向量p\pmb pppp,将节点特征向量在该基向量上的投影当作重要度:
z=Xp∣∣p∣∣\pmb z=\frac{X_{\pmb p}}{||\pmb p||} zzz=pppXppp
两个作用:

  1. 可以以投影大小来确定Topk的排序;
  2. 投影大小还起到了一个梯度门限的作用,投影较小的节点仅有较小的梯度更新幅度,相对地,投影较大的节点会获得更加充分的梯度信息。

z=Xp∣∣p∣∣,i=top−rank(z,kN)X′=(X⊙tanh(z))i,:A′=Ai,i\pmb z=\frac{X_{\pmb p}}{||\pmb p||},\pmb i=\text{top}-\text{rank}(\pmb z,kN)\\ X^{'}={(X\odot\text{tanh}(\pmb z))}_{i,:}\\ A^{'}=A_{i,i} zzz=pppXppp,iii=toprank(zzz,kN)X=(Xtanh(zzz))i,:A=Ai,i

点乘是利用节点的重要度对节点特征做了一次收缩变换,进一步强化了对重要度高的节点的梯度学习。——gpool层。

但是上述做法缺乏对所有节点的有效信息的融合,因此在gpool层后跟一个读出层,实现该尺度下的图全局信息的一次性聚合。具体实现是将全局平均池化和全局最大池化拼接起来:
s=1N∑i=1Nxi′∣∣max⁡i=1Nxi′\pmb s=\frac{1}{N}\sum_{i=1}^{N}\pmb x_i^{'}||\max_{i=1}^N \pmb x_i^{'} sss=N1i=1Nxxxii=1maxNxxxi
全图表示,将各层s相加:
s=∑l=1Ls(l)\pmb s=\sum_{l=1}^L\pmb s^{(l)} sss=l=1Lsss(l)

b.使用一个GNN对节点重要度进行学习,这样能更好地利用图的结构信息对节点的重要度进行学习。

8.2.3 基于边收缩的池化机制

基本思想:迭代式地对每条边上的节点进行两两归并形成一个新的节点,同时保留合并前两个节点的连接关系到新节点上。

存在问题:每个节点有多条边,但是每个节点只能从属于一条边进行边收缩,如何选择?

EdgePool设计了一个边上的分数,根据该分数进行非重复式地挑选与合并。

过程如下:

计算每条边的原始分数:
rij=wT[hi∣∣hj]+br_{ij}=\pmb w^T[\pmb h_i||\pmb h_j]+b rij=wwwT[hhhihhhj]+b
对原始分数沿邻居节点进行归一化:
sij=softmaxj(rij)s_{ij}=\text{softmax}_j(r_{ij}) sij=softmaxj(rij)
得到上述分数之后,接下来对所有的sijs_{ij}sij进行排序,依次选择该分数最高并且未被选中的两个节点进行收缩操作。细节如下:

a为原始分数,b为ere^rer,c为归一化之后的结果,先合并最高的v3,v4v_3,v_4v3,v4,再合并较高的v1,v2v_1,v_2v1,v2.

合并之后的节点特征可以使用求和的方式:
hij=s(hi+hj),s=max⁡(sij,sji)\pmb h_{ij}=s(\pmb h_i+\pmb h_j),s=\max(s_{ij},s_{ji}) hhhij=s(hhhi+hhhj),s=max(sij,sji)
s同样是收缩作用。

oe4-1669389714951)]

a为原始分数,b为ere^rer,c为归一化之后的结果,先合并最高的v3,v4v_3,v_4v3,v4,再合并较高的v1,v2v_1,v_2v1,v2.

合并之后的节点特征可以使用求和的方式:
hij=s(hi+hj),s=max⁡(sij,sji)\pmb h_{ij}=s(\pmb h_i+\pmb h_j),s=\max(s_{ij},s_{ji}) hhhij=s(hhhi+hhhj),s=max(sij,sji)
s同样是收缩作用。

这种方法节点的融合都是从边进行的,契合了图的结构信息;保留了融合之后图中连接的稀疏性,空间复杂度低;作为一种端到端的池化机制,可以广泛地整合到各个GNN模型中,以完成图分类任务的学习。

《深入浅出图神经网络》读书笔记(8. 图分类)相关推荐

  1. 《深入浅出DPDK》读书笔记(九):流分类与多队列、流过滤、虚拟化流分类方式、流分类技术的使用

    Table of Contents 94.Linux内核对多队列的支持 95.DPDK与多队列 98.流分类 99.RSS 100.Flow Director 101.服务质量 102.虚拟化流分类方 ...

  2. 怎么用思维导图做读书笔记?思维导图这样画

    怎么用思维导图做读书笔记?读书笔记是在读书时记录自己阅读心得,也可以将文中精彩的部分整理出来,一来方便我们对内容进行深入理解,积累并牢固掌握所学到的知识,同时也能提高我们的阅读效率等. 想要做一个清晰 ...

  3. Graph Decipher: A transparent dual-attention graph neural network 图解密器:一种透明的双注意图神经网络,用于理解节点分类的消息传递机制

    引用 Pang Y, Liu C. Graph Decipher: A transparent dual-attention graph neural network to understand th ...

  4. 图神经网络学习笔记-01基础

    图神经网络-01基础-图与图学习 文章目录 图神经网络-01基础-图与图学习 图是什么 图的定义 图的基本表示方法 e.g 图的存储 图的类型和性质 图算法 1. 寻路和图搜索算法 1). 搜索算法 ...

  5. 《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)

    Table of Contents Open vSwitch(OVS)中的DPDK性能加速 174.虚拟交换机简介 175.OVS简介 176.DPDK加速的OVS 177.OVS的数据通路 178. ...

  6. 《深入浅出DPDK》读书笔记(十四):DPDK应用篇(DPDK与网络功能虚拟化:NFV、VNF、IVSHMEM、Virtual BRAS“商业案例”)

    Table of Contents DPDK应用篇 DPDK与网络功能虚拟化 157.网络功能虚拟化 13.1.1起源 158.发展 159.OPNFV与DPDK NFV的部署 160.NFV的部署 ...

  7. 《深入浅出DPDK》读书笔记(十三):DPDK虚拟化技术篇(加速包处理的vhost优化方案)

    Table of Contents 加速包处理的vhost优化方案 142.vhost的演进和原理 143.Qemu与virtio-net 144.Linux内核态vhost-net 145.用户态v ...

  8. 《深入浅出DPDK》读书笔记(十二):DPDK虚拟化技术篇(半虚拟化Virtio)

    Table of Contents 半虚拟化Virtio 132.Virtio使用场景 133.Virtio规范和原理 11.2.1 设备的配置 1. 设备的初始化 2. 设备的发现 3. 传统模式v ...

  9. 《深入浅出DPDK》读书笔记(十一):DPDK虚拟化技术篇(I/O虚拟化、CPU虚拟化、内存虚拟化、VT-d、I/O透传)

    Table of Contents DPDK虚拟化技术篇 X86平台上的I/O虚拟化 120.X86平台上的I/O虚拟化 121.X86平台虚拟化概述 122.CPU虚拟化 123.内存虚拟化 124 ...

  10. 《深入浅出DPDK》读书笔记(十):硬件加速与功能卸载(VLAN、IEEE1588、IP TCP/UDP/SCTP checksum、Tunnel)

    Table of Contents 109.硬件卸载简介 110.网卡硬件卸载功能 111.DPDK软件接口 接收侧: 发送侧: 112.硬件与软件功能实现 113.VLAN硬件卸载 1. 收包时VL ...

最新文章

  1. 现实迷途 第七章 特殊客户
  2. Python安装MySQL模块
  3. 背景建模之单高斯实现
  4. 深入理解JavaScript模拟私有成员
  5. ubuntu16 redis5.0以前版本集群部署示例
  6. git提交 本地分支和远程分支断开连接
  7. Clob 2 String
  8. echarts可以去掉边距吗_又有近视又有散光怎么办?近视手术可以同时去掉吗?...
  9. 每天10个Linux命令四
  10. JAVA数组批量设值(初始化)的办法
  11. 泰凌微ble mesh蓝牙模组天猫精灵学习之旅 ④ 初认识阿里天猫精灵官方Genie BT mesh Stack框架, windows平台搭建打印Hello World !
  12. C#酒店客房管理系统设计与实现
  13. php怎么实现网页切图,CSS_网站页面切图与CSS注意事项,一、Web页面切图 1) Web页面的 - phpStudy...
  14. python爬今日头条组图_python 爬虫抓取今日头条街拍图片
  15. Web Audio API与WebSocket播放实时音频
  16. 石油石化生产企业该如何防止电网晃电发生和发生晃电时保证敏感负荷的设备正常运行
  17. word操作:如何修改字体(正确、规范、快捷)
  18. vivox50支持鸿蒙,vivoX50pro—好马配好鞍,强大的微云台相机
  19. Cannot render error page for request [/list.html] and exception [An error happened during template p
  20. Android UI绘制流程分析(三)measure

热门文章

  1. Java利用jacob实现wps转换pdf
  2. 分享微信抽奖小程序制作步骤_微信抽奖小程序怎么开发
  3. 哈尔滨八维计算机学校,哈尔滨 口语学习
  4. android服务的原理,android service原理
  5. vnote中graphviz与plantuml的安装与配置
  6. 特征图注意力_注意力机制之Residual Attetion Network
  7. 饿了么平台最全开发API接口列表 elm接口 2019
  8. magento 多货币paypal支付扩展
  9. J2EE基础之集合框架set
  10. 苹果电脑 Mac 下终端中删除文件的命令