65、图神经网络:通用框架解析

图神经网络:通用框架解析

1. 图神经网络的损失与输出

在图神经网络中,整体损失是无监督损失和有监督损失的加权和。这两个损失的相对权重可以调节监督的程度,并且可以在保留的标记节点验证集上进行调整,以最大化分类准确率。

对于有监督和半监督的图神经网络,主要输出是对未标记节点的类别标签预测。而对于无监督和半监督的图神经网络,各隐藏层中每个节点的隐藏变量值提供了一种嵌入,可用于各种应用场景。早期时间层(即更接近输入层的层)的嵌入倾向于编码更局部和原始的结构特征,而后期时间层的嵌入则倾向于编码节点更全局和复杂的特征。这两种嵌入在不同类型的应用中都很有用,并且通常会连接起来形成完整的嵌入。

2. 关键函数介绍
2.1 邻域函数

邻域函数是设计图神经网络时最简单的函数。它使用所有相邻节点的平均嵌入,从第 (k - 1) 层生成第 (k) 层的嵌入。其定义如下:
((\forall i, k) : h_i^{(k)} = \Phi \left( W^{(k)} \sum_{j\in A(i)} \frac{h_j^{(k - 1)}}{|A(i)|} + B^{(k)} h_i^{(k - 1)} \right))
其中,(\Phi(\cdot)) 是一个非线性激活函数(例如 ReLU),以逐元素的方式应用于其向量参数;(W^{(k)}) 和 (B^{(k)}) 是可训练矩阵,在不同节点之间共享,并在反向传播过程中学习。这两个矩阵的大小均为 (p_k \times p_{k - 1})。可以将 (W^{(k)}) 视为应用于邻域连接的权重矩阵,将 (B^{(k)}) 视为应用于自连接的偏置矩阵。这些可训练矩阵在一层内的节点之间共享,但在不同层之间不共享,这与卷积神经网络在整个图像上共享滤波器但在不同层之间不共享类似。

值得注意的是,邻域函数对邻域嵌入进行平均而不是求和,这对于归一化很重要。因为大多数现实世界的图满足幂律度分布,导致节点的度差异很大。使用求和而不是平均会在为度差异很大的节点生成可比嵌入时带来相当大的困难。

每个 (p_k) 的值通常小于节点数量的平方根,因此 (p_k \times p_{k - 1}) 矩阵 (W^{(k)}) 和 (B^{(k)}) 中的参数数量小于节点数量,这有助于避免过拟合。

2.2 图卷积函数

图卷积网络使用与基于邻域聚合类似的原理,但底层度归一化的性质不同。邻域聚合算子使用节点度进行节点级归一化,而图卷积算子使用边两端节点度的几何平均值对嵌入进行边级归一化。此外,在自连接中不使用单独的矩阵 (B^{(k)}) 来传输嵌入值,而是在图中添加权重等于节点度的自环。这样可以使用单个矩阵 (W^{(k)}) 来处理自连接和邻域连接。图卷积函数可表示为:
((\forall i, k) : h_i^{(k)} = \Phi \left( W^{(k)} \sum_{j\in A(i)\cup{i}} \frac{h_j^{(k - 1)}}{\sqrt{|A(i)| \cdot |A(j)|}} \right))
自连接包含在上述变换中,因为节点的聚合操作包括其前一层的表示。激活函数 (\Phi(\cdot)) 以逐元素的方式应用于其向量参数。通过这种归一化方式,高自由度节点的嵌入对其邻居的影响较小,尽管高自由度节点的嵌入往往具有稍大(绝对值)的分量。

卷积操作可以用矩阵形式表示。(n) 个节点的 (p_k) 维隐藏表示可以堆叠成一个 (n \times p_k) 矩阵 (H^{(k)}):
(H^{(k)} = [h_1^{(k)}, h_2^{(k)}, \ldots, h_n^{(k)}]^T)
即 (H^{(k)}) 的第 (i) 行包含 (h_i^{(k)})。设 (\Delta) 是 (n \times n) 对角度矩阵,它包含(对称)邻接矩阵 (A) 的行元素之和。(n \times n) 归一化和条件邻接矩阵 (A_c) 定义为:
(A_c = \Delta^{-1/2}(A + \Delta)\Delta^{-1/2} = I + \Delta^{-1/2}A\Delta^{-1/2})
上述操作使用边两端节点度的几何平均值对 (A) 中的每个边权重进行归一化,并将每个对角元素加 1。对角线上的 1 对于在自连接上执行操作很重要。更新可以用矩阵形式表示为:
(H^{(k)} = \Phi (A_c H^{(k - 1)} W^{(k)}))
激活函数 (\Phi(\cdot)) 以逐元素的方式应用于其矩阵参数。由于上述乘积中最大的矩阵 (A_c) 是稀疏的,因此乘法可以高效执行。

