《深入浅出图神经网络》读书笔记(7.GNN的变体与框架)

文章目录

  • 7. GNN的变体与框架
    • 7.1 GraphSAGE
      • 7.1.1 采样邻居
      • 7.1.2 聚合邻居
      • 7.1.3 算法过程
    • 7.4 GNN的通用框架
      • 7.4.1 MPNN
      • 7.4.2 NLNN
      • 7.4.3 GN

7. GNN的变体与框架

GNN图神经网络,神经网络技术运用于图数据的学习任务中去的一大类方法。

空域角度下的GCN本质上是一个迭代式地聚合邻居的过程,这启发了一大类模型对于这种聚合操作的重新设计,这些设计在某些方面大大加强了GNN对于图数据的适应性。解构这些设计能够提出一些GNN的通用表达框架,为GNN模型设计工作提供统一范式。

7.1 GraphSAGE

本节的GraphSAGE从两个方面对GCN做了改动:

  1. 通过采样邻居的策略将GCN由全图的训练方式改造为中心的小批量训练方式,这使得大规模图数据的分布式训练成为可能;
  2. 该算法对聚合邻居的操作进行了拓展,提出了替换GCN操作的几种新的方式。

7.1.1 采样邻居

根据梯度下降时小批量的思想,为了提高效率,我们也可以将这种思想迁移到聚合邻居的操作上。对邻居进行随机采样来控制实际运算时节点k阶子图的数据规模,在此基础上对采样的子图进行随机组合来完成小批量式的训练。

《深入浅出图神经网络》读书笔记(7.GNN的变体与框架)_第1张图片

上图如果使用GCN,模型层数为2时,所有节点都需要参与计算。

如果我们只考虑节点的k阶子图,仍有以下问题:

  1. 子图节点数指数级增长。图中节点度的均值 d ˉ \bar d dˉ,执行k层,那么需要计算 ∑ i = 1 k d ˉ i 个 节 点 , 其 中 i 为 层 数 \sum_{i=1}^k\bar d^i个节点,其中i为层数 i=1kdˉi,i
  2. 真实世界中图数据节点的度往往呈现幂律分布,存在一些度数很大的超级节点,很难处理。

解决:采样邻居时控制子图的发散率。设置第k层的邻居采样倍率为 S k S_k Sk,每个节点采样的一阶邻居数不能超过 S k S_k Sk。这里GraphSAGE选择了均匀分布,这样大量减少了计算复杂度。

7.1.2 聚合邻居

提出了几种新的操作形式:

  1. 聚合操作必须对聚合节点的数量做到自适应。不管节点邻居数量如何,聚合操作后输出维度必须一致,一般是一个统一长度的向量;
  2. 聚合操作的结点具有排列不变性。对于我们熟知的2D图像数据与1D序列数据,前者包含空间顺序,后者包含时序顺序。由于图数据是无序的数据结构,邻居节点的排序顺序与输出结果无关。即 A g g ( v 1 , v 2 ) = A g g ( v 2 , v 1 ) Agg(v_1,v_2)=Agg(v_2,v_1) Agg(v1,v2)=Agg(v2,v1).
  3. 聚合操作可导,这样可以方便优化模型。

比较符合的操作算子:

平均/加和算子: W 和 b \pmb W和\pmb b WWWbbb是聚合操作的学习参数:
A g g s u m = σ ( S U M { W h j + b j , ∀ v j ∈ N ( v i ) } ) Agg^{sum}=\sigma(SUM\{\pmb W\pmb h_j+\pmb b_j,\forall v_j\in N(v_i)\}) Aggsum=σ(SUM{WWWhhhj+bbbj,vjN(vi)})
池化聚合算子:最大池化操作如下:
A g g p o o l = M A X { σ ( W h j + b ) , ∀ v j ∈ N ( v i ) } Agg^{pool}=MAX\{\sigma(\pmb W\pmb h_j+\pmb b ),\forall v_j\in N(v_i)\} Aggpool=MAX{σ(WWWhhhj+bbb),vjN(vi)}
可以用DNN模型代替 W h j + b j \pmb W\pmb h_j+\pmb b_j WWWhhhj+bbbj.

