图神经网络GNN学习笔记:GNN的通用框架

  • 1. MPNN
  • 2. NLNN
  • 3. GN
  • 参考资料

所谓通用框架,是对多种变体GNN网络结构的一般化总结,也是GNN编程的通用范式,这里介绍3类通用框架:

  • 消息传播神经网络(Message Passing Neural Network, MPNN):从聚合和更新角度归纳GNN模型的几种变体;
  • 非局部神经网络(Non-Local Neural Network, NLNN):基于注意力机制的GNN模型的一般化总结;
  • 图网络(Graph Network, GN):对GNN模型进行更全面的总结

1. MPNN

MPNN的基本思路为:节点表示向量都是通过消息函数MMM(Message)和更新函数UUU(Update)进行K轮消息传播机制的迭代后得到的,消息传播的过程如下:
mi(k+1)=∑vj∈N(vi)M(k)(hi(k),hj(k),eij)m_i^{(k+1)}=\sum_{v_j\in N(v_i)} M^{(k)}(h_i^{(k)}, h_j^{(k)}, e_{ij})mi(k+1)=vjN(vi)M(k)(hi(k),hj(k),eij)
hi(k+1)=U(k)(hi(k),mi(k+1))h_i^{(k+1)}=U^{(k)}(h_i^{(k)},m_i^{(k+1)})hi(k+1)=U(k)(hi(k),mi(k+1))
其中eije_{ij}eij表示边<vi,vj><v_i,v_j><vi,vj>上的特征向量,kkk表示第kkk次消息传播,在实际编程中,一般和模型中层的概念等价。

消息函数的输入由边本身以及两侧节点构成,借用RDF(Resource Description Framework)三元组来表示这样的输入:
Source→PredictObjectSource\overset{Predict}\rightarrow Object SourcePredictObject
Source表示源节点,Object表示目标节点,Predict表示源节点到目标节点的关系。

想象人类学习知识的过程,在自身具有一定知识的基础上,我们会想要从周围的伙伴那里学习到更多的知识,然后将伙伴给予的信息与自身已有的知识组合起来,更新并获得更高阶的知识,这个过程就是一个消息传递过程。

以下图为例,假设我们要计算 [公式] 时刻红色节点的表示,从消息传递的角度来看,会经历以下步骤:1)首先从邻居获取信息:计算红色节点周围的四个邻居节点的消息总和。2)对获得的信息加以利用:将获得的消息与 [公式] 时刻红色节点本身的表示组合起来,计算得到 [公式]时刻的红色节点表示。

在理解了消息传递过程之后,正式介绍形式化的消息传递过程。MPNN共包含两个阶段:消息传递阶段读出阶段(readout phase)

  1. 消息传递阶段 :共运行T个时间步,并包含以下两个子函数:

    • Aggregation Function:也称消息函数,作用是聚合邻居节点的特征,形成一个消息向量,准备传递给中心节点。
    • Combination Function:也称节点更新函数,作用是更新当前时刻的节点表示,组合当前时刻节点的表示以及从Aggregation Function中获得的消息。
  2. 读出阶段:针对于图级别的任务(如图分类)仅仅获得节点级别的表示是不够的,需要通过读出函数(Readout Function)聚合节点级别的表示,计算获得图级别的表示。

在消息函数的作用下,图里面所有的RDF都会向外广播消息,之后这些消息都会沿着边的方向传播到RDF的两侧节点处进行聚合,聚合后的消息会在之后的更新函数的作用下对节点特征进行更新

MPNN的核心在于消息函数和更新函数,原则上可以把它们设计成任意一种DNN模型。

因此,不同种类的GNN就是通过设计不同的Aggregation Function,Combination Function以及Readout Function实现的。也就是说,从邻居聚合的信息不同,邻居信息与自身信息的组合方式不同,或者节点的读出方式不同,最终都会导致我们最终获得的表示向量不同。不同的任务为了获得更准确的预测效果,会着重于抓取不同的信息。

在消息传播的视角下,GCN、R-GCN、GraogSAGE、Interaction Network等GCN模型中的消息函数和更新函数,如下表:

模型 消息函数 更新函数
GCN M(hi(k),hj(k))=L~sym[i,j]W(k)h~j(k)M(h_i^{(k)}, h_j^{(k)})=\tilde L_{sym}[i,j]W^{(k)}\tilde h_j^{(k)}M(hi(k),hj(k))=L~sym[i,j]W(k)h~j(k) U(mi(k+1))=σ(mi(k+1))U(m_i^{(k+1)})= \sigma(m_i^{(k+1)})U(mi(k+1))=σ(mi(k+1))
R-GCN M(hj(k),r)=1ci,rWr(k)hj(k)M(h_j^{(k)},r)=\frac{1}{c_{i,r}}W_{r}^{(k)}h_j^{(k)}M(hj(k),r)=ci,r1Wr(k)hj(k) U(hi(k),mi(k+1))=σ(mi(k+1)+W0hi(k))U(h_i^{(k)},m_i^{(k+1)})=\sigma(m_i^{(k+1)}+W_0h_i^{(k)})U(hi(k),mi(k+1))=σ(mi(k+1)+W0hi(k))
GraphSAGE ∑M(hj(k))=Agg[hj(k),vj∈N(vi)]\sum M(h_j^{(k)})=Agg[h_j^{(k)},v_j\in N(v_i)]M(hj(k))=Agg[hj(k),vjN(vi)] U(hi(k),mi(k+1))=σ(W(k)[mi(k+1);hi(k)])U(h_{i}^{(k)}, m_{i}^{(k+1)}) = \sigma(W^{(k)}[m_{i}^{(k+1)}; h_i^{(k)} ])U(hi(k),mi(k+1))=σ(W(k)[mi(k+1);hi(k)])
Interaction Network NN模型 另一个NN模型

由于MPNN的消息函数是作用在RDF三元组上的,下面给出常见的同构图、异构图、属性图等类型的图数据使用MPNN框架进行处理的方法:
(1)同构图:特殊的是有向加权图,对于这类图数据,可以将边的正反方向看成两种关系,借用R-GCN的思路进行处理,同时对边上的权重可以考虑进邻接矩阵中当作归一化项一并处理。
(2)异构图:可以考虑R-GCN方式,如果关系不多,可以将关系编码成one-hot向量当作边上的特征进行处理。
(3)属性图:需要考虑的因素有节点的异构以及边属性。前者可以在调用MPNN之前,对不同类型的节点分别送进变换函数,将异构的节点变换到同一维度的同一特征空间,之后当作节点同构图处理。对于后者,参考关系图的处理,如果边上具有一些属性信息,则可以按照消息函数的机制,对其进行特征编码(如类别型属性特征进行one-hot编码或者embedding编码)。

2. NLNN

非局部神经网络(NLNN)是对注意力机制的一般化总结。《Non-local Neural Networks》发表于2017年,作者王小龙,导师是何凯明。作者提出的非局部神经网络(non-local neural network,NLNN)来捕获深度神经网络的长依赖关系,这种非局部运算是对所有位置特征的加权计算,因此也可以被看作是不同“self-attention”的方法的统一

卷积运算递归运算是典型的局部运算(只考虑局部信息),长距离依赖关系通常是通过不断迭代来形成更大的感受野。但这种方式有很多缺点,包括计算效率低,优化困难等。作者受 CV 领域中经典的非局部均值滤波的启发提出了 NLNN,将一个位置响应为所有位置特征的加权计算,这种位置位置可以是空间、时间或者时空,也就是说这种方法的应用领域适用于图像、序列和视频等问题。
这种非局部运算有几大优点:

  • 与卷积运算和递归运算相比,非局部运算通过计算任意两个位置之间的交互直接捕获长依赖
  • 即使神经网络的层数不多也能达到最佳效果
  • 非局部运算支持可变的输入大小,并且可以轻松与其他运算(如卷积运算)相结合。

NLNN通过non-local操作将任意位置的输出响应计算为所有位置特征的加权和。位置可以是图像中的空间坐标,也可以是序列数据中时间坐标,在图数据中,位置可以直接以节点代替。


非局部均值滤波(Non-Local Means,NLM)是 Buades 等人 2005 年的论文《A non-local algorithm for image denoising》提出的一种对传统领域滤波方法进行改进的一种滤波方法,其考虑图像的自相似性,充分利用图像中的非局部信息来辅助滤波降噪。算法的主要原理是计算图像中所有像素与当前像素的相似性,其公式定义为:
NL[v](i)=∑j∈Iw(i,j)v(j)NL[v](i)=\sum_j\in I w(i,j) v(j)NL[v](i)=jIw(i,j)v(j)
w(i,j)=1Z(i)e−∣∣v(Ni)−v(Nj)∣∣2,a2h2w(i,j) = \frac{1}{Z(i)}e^{-\frac{||v(N_i)-v(N_j)||_{2,a}^2}{h2}}w(i,j)=Z(i)1eh2v(Ni)v(Nj)2,a2
Z(i)=∑je−∣∣v(Ni)−v(Nj)∣∣2,a2h2Z(i)=\sum_j e^{-\frac{||v(N_i)-v(N_j)||_{2,a}^2}{h2}}Z(i)=jeh2v(Ni)v(Nj)2,a2
其中,w(i,j)w(i,j)w(i,j)为两个像素的相似性;NiN_iNi表示以像素i为中心固定大小的领域;v(Ni)v(N_i)v(Ni)为灰度强度的映射向量;Z(i)Z(i)Z(i)为归一化常数;hhh为平滑参数。