2.3 GraphSAGE

GraphSAGE 是基于邻域聚合函数的广义变体,它将自连接和邻域连接的操作分开。我们重新表述基于邻域的聚合函数:
((\forall i, k) : h_i^{(k)} = \Phi \left( W^{(k)} \sum_{j\in A(i)} \frac{h_j^{(k - 1)}}{|A(i)|} + B^{(k)} h_i^{(k - 1)} \right))
在邻域模型中,前一层的自嵌入与邻域嵌入进行聚合。我们也可以选择将它们连接起来:
((\forall i, k) : h_i^{(k)} = \Phi \begin{bmatrix} W^{(k)} \sum_{j\in A(i)} \frac{h_j^{(k - 1)}}{|A(i)|} \ B^{(k)} h_i^{(k - 1)} \end{bmatrix})
连接的优点是强调了自连接的特征,因为它们不会因与其他邻域特征的连续聚合而“丢失”。连续聚合常常导致所有节点的特征表示变得非常相似,这个问题被称为过平滑,而连接在一定程度上可以缓解这个问题。

GraphSAGE 可以通过将前向传播更新中的邻域聚合替换为通用聚合算子 (\Gamma(\cdot)) 以更一般的方式表述:
((\forall i, k) : h_i^{(k)} = \Phi \begin{bmatrix} W^{(k)} \Gamma({h_j^{(k - 1)} : \forall j \in A(i)}) \ B^{(k)} h_i^{(k - 1)} \end{bmatrix})
当将算子 (\Gamma(\cdot)) 设置为 (\Gamma({h_j^{(k - 1)} : \forall j \in A(i)}) = \sum_{j\in A(i)} \frac{h_j^{(k - 1)}}{|A(i)|}) 时,可以得到上述基于邻域的聚合函数。

可以选择其他形式的聚合算子,只要它是可微的(以便进行反向传播)并且对给定节点的邻居具有排列不变性。一个重要的算子是最大池化算子:
(\Gamma({h_j^{(k - 1)} : \forall j \in A(i)}) = \text{ELEMENTWISE - MAX} {j\in A(i)} W {pool} h_j^{(k - 1)})
这里使用了一个额外的矩阵 (W_{pool}) 进行池化,它需要在反向传播过程中学习。将第 (j) 个节点的每个邻居的隐藏表示与 (W_{pool}) 相乘,为每个邻居得到一个向量,然后对这些不同向量进行逐元素最大值操作,以将结果合并为一个向量。原始的 GraphSAGE 论文表明,池化算子比简单的聚合算子效果更好。

另一个聚合算子是在邻居节点上应用 LSTM 后获得的嵌入。然而,LSTM 处理序列,而邻居必须以排列不变的方式处理,因此 LSTM 应用于节点的随机排列。池化算子和 LSTM 算子在准确性上相似,但 LSTM 算子速度要慢得多,因此池化算子是本节介绍的算子中的首选。

即使在聚合算子中使用所有邻居节点来介绍 GraphSAGE,但使用固定大小的节点随机样本创建聚合算子就足够了。对节点进行采样也使更新更加高效。这种方法在使用少量(两到三个)隐藏层时效果最佳。

3. 处理边权重

到目前为止的讨论中隐含假设边是二元的,因为节点的所有邻居都以统一的方式处理。但在实践中,边是有权重的,在嵌入过程中,权重较大的边应该被赋予更多的重要性。因此,所有邻域聚合都由相应的边权重加权。设边 ((i, j)) 的权重为 (c_{ij}),基于邻域的简单聚合算子可以修改为:
((\forall i, k) : h_i^{(k)} = \Phi \left( W^{(k)} \sum_{j\in A(i)} \frac{c_{ij} h_j^{(k - 1)}}{\sum_{j\in A(i)} c_{ij}} + B^{(k)} h_i^{(k - 1)} \right))

