图神经网络学习日记(四)图神经网络(GNN)

置换不变性和置换同变性

任何将邻接矩阵 \(A\) 作为输入的函数 \(f\) 在理想状态下,都应满足下面两个条件之一: \[ \begin{align} f(PAP^T)&=f(A)\text{(置换不变)} \\ f(PAP^T)&=Pf(A)\text{(置换同变)} \end{align} \]

其中 \(P\) 是置换矩阵。置换不变是指函数不依赖邻接矩阵中行/列的任意顺序,置换同变表示当置换邻接矩阵时 \(f\) 的输出以一致的方式置换。

神经消息传递

GNN 框架

在 GNN 的每个消息传递迭代期,通过聚合每个节点\(u \in \mathcal{V}\)的邻域\(\mathcal{N}(u)\)的信息来更新其隐藏嵌入\(h_u^{(k)}\),过程如下式所示: \[ \begin{align} h_u^{(k+1)} & = \mathrm{UPDATE}^{(k)}(h_u^{(k)}, \mathrm{AGGREGATE}^{(k)}(\{h_v^{(k)}, \forall v \in \mathcal{N}(u)\})) \\\\ & = \mathrm{UPDATE}^{(k)}(h_u^{(k)}, m_{\mathcal{N}(u)}^{(k)}) \end{align} \]

其中 \(\mathrm{UPDATE}\)\(\mathrm{AGGREGATE}\) 是任意可微函数,\(m_{\mathcal{N}(u)}\) 是聚合节点 \(u\) 邻域消息的结果,上标表示消息迭代期的索引。

迭代最后一层的输出定义为每个节点的嵌入: \[ z_u = h_u^{(K)}, \forall u \in \mathcal{V} \] 由于 \(\mathrm{AGGREGATE}\) 函数将整个集合作为输入,这种方式定义的 GNN 是置换同变的。

节点嵌入编码了两种形式的信息:

图的结构信息 例如,在经过 GNN 消息传递的 \(k\) 次迭代后,节点 \(u\) 的嵌入 \(h_{u}^{(k)}\) 可能会编码 \(u\)\(k\) 跳邻居中的所有节点的度的信息。

基于节点特征的信息 GNN 的消息传递进行了 \(k\) 次迭代后,每个节点的嵌入对其 \(k\) 跳邻居中所有节点的特征信息进行编码。

GNN 实例

基本 GNN 的消息传递定义如下式: \[ h_u^{(k)} = \sigma(W_{self}^{(k)}h_u^{(k-1)} + W_{neigh}^{(k)}\sum_{v \in \mathcal{N}(u)} h_v^{(k-1)} + b^{(k)}) \] 其中,\(W_{self}^{(k)}\)\(W_{neigh}^{(k)} \in \mathbb{R}^{d^{(k)} \times d^{(k-1)}}\) 是可训练参数矩阵,\(\sigma\) 表示逐元素的非线性函数。

通过定义更新和聚合函数等效地定义基本的 GNN: $$ \[\begin{aligned} m_{\mathcal{N}(u)} &= \sum_{v \in \mathcal{N}(u)} h_v \\\\ \mathrm{UPDATE}(h_u, m_{\mathcal{N}(u)}) &= \sigma (W_{self} h_u + W_{neigh}m_{\mathcal{N}(u)}) \end{aligned} \tag{5.8,5.9}\]

\[ 下式可作为从节点 $u$ 的图上邻域聚合消息的简写: \] m_{(u)} = {(k)}({h_v{(k)}, v (u)}) \[ **图级别 GNN 定义** \] H^{(k)} = (AH{(k-1)}W_{neigh}{(k)} + H{(k-1)}W_{self}{(k)}) $$ 其中,\(H^{(k)} \in \mathbb{R}^{|\mathcal{V}| \times d}\) 表示 GNN 中第 \(k\) 层的节点表示矩阵(每个节点对应矩阵的一行),\(A\) 是邻接矩阵。

自环消息传递

添加自环并省略显示的更新步骤消息传递可定义如下: \[ h_u^{(k)} = \mathrm{AGGREGATE}(\{ h_v^{(k-1)}, \forall v \in \mathcal{N}(n) \bigcup \{u\} \}) \] 其中,聚合在集合 \(\mathcal{N}(u) \bigcup \{u\}\) 上进行。这种消息传递方式可以缓解拟合问题,也因为无法区分节点和邻域的信息严重限制了 GNN 的表达能力。