通用的non-local操作的定义如下:
hi′=1C(h)∑∀jf(hi,hj)g(hj)h'_i=\frac{1}{C(h)}\sum_{\forall j} f(h_i, h_j)g(h_j)hi=C(h)1jf(hi,hj)g(hj)
其中,iii是输出位置的索引,jjj是枚举所有可能位置的索引。hih_ihi表示iii位置的特征向量,f(hi,hj)f(h_i,h_j)f(hi,hj)iiijjj位置上元素之间的相关度函数;g(hj)g(h_j)g(hj)表示对输入hjh_jhj进行变换的变换函数,因子1C(h)\frac{1}{C(h)}C(h)1用于归一化结果。

**非局部运算考虑的是所有位置,而局部运算(如卷积操作)只考虑节点的周围信息,递归运算只考虑上一步的信息。**非局部运算与全连接运算的区别主要有3点:

  1. 非局部运算的多输出值会受到输入值之间关系的影响(因为要计算f(⋅,⋅)f(\cdot,\cdot)f(,)),而全连接运算通过学习到权重来计算输入到输出的映射,所以不同位置的关系是不会影响到输出,一定程度上损失了位置的相关性;
  2. 非局部运算支持可变大小的输入,而全连接运算的输入大小是固定的
  3. 非局部操作可以很容易地与卷积/递归层一起使用,而不像全连接层只能放到神经网络的最后使用。这便使得我们能够将非局部信息和局部信息结合起来,来构建一个更丰富的层次结构,

同MPNN一样,NLNN的核心也在两个函数上:fffggg。为了简化,可以使用线性变换作为函数g:g(hj)=Wghjg:g(h_j)=W_gh_jgg(hj)=Wghj。这里WgW_gWg是需要学习的权重矩阵。下面列出函数fff的一些选择:

  1. 内积
    Dot product:考虑点乘相似度。函数fff的最简单的一种形式就是内积f(hi,hj)=θ(hi)Tϕ(hj)f(h_i,h_j)=\theta(h_i)^T\phi(h_j)f(hi,hj)=θ(hi)Tϕ(hj),这里θ(hj)=Wθhi,ϕ(hj)=Wϕhj\theta(h_j)=W_\theta h_i,\phi(h_j)=W_{\phi}h_jθ(hj)=Wθhiϕ(hj)=Wϕhj,分别表示对输入的一种线性变换,C(h)=∣hj∣C(h)=|h_j|C(h)=hj

  2. 全连接
    使用输出为一维标量的全连接层定义fff
    f(hi,hj)=ReLU(wfT[θ(hi),ϕ(hj)])f(h_i,h_j)= ReLU(w_f^T[\theta(h_i), \phi(h_j)])f(hi,hj)=ReLU(wfT[θ(hi),ϕ(hj)])
    其中,[⋅,⋅][\cdot,\cdot][,]为连接运算,wfw_fwf为将 concat 向量转换成标量的权重向量,C(h)=∣hj∣C(h)=|h_j|C(h)=hj表示输入向量的数量。

  3. 高斯函数
    Embedded Gaussian:考虑到 Embedding 的向量空间,我们有高斯滤波的变种f(hi,hj)=eθ(hi)T⋅ϕ(hj)f(h_i,h_j)=e^{\theta(h_i)^T\cdot \phi(h_j)}f(hi,hj)=eθ(hi)Tϕ(hj),其中θ(hi)=Wθhi,ϕ(hj)=Wϕhj,C(h)=∑∀jf(hi,hj)\theta(h_i)=W_\theta h_i, \phi(h_j)=W_{\phi}h_j,C(h)=\sum_{\forall j}f(h_i,h_j)θ(hi)=Wθhi,ϕ(hj)=WϕhjC(h)=jf(hi,hj),对于给定iii1C(h)\frac{1}{C(h)}C(h)1表示沿维度jjj进行归一化之后的值,此时hi′=softmaxj(θ(hi)Tϕ(hj))g(hj)h'_i=softmax_j(\theta(h_i)^T \phi(h_j))g(h_j)hi=softmaxj(θ(hi)Tϕ(hj))g(hj)。如果将自然对数eee的幂指数项改成全连接的形式,就成了GAT中的做法。