图卷积算子的更新修改非常相似。实际上,矩阵形式的更新完全相同,只是矩阵以加权方式定义。我们重新表述图卷积网络中以矩阵为中心的更新:
(H^{(k)} = \Phi (A_c H^{(k - 1)} W^{(k)}))
与未加权版本的更新的主要区别在于矩阵 (A_c) 的定义方式。首先,原始邻接矩阵 (A) 是加权的,度矩阵 (\Delta) 也是包含节点加权度的对角矩阵。然后,(A_c) 定义为 (I + \Delta^{-1/2}A\Delta^{-1/2})。

也可以通过在聚合过程中按权重比例采样邻居来处理加权网络。这种方法可以很自然地与像 GraphSAGE 这样在学习过程中已经内置了某种采样形式的算法一起使用。

4. 处理新节点

许多现实世界的社交网络是增量式的,随着时间的推移会有新节点(与网络中的一些旧节点相连)加入。早期讨论的浅层网络(如 node2vec 和 DeepWalk 的基础)的一个重要特性是,无法从已经训练好的模型中嵌入新节点。这是因为输入是与节点数量相同的结果的独热编码。一旦网络使用这种输入结构进行训练,就无法再嵌入新节点,除非加入额外的输入和输出,并使用更新后的输入对权重进行一些更新。随着新节点的加入,输入可能会发生很大变化,特别是如果使用随机游走度量来定义边权重。可以将原始权重作为起点(添加额外的输入和输出),并将新连接的权重设为零。

下面是一个简单的流程图,展示图神经网络中邻域函数的计算流程:

graph TD;
    A[输入节点及邻域信息] --> B[计算邻域平均嵌入];
    B --> C[与权重矩阵相乘];
    C --> D[加上自连接偏置];
    D --> E[应用激活函数];
    E --> F[输出节点嵌入];

以下是一个总结不同函数特点的表格:
| 函数名称 | 归一化方式 | 自连接处理 | 聚合方式 | 特点 |
| ---- | ---- | ---- | ---- | ---- |
| 邻域函数 | 节点级平均 | 使用 (B^{(k)}) 矩阵 | 平均聚合 | 简单,可避免过拟合 |
| 图卷积函数 | 边级几何平均 | 添加自环 | 加权聚合 | 高自由度节点影响小,计算高效 |
| GraphSAGE | 可自定义 | 分开处理 | 多种聚合算子可选 | 缓解过平滑,可采样提高效率 |

图神经网络:通用框架解析

5. 各函数操作步骤总结

为了更清晰地理解图神经网络中各函数的使用,下面详细列出操作步骤:

5.1 邻域函数操作步骤
  1. 输入准备 :获取节点的邻域信息 (A(i)),前一层节点的嵌入 (h_j^{(k - 1)}),可训练矩阵 (W^{(k)}) 和 (B^{(k)})。
  2. 计算邻域平均嵌入 :对于每个节点 (i),计算其邻域节点嵌入的平均值 (\sum_{j\in A(i)} \frac{h_j^{(k - 1)}}{|A(i)|})。
  3. 矩阵乘法 :将邻域平均嵌入与 (W^{(k)}) 相乘,将节点 (i) 前一层的嵌入 (h_i^{(k - 1)}) 与 (B^{(k)}) 相乘。
  4. 求和 :将上述两个乘法结果相加。
  5. 应用激活函数 :对求和结果应用非线性激活函数 (\Phi(\cdot)),得到当前层节点 (i) 的嵌入 (h_i^{(k)})。
5.2 图卷积函数操作步骤
  1. 输入准备 :获取邻接矩阵 (A),前一层节点的嵌入矩阵 (H^{(k - 1)}),可训练矩阵 (W^{(k)}),计算对角度矩阵 (\Delta)。
  2. 计算归一化和条件邻接矩阵 (A_c) :根据公式 (A_c = \Delta^{-1/2}(A + \Delta)\Delta^{-1/2} = I + \Delta^{-1/2}A\Delta^{-1/2}) 进行计算。
  3. 矩阵乘法 :将 (A_c) 与 (H^{(k - 1)}) 相乘,再将结果与 (W^{(k)}) 相乘。
  4. 应用激活函数 :对矩阵乘法结果应用激活函数 (\Phi(\cdot)),得到当前层节点的嵌入矩阵 (H^{(k)})。