7.1.3 算法过程

《深入浅出图神经网络》读书笔记(7.GNN的变体与框架)_第2张图片
此图参考的是知乎大师兄的相关内容,大家可以去看看。

上述算法的基本思路:先将小批量集合B内的中心节点聚合操作所要涉及的k阶子图全部一次性遍历处理,然后在这些节点上进行K次聚合操作的迭代式计算。

1-7行就是遍历操作,把所有需要计算的节点寻找到构成集合 B 0 , B 1 , B 2 , . . . , B k B^0,B^1,B^2,...,B^k B0,B1,B2,...,Bk,分别代表每层选取的点集合,其中 B 0 B^0 B0是最外层;9-15行是聚合操作,11行是调用聚合 操作完成对每个节点邻居特征的整合输出;12行是将聚合后的邻居特征与中心节点上一层的特征进行拼接,然后送到一个单层网络里得到中心节点新的特征向量,13行对节点的特征向量进行归一化处理,将所有节点的向量都统一到单位尺度上.

《深入浅出图神经网络》读书笔记(7.GNN的变体与框架)_第3张图片

由上图可知,采样由内到外,聚合由外到内。B是中心节点的特征集合,可以看到最终聚合得到的是中心节点的特征向量。

这个算法计算过程没有拉普拉斯矩阵的参与,每个节点的特征学习过程仅仅只与其k阶邻居相关,而不需要考虑全图的结构信息,这样的方法适合做归纳学习(归纳学习,指可以对在训练阶段见不到的数据(新节点或者新图)直接进行预测而不需要重新训练的学习方法)。与之相对的是转导学习(所有的数据在训练阶段都可以拿到,学习过程是作用在这个固定的数据上的,一旦数据发生改变需要重新进行学习训练),典型的有图上的随机游走算法。

《深入浅出图神经网络》读书笔记(7.GNN的变体与框架)_第4张图片

7.2 介绍了注意力机制和图注意力网络(GAT),7.3介绍了R-GCN和知识图谱,旨在解决异构图的问题,详细见书P134-P142。这两种均是GNN通用框架的特殊形式。书上介绍足够简洁。

7.4 GNN的通用框架

三种通用框架:

  1. 消息传播神经网络(Message Passing Neural Network)MPNN
  2. 非局部神经网络(Non-Local Neural Network)NLNN
  3. 图网络(Graph Network)GN

7.4.1 MPNN

基本思路:节点的表示向量通过消息函数M和更新函数U进行K轮消息传播机制的迭代后得到的,传播过程如下:
m i ( k + 1 ) = ∑ v j ∈ N ( v i ) M ( k ) ( h i ( k ) , h j ( k ) , e i j ) h i ( k + 1 ) = U ( k ) ( h i ( k ) , m i ( k + 1 ) ) \pmb m_i^{(k+1)}=\sum_{v_j\in N(v_i)}M^{(k)}(\pmb h_i^{(k)},\pmb h_j^{(k)},\pmb e_{ij} )\\ \pmb h_i(k+1)=U^{(k)} (\pmb h_i^{(k)} ,\pmb m_i^{(k+1)}) mmmi(k+1)=vjN(vi)M(k)(hhhi(k),hhhj(k),eeeij)hhhi(k+1)=U(k)(hhhi(k),mmmi(k+1))
e i j \pmb e_{ij} eeeij表示边上的特征向量,k表示第k次消息传播。

消息函数的输入由边本身以及两侧节点构成,使用RDF三元组表示这样的输入:
Source ⟶ Predict Object \text{Source}\stackrel{\text{Predict}}{\longrightarrow}\text{Object} SourcePredictObject
在消息函数作用下,图里面所有的RDF都会向外广播消息,之后这些消息沿着边方向传播到RDF的两侧节点处进行聚合,聚合后的消息会在之后的更新函数作用下对节点特征进行更新,如下图:

《深入浅出图神经网络》读书笔记(7.GNN的变体与框架)_第5张图片

其实边也是可能具有特征向量的,如果对边始终维护一个状态向量,可以参见GN的做法。

《深入浅出图神经网络》读书笔记(7.GNN的变体与框架)_第6张图片

由于MPNN的消息函数作用于三元组RDF,因此对各种类型的图数据都具有一定适应性,处理方式如下:

  1. 同构图:本身容易处理,唯一特殊的是有向加权图,对于这类图数据,可以把边的正反方向看成两种关系,借用R-GCN的思路进行处理,同时对边上的权重可以考虑进邻接矩阵中当作归一化项一并处理。
  2. 异构图:考虑R-GCN方式,另外如果关系不多,可以将关系编码成one-hot向量当作边上的特征进行处理。
  3. 属性图: 属性图中需要考虑的因素有节点的异构以及边属性。对于前者,如果我们追求工程上的简化处理,在调用MPNN之前可以对不同类型的节点分别送进变换函数里面,将异构的节点变换到同一维度的同一特征空间里,之后当作节点同构的图处理。对于后者,可以参考关系图的处理方式,这里如果边上具有一些属性信息的话,按照消息函数的机制,需要对其进行特征编码(比如类别型属性特征进行onehot编码或者embedding编码)。

7.4.2 NLNN

非局部神经网络是对注意力机制的一般性总结,GAT是它的一个个例,NLNN通过non-local操作将任意位置的输出响应计算为所有位置特征的加权和。位置可以是图像中的空间坐标,也可以是序列数据中的时间坐标。图数据中可以是节点:

non-local操作定义如下:
h i ′ = 1 C ( h ) ∑ ∀ j f ( h i , h j ) g ( h j ) \pmb h_i^{'}=\frac{1}{C(\pmb h)}\sum_{\forall j}f(\pmb h_i,\pmb h_j)g(\pmb h_j) hhhi=C(hhh)1jf(hhhi,hhhj)g(hhhj)
i是输出位置的索引,j是枚举所有可能位置的索引。 f ( h i , h j ) f(\pmb h_i,\pmb h_j) f(hhhi,hhhj)是i和j位置上元素之间的相关度函数, g ( h j ) g(\pmb h_j) g(hhhj)表示对输入 h j \pmb h_j hhhj进行变换的变换函数,因子 1 C ( h ) \frac {1}{C(\pmb h)} C(hhh)1用于归一化。

g一般采用线性变换: g ( h j ) = W g h j g(\pmb h_j)=W_g\pmb h_j g(hhhj)=Wghhhj,这里 W g W_g Wg是需要学习的权重参数。f的一些选择:

  1. 内积
    f ( h i , h j ) = θ ( h i ) T ϕ ( h j ) , 其 中 , θ ( h i ) = W θ h i , ϕ ( h j ) = W ϕ h j , 分 别 表 示 对 输 入 的 一 种 线 性 变 换 , C ( h ) = ∣ h j ∣ f(\pmb h_i,\pmb h_j)=\theta(\pmb h_i)^T\phi(\pmb h_j), \\其中,\theta(\pmb h_i)=W_\theta\pmb h_i,\phi(\pmb h_j)=W_\phi \pmb h_j,分别表示对输入的一种线性变换,C(\pmb h)=|\pmb h_j| f(hhhi,hhhj)=θ(hhhi)Tϕ(hhhj),θ(hhhi)=Wθhhhi,ϕ(hhhj)=Wϕhhhj,线C(hhh)=hhhj

  2. 全连接

    使用输出为一维标量的全连接层定义 f f f:
    f ( h i , h j ) = σ ( w f [ θ ( h i ) ∣ ∣ ϕ ( h j ) ] ) , 其 中 , w f 是 将 向 量 投 影 为 标 量 的 权 重 参 数 , C ( h ) = ∣ h j ∣ f(\pmb h_i,\pmb h_j)=\sigma(w_f[\theta (\pmb h_i)|| \phi(\pmb h_j) ]),\\ 其中,w_f是将向量投影为标量的权重参数,C(\pmb h)=|\pmb h_j| f(hhhi,hhhj)=σ(wf[θ(hhhi)ϕ(hhhj)]),wfC(hhh)=hhhj

  3. 高斯函数
    f ( h i , h j ) = e θ ( h i ) T ϕ ( h j ) , 其 中 , C ( h ) = ∑ ∀ f f ( h i , h j ) f(\pmb h_i,\pmb h_j)=e^{\theta(\pmb h_i)^T\phi(\pmb h_j) },\\其中,C(\pmb h)=\sum_{\forall f}f(\pmb h_i,\pmb h_j) f(hhhi,hhhj)=eθ(hhhi)Tϕ(hhhj)C(hhh)=ff(hhhi,hhhj)
    对于给定的i, 1 C ( h ) \frac{1}{C(\pmb h)} C(hhh)1表示沿维度j进行归一化之后的值,此时 h i ′ = softmax j ( θ ( h i ) ϕ ( h j ) ) g ( h j ) \pmb h_i^{'}=\text{softmax}_j(\theta(\pmb h_i)\phi(\pmb h_j))g(\pmb h_j) hhhi=softmaxj(θ(hhhi)ϕ(hhhj))g(hhhj)。如果自然对数e的幂指数改成全连接形式,就是GAT。

7.4.3 GN

基本计算单元包含3个要素:节点的状态 h \pmb h hhh,边的状态 e i j \pmb e_{ij} eeeij,图的状态 u \pmb u uuu.围绕这3个元素,有三个更新函数 ϕ \phi ϕ,三个聚合函数 ρ \rho ρ,具体如下:
e i j ′ = ϕ e ( e i j , h i , h j , u ) e i ′ ˉ = ρ e → h ( [ e i j ′ , ∀ v j ∈ N ( v i ) ] ) h i ′ = ϕ h ( e i ′ ˉ , h i , u ) e ′ ˉ = ρ e → u ( [ e i j ′ , ∀ v j ∈ E ] ) h ′ ˉ = ρ h → u ( [ h i ′ = ∀ v i ∈ V ] ) u ′ = ϕ u ( e ′ ˉ , h ′ ˉ , u ) \pmb e_{ij}^{'}=\phi^e(\pmb e_{ij},\pmb h_i,\pmb h_j,\pmb u)\\ \bar {\pmb e_i^{'}}=\rho^{e\rightarrow h}([\pmb e_{ij}^{'},\forall v_j\in N(v_i)])\quad\pmb h_i^{'}=\phi^h(\bar {\pmb e_i^{'}},\pmb h_i ,\pmb u )\\ \bar {\pmb e^{'}}=\rho^{e\rightarrow u}([\pmb e_{ij}^{'},\forall v_j\in E])\quad\bar{ \pmb h^{'}}=\rho^{h\rightarrow u}([\pmb h_i^{'}=\forall v_i\in V])\quad \pmb u^{'}=\phi^u(\bar {\pmb e^{'}},\bar {\pmb h^{'}},\pmb u) eeeij=ϕe(eeeij,hhhi,hhhj,uuu)eeeiˉ=ρeh([eeeij,vjN(vi)])hhhi=ϕh(eeeiˉ,hhhi,uuu)eeeˉ=ρeu([eeeij,vjE])hhhˉ=ρhu([hhhi=viV])uuu=ϕu(eeeˉ,hhhˉ,uuu)
r{ \pmb h{'}}=\rho{h\rightarrow u}([\pmb h_i^{‘}=\forall v_i\in V])\quad \pmb u{'}=\phiu(\bar {\pmb e^{’}},\bar {\pmb h^{'}},\pmb u)
$$
GN对图里的节点、边、全图都维护了相应的状态,这三者可以分别对应上节点层面的任务、边层面的任务、全图层面的任务。

你可能感兴趣的:(深入浅出图神经网络,人工智能,算法,python)