系列文章
《Graph Representation Learning》笔记 Chapter2
《Graph Representation Learning》笔记 Chapter3
《Graph Representation Learning》笔记 Chapter4
为了生成整张图的 embedding ,我们可以将邻接矩阵展平后输入到多层感知机 (MLP) 中
z G = M L P ( A [ 1 ] ⊕ A [ 2 ] ⊕ . . . ⊕ A [ ∣ V ∣ ] ) z_{\mathcal{G}} = MLP(A[1] \oplus A[2] \oplus ... \oplus A[|\mathcal{V}|]) zG=MLP(A[1]⊕A[2]⊕...⊕A[∣V∣])
其中, A [ i ] ∈ R ∣ V ∣ A[i] ∈ R^{|\mathcal{V}|} A[i]∈R∣V∣ 表示邻接矩阵的第 i i i 行,使用 ⊕ \oplus ⊕ 代表向量拼接。
这种方法高度依赖于邻接矩阵中节点的顺序,我们所期望的模型需要具有排列不变性或排列相等性,这两种性质可用数学公式表示为
f ( P A P T ) = f ( A ) ( 排 列 不 变 性 ) f ( P A P T ) = P f ( A ) ( 排 列 相 等 性 ) \begin{aligned} f(PAP^T) = f(A) &(排列不变性)\\ f(PAP^T) = Pf(A) &(排列相等性) \end{aligned} f(PAPT)=f(A)f(PAPT)=Pf(A)(排列不变性)(排列相等性)
其中, f f f 为我们所期望的模型, P P P 为排列矩阵, P A P T PAP^T PAPT 表示将邻接矩阵先进行行变换再进行相同规则的列变换,即变换节点在邻接矩阵中所处的顺序。
我们将讨论图神经网络 (GNN) 结构如何用于产生子图和整图的 embeddings 。
GNN 在每次信息传递迭代时,每个 hidden embedding h u ( k ) , u ∈ V h_u^{(k)}, u ∈ \mathcal{V} hu(k),u∈V 被更新通过聚合 u u u 的邻域 N ( u ) \mathcal{N}(u) N(u) 的信息,如下图所示
它的数学表达示为
h u ( k + 1 ) = U P D A T E ( k ) ( h u ( k ) , A G G R E G A T E ( k ) ( { h v ( k ) , ∀ v ∈ N ( u ) } ) ) = U P D A T E ( k ) ( h u ( k ) , m N ( u ) ( k ) ) \begin{aligned} h_u^{(k+1)} &= UPDATE^{(k)}(h_u^{(k)}, AGGREGATE^{(k)}(\{h_v^{(k)}, \forall{v} ∈ \mathcal{N}(u)\})) \\ &= UPDATE^{(k)}(h_u^{(k)}, m_\mathcal{N(u)}^{(k)}) \end{aligned} hu(k+1)=UPDATE(k)(hu(k),AGGREGATE(k)({hv(k),∀v∈N(u)}))=UPDATE(k)(hu(k),mN(u)(k))
其中, U P D A T E UPDATE UPDATE 和 A G G R E G A T E AGGREGATE AGGREGATE 是任意的可微函数, m N ( u ) m_\mathcal{N(u)} mN(u) 是节点 u u u 邻域 N ( u ) \mathcal{N}(u) N(u) 的信息聚合。
在 K K K 次迭代(信息传递)后,我们可以用最后一层的输出来定义每个节点的 embeddings
z u = h u ( K ) , ∀ u ∈ V z_u = h_u^{(K)}, \forall{u} ∈ \mathcal{V} zu=hu(K),∀u∈V
基本 GNN 信息传递被定义为
h u ( k ) = σ ( W s e l f ( k ) h u ( k − 1 ) + W n e i g h ( k ) ∑ v ∈ N ( u ) h v ( k − 1 ) + b ( k ) ) h_u^{(k)} = σ(W_{self}^{(k)}h_u^{(k-1)} + W_{neigh}^{(k)}\sum_{v ∈ \mathcal{N}(u)}h_v^{(k-1)} + b^{(k)}) hu(k)=σ(Wself(k)hu(k−1)+Wneigh(k)v∈N(u)∑hv(k−1)+b(k))
其中, W s e l f ( k ) , W n e i g h ( k ) ∈ R d ( k ) × d ( k − 1 ) W_{self}^{(k)}, W_{neigh}^{(k)} ∈ \mathbb{R}^{d^{(k)} × d^{(k-1)}} Wself(k),Wneigh(k)∈Rd(k)×d(k−1) 是可训练的参数矩阵, σ σ σ 表示非线性函数。为了表述简洁,下文中的偏置 b ( k ) ∈ R d ( k ) b^{(k)} ∈ \mathbb{R}^{d^{(k)}} b(k)∈Rd(k) 会省略,但不可忽视。
定义 U P G A T E UPGATE UPGATE 和 A G G R E G A T E AGGREGATE AGGREGATE 函数
m N ( u ) = A G G R E G A T E ( { h v , ∀ v ∈ N ( u ) } ) = ∑ v ∈ N ( u ) h v U P D A T E ( h u , m N ( u ) ) = σ ( W s e l f h u + W n e i g h m N ( u ) ) m_{\mathcal{N}(u)} = AGGREGATE(\{h_v, \forall{v} ∈ \mathcal{N}(u)\}) = \sum_{v ∈ \mathcal{N}(u)}h_v \\ UPDATE(h_u, m_\mathcal{N(u)}) = σ(W_{self}h_u + W_{neigh}m_{\mathcal{N}(u)}) mN(u)=AGGREGATE({hv,∀v∈N(u)})=v∈N(u)∑hvUPDATE(hu,mN(u))=σ(Wselfhu+WneighmN(u))
同样为了表述简洁,我们省略了式中的上角标。
我们可以简洁地定义整图级别的 GNN 模型
H ( t ) = σ ( A H ( k − 1 ) W n e i g h k + H ( k − 1 ) W s e l f ( k ) ) H^{(t)} = σ(AH^{(k-1)}W_{neigh}^{k} + H^{(k-1)}W_{self}^{(k)}) H(t)=σ(AH(k−1)Wneighk+H(k−1)Wself(k))
式中 H ( k ) ∈ R ∣ V ∣ × d H^{(k)} ∈ \mathbb{R}^{|V| × d} H(k)∈R∣V∣×d 表示第 t 层 GNN 输出的节点 embeddings 的集合(按行排列)。
为了简化信息传播方法,我们加入了自循环机制,定义为
h u ( k ) = A G G R E G A T E ( { h v ( k − 1 ) , ∀ v ∈ N ( u ) ∪ { u } } ) ) h_u^{(k)} = AGGREGATE(\{h_v^{(k-1)}, \forall{v} ∈ \mathcal{N}(u) \cup \{u\} \})) hu(k)=AGGREGATE({hv(k−1),∀v∈N(u)∪{u}}))
现在, AGGREGATE 的输入变为了集合 N ( u ) ∪ { u } \mathcal{N}(u) \cup \{u\} N(u)∪{u} ,不需要额外定义 U P D A T E UPDATE UPDATE 函数,这中方法减轻了过拟合现象,但是节点邻域的信息与该节点的信息在聚合时并没有区分开。
对于整图来说,自循环机制相当于将 W s e l f W_{self} Wself 和 W n e i g h W_{neigh} Wneigh 的参数进行共享,表达式变为
H ( t ) = σ ( ( A + I ) H ( t − 1 ) W ( t ) ) H^{(t)} = σ((A+I)H^{(t-1)}W^{(t)}) H(t)=σ((A+I)H(t−1)W(t))
当不同节点所对应的邻域节点数差距过大时,会导致数值的不稳定以及优化困难。一个解决方法是通过节点的 degrees 来标准化 A G G R E G A T E AGGREGATE AGGREGATE 操作,如下所示
m N ( u ) = ∑ v ∈ N ( u ) h v ∣ N ( u ) ∣ m_{\mathcal{N}(u)} = \frac{\sum_{v ∈ \mathcal{N}(u)}h_v}{|\mathcal{N}(u)|} mN(u)=∣N(u)∣∑v∈N(u)hv
下面的对称标准化也能起到不错的效果
m N ( u ) = ∑ v ∈ N ( u ) h v ∣ N ( u ) ∣ ∣ N ( v ) ∣ m_{\mathcal{N}(u)} = \sum_{v ∈ \mathcal{N}(u)} \frac{h_v}{\sqrt{|\mathcal{N}(u)||\mathcal{N}(v)|}} mN(u)=v∈N(u)∑∣N(u)∣∣N(v)∣hv
GCN 模型定义信息传递函数为
h u ( k ) = σ ( W ( k ) ∑ v ∈ N ( u ) ∪ { u } h v ∣ N ( u ) ∣ ∣ N ( v ) ∣ ) h_u^{(k)} = σ(W^{(k)}\sum_{v ∈ \mathcal{N}(u) \cup \{u\} } \frac{h_v}{\sqrt{|\mathcal{N}(u)||\mathcal{N}(v)|}}) hu(k)=σ(W(k)v∈N(u)∪{u}∑∣N(u)∣∣N(v)∣hv)
我们需要基于上文提到的排列不变性来定义 AGGREGATE 函数, Zaheer 定义了如下函数
m N ( u ) = M L P θ ( ∑ v ∈ N M L P ϕ ( h v ) ) m_{\mathcal{N}(u)} = MLP_θ(\sum_{v ∈ N}MLP_{\phi}(h_v)) mN(u)=MLPθ(v∈N∑MLPϕ(hv))
其中, M L P θ MLP_θ MLPθ 代表有着可训练参数 θ θ θ 的多层感知机。
Janossy pooling 计算所有可能的排列输入产生的结果进行平均
m N ( u ) = M L P θ ( 1 ∣ Π ∣ ∑ π i ∈ Π ρ ϕ ( h v 1 , h v 2 , . . . , h v ∣ N ( u ) ∣ ) π i ) m_{\mathcal{N}(u)} = MLP_θ(\frac{1}{|\Pi|} \sum_{\pi_i ∈ \Pi} ρ_{\phi}(h_{v_1}, h_{v_2}, ..., h_{v_{|\mathcal{N}(u)|}})_{\pi_i}) mN(u)=MLPθ(∣Π∣1πi∈Π∑ρϕ(hv1,hv2,...,hv∣N(u)∣)πi)
其中, Π \Pi Π 表示排列函数 π i \pi_i πi 的集合, ρ ϕ ρ_{\phi} ρϕ 为序列输入的函数,如 LSTM 。
第一个引入注意力机制的GNN模型为 Graph Attention Network(GAT) ,它使用注意力权重来聚合邻域信息
m N ( u ) = ∑ v ∈ N ( u ) α u , v h v m_{\mathcal{N}(u)} = \sum_{v ∈ \mathcal{N}(u)} α_{u, v}h_v \\ mN(u)=v∈N(u)∑αu,vhv
其中, α u , v α_{u, v} αu,v 代表注意力权重。有的注意力权重被定义为
α u , v = e x p ( a T [ W h u ⊕ W h v ] ) ∑ v ′ ∈ N ( u ) e x p ( a T [ W h u ⊕ W h v ′ ] ) α_{u, v} = \frac{exp(a^T[Wh_u \oplus Wh_v])}{\sum_{v' ∈ \mathcal{N}(u)} exp(a^T[Wh_u \oplus Wh_{v'}])} αu,v=∑v′∈N(u)exp(aT[Whu⊕Whv′])exp(aT[Whu⊕Whv])
其中, a a a 是一个可训练的注意力向量, W W W 是一个可训练的矩阵, ⊕ \oplus ⊕ 代表向量拼接操作。
令一种流行的注意力权重被定义为
α u , v = e x p ( h u T W h v ) ∑ v ′ ∈ N ( u ) e x p ( h u T W h v ′ ) α_{u, v} = \frac{exp(h_u^TWh_v)}{\sum_{v' ∈ \mathcal{N}(u)} exp(h_u^TWh_{v'})} αu,v=∑v′∈N(u)exp(huTWhv′)exp(huTWhv)
有人使用 MLPs 来计算注意力权重
α u , v = e x p ( M L P ( h u , h v ) ) ∑ v ′ ∈ N ( u ) e x p ( M L P ( h u , h v ′ ) ) α_{u, v} = \frac{exp(MLP(h_u, h_v))}{\sum_{v' ∈ \mathcal{N}(u)} exp(MLP(h_u, h_{v'}))} αu,v=∑v′∈N(u)exp(MLP(hu,hv′))exp(MLP(hu,hv))
其中, M L P MLP MLP 被限制为一个标量输出。
有人将 transformer 结构引入 GNN ,这种方法使用不同参数的注意力层计算 K K K 个不同的注意力权重 α u , v , k α_{u, v, k} αu,v,k ,在信息 A G G R E G A T E AGGREGATE AGGREGATE 时,先使用这些权重进行信息 transform ,在将变化后的信息堆积在一起,表达式如下
m N ( u ) = [ a 1 ⊕ a 2 ⊕ . . . ⊕ a K ] a k = W i ∑ v ∈ N ( u ) α u , v , k h v m_{\mathcal{N}(u)} = [a_1 \oplus a_2 \oplus ... \oplus a_K] \\ a_k = W_i \sum_{v ∈ \mathcal{N}(u)} α_{u, v, k} h_v mN(u)=[a1⊕a2⊕...⊕aK]ak=Wiv∈N(u)∑αu,v,khv
在 GNN 中,对于任意节点对,我们可以通过雅可比矩阵量化 u u u 对 v v v 的影响
I K ( u , v ) = 1 T ( δ h v ( K ) δ h u ( 0 ) ) 1 I_K(u, v) = \bm1^T(\frac{δh_v^{(K)}}{δh_u^{(0)}}) \bm1 IK(u,v)=1T(δhu(0)δhv(K))1
其中, 1 \bm1 1 为全1向量。
对于自循环方法来说,信息 A G G R E G A T E AGGREGATE AGGREGATE 函数表示如下
A G G R E G A T E ( { h v , ∀ v ∈ N ( u ) ∪ { u } } ) = 1 f n ( ∣ N ( u ) ∪ { u } ∣ ) ∑ v ∈ N ( u ) ∪ { u } h v AGGREGATE(\{h_v, \forall{v} ∈ \mathcal{N}(u) \cup \{u\} \}) = \frac{1}{f_n(|\mathcal{N}(u) \cup \{u\}|)} \sum_{v ∈ \mathcal{N}(u) \cup \{u\} h_v} AGGREGATE({hv,∀v∈N(u)∪{u}})=fn(∣N(u)∪{u}∣)1v∈N(u)∪{u}hv∑
其中, f : R + → R + f: \mathbb{R}^+ \rightarrow \mathbb{R}^+ f:R+→R+ 是标准化函数。
我们知道
I K ( u , v ) ∝ p G , K ( u ∣ v ) I_K(u, v) \propto p_{\mathcal{G}, K}(u | v) IK(u,v)∝pG,K(u∣v)
其中, p G , K ( u ∣ v ) p_{\mathcal{G}, K}(u | v) pG,K(u∣v) 代表节点 u u u 以长度为 K K K 的随机路径移动到节点 v v v 的概率。当 K → ∞ K \rightarrow ∞ K→∞ 时,对于任意节点对, p G , K ( u ∣ v ) p_{\mathcal{G}, K}(u | v) pG,K(u∣v) 趋于相同,导致邻域信息丢失,即出现过平滑现象。
将基本 U P D A T E UPDATE UPDATE 的输出与节点的上一层 embedding 拼接,可以在信息传递中保持更多的节点信息
U P D A T E c o n c a t ( h u , m N ( u ) ) = [ U P D A T E b a s e ( h u , m N ( u ) ) ⊕ h u ] UPDATE_{concat}(h_u, m_{\mathcal{N}(u)}) = [UPDATE_{base}(h_u, m_{\mathcal{N}(u)}) \oplus h_u] UPDATEconcat(hu,mN(u))=[UPDATEbase(hu,mN(u))⊕hu]
除了拼接,其他方式的 skip-connections 也可被使用,比如说线性插值方法,如下所示
U P D A T E i n t e r p o l a t e ( h u , m N ( u ) ) = α 1 ∘ U P D A T E b a s e ( h u , m N ( u ) ) + α 2 ⊙ h u UPDATE_{interpolate}(h_u, m_{\mathcal{N}(u)}) = \alpha_1 \circ UPDATE_{base}(h_u, m_{\mathcal{N}(u)}) + \alpha_2 \odot h_u UPDATEinterpolate(hu,mN(u))=α1∘UPDATEbase(hu,mN(u))+α2⊙hu
其中, α 1 , α 2 ∈ [ 0 , 1 ] d \alpha_1, \alpha_2 ∈ [0, 1]^d α1,α2∈[0,1]d 为门控向量, α 2 = 1 − α 1 \alpha_2 = 1 - \alpha_1 α2=1−α1 , ∘ \circ ∘ 代表 Hadamard 积。
我们也可以通过观测值使用门控循环单元( gated recurrent unit, GRU )来更新隐藏状态
h u ( k ) = G R U ( h u ( k − 1 ) , m N ( u ) ( k ) ) h_u^{(k)} = GRU(h_u^{(k-1)}, m_{\mathcal{N(u)}}^{(k)}) hu(k)=GRU(hu(k−1),mN(u)(k))
简单的在信息传递中利用每层的节点表示也可以提升最终的节点表示 z u z_u zu
z u = f J K ( h u ( 0 ) ⊕ h u ( 1 ) ⊕ . . . ⊕ h u ( K ) ) z_u = f_{JK}(h_u^{(0)} \oplus h_u^{(1)} \oplus ... \oplus h_u^{(K)}) zu=fJK(hu(0)⊕hu(1)⊕...⊕hu(K))
其中, f J K f_{JK} fJK 为任意函数。
aggregation 方法可以通过在每种关系上指定一个单独的转移矩阵来适应多关系情况
m N ( u ) = ∑ τ ∈ R ∑ v ∈ N τ ( u ) W τ h v f n ( N ( u ) , N ( v ) ) m_{\mathcal{N}(u)} = \sum_{\tau ∈ \mathcal{R}} \sum_{v ∈ \mathcal{N}_{\tau}(u)} \frac{W_{\tau}h_v}{f_n(\mathcal{N}(u), \mathcal{N}(v))} mN(u)=τ∈R∑v∈Nτ(u)∑fn(N(u),N(v))Wτhv
其中, f n f_n fn 是一个标准化函数, R \mathcal{R} R 为存在的关系, W τ W_{\tau} Wτ 为关系矩阵。
上述方法的参数过多,所以有人提出了共享参数的方法
W τ = ∑ i = 1 b α i , τ B i W_{\tau} = \sum_{i=1}^b \alpha_{i, \tau} B_i Wτ=i=1∑bαi,τBi
关系矩阵 W τ W_{\tau} Wτ 被定义为 b 个基本矩阵 B 1 , . . . , B b B_1, ..., B_b B1,...,Bb 的线性叠加,权重为 α 1 , τ , . . . , α b , τ \alpha_{1, \tau}, ..., \alpha_{b, \tau} α1,τ,...,αb,τ 。
aggregate 函数表示为
m N ( u ) = ∑ τ ∈ R ∑ v ∈ N τ ( u ) α τ × B × h v f n ( N ( u ) , N ( v ) ) m_{\mathcal{N}(u)} = \sum_{\tau ∈ \mathcal{R}} \sum_{v ∈ \mathcal{N}_{\tau}(u)} \frac{\alpha_{\tau} \times \mathcal{B} \times h_v}{f_n(\mathcal{N}(u), \mathcal{N}(v))} mN(u)=τ∈R∑v∈Nτ(u)∑fn(N(u),N(v))ατ×B×hv
其中, B = ( B 1 , . . . , B b ) \mathcal{B} = (B_1, ..., B_b) B=(B1,...,Bb) 为堆积所有基本矩阵 B i B_i Bi 的张量, α τ = ( α 1 , τ , . . . , α b , τ ) \alpha_{\tau} = (\alpha_{1, \tau}, ..., \alpha_{b, \tau}) ατ=(α1,τ,...,αb,τ) 为关系 τ \tau τ 中的权重向量。
定义一个新的 aggregation 函数
m N ( u ) = A G G R E F A T E b a s e ( { h v ⊕ e ( u , τ , v ) , ∀ v ∈ N ( u ) } ) m_{\mathcal{N}(u)} = AGGREFATE_{base}(\{ h_v \oplus e_{(u, \tau, v)}, \forall v ∈ \mathcal{N}(u) \}) mN(u)=AGGREFATEbase({hv⊕e(u,τ,v),∀v∈N(u)})
其中, e ( u , τ , v ) e_{(u, \tau, v)} e(u,τ,v) 代表边缘 ( u , τ , v ) (u, \tau, v) (u,τ,v) 的特征向量。
我们想要设计一个能将节点嵌入 { z 1 , z ∣ V ∣ } \{z_1, z_{|V|}\} {z1,z∣V∣} 映射至图嵌入 z G z_\mathcal{G} zG 的池化函数 f p f_p fp 。
第一种方法是简单的取节点嵌入的和或平均
z G = ∑ v ∈ V z v f n ( ∣ V ∣ ) z_{\mathcal{G}} = \frac{\sum_{v ∈ \mathcal{V}}z_v}{f_n(|\mathcal{V}|)} zG=fn(∣V∣)∑v∈Vzv
第二种方法结合了 LSTM 和注意力机制,需要迭代 t = 1 , . . . , T t=1, ..., T t=1,...,T 步
q t = L S T M ( o t − 1 , q t − 1 ) e v , t = f a ( z v , q t ) , ∀ v ∈ V a v , t = e x p ( e v , t ) ∑ u ∈ V e u , t , ∀ v ∈ V o t = ∑ v ∈ V a v , t z v q_t = LSTM(o_{t-1}, q_{t-1}) \\ e_{v, t} = f_a(z_v, q_t), \forall v ∈ \mathcal{V} \\ a_{v, t} = \frac{exp(e_{v, t})}{\sum_{u ∈ \mathcal{V}}e_{u, t}}, \forall v ∈ \mathcal{V} \\ o_t = \sum_{v ∈ \mathcal{V}} a_{v, t}z_v qt=LSTM(ot−1,qt−1)ev,t=fa(zv,qt),∀v∈Vav,t=∑u∈Veu,texp(ev,t),∀v∈Vot=v∈V∑av,tzv
其中, q t q_t qt 向量代表第 t t t 轮的查询向量,由上一轮的观测向量和查询向量计算而成。 f a : R d × R d → R f_a: \mathbb{R}^d \times \mathbb{R}^d \rightarrow \mathbb{R} fa:Rd×Rd→R 代表注意力函数, e v , t e_{v, t} ev,t 代表 第 t t t 轮的注意力分数,将注意力分数规则化后变为 a v , t a_{v, t} av,t。最终,将节点嵌入加权相加后得到观测向量。 q 0 q_0 q0 和 o 0 o_0 o0 初始化为全零向量,整图嵌入表示为
z G = o 1 ⊕ o 2 ⊕ . . . ⊕ o T z_{\mathcal{G}} = o_1 \oplus o_2 \oplus ... \oplus o_T zG=o1⊕o2⊕...⊕oT
假定我们由一些聚类函数将所有节点分配到 c c c 个簇中
f c → G × R ∣ V ∣ × d → R + ∣ V ∣ × c S = f c ( G , Z ) f_c \rightarrow \mathcal{G} \times \mathbb{R}^{|V| \times d} \rightarrow \mathbb{R}^{+|V| \times c} \\ S = f_c(\mathcal{G}, Z) fc→G×R∣V∣×d→R+∣V∣×cS=fc(G,Z)
其中, S [ u , i ] ∈ R + S[u, i] ∈ \mathbb{R}^+ S[u,i]∈R+ 代表节点 u u u 和簇 i i i 的联系强度。
修改邻接矩阵使其表示簇和簇之间的连接强度
A n e w = S T A S ∈ R + c × c A^{new} = S^TAS ∈ \mathbb{R}^{+c \times c} Anew=STAS∈R+c×c
修改嵌入矩阵使其表示簇嵌入
X n e w = S T X ∈ R c × d X^{new} = S^T X ∈ \mathbb{R} ^{c \times d} Xnew=STX∈Rc×d
每一轮进行迭代,簇会越来越少,最终形成一个充分粗糙的图嵌入
信息传递还需利用边和整图的信息,传递方式如下所示
h ( u , v ) ( k ) = U P D A T E e d g e ( h ( u , v ) ( k − 1 ) , h u ( k − 1 ) , h v ( k − 1 ) , h G ( k − 1 ) ) m N ( u ) = A G G R E G A T E n o d e ( { h ( u , v ) ( k ) , ∀ v ∈ N ( u ) } ) h u ( k ) = U P D A T E n o d e ( h u ( k − 1 ) , m N ( u ) , h G ( k − 1 ) ) h G ( k ) = U P D A T E g r a p h ( h G ( k − 1 ) , { h u ( k ) , ∀ u ∈ V } , { h ( u , v ) ( k ) , ∀ ( u , v ) ∈ E } ) h_{(u, v)}^{(k)} = UPDATE_{edge} (h_{(u, v)}^{(k-1)}, h_u^{(k-1)}, h_v^{(k-1)}, h_{\mathcal{G}}^{(k-1)}) \\ m_{\mathcal{N}(u)} = AGGREGATE_{node} (\{ h_{(u, v)}^{(k)}, \forall v ∈ \mathcal{N}(u) \}) \\ h_u^{(k)} = UPDATE_{node} (h_u^{(k-1)}, m_{\mathcal{N}(u)}, h_{\mathcal{G}}^{(k-1)}) \\ h_{\mathcal{G}}^{(k)} = UPDATE_{graph}(h_{\mathcal{G}}^{(k-1)}, \{ h_u^{(k)}, \forall u ∈ \mathcal{V} \}, \{ h_{(u, v)}^{(k)}, \forall (u, v) ∈ \mathcal{E} \}) h(u,v)(k)=UPDATEedge(h(u,v)(k−1),hu(k−1),hv(k−1),hG(k−1))mN(u)=AGGREGATEnode({h(u,v)(k),∀v∈N(u)})hu(k)=UPDATEnode(hu(k−1),mN(u),hG(k−1))hG(k)=UPDATEgraph(hG(k−1),{hu(k),∀u∈V},{h(u,v)(k),∀(u,v)∈E})