5.3 GraphSAGE 操作步骤
  1. 输入准备 :获取节点的邻域信息 (A(i)),前一层节点的嵌入 (h_j^{(k - 1)}),可训练矩阵 (W^{(k)}) 和 (B^{(k)}),选择合适的聚合算子 (\Gamma(\cdot))。
  2. 聚合操作 :使用聚合算子 (\Gamma(\cdot)) 对节点 (i) 的邻域节点嵌入进行聚合。
  3. 矩阵乘法 :将聚合结果与 (W^{(k)}) 相乘,将节点 (i) 前一层的嵌入 (h_i^{(k - 1)}) 与 (B^{(k)}) 相乘。
  4. 连接操作 :将上述两个乘法结果连接起来。
  5. 应用激活函数 :对连接结果应用激活函数 (\Phi(\cdot)),得到当前层节点 (i) 的嵌入 (h_i^{(k)})。
6. 处理边权重和新节点的操作步骤
6.1 处理边权重操作步骤
  • 邻域函数
    1. 输入准备 :获取节点的邻域信息 (A(i)),前一层节点的嵌入 (h_j^{(k - 1)}),可训练矩阵 (W^{(k)}) 和 (B^{(k)}),边权重 (c_{ij})。
    2. 计算加权邻域嵌入 :对于每个节点 (i),计算 (\sum_{j\in A(i)} \frac{c_{ij} h_j^{(k - 1)}}{\sum_{j\in A(i)} c_{ij}})。
    3. 后续步骤 :与未加权邻域函数后续步骤相同,即矩阵乘法、求和、应用激活函数。
  • 图卷积函数
    1. 输入准备 :获取加权邻接矩阵 (A),前一层节点的嵌入矩阵 (H^{(k - 1)}),可训练矩阵 (W^{(k)}),计算包含加权度的对角度矩阵 (\Delta)。
    2. 计算归一化和条件邻接矩阵 (A_c) :与未加权情况相同,公式为 (A_c = I + \Delta^{-1/2}A\Delta^{-1/2})。
    3. 后续步骤 :与未加权图卷积函数后续步骤相同,即矩阵乘法、应用激活函数。
6.2 处理新节点操作步骤
  1. 模型调整 :在已训练模型的基础上,添加与新节点对应的输入和输出。
  2. 权重初始化 :将新连接的权重设为零,保留原始权重作为起点。
  3. 模型更新 :使用更新后的输入对模型权重进行更新,可采用梯度下降等优化算法。
7. 不同聚合算子的对比

GraphSAGE 中可以使用多种聚合算子,下面对常见的聚合算子进行对比:
| 聚合算子 | 可微性 | 排列不变性 | 计算速度 | 效果 |
| ---- | ---- | ---- | ---- | ---- |
| 简单平均聚合 | 是 | 是 | 快 | 基础聚合方式,可能存在过平滑问题 |
| 最大池化算子 | 是 | 是 | 较快 | 效果较好,能缓解过平滑 |
| LSTM 算子 | 是 | 需随机排列处理 | 慢 | 与池化算子效果相近 |

8. 图神经网络整体流程总结

下面是一个更全面的流程图,展示图神经网络的整体计算流程:

graph TD;
    A[输入图结构和节点特征] --> B[选择函数类型];
    B --> C{是否处理边权重};
    C -- 是 --> D[获取边权重信息];
    C -- 否 --> E[正常计算];
    D --> E;
    E --> F{是否处理新节点};
    F -- 是 --> G[调整模型和权重];
    F -- 否 --> H[按所选函数计算];
    G --> H;
    H --> I[应用激活函数];
    I --> J[输出节点嵌入或分类结果];
9. 总结

图神经网络在处理图结构数据方面具有强大的能力,通过不同的函数和处理方法,可以适应各种复杂的场景。邻域函数简单且能避免过拟合,图卷积函数在处理高自由度节点时表现出色,GraphSAGE 则可以缓解过平滑问题。在实际应用中,需要根据具体需求选择合适的函数和聚合算子,并正确处理边权重和新节点。同时,通过采样等方法可以提高计算效率,使图神经网络在大规模数据上也能高效运行。

希望本文能帮助读者更好地理解图神经网络的通用框架,为进一步的研究和应用提供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值