另外,作者将非局部运算变成一个非局部模块,以便插入到现有的神经网络结构中。作者将其设计成残差模块,让其学习x的残差:
zi=Wzyi+hiz_i=W_zy_i+h_izi=Wzyi+hi
这种残差结构可以使得在任意的预训练模型中直接插入一个新的非局部模块而不用改变原有的网络结构。考虑计算量问题,在输入比较大的情况下可以只在高阶语义层中引入 non-local layer,此外也可以通过 pooling 层来减少计算量。
下图是一个简单的实现:

⊕ 为元素点和,⊗ 为矩阵相乘。通过利用1×1×11\times 1\times 11×1×1的卷积将Wg,Wθ,WϕW_g, W_\theta, W_\phiWg,Wθ,Wϕ的channel数量控制为XXX的一半,形成一个bottleneck的结构,可以减少计算量。在输出时利用WzW_zWz可以将channel还原,保证了输入输出的维度一致。
此外,还有一个下采样(subsampling)的trick可以使用,例如,将通用公式修改为hi′=1C(h^)∑∀jf(hi,h^j)g(h^j)h'_i=\frac{1}{C(\hat{h})}\sum_{\forall j} f(h_i, \hat h_j)g(\hat h_j)hi=C(h^)1jf(hi,h^j)g(h^j),其中h^j\hat h_jh^jhjh_jhj的下采样,比如可以利用pooling,这样就可以减少1/41/41/4的pair-wise的计算量。这个trick不会改变non-local的行为,但是可以使得计算更加稀疏,通常会在上图中ϕ,g\phi, gϕ,g的后面增加一层max pooling层来实现。

3. GN

Graph Network相较于MPNN和NLNN,对GNN做了更一般的总结。其基本计算单元包括3个要素:

  • 节点的状态hih_ihi
  • 边的状态eije_{ij}eij
  • 图的状态uuu

