图神经网络基础:图的基本概念、节点与边、邻接矩阵、图的性质
在深入 GraphSAGE 模型之前,必须牢固掌握图这一核心数据结构。图(Graph)是一种用于描述对象及其之间关系的数学结构,是图神经网络(GNN)所有操作的基石。本节将系统梳理图的基本构成要素、数学表示方法以及关键性质。
1. 图的基本构成:节点与边
一个图由两个核心集合定义:节点(Vertex/Node) 和 边(Edge)。节点代表实体对象,边代表实体之间的关联。
- 节点(Node):图中的基本单元,通常用符号
v ∈ V表示。在社交网络中,节点可以是用户;在分子结构中,节点是原子。 - 边(Edge):连接两个节点的关系线,用
e ∈ E表示。边可以是有向的(箭头指向)或无向的(双向对称)。 - 图(Graph):记作
G = (V, E),其中V是节点集合,E是边集合。
💡 关键区分: 在 GraphSAGE 中,每个节点都关联一个特征向量(如用户画像、交易金额),而边则定义了消息传递的路径。没有边,节点之间就无法进行信息聚合。
2. 图的数学表示:邻接矩阵
为了将图结构输入到神经网络中,我们需要一种标准化的数学表示——邻接矩阵(Adjacency Matrix)。对于一个包含 N 个节点的图,邻接矩阵 A 是一个 N × N 的方阵。
| 矩阵元素 | 无向图 | 有向图 |
|---|---|---|
A[i][j] = 1 |
节点 i 与节点 j 之间存在一条边(对称矩阵) | 存在一条从节点 i 指向节点 j 的边 |
A[i][j] = 0 |
节点 i 与节点 j 之间无边 | 不存在从 i 到 j 的边 |
| 对角线 | 通常为 0(无自环) | 通常为 0 |
以下是一个 4 节点无向图的邻接矩阵示例:
# 图结构:节点 0-1, 0-2, 1-2, 2-3 相连
# 邻接矩阵 A (4x4)
A = [
[0, 1, 1, 0], # 节点0连接1和2
[1, 0, 1, 0], # 节点1连接0和2
[1, 1, 0, 1], # 节点2连接0、1和3
[0, 0, 1, 0] # 节点3仅连接2
]
📐 度矩阵与拉普拉斯矩阵: 在 GNN 中,邻接矩阵常与度矩阵
D(对角矩阵,D[i][i] 为节点 i 的度数)结合使用。归一化拉普拉斯矩阵 L = I - D^{-1/2} A D^{-1/2} 是图卷积操作的理论基础。
3. 图的关键性质
理解图的以下性质,对于设计 GNN 模型和诊断模型漂移至关重要:
| 性质 | 定义 | 在 GraphSAGE 中的意义 |
|---|---|---|
| 度数 (Degree) | 与节点直接相连的边的数量 | 影响邻居采样数量;度数高的节点(Hub)聚合信息更丰富 |
| 连通性 (Connectivity) | 图中任意两点是否存在路径相连 | 连通分量变化可能指示图结构漂移 |
| 路径 (Path) | 从一个节点到另一个节点经过的边序列 | GraphSAGE 的 K 跳邻居聚合基于路径长度 |
| 聚类系数 (Clustering Coefficient) | 衡量节点邻居之间相互连接的程度 | 高聚类系数区域可能形成社区,影响消息传递模式 |
| 图直径 (Diameter) | 图中所有最短路径的最大长度 | 决定模型需要多少层才能捕获全局信息 |
4. 图的类型与选择
在实际业务场景中,图的结构类型直接影响建模策略。以下是常见图类型及其在漂移检测中的应用:
- 同构图 (Homogeneous Graph):所有节点和边属于同一类型。例如,社交网络中的“用户-用户”好友关系。
- 异构图 (Heterogeneous Graph):包含多种类型的节点和边。例如,电商图中包含“用户”、“商品”、“店铺”三类节点和“购买”、“收藏”、“属于”三类边。
- 动态图 (Dynamic Graph):节点和边随时间变化。在模型看板漂移检测中,动态图是最常见的场景——新用户注册、交易关系建立/断开都会改变图结构。
⚠️ 漂移检测陷阱: 当图从同质结构演变为异质结构(例如新增了“设备”节点类型),或者图的度数分布发生显著偏移时,基于旧图结构训练的 GraphSAGE 模型可能会产生特征分布漂移,导致预测性能下降。这是模型看板需要重点监控的信号。
5. 图在 GraphSAGE 中的角色
在 GraphSAGE 模型中,图结构决定了消息传递的路径和范围。模型通过聚合邻居节点的特征来更新目标节点的表示。以下代码展示了如何利用邻接矩阵获取节点的邻居信息:
import numpy as np
# 假设邻接矩阵 A 和节点特征矩阵 X
A = np.array([
[0, 1, 1, 0],
[1, 0, 1, 0],
[1, 1, 0, 1],
[0, 0, 1, 0]
])
# 获取节点 0 的邻居索引(无向图)
neighbors_0 = np.where(A[0] == 1)[0]
print(f"节点 0 的邻居: {neighbors_0}") # 输出: [1 2]
# 模拟 1 跳邻居特征聚合(平均聚合)
X = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]])
neighbor_features = X[neighbors_0] # 取邻居节点特征
aggregated = np.mean(neighbor_features, axis=0)
print(f"节点 0 的聚合邻居特征: {aggregated}") # 输出: [4. 5.]
📊 实践要点: 在模型看板漂移检测中,需要定期监控图的统计性质(如平均度数、连通分量数量、异构图边类型分布)。当这些指标发生显著变化时,往往预示着图结构漂移,此时应触发模型重训练或特征工程调整。