在基本 GNN 模型中,添加自环等效于在 \(W_{self}\)\(W_{neigh}\) 矩阵之间共享参数,图级别更新方式如下所示: \[ H^{(t)} = \sigma ((A+I)H^{(t-1)}W^{(t)}) \]

广义邻域聚合

邻域归一化

最基本的邻域聚合函数仅取邻居嵌入的总和,这种方法有可能不稳定并且对节点度高度敏感。解决该问题方案之一是基于所涉及节点的度来归一化聚合操作。

均值代替求和,如下式所示: \[ m_{\mathcal{N}(u)} = \frac{\sum_{v \in \mathcal{N}(n)}h_v}{|\mathcal{N}(u)|} \] 对称归一化,如下式所示: \[ m_{\mathcal{N}(u)} = \sum_{v \in \mathcal{N}(u)} \frac{h_v}{\sqrt{|\mathcal{N}(u)||\mathcal{N}(v)|}} \] 图卷积神经网络(GCN)

采用对称归一化聚合及自环更新方法,GCN 消息传递函数如下式定义: \[ h_u^{(k)} = \sigma (W^{(k)} \sum_{v \in \mathcal{N}(u)} \bigcup \{u\} \frac{h_v}{|\mathcal{N}(u)||\mathcal{N}(v)|}) \] 是否归一化?

归一化可能导致信息丢失,在归一化后可能很难使用学习到的嵌入来区分不同度的节点,并且归一化会掩盖各种其他的图结构特征。

在通常情况下,在节点特征信息远比结构信息有用或由于节点度范围过于广泛导致优化过程可能不稳定的任务中,归一化最有用。

集合聚合操作

集合池化

一种定义聚合函数的原则是基于置换不变神经网络的理论,具有下式的聚合函数是通用的集合函数逼近器: \[ m_{\mathcal{N}(u)} = MLP_{\theta} (\sum_{v \in \mathcal{N}(u)} MLP_{\phi}(h_v)) \] 依照惯例用 \(MLP_{\theta}\) 表示可训练参数为 \(\theta\) 的任一深度多层感知器。将一组嵌入映射到一个嵌入的任何置换不变函数都可以基于上式的模型逼近到任意精度。

Janossy 池化

不使用置换不变的压缩方法(如求和或取均值),而是采用置换敏感的函数并对多种可能的置换取均值。具体操作为:令 \(\pi_i \in \Pi\) 表示将集合 \(\{h_v, \forall v \in \mathcal{N}(u)\}\) 映射到特定序列 \(((h_{v_1}, h_{v_2}, \cdots, h_{v_{| \mathcal{N}(u) |}})_{\pi_i})\) 的置换函数。即 \(\pi_i\) 将无序的邻居嵌入集置于任意排列的序列中。然后通过 Janossy 池化实现邻域聚合,如下式所示:

\[ m_{\mathcal{N}(u)} = \mathrm{MLP}_{\theta} (\frac{1}{|\Pi|} \sum_{\pi \in \Pi} \rho_{\phi} (h_{v_1}, h_{v_2}, \cdots, h_{v_{|\mathcal{N}(u)|}})_{\pi_i}) \]

其中,\(\Pi\) 表示一组置换函数, \(\rho_{\phi}\) 是置换敏感的函数(如应用于序列数据集的神经网络)。在实践中,通常将 \(\rho_{\phi}\) 定义为 LSTM。

如果上式中的置换函数集合 \(\Pi\) 包含所有可能的置换函数,则上式中的聚合函数也是通用集合函数逼近器。但是对所有可能的置换求和很困难,在实践中通常采用如下两种方法进行 Janossy 池化:

1 在每次应用聚合函数时,对所有可能的置换采样出一个随机子集,并且对该随机自己进行求和。

2 对邻域中的节点进行规范化排序,例如,根据节点度对节点进行降序排序,并随机断开一些关联关系。

邻域注意力模型

基本思想是为每个邻域中的节点分配注意力权重,该权重用于在聚合步骤中权衡该节点的影响力。第一个引入注意力机制的GNN模型是图注意力网络 GAT,该网络使用注意力权重来定义邻域的加权和,如下式所示: \[ m_{\mathcal{N}(u)} = \sum_{v \in \mathcal{N}(u)} \alpha_{u,v}h_v \] 其中,\(\alpha_{u,v}\) 表示在节点 \(u\) 处聚合信息时,其邻域中的节点 \(v \in \mathcal{N}(u)\) 的注意力权重。GAT 中注意力权重的定义如下式所示: \[ \alpha_{u,v} = \frac{exp([Wh_v \bigoplus Wh_v])}{\sum_{v' \in \mathcal{N}(u)} exp(a^T[Wh_v \bigoplus Wh_{v'}])} \] 其中,\(a\) 是可训练的注意力向量,\(W\) 是可训练的矩阵,\(\bigoplus\) 表示拼接操作。

注意力机制变体: \[ \alpha_{u,v} = \frac{exp(h_u^TWh_v)}{\sum_{v' \in \mathcal{N}(u)} exp(h_u^TWh_{v'})} \] MLP 注意力层的变体: \[ \alpha_{u,v} = \frac{exp(MLP(h_u,h_v))}{\sum_{v' \in \mathcal{N}(u)} exp(MLP(h_u,h_{v'}))} \] 上式限定 MLP 输出为标量。

添加多注意力头,使用彼此独立的 \(K\) 个注意力层计算 \(K\) 个不同的注意力权重 \(\alpha_{u,v,k}\) ,然后使用不同的注意力权重聚合的消息会在聚合步骤中进行转换和合并,通常是先进性线性映射,再进行拼接操作,如下式所示: \[ \begin{aligned} m_{\mathcal{N}(u)} &= [a_1 \bigoplus a_2 \bigoplus \cdots \bigoplus a_K] \\\\ a_k &= W_i \sum_{v \in \mathcal{N}(u)} \alpha_{u,v,k}h_v \end{aligned} \] 其中,\(K\) 个注意力头中的每一个注意力权重 \(\alpha_{u,v,k}\) 可以使用上述任何一种注意力机制进行计算。

广义更新方法

过度平滑和邻域影响

GNN 的一个常见问题是过度平滑。过度平滑的基本原理是:经过多次 GNN 消息传递后,图中所有节点的表示可能变得非常相似。过度平滑导致无法建立更深的 GNN 模型以利用图上的长期依赖关系,因为这些深层的 GNN 模型往往会生成过度平滑的嵌入。

可以通过定义每个节点的输入特征 \(h_u^{(0)}=x_u\) 对图上其它节点的最终层输出的嵌入(\(h_v^{(K)},\forall v \in \mathcal{V}\))的影响来形式化定义 GNN 中的过度平滑问题。对于任意一对节点 \(u\)\(v\) ,可以通过检查相应的雅可比矩阵的大小来量化 GNN 中节点 \(u\) 对节点 \(v\) 的影响,如下式所示: \[ I_{K(u,v)} = 1^T(\frac{\partial h_v^{(K)}}{\partial h_u^{(0)}})1 \] 其中,\(1\) 是元素全为 1 的向量。\(I_{K(u,v)}\) 是雅可比矩阵 \(\frac{\partial h_v^{(K)}}{\partial h_u^{(0)}}\) 中的元素之和。用来衡量 GNN 中节点 \(u\) 的初始嵌入对节点 \(v\) 的最终嵌入的影响程度。

定理:对于任何使用自环更新方法和用下式表示聚合函数的 GNN 模型 \[ \mathrm{AGGRGATE}(\{h_v, \forall v \in \mathcal{N}(u) \bigcup \{u\}\}) = \frac{1}{f_n(|\mathcal{N}(u) \bigcup \{u\}|)} \sum_{v \in \mathcal{N}(u) \bigcup \{u\}} h_v \] 其中,\(f:\mathbb{R}^+ \rightarrow \mathbb{R}^+\) 是任意可微的归一化函数。

可得出下式结论: \[ I_K (u,v) \propto p_{\mathcal{G},K}(u|v) \] 其中,\(p_{\mathcal{G},K}(u|v)\) 表示从节点 \(u\) 开始的 \(K\) 步随机游走过程中访问节点 \(v\) 的概率。

当使用 \(K\) 层 GCN 型魔性时,节点 \(u\) 对节点 \(v\) 的影响从节点 \(u\) 开始经过 \(K\) 步随机游走到达节点 \(v\) 的概率成正比。但是,随着 \(K \rightarrow \infty\),每个节点的影响都接近图上随机游走的平稳分布,这意味着本地邻域信息会丢失。

上述定理直接适用于使用自环更新方法的模型,但是只要任意层 \(k\) 满足 \(\| W_{self}^{(k)} \| < \| W_{neigh}^{(k)} \|\),其结果也可以渐近地扩展基本 GNN 的更新。因此当使用简单 GNN 模型时,构建更深的模型实际上会损害模型性能。随着更多层的加入,模型将丢失更多关于本地邻域结构的信息,并且学习的嵌入会变得过于平滑,接近几乎均匀的分布。

拼接和跳跃连接

最简单更新跳跃连接的方式之一是使用拼接操作再消息传递期间保留更多节点级别信息,如下式所示: \[ \mathrm{UPDATE}_{concat}(h_u, m_{\mathcal{N}(u)}) = [\mathrm{UPDATE}_{base}(h_u,m_{\mathcal{N}(u)}) \bigoplus h_u] \] 其中,直接将基本更新函数的输出与节点的上一层表示拼接,鼓励模型再消息传递过程中解耦信息,将来自邻域的信息(\(m_{\mathcal{N}(u)}\))与每个节点当前的表示(\(h_u\))分开。

线性插值法跳跃连接,如下式所示: \[ \mathrm{UPDATE}_{interpolate}(h_u,m_{\mathcal{N}(u)}) = \alpha_1 \circ \mathrm{UPDATE}_{base}(h_u,m_{\mathcal{N}(u)}) + \alpha_2 \bigodot h_u \] 其中,\(\alpha_1,\alpha_2 \in [0,1]^d\) 是满足 \(\alpha_2 = 1 - \alpha_1\) 的门控向量,\(\circ\) 表示逐元素相乘。

最终更新的表示是先前表示与基于邻域信息进行更新的表示之间的线性插值。

在通常情况下,拼接和跳跃连接有助于缓解 GNN 中过渡平滑问题,同时可以提高优化数值的稳定性。

门控更新函数

一种解读 GNN 消息传递算法的观点是:聚合函数从邻域接收观察结果,然后将其用于更新每个节点的隐状态。基于这一观点可以根据观察结果直接使用更新 RNN 框架的隐状态的方法,最早的 GNN 架构之一定义更新函数如下式所示: \[ h_u^{(k)} = \mathrm{GRU}(h_u^{(k-1)},m_{\mathcal{N}(u)}^{(k)}) \] 其中,GRU 表示 GRU 单元的更新函数。

门控更新方法在提高 GNN 框架的模型深度(超过10层)和防止过度平滑问题方面非常有效。

跳跃知识连接

提高最终的节点表示质量的一种补充策略是利用消息传递的每一层输出的表示,叫做加入跳跃知识,如下式所示: \[ z_u = f_{JK}(h_u^{(0)} \bigoplus h_u^{(1)} \bigoplus \cdots \bigoplus h_u^{(K)}) \] 其中,\(f_{JK}\) 是任意微分函数。

边特征和多元关系 GNN

下面介绍 GNN 在多元关系图或其它异构图中的应用。

关系 GNN

关系图卷积网络(RGCN),通过为每种关系类型指定一个单独的变化矩阵来增强聚合函数处理多种关系的能力,如下式所示: \[ m_{\mathcal{N}(u)} = \sum_{\tau \in \mathcal{R}} \sum_{v \in \mathcal{N}_{\tau}(u)} \frac{W_{\tau}h_v}{f_n(\mathcal{N}(u), \mathcal{N}(v))} \] 其中, \(f_n\) 是一个归一化函数,它的值取决于节点 \(u\) 的邻域以及被聚合的节点 \(v\) 的邻域。RGCN 中的多元关系聚合类似具有归一化函数的基本 GNN,但根据边的类型不同分别聚合信息。

参数共享

朴素 RGCN 方法的一个缺点是由于每一种关系类型都需要一个可训练的矩阵导致参数量急剧增加,这种参数量的激增可能导致过拟合和训练缓慢的问题。

通过与基矩阵共享参数的方法来解决此问题,如下式: \[ W_{\tau} = \sum_{i=1}^b \alpha_{i,\tau}B_i \] 该方法中,所有关系矩阵都定义为 \(b\) 个基矩阵(\(B1,\cdots,B_b\))的线性组合;唯一的关于关系的参数是每种关系 \(\tau\)\(b\) 个组合权重 \(\alpha_{1,\tau}, \cdots, \alpha_{b,\tau}\)。在这种基本共享方法中,看可以将完整聚合函数表示为下式: \[ m_{\mathcal{N}(u)} = \sum_{\tau \in \mathcal{R}} \sum_{v \in \mathcal{N}_{\tau}(u)} \frac{\alpha_{\tau} \times_{1} B \times_{2} h_v}{f_n(\mathcal{N}(u), \mathcal{N}(v))} \] 其中,\(B = (B_1, \cdots, B_b)\) 是一个由基矩阵堆叠构成的张量, \(\alpha_{\tau} = \alpha_{1,\tau}, \cdots, \alpha_{b,\tau}\) 是一个关于关系 \(\tau\) 的包含基矩阵组合权重的向量,\(\times_{i}\) 表示沿着模 \(i\) 的张量积。另一种理解参数共享 RGCN 方法的过程是:学习每个关系的嵌入及所有关系之间共享的张量。

注意力机制和特征拼接

为适应更一般形式的边特征的情况,可以在消息传递过程中基于注意力机制或将这些信息与邻域嵌入拼接来充分利用这些特征。在给定任意基本聚合方法 \(\mathrm{AGGREGATE}_{base}\) 的情况下,利用边特征的一种简单策略是如下式定义新的聚合函数: \[ m_{\mathcal{N}(u)} = \mathrm{AGGREGATE}_{base}(\{h_v \bigoplus e_{(u,\tau,v)}, \forall v \in \mathcal{N}(u) \}) \] 其中,\(e_{(u,\tau,v)}\) 表示边 \((u,\tau,v)\) 的特征。

图池化

集合池化方法

与 AGGREGATE 操作类似,图池化任务可以看作是解决集合上的问题。要设计一个池化函数 \(f_p\) 将一组节点嵌入 \(\{ z_1, \cdots, z_{|V|} \}\) 映射为表示整张图的嵌入 \(z_{\mathcal{G}}\)

第一种常用方法是对节点嵌入求和(或取均值),如下式所示: \[ z_{\mathcal{G}} = \frac{\sum_{v \in \mathcal{V}} z_c}{f_n(|\mathcal{V}|)} \] 其中,\(f_n\) 是归一化函数(如恒等函数)。适用于小规模图。

第二种常用方法基于集合的方法,结合了 LSTM 和注意力机制来池化节点嵌入。这种池化方法迭代 \(t=1,\cdots,T\) 步基于注意力机制的聚合操作,如下式所示: \[ \begin{aligned} q_i &= \mathrm{LSTM}(o_{t-1}, q_{t-1}) \\\\ e_{v,t} &= f_a(z_v,q_t),\forall v \in \mathcal{V} \\\\ a_{v,t} &= \frac{exp(e_{v,i})}{\sum_{u \in \mathcal{V}} e_{u,t}}, \forall v \in \mathcal{V} \\\\ o_t &= \sum_{v \in \mathcal{V}} a_{v,t} z_v \end{aligned} \]

其中,\(q_t\) 表示每次迭代 \(t\) 次注意力机制中的查询向量。查询向量用于使用注意力函数 \(f_a: \mathbb{R}^d \times \mathbb{R} \rightarrow \mathbb{R}\) (如点积)为每个节点计算注意力分数,然后将该注意力分数进行归一化,最后根据注意力权重计算节点嵌入的加权和,并基于该加权和采用 LSTM 更新来更新查询向量。通常情况下,用全零向量初始化 \(q_0\)\(o_0\) ,进行了 \(T\) 次迭代后计算整张图的嵌入如下式所示: \[ z_{\mathcal{G}} = o_1 \bigoplus o_2 \bigoplus \cdots \bigoplus o_T \] 图粗糙化方法

集合池化方法的局限性在于不能利用图的结构信息。在池化阶段利用图的拓扑信息可以进一步提供增益,实现次目的的一种流形策略是用图聚类或粗糙化作为池化节点表示的一种方法。

假设有聚类函数如下式所示: \[ f_c \rightarrow \mathcal{G} \times \mathbb{R}^{|V| \times d} \rightarrow \mathbb{R}^{+|V| \times c} \] 聚类函数将图上的所有节点分为 \(c\) 个簇。假定该函数输出一个分配矩阵 \(S = f_c(\mathcal{G}, Z)\),其中,\(S[u,i] \in \mathbb{R}\) 表示节点 \(u\) 和簇 \(i\) 之间的关联强度。

图粗糙化方法的关键思想是使用聚类分配矩阵来粗糙化图。这里使用分配矩阵 \(S\) 来计算新的粗糙化邻接矩阵和一个新的节点特征集合,如下式所示: \[ \begin{aligned} A^{new} &= S^TAS \in \mathbb{R}^{+c \times c} \\\\ X^{new} &= S^TX \in \mathbb{R}^{c \times d} \end{aligned} \] 这一新的邻接矩阵表示图中的簇之间的关联强度(边),而新的特征矩阵表示聚合分配给每个簇的所有节点嵌入的结果。在该粗糙化的图上运行 GNN,并在每次迭代的过程中重复粗糙化过程,图在每一步都会减小,最后在足够粗糙化的图上对节点嵌入执行集合池化可以获得图的最终表示。

通用消息传递方法

GNN 消息传递方法可以泛化为在消息传递的每个阶段利用边和图级别的信息。

更为通用的消息传递方法如下式: \[ \begin{aligned} h_{(u,v)}^{(k)} &= \mathrm{UPDATE}_{edge}(h_{(u,v)}^{(k-1)}, h_u^{(k-1)}, h_v^{(k-1)}, h_{\mathcal{G}}^{(k-1)}) \\\\ m_{\mathcal{N}(u)} &= \mathrm{AGGREGATE}_{node}(\{ h_{(u,v)}^{(k-1)}, \forall v \in \mathcal{N}(u) \}) \\\\ h_u^{(k)} &= \mathrm{UPDATE}_{node}(h_u^{(k-1)}, m_{\mathcal{N}(u)}, h_{\mathcal{G}}^{(k-1)}) \\\\ h_{\mathcal{G}}^{(k)} &= \mathrm{UPDATE}_{graph}(h_{\mathcal{G}}^{(k-1)}, \{ h_u^{(k-1)}, \forall u \in \mathcal{V}, \{ h_{(u,v)}^{(k)}, \forall (u,v) \in \varepsilon \} \}) \end{aligned} \] 通用消息传递框架中,在消息传递过程中为图上的每条边生成嵌入 \(h_(u,v)^{(k)}\),并为整张图生成相应的嵌入 \(h_{\mathcal{G}}^{(k)}\),这使得消息传递模型可以聚合边和图级别的特征。

在通用消息传递框架中进行消息传递时,首先根据便关联的节点的嵌入来更新边的嵌入。接下来,通过聚合节点关联所有边的嵌入来更新节点嵌入。图嵌入被用于节点和边表示的更新函数中,并且图级别的嵌入本身通过在每次迭代结束时对所有节点和边的嵌入进行聚合来更新。

损失函数

用于节点分类的 GNN

以完全监督方式训练 GNN,使用 softmax 分类函数和负对数似然损失来定义损失函数,如下式:

\[ \mathcal{L} = \sum_{u \in \mathcal{V}_{train}} = -log(\mathrm{softmax}(z_u,y_u)) \]

其中,假设 \(y_u \in \mathbb{Z}^c\) 是一个独热向量,表示用于训练的节点 \(u \in \mathcal{V}_{train}\) 的类。

在引用网络中,\(y_u\) 表示论文的主题,\(Softmax(z_u,y_u)\) 表示通过 softmax 函数计算节点属于类 \(y_u\) 的概率,如下式:

\[ \mathrm{softmax}(z_u,y_u) = \sum_{i=1}^c y_u[i]\frac{e^{z_u^Tw_i}}{\sum_{j=1}^c e^{z_u^Tw_j}} \]

其中,\(w_i \in \mathbb{R}^d,i=1,\cdots,c\) 是可训练的参数。

用于图分类的 GNN

图分类的损失函数值是通过一组有标记的训练图 \(\mathcal{T} = {\mathcal{G}_1,\cdots,\mathcal{G}_n}\) 上学习的图嵌入 \(z_{\mathcal{G}_i}\) 计算,通常使用如下式定义的平方误差损失函数:

\[ \mathcal{L} = \sum_{\mathcal{G} \in \mathcal{T}}\| \mathrm{MLP}(z_{\mathcal{G}_i}) - y_{\mathcal{G}_i} \|_2^2 \]

其中,MLP 是具有单一变量输出的密集连接的神经网络,\(y_{\mathcal{G}_i} \in \mathbb{R}\) 是训练图 \(\mathcal{G}_i\) 的标签值。

用于关系预测的 GNN

深度图信息最大化(DGI)节点嵌入 \(z_u\) 和图嵌入 \(z_{\mathcal{G}}\) 之间的互信息,损失函数如下式:

\[ \mathcal{L} = -\sum_{u \in \mathcal{V}_{train}} \mathbb{E}_{\mathcal{G}} log(D(z_u,z_{\mathcal{G}})) + \gamma\mathbb{E}log(1-D(\tilde{z}_u,z_{\mathcal{G}})) \]

其中,\(z_u\) 表示 GNN 根据图 \(\mathcal{G}\) 生成的节点 \(u\) 的嵌入,而 \(\tilde{z}_u\) 表示根据 \(\mathcal{G}\) 的损坏版本 \(\tilde{\mathcal{G}}\) 生成的节点 \(u\) 的嵌入。这里用 \(D\) 表示判别函数,它是一个被训练用以预测节点嵌入是基于真实的图 \(\mathcal{G}\) 还是损坏版本的图 \(\tilde{\mathcal{G}}\) 生成的。在通常情况下,通过一种随机的方式(如打乱特征矩阵中的元素)修改节点特征或邻接矩阵,抑或是同时修改两者来破坏图。上述损失函数背后的思想是:GNN 模型必须学会生成可以区分真是图和其损坏版本的节点嵌入。这一优化目标与最大化节点嵌入 \(z_u\) 和图嵌入 \(z_{\mathcal{G}}\) 之间的互信息密切相关。

节点采样

基于节点级别消息传递的角度直接实现 GNN 可能存在计算效率低的问题。例如,当多个节点共享邻域时,如果图中所有节点独立执行消息传递操作,最终可能会执行大量冗余计算。

图级别的实现方法

子采样和小批量

为了限制 GNN 的内存占用并促进小批量训练方式,可以在消息传递过程中使用节点集的子集。从数学角度,可以认为这是在每个批次中为图中节点的子集运行节点级的 GNN 公式。

挑战在于不能在不丢失信息的情况下简单地在图上的一部分节点中执行消息传递操作,每次删除节点时也会删除其关联的边,这无法保证选择的节点的随机子集会构成连接图,并且为每个小批次选择一个节点的随机自己会对模型性能产生严重的不利影响。

通过对节点邻域进行子采样的策略来克服此问题:首先为每个批次选择一组目标节点,然后递归采样这些节点的邻域以确保能够保持图的连通性。为了尽可能避免为一个批次采样过多节点的情况,建议使用固定容量对每个节点的邻域进行子采样以提高批量张量操作的效率。

参数共享和正则化

层间参数共享

在 GNN 的所有聚合和更新函数中使用相同的函数。通常情况下,在6层以上的 GNN 中最有效,并且通常与门控更新函数结合使用。

边丢弃

训练过程中随机删除(或屏蔽)邻接矩阵的边。直观来看,这将使 GNN 不太容易过拟合,并且对邻接矩阵中的噪声更具鲁棒性。


图神经网络学习日记(四)图神经网络(GNN)
https://blog.lfd.world/2023/05/31/tu-shen-jing-wang-luo-xue-xi-ri-ji-si-tu-shen-jing-wang-luo-gnn/
作者
培根请加蛋
发布于
2023年5月31日
许可协议