围绕着三个元素,GN设计了3个更新函数ϕ\phiϕ、3个聚合函数ρ\rhoρ,具体如下:
eij′=ϕe(eij,hi,hj,u)e'_{ij}=\phi^e(e_{ij,h_i,h_j,u})eij=ϕe(eij,hi,hj,u)
ei′ˉ=ρe→h([eij′,∀vj∈N(vi)],hi′=ϕh(ei′ˉ,hi,u))\bar {e'_i}=\rho^{e\rightarrow h}([e'_{ij},\forall v_j\in N(v_i)], h'_i=\phi^h(\bar{e'_i},h_i,u))eiˉ=ρeh([eij,vjN(vi)],hi=ϕh(eiˉ,hi,u))
e′ˉ=ρe→u([eij′,∀eij∈E]),h′ˉ=ρh→u([hi′,∀vi∈V]),u′=ϕu(e′ˉ,h′ˉ,u)\bar{e'}=\rho^{e\rightarrow u}([e'_{ij},\forall e^{ij}\in E]),\bar{h'}=\rho^{h\to u}([h'_i,\forall v_i\in V]), u'=\phi^u(\bar{e'},\bar{h'},u)eˉ=ρeu([eij,eijE]),hˉ=ρhu([hi,viV]),u=ϕu(eˉ,hˉ,u)
GN的计算过程如下:

蓝色表示正在被更新的元素,黑色表示正在参与更新计算的元素。GN的更新思路是由点更新边,边聚合更新点,点聚合与边聚合更新图,每个元素在更新的时候需要考虑自身上一轮的状态。注意;更新步骤不是一成不变的,可以从全局出发到每个节点,再到每条边。另外全图状态uuu的初始值,可以看成是图的某种固有属性或者先验知识的编码向量。
如果除去这个全图状态值的维护,GN就退化成了一个维护边状态的MPNN。GN对图里面的节点、边、全图都维护了相应的状态,分别对应节点层面的任务、边层面的任务、全图层面的任务。

参考资料

  1. 《深入浅出图神经网络:GNN原理解析》
  2. MPNN:消息传递神经网络
  3. Probing stop pair production at the LHC with graph neural networks
  4. 【GNN】MPNN:消息传递神经网络
  5. NLNN:self-Attention 的泛化框架

【图神经网络】图神经网络(GNN)学习笔记:GNN的通用框架相关推荐

  1. 【图神经网络】图神经网络(GNN)学习笔记:基于GNN的图表示学习

    图神经网络GNN学习笔记:基于GNN的图表示学习 1. 图表示学习 2. 基于GNN的图表示学习 2.1 基于重构损失的GNN 2.2 基于对比损失的GNN 参考资料 本文主要就基于GNN的无监督图表 ...

  2. 【图神经网络】图神经网络(GNN)学习笔记:图分类

    图神经网络GNN学习笔记:图分类 1. 基于全局池化的图分类 2. 基于层次化池化的图分类 2.1 基于图坍缩的池化机制 1 图坍缩 2 DIFFPOOL 3. EigenPooling 2.2 基于 ...

  3. GNN学习笔记(四):图注意力神经网络(GAT)节点分类任务实现

    目录 0 引言 1.Cora数据集 2.citeseer数据集 3.Pubmed数据集 4.DBLP数据集 5.Tox21 数据集 6.代码 嘚嘚嘚,唠叨小主,闪亮登场,哈哈,过时了过时了,闪亮登场换 ...

  4. 【图神经网络】图神经网络(GNN)学习笔记:图的基础理论

    图神经网络GNN学习笔记:图的基础理论 1. 图的概述 2.图的基本类型 2.1 有向图和无向图 2.2 非加权图与加权图 2.3 连通图与非连通图 2.4 二部图 2.5 邻居和度 2.6 子图和路 ...

  5. GNN学习笔记(二)表征学习基本介绍

    GNN学习笔记(二)表征学习基本介绍 一.表征学习(Representation Learning) 1.什么是表征学习 2.传统表征学习(特征工程)的局限性 3.表征学习的分类 4.如何判断表征学习 ...

  6. GTK+图形化应用程序开发学习笔记(五)—组装盒、组合表、固定容器构件

    GTK+图形化应用程序开发学习笔记(五)-组装盒.组合表.固定容器构件 一.组装盒 组装盒(GtkBox)也称为组合构件.使用组装盒可以将多个构件放在一个容器中.容器可以把组装盒看作是一个构件.不像按 ...

  7. GTK+图形化应用程序开发学习笔记(一)—概述

    GTK+图形化应用程序开发学习笔记(一)-概述 一.什么是GNOME. GNOME的意思是"GNU Network Object Model Environment"(GNU网络对 ...

  8. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  9. 【HTML】学习笔记——表单、框架

    [HTML]学习笔记--表单.框架 HTML 表单 表单是一个包含表单元素的区域. 表单元素是允许用户在表单中输入内容,比如:文本域(textarea).下拉列表.单选框(radio-buttons) ...

最新文章

  1. reindex-maven 私服(nexus)架设以及项目管理中遇到的问题及解决方案(updating)
  2. java端模拟http的get、post请求(转)
  3. laravel5.6 数据库获取数据模式变为’数组‘
  4. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 权限申请原理对话框操作回调接口 | 永久拒绝权限后引导设用户置权限 )
  5. java获取栈最大值_实现O(1)获取最大最小值的栈----java
  6. 团队-象棋游戏-需求分析
  7. python字典合并几种方式对比,Python合并两个字典的常用方法与效率比较
  8. python list元素合并_Python-列表+-01-两个列表各元素合并
  9. composer 下载包慢的解决方法
  10. 2020暨大计算机考研失败经验总结
  11. 求极限的若干方法经验和教训
  12. 数据库管理系统(DBMS)
  13. 联通4g满格但是网速慢_4G信号明明满格,但网速却慢过蜗牛,是什么原因?
  14. 坦克世界没有服务器信号,坦克世界闪击战无法连接服务器怎么办 网络问题
  15. 中国Top20天使投资机构和中国Top20VC投资机构
  16. 全网最好的子网划分方法与例题解析
  17. GitHub完整使用教程
  18. 乐高机器人纲要_人工智能与机器人课程纲要
  19. Unity 回合制战斗系统(初级篇)
  20. 读书笔记:软件工程(11) - 传统方法学 - 软件需求分析

热门文章

  1. api接口通达信系统怎样开发量化回测及K线的显示买卖点程序?
  2. 不能说的秘密-Tribon未公开的COM接…
  3. C语言缓冲区基础知识
  4. 那些学校计算机专硕学费低,这5个专业学费很低,适合“家庭条件不好”的学生,但就业率很高...
  5. contenteditable换行踩坑心得
  6. 5、结果跳转方式(重定向、转发)
  7. 生物 期中考试 参考答案
  8. 线性表的顺序表示06
  9. slaveof directive not allowed in cluster mode
  10. 如何建立高效的软件测试组织?