在开始正式介绍图卷积之前,我们先花一点篇幅探讨一个问题:为什么研究者们要设计图卷积操作,传统的卷积不能直接用在图上吗? 要理解这个问题,我们首先要理解能够应用传统卷积的**图像(欧式空间)与图(非欧空间)**的区别。
如果把图像中的每个像素点视作一个结点,如下图左侧所示,一张图片就可以看作一个非常稠密的图;下图右侧则是一个普通的图。
阴影部分代表卷积核,左侧是一个传统的卷积核,右侧则是一个图卷积核。卷积代表的含义我们会在后文详细叙述,这里读者可以将其理解为在局部范围内的特征抽取方法。
仔细观察两个图的结构,我们可以发现它们之间有2点非常不一样:
真正的难点聚焦于邻居结点数量不固定上。那么,研究者如何解决这个问题呢?其实说来也很简单,目前主流的研究从2条路来解决这件事:
这两条实际上也是后续图卷积神经网络的设计原则,图卷积的本质是想找到适用于图的可学习卷积核。
上面说了图卷积的核心特征,下面我们先来一窥图卷积神经网络的全貌。如下图所示,输入的是整张图:
Convolution Layer 1
里,对每个结点的邻居都进行一次卷积操作,并用卷积的结果更新该结点;然后经过激活函数如ReLU
,Convolution Layer 2
与一次激活函数;与GNN类似,图卷积神经网络也有一个局部输出函数,用于将结点的状态(包括隐藏状态与结点特征)转换成任务相关的标签,比如水军账号分类,本文中笔者称这种任务为Node-Level
的任务;也有一些任务是对整张图进行分类的,比如化合物分类,本文中笔者称这种任务为Graph-Level
的任务。卷积操作关心每个结点的隐藏状态如何更新,而对于Graph-Level
的任务,它们会在卷积层后加入更多操作,从结点信息得到整张图的表示。
GCN与GNN乍看好像还挺像的,它们根本上的不同:GCN是多层堆叠,比如上图中的Layer 1
和Layer 2
的参数是不同的;GNN是迭代求解,可以看作每一层Layer参数是共享的。
图卷积神经网络主要有两类,一类是基于空域的,另一类则是基于频域的。
通俗点解释,空域可以类比到直接在图片的像素点上进行卷积,而频域可以类比到对图片进行傅里叶变换后,再进行卷积。
傅里叶变换的概念我们先按下不讲,我们先对两类方法的代表模型做个大概介绍。
基于空域卷积的方法直接将卷积操作定义在每个结点的连接关系上,它跟传统的卷积神经网络中的卷积更相似一些。在这个类别中比较有代表性的方法有:
基于频域卷积的方法则从图信号处理起家,包括:
在介绍这些具体的模型前,先让我们从不同的角度来回顾一下卷积的概念,重新思考一下卷积的本质。
由维基百科的介绍我们可以得知,卷积是一种定义在两个函数( f f f跟 g g g)上的数学操作,旨在产生一个新的函数。那么 f f f 和 g g g 的卷积就可以写成 f ∗ g f*g f∗g ,数学定义如下:
( f ∗ g ) ( t ) = ∫ − ∞ ∞ f ( τ ) g ( t − τ ) ( 连 续 形 式 ) (f*g)(t)={\int}_{-\infty}^{\infty}f(\tau)g(t-\tau) (连续形式) (f∗g)(t)=∫−∞∞f(τ)g(t−τ)(连续形式)
( f ∗ g ) ( t ) = ∑ τ = − ∞ ∞ f ( τ ) g ( t − τ ) ( 离 散 形 式 ) (f*g)(t)={\sum}_{\tau=-\infty}^{\infty}f(\tau)g(t-\tau) (离散形式) (f∗g)(t)=∑τ=−∞∞f(τ)g(t−τ)(离散形式)
离散卷积本质就是一种加权求和。
光看数学定义可能会觉得非常抽象,下面我们举一个掷骰子的问题,该实例参考了知乎问题"如何通俗易懂地解释卷积"《如何通俗易懂地解释卷积》的回答。
想象我们现在有两个骰子,两个骰子分别是 f f f 跟 g g g, f ( 1 ) f(1) f(1) 表示骰子 f f f 向上一面为数字 1 1 1 的概率。同时抛掷这两个骰子1次,它们正面朝上数字和为 4 4 4 的概率是多少呢?相信读者很快就能想出它包含了三种情况,分别是:
最后这三种情况出现的概率和即问题的答案,如果写成公式,就是 ∑ τ = 1 3 f ( τ ) g ( 4 − τ ) \sum_{\tau=1}^{3}f(\tau)g(4-\tau) ∑τ=13f(τ)g(4−τ)。可以形象地绘制成下图:
如果稍微扩展一点,比如说我们认为 f ( 0 ) f(0) f(0) 或者 g ( 0 ) g(0) g(0) 等是可以取到的,只是它们的值为 0 而已。那么该公式可以写成 ∑ τ = − ∞ ∞ f ( τ ) g ( 4 − τ ) \sum_{\tau=-\infty}^{\infty}f(\tau)g(4-\tau) ∑τ=−∞∞f(τ)g(4−τ)。仔细观察,这其实就是卷积 ( f ∗ g ) ( 4 ) (f*g)(4) (f∗g)(4)。
如果将它写成内积的形式,卷积其实就是:
[ f ( − ∞ ) , ⋯ , f ( 1 ) , ⋯ , f ( ∞ ) ] ⋅ [ g ( ∞ ) , ⋯ , g ( 3 ) , ⋯ , g ( − ∞ ) ] [f(-\infty),\cdots,f(1),\cdots,f(\infty)] \cdot [g(\infty),\cdots,g(3),\cdots,g(-\infty)] [f(−∞),⋯,f(1),⋯,f(∞)]⋅[g(∞),⋯,g(3),⋯,g(−∞)]
这么一看,是不是就对卷积的名字理解更深刻了呢?
所谓卷积,其实就是把一个函数卷(翻)过来,然后与另一个函数求内积。
对应到不同方面,卷积可以有不同的解释:
下面两个动图就分别对应信号处理《https://en.wikipedia.org/wiki/Convolution》与深度学习中卷积操作的过程《https://mlnotebook.github.io/post/CNN1/》。
直推式学习:训练的节点、预测的节点都必须在同一个图上;比如GCN模型
归纳式学习:训练的节点在图A中,预测的节点在图B中;比如:GraphSAGE、GAT模型;
直觉:基于邻域节点生成当前节点的嵌入向量。【Intuition:Generate node embedding based on local network neighborhoods.】
图中的各个节点使用神经网络聚合来自其邻居的信息【Nodes aggregate information from their neighbors using neural networks】
给定一个图 G \color{D60595}{G} G:
For each node in the graph, a convolutional operator consists of two main steps
GCN 的层类似于CNN里的卷积层,Complete GCN consists of multiple convolutional layers。
GNN(GCN/GraphSAGE/GAT…)通用设计流程
由于在图中顶点的邻居是天然无序的,所以我们希望构造出的聚合函数是对称的(即改变输入的顺序,函数的输出结果不变),同时具有较高的表达能力。
其中汇聚邻域节点信息的聚合函数 AGG ( { h u k , ∀ u ∈ N ( v ) } ) \operatorname{AGG}(\{\textbf{h}_u^{k}, ∀u∈N(v)\}) AGG({huk,∀u∈N(v)}) 可以有多种形式,GCN、GraphSAGE、GAT的不同之处就在于 AGG \operatorname{AGG} AGG 的不同:
将最后一层得到的各个节点的 Embedding喂给损失函数,利用梯度下降算法来训练参数。
如何训练GNN模型来获得各个节点的Embedding?需要为 Embedding定义一个损失函数(Need to define a loss function on the embeddings.)
没有节点标签,利用图的拓扑结构本身作为监督(Use the graph structure as the supervision):相似的节点具有相似的Embedding(“Similar” nodes have similar embeddings)
L = ∑ z u , z v C E ( y u , v , D E C ( z u , z v ) ) \color{red}{\mathcal{L}=\sum_{z_u,z_v}CE\left(y_{u,v},DEC(z_u,z_v)\right)} L=zu,zv∑CE(yu,v,DEC(zu,zv))
采用负采样后,与Word2vec模型的损失函数一样:
Encoder: maps each node to a low-dimensional vector
Similarity function:度量原始网络中节点间的相似性【measure of similarity in the original network】。
Similarity of node u u u and v v v in the original network:
S i m i l a r i t y ( u , v ) Similarity(u,v) Similarity(u,v)
常用的度量原始网络中节点间的相似性 S i m i l a r i t y ( u , v ) Similarity(u,v) Similarity(u,v)的方法:
Decoder:从嵌入到相似性分数的映射【maps from embeddings to the similarity score 】
Similarity of the embedding z u 、 z v z_u、z_v zu、zv:
D E C ( z u T ⋅ z v ) DEC(z_u^T·z_v) DEC(zuT⋅zv)
Optimize the parameters of the encoder so that:
S i m i l a r i t y ( u , v ) ≈ D E C ( z u T ⋅ z v ) Similarity(u,v)≈DEC(z_u^T·z_v) Similarity(u,v)≈DEC(zuT⋅zv)
z u T ⋅ z v z_u^T·z_v zuT⋅zv:dot product between node embeddings
Directly train the model for a supervised task (e.g., node classification)
我们可以发现就本质而言,GCN、GraphSAGE、GAT都是将邻居节点的特征聚合到中心节点上,其实就是一种聚合(aggregate)运算,利用graph上的local stationary学习新的顶点特征表达。
GCN、GraphSAGE、GAT都是一种局部网络。因此,(相比于GNN或GGNN等网络)训练GCN、GraphSAGE、GAT模型无需了解整个图结构,只需知道每个节点的邻节点即可。
不同的是GCN用的是拉普拉斯矩阵,而GAT用的是注意力系数,在一定程度上来说,GAT会更强,因为GAT很好的将顶点的特征之间的相关性融入到了模型之中。相比于GCN,每个节点的重要性可以是不同的,因此,GAT具有更强的表示能力。
X = [ x ⃗ 1 x ⃗ 2 x ⃗ 3 ] = [ x 11 x 12 x 21 x 22 x 31 x 32 ] H 0 = X H l = [ h ⃗ 1 h ⃗ 2 h ⃗ 3 ] = [ h 11 h 12 h 21 h 22 h 31 h 32 ] X=\left[\begin{array}{ll}\vec{x}_1 \\\vec{x}_2\\ \vec{x}_3 \end{array}\right]=\left[\begin{array}{ll}x_{11} & x_{12} \\x_{21} & x_{22} \\ x_{31} & x_{32} \end{array}\right] \quad H^0=X \quad H^l=\left[\begin{array}{ll}\vec{h}_1 \\\vec{h}_2\\ \vec{h}_3 \end{array}\right]=\left[\begin{array}{ll}h_{11} & h_{12} \\h_{21} & h_{22} \\ h_{31} & h_{32} \end{array}\right] X=⎣⎡x1x2x3⎦⎤=⎣⎡x11x21x31x12x22x32⎦⎤H0=XHl=⎣⎢⎡h1h2h3⎦⎥⎤=⎣⎡h11h21h31h12h22h32⎦⎤
W = [ w 11 w 12 w 13 w 14 w 21 w 22 w 23 w 24 ] W=\left[\begin{array}{ll} w_{11} & w_{12} & w_{13} & w_{14} \\ w_{21} & w_{22} & w_{23} & w_{24}\end{array}\right] W=[w11w21w12w22w13w23w14w24]
A = [ a 11 a 12 0 0 a 22 a 23 0 0 a 33 ] A=\left[\begin{array}{lll} a_{11} & a_{12} & 0 \\ 0 & a_{22} & a_{23} \\ 0 & 0 & a_{33} \end{array}\right] A=⎣⎡a1100a12a2200a23a33⎦⎤
其中:
H W = [ y 1 y 2 y 3 ] = [ w 11 h 11 + w 21 h 12 w 12 h 11 + w 22 h 12 w 13 h 11 + w 23 h 12 w 14 h 11 + w 24 h 12 w 11 h 21 + w 21 h 22 w 12 h 21 + w 22 h 22 w 13 h 21 + w 23 h 22 w 14 h 21 + w 24 h 22 w 11 h 31 + w 21 h 32 w 12 h 31 + w 22 h 32 w 13 h 31 + w 23 h 32 w 14 h 31 + w 24 h 32 ] \mathrm{HW}=\left[\begin{array}{l} \boldsymbol{y}_{1} \\ \boldsymbol{y}_{2} \\ \boldsymbol{y}_{3} \end{array}\right]=\left[\begin{array}{ll} w_{11} h_{11}+w_{21} h_{12} & w_{12} h_{11}+w_{22} h_{12} & w_{13} h_{11}+w_{23} h_{12} & w_{14} h_{11}+w_{24} h_{12} \\ w_{11} h_{21}+w_{21} h_{22} & w_{12} h_{21}+w_{22} h_{22} & w_{13} h_{21}+w_{23} h_{22} & w_{14} h_{21}+w_{24} h_{22} \\ w_{11} h_{31}+w_{21} h_{32} & w_{12} h_{31}+w_{22} h_{32} & w_{13} h_{31}+w_{23} h_{32} & w_{14} h_{31}+w_{24} h_{32} \end{array}\right] HW=⎣⎡y1y2y3⎦⎤=⎣⎡w11h11+w21h12w11h21+w21h22w11h31+w21h32w12h11+w22h12w12h21+w22h22w12h31+w22h32w13h11+w23h12w13h21+w23h22w13h31+w23h32w14h11+w24h12w14h21+w24h22w14h31+w24h32⎦⎤
H l + 1 = A H l W = [ a 11 ( w 11 h 11 + w 21 h 12 ) + a 12 ( w 11 h 21 + w 21 h 22 ) a 11 ( w 12 h 11 + w 22 h 12 ) + a 12 ( w 12 h 21 + w 22 h 22 ) a 11 ( w 13 h 11 + w 23 h 12 ) + a 12 ( w 13 h 21 + w 23 h 22 ) a 11 ( w 14 h 11 + w 24 h 12 ) + a 12 ( w 14 h 21 + w 24 h 22 ) a 22 ( w 11 h 21 + w 21 h 22 ) + a 23 ( w 11 h 31 + w 21 h 32 ) a 22 ( w 12 h 21 + w 22 h 22 ) + a 23 ( w 12 h 31 + w 22 h 32 ) a 22 ( w 13 h 21 + w 23 h 22 ) + a 23 ( w 13 h 31 + w 23 h 32 ) a 22 ( w 14 h 21 + w 24 h 22 ) + a 23 ( w 14 h 31 + w 24 h 32 ) a 33 ( w 11 h 31 + w 21 h 32 ) a 33 ( w 12 h 31 + w 22 h 32 ) a 33 ( w 13 h 31 + w 23 h 32 ) a 33 ( w 14 h 31 + w 24 h 32 ) ] H^{l+1}=AH^lW=\left[\begin{array}{cc} a_{11}(w_{11} h_{11}+w_{21} h_{12})+a_{12}(w_{11} h_{21}+w_{21} h_{22}) & a_{11}(w_{12} h_{11}+w_{22} h_{12})+a_{12}(w_{12} h_{21}+w_{22} h_{22}) & a_{11}(w_{13} h_{11}+w_{23} h_{12})+a_{12}(w_{13} h_{21}+w_{23} h_{22}) & a_{11}(w_{14} h_{11}+w_{24} h_{12})+a_{12}(w_{14} h_{21}+w_{24} h_{22}) \\ a_{22}(w_{11} h_{21}+w_{21} h_{22})+a_{23}(w_{11} h_{31}+w_{21} h_{32}) & a_{22}(w_{12} h_{21}+w_{22} h_{22})+a_{23}(w_{12} h_{31}+w_{22} h_{32}) & a_{22}(w_{13} h_{21}+w_{23} h_{22})+a_{23}(w_{13} h_{31}+w_{23} h_{32})& a_{22}(w_{14} h_{21}+w_{24} h_{22})+a_{23}(w_{14} h_{31}+w_{24} h_{32}) \\ a_{33(}w_{11} h_{31}+w_{21} h_{32}) & a_{33}(w_{12} h_{31}+w_{22} h_{32}) & a_{33}(w_{13} h_{31}+w_{23} h_{32}) & a_{33}(w_{14} h_{31}+w_{24} h_{32}) \end{array}\right] Hl+1=AHlW=⎣⎡a11(w11h11+w21h12)+a12(w11h21+w21h22)a22(w11h21+w21h22)+a23(w11h31+w21h32)a33(w11h31+w21h32)a11(w12h11+w22h12)+a12(w12h21+w22h22)a22(w12h21+w22h22)+a23(w12h31+w22h32)a33(w12h31+w22h32)a11(w13h11+w23h12)+a12(w13h21+w23h22)a22(w13h21+w23h22)+a23(w13h31+w23h32)a33(w13h31+w23h32)a11(w14h11+w24h12)+a12(w14h21+w24h22)a22(w14h21+w24h22)+a23(w14h31+w24h32)a33(w14h31+w24h32)⎦⎤
A G C N = [ 1 1 0 0 1 1 0 0 1 ] A^{GCN}=\left[\begin{array}{lll} 1 & 1 & 0 \\ 0 & 1 & 1 \\ 0 & 0 & 1 \end{array}\right] \quad AGCN=⎣⎡100110011⎦⎤
GCN使用的是 A G C N A^{GCN} AGCN【单层GCN(下面的公式忽略激活函数)】【Weights in average depends on degree of neighbouring nodes】:
H l + 1 = A G C N H l W = [ ( w 11 h 11 + w 21 h 12 ) + ( w 11 h 21 + w 21 h 22 ) ( w 12 h 11 + w 22 h 12 ) + ( w 12 h 21 + w 22 h 22 ) ( w 13 h 11 + w 23 h 12 ) + ( w 13 h 21 + w 23 h 22 ) ( w 14 h 11 + w 24 h 12 ) + ( w 14 h 21 + w 24 h 22 ) ( w 11 h 21 + w 21 h 22 ) + ( w 11 h 31 + w 21 h 32 ) ( w 12 h 21 + w 22 h 22 ) + ( w 12 h 31 + w 22 h 32 ) ( w 13 h 21 + w 23 h 22 ) + ( w 13 h 31 + w 23 h 32 ) ( w 14 h 21 + w 24 h 22 ) + ( w 14 h 31 + w 24 h 32 ) w 11 h 31 + w 21 h 32 w 12 h 31 + w 22 h 32 w 13 h 31 + w 23 h 32 w 14 h 31 + w 24 h 32 ] H^{l+1}=A^{GCN}H^lW=\left[\begin{array}{cc} (w_{11} h_{11}+w_{21} h_{12})+(w_{11} h_{21}+w_{21} h_{22}) & (w_{12} h_{11}+w_{22} h_{12})+(w_{12} h_{21}+w_{22} h_{22}) & (w_{13} h_{11}+w_{23} h_{12})+(w_{13} h_{21}+w_{23} h_{22})& (w_{14} h_{11}+w_{24} h_{12})+(w_{14} h_{21}+w_{24} h_{22}) \\ (w_{11} h_{21}+w_{21} h_{22})+(w_{11} h_{31}+w_{21} h_{32}) & (w_{12} h_{21}+w_{22} h_{22})+(w_{12} h_{31}+w_{22} h_{32}) & (w_{13} h_{21}+w_{23} h_{22})+(w_{13} h_{31}+w_{23} h_{32}) & (w_{14} h_{21}+w_{24} h_{22})+(w_{14} h_{31}+w_{24} h_{32}) \\ w_{11} h_{31}+w_{21} h_{32} & w_{12} h_{31}+w_{22} h_{32} & w_{13} h_{31}+w_{23} h_{32} & w_{14} h_{31}+w_{24} h_{32} \end{array}\right] Hl+1=AGCNHlW=⎣⎡(w11h11+w21h12)+(w11h21+w21h22)(w11h21+w21h22)+(w11h31+w21h32)w11h31+w21h32(w12h11+w22h12)+(w12h21+w22h22)(w12h21+w22h22)+(w12h31+w22h32)w12h31+w22h32(w13h11+w23h12)+(w13h21+w23h22)(w13h21+w23h22)+(w13h31+w23h32)w13h31+w23h32(w14h11+w24h12)+(w14h21+w24h22)(w14h21+w24h22)+(w14h31+w24h32)w14h31+w24h32⎦⎤
A G A T = [ α 11 α 12 0 0 α 22 α 23 0 0 α 33 ] A^{GAT}=\left[\begin{array}{lll} α_{11} & α_{12} & 0 \\ 0 & α_{22} & α_{23} \\ 0 & 0 & α_{33} \end{array}\right] AGAT=⎣⎡α1100α12α2200α23α33⎦⎤
GAT使用的是 A G A T A^{GAT} AGAT【GAT使用 self-attention为每个邻节点分配权重(下面的公式忽略激活函数)】【Weights computed by a self-attention mechanism based on node features】:
H l + 1 = A G A T H l W = [ α 11 ( w 11 h 11 + w 21 h 12 ) + α 12 ( w 11 h 21 + w 21 h 22 ) α 11 ( w 12 h 11 + w 22 h 12 ) + α 12 ( w 12 h 21 + w 22 h 22 ) α 11 ( w 13 h 11 + w 23 h 12 ) + α 12 ( w 13 h 21 + w 23 h 22 ) α 11 ( w 14 h 11 + w 24 h 12 ) + α 12 ( w 14 h 21 + w 24 h 22 ) α 22 ( w 11 h 21 + w 21 h 22 ) + α 23 ( w 11 h 31 + w 21 h 32 ) α 22 ( w 12 h 21 + w 22 h 22 ) + α 23 ( w 12 h 31 + w 22 h 32 ) α 22 ( w 13 h 21 + w 23 h 22 ) + α 23 ( w 13 h 31 + w 23 h 32 ) α 22 ( w 14 h 21 + w 24 h 22 ) + α 23 ( w 14 h 31 + w 24 h 32 ) α 33 ( w 11 h 31 + w 21 h 32 ) α 33 ( w 12 h 31 + w 22 h 32 ) α 33 ( w 13 h 31 + w 23 h 32 ) α 33 ( w 14 h 31 + w 24 h 32 ) ] H^{l+1}=A^{GAT}H^lW=\left[\begin{array}{cc} α_{11}(w_{11} h_{11}+w_{21} h_{12})+α_{12}(w_{11} h_{21}+w_{21} h_{22}) & α_{11}(w_{12} h_{11}+w_{22} h_{12})+α_{12}(w_{12} h_{21}+w_{22} h_{22}) & α_{11}(w_{13} h_{11}+w_{23} h_{12})+α_{12}(w_{13} h_{21}+w_{23} h_{22}) & α_{11}(w_{14} h_{11}+w_{24} h_{12})+α_{12}(w_{14} h_{21}+w_{24} h_{22}) \\ α_{22}(w_{11} h_{21}+w_{21} h_{22})+α_{23}(w_{11} h_{31}+w_{21} h_{32}) & α_{22}(w_{12} h_{21}+w_{22} h_{22})+α_{23}(w_{12} h_{31}+w_{22} h_{32}) & α_{22}(w_{13} h_{21}+w_{23} h_{22})+α_{23}(w_{13} h_{31}+w_{23} h_{32})& α_{22}(w_{14} h_{21}+w_{24} h_{22})+α_{23}(w_{14} h_{31}+w_{24} h_{32}) \\ α_{33(}w_{11} h_{31}+w_{21} h_{32}) & α_{33}(w_{12} h_{31}+w_{22} h_{32}) & α_{33}(w_{13} h_{31}+w_{23} h_{32}) & α_{33}(w_{14} h_{31}+w_{24} h_{32}) \end{array}\right] Hl+1=AGATHlW=⎣⎡α11(w11h11+w21h12)+α12(w11h21+w21h22)α22(w11h21+w21h22)+α23(w11h31+w21h32)α33(w11h31+w21h32)α11(w12h11+w22h12)+α12(w12h21+w22h22)α22(w12h21+w22h22)+α23(w12h31+w22h32)α33(w12h31+w22h32)α11(w13h11+w23h12)+α12(w13h21+w23h22)α22(w13h21+w23h22)+α23(w13h31+w23h32)α33(w13h31+w23h32)α11(w14h11+w24h12)+α12(w14h21+w24h22)α22(w14h21+w24h22)+α23(w14h31+w24h32)α33(w14h31+w24h32)⎦⎤
参考资料:
从GNN到GCN(1)–传统GCN和基于空域的MPNN及GraphSage
如何通俗易懂地解释卷积?
从CNN到GCN的联系与区别——GCN从入门到精(fang)通(qi)
技术思辨:GCN和CNN到底有什么差别?
CNN与GCN的区别、联系及融合
GCN、GAT、GraphSAGE的优势很明显,想问一下它们分别有什么缺点?
GCN、GAT、GraphSAGE 的优势很明显,想问一下它们分别有什么缺点?
如何通俗易懂地解释卷积?
(三)图神经网络消息传递