2.1 消息传递机制详解
消息传递神经网络(MPNN)是GNN的通用框架。 其核心思想是:每个节点不断地从其邻居节点接收"消息", 并根据这些消息更新自己的状态。经过多轮消息传递后, 每个节点的表示就融合了更远距离的信息。
基本流程
消息传递分为两个核心步骤,在每一层中重复执行:
- 消息构造(Message): 对于每条边 (i, j),根据源节点 j 的特征、目标节点 i 的特征以及边的特征, 计算出一条"消息" mij
- 聚合与更新(Aggregate & Update): 对于每个节点 i,将其所有邻居发来的消息聚合起来(如求和、平均、最大池化), 然后结合节点自身的当前状态,更新得到新的节点特征 hi
mij(k) = M(k)(hi(k-1), hj(k-1), eij)
mi(k) = AGGj∈N(i)({mij(k) | j ∈ N(i)})
hi(k) = U(k)(hi(k-1), mi(k))
其中:
- hi(k) 是第 k 层节点 i 的特征向量
- N(i) 是节点 i 的所有邻居
- M 是消息函数(通常是MLP)
- AGG 是聚合函数(sum, mean, max 等)
- U 是更新函数(通常是MLP或GRU)
感受野与层数的关系
每增加一层GNN,节点的感受野就向外扩展一跳。 一个 L 层的GNN,每个节点能接收到 L 跳以内的邻居信息。 在物理仿真中,这对应着信息能够传播的距离。
过度平滑问题:当GNN层数过多时,所有节点的特征会变得越来越相似, 失去区分度,这就是"过度平滑"(over-smoothing)现象。 在物理仿真中,如果需要捕捉很长距离的依赖(如碰撞波从车头传到车尾), 单纯增加GNN层数可能不是最优方案——这也是引入Transformer的重要原因之一。
📝 小节检测
MPNN的核心是每一层都执行"消息构造"和"聚合更新"两个步骤,逐层传播信息。
每增加一层GNN,感受野扩展一跳。5层GNN意味着每个节点能接收5跳以内的邻居信息。
增加GNN层数恰恰是导致过度平滑的原因,而不是解决方案。解决方法包括跳跃连接、注意力机制等。
聚合函数可以有多种选择,包括sum、mean、max、attention-weighted sum等,不同选择对应不同的GNN变体。
2.2 GCN:图卷积网络
GCN(Graph Convolutional Network) 由Kipf和Welling在2017年提出,是图神经网络的里程碑式工作。 它将谱图卷积简化为高效的空间域形式,成为最经典的GNN架构之一。
核心公式
H(k+1) = σ( D̃-1/2 Ã D̃-1/2 H(k) W(k) )
各部分含义:
- Ã = A + I:邻接矩阵加上自环(每个节点能看到自己)
- D̃:Ã 的度矩阵(对角矩阵,对角元素为每个节点的度数)
- D̃-1/2 Ã D̃-1/2:对称归一化的邻接矩阵
- W(k):可学习的权重矩阵
- σ:非线性激活函数(如ReLU)
直观理解
GCN做的事情其实很简单:每个节点把自己和邻居的特征加权平均,再做一次线性变换和非线性激活。 归一化的目的是让度数高的节点不会因为接收更多消息而数值过大。
GCN的特点:
✅ 计算效率高(基于稀疏矩阵乘法)
✅ 理论基础扎实(源于谱图理论)
❌ 对所有邻居平等看待,无法区分邻居的重要性
❌ 需要知道完整图结构(直推式学习,transductive)
❌ 处理大图时内存占用高
在物理仿真中的适用性:GCN虽然经典,但在物理仿真中用得相对较少。 原因是:物理交互中不同方向、不同距离的邻居影响力应该不同, 而GCN的"平等看待所有邻居"的假设与物理直觉不完全吻合。 物理仿真中更常用的是带边特征的消息传递GNN(如GraphNets架构)。
📝 小节检测
对称归一化(D^-1/2 A D^-1/2)的目的是平衡不同度数节点的消息,避免高度数节点主导计算。
GCN的核心局限是对所有邻居使用固定权重(由度数决定),无法学习不同邻居的不同重要性。
添加自环确保每个节点在聚合邻居信息时也保留自己的特征信息。
2.3 GAT:图注意力网络
GAT(Graph Attention Network) 由Velickovic等人在2018年提出,解决了GCN"平等对待所有邻居"的问题。 GAT引入了注意力机制,让每个节点自动学习不同邻居的重要程度。
注意力系数的计算
对于节点 i 和它的邻居 j,注意力系数 αij 衡量了 j 对 i 的重要性:
eij = LeakyReLU( aT [W hi || W hj] )
αij = softmaxj(eij) = exp(eij) / Σk∈N(i) exp(eik)
hi' = σ( Σj∈N(i) αij W hj )
各部分含义:
- W:共享的线性变换矩阵,先对节点特征做变换
- ||:拼接(concatenation)操作
- a:注意力向量,一个可学习的向量,用于计算注意力得分
- LeakyReLU:非线性激活函数
- softmax:对所有邻居的注意力得分归一化,使其和为1
多头注意力
与Transformer类似,GAT也使用多头注意力来稳定学习过程并捕捉不同类型的关系。 每个头独立计算注意力,然后将结果拼接或平均。
GAT的特点:
✅ 能学习不同邻居的重要性,更灵活
✅ 不需要预先知道完整图结构(归纳式学习能力更强)
✅ 计算效率较高(可并行计算所有边的注意力)
❌ 两两计算注意力,复杂度与边数成正比
❌ 注意力仅基于特征相似性,可能忽略结构信息
在物理仿真中的意义:GAT的注意力机制在物理仿真中非常有用。 例如,碰撞发生时,接触区域附近的节点之间影响力更大, 注意力机制可以自适应地聚焦于这些关键交互。 这也是为什么"注意力"成为后续Graph Transformer等架构的核心组件。
📝 小节检测
GAT的核心贡献是引入注意力机制,让每个节点能够学习到不同邻居的重要性权重。
多头注意力会增加参数量(多头就有多组参数),而不是减少。
碰撞发生时接触区域的节点间影响力更大,注意力机制可以自适应地关注这些重要交互。
2.4 GraphSAGE:归纳式学习
GraphSAGE 由Hamilton等人在2017年提出,解决了GCN和早期GNN"直推式学习"的局限—— 即训练时必须见过所有节点,无法泛化到新节点。 GraphSAGE学习的是聚合函数而不是节点嵌入本身,因此能处理未见过的节点。
核心思想:采样 + 聚合
GraphSAGE的每一层包含两个关键操作:
- 邻居采样(Sample): 为每个节点固定采样 K 个邻居(如果邻居多于K个则随机采样,少于则有放回采样)。 这使得计算量可控,可以处理大规模图。
- 特征聚合(Aggregate): 用聚合函数将邻居特征聚合起来,然后与自身特征拼接,再经过线性变换。
hN(i)(k) = AGGj∈N(i)({hj(k-1)})
hi(k) = σ(W(k) · [hi(k-1) || hN(i)(k)])
三种聚合函数
- Mean聚合:对邻居特征取平均,最简单也最常用
- Pool聚合:先通过MLP变换,再取最大池化(max-pooling)
- LSTM聚合:将邻居随机排序后输入LSTM,表达能力更强但计算更慢
GraphSAGE的特点:
✅ 支持归纳式学习(inductive),能泛化到新节点
✅ 通过邻居采样,可以处理大规模图
✅ 训练效率高,支持小批量训练
❌ 采样引入随机性,可能丢失重要邻居信息
❌ 固定采样数量可能不适合所有节点
GCN vs GAT vs GraphSAGE 对比
| 特性 | GCN | GAT | GraphSAGE |
|---|---|---|---|
| 核心机制 | 谱图卷积简化 | 注意力加权聚合 | 采样+聚合 |
| 邻居权重 | 固定(由度数决定) | 可学习(注意力) | 固定(mean/max等) |
| 学习方式 | 直推式 | 归纳式(更强) | 归纳式 |
| 大规模图 | 支持(稀疏矩阵) | 一般 | 好(采样机制) |
| 计算效率 | 高 | 中 | 中高 |
| 适用场景 | 小规模静态图 | 需要区分邻居重要性 | 大规模、动态图 |
物理仿真中的选择:在物理仿真中,最常用的架构其实是 自定义的消息传递网络(基于GraphNets框架), 它们使用MLP作为消息和更新函数,支持丰富的边特征, 比标准的GCN/GAT/GraphSAGE更灵活。 这三种经典GNN更像是基础组件,而实际仿真系统通常在此基础上做了大量定制。
📝 小节检测
归纳式学习意味着模型学习的是聚合函数本身,而不是特定节点的嵌入,因此可以处理新出现的节点。
GraphSAGE的邻居采样机制使其可以通过小批量训练处理非常大的图,而不需要一次性加载全图。
GraphSAGE原文提出了Mean、Pool、LSTM三种聚合函数,Transformer聚合不是GraphSAGE的标准变体。
物理仿真中更常用的是自定义消息传递网络(基于GraphNets/MPNN框架),支持丰富的边特征,比标准GCN更灵活。
2.5 Encoder-Processor-Decoder 架构
在物理仿真领域,Encoder-Processor-Decoder(EPD) 是最主流的GNN架构范式。DeepMind的GNS(Graph Network-based Simulators) 和MeshGraphNet都采用了这一架构。
三大组件
图:Encoder-Processor-Decoder 架构示意图
1. Encoder(编码器)
编码器将原始的物理特征(节点位置、速度、材料属性等)映射到高维潜空间。 通常用两个独立的MLP分别处理节点特征和边特征:
- 节点编码器:hi0 = MLPnode(xi)
- 边编码器:eij0 = MLPedge(rij)
其中 xi 是节点 i 的原始物理特征(如位置、速度、类型), rij 是边 ij 的原始特征(如相对位移、距离、边类型)。
2. Processor(处理器)
处理器是模型的核心,由 N 个消息传递层(Graph Network blocks)堆叠而成。 每一层执行:
- 边更新:eij(k+1) = MLPedge([eij(k) || hi(k) || hj(k)])
- 边聚合:mi(k+1) = Σj∈N(i) eji(k+1)
- 节点更新:hi(k+1) = MLPnode([hi(k) || mi(k+1)])
残差连接:在Processor的每层中通常会加入残差连接 (即 hi(k+1) = hi(k) + Δhi), 这样可以训练更深的网络,缓解梯度消失和过度平滑问题。 实际应用中10-15层是常见的配置。
3. Decoder(解码器)
解码器将处理后的节点潜特征映射回物理空间,输出预测的物理量。 在动力学仿真中,通常预测状态的变化量(如加速度、位移增量), 而不是直接预测下一时刻的状态:
- Δvi = MLPdecoder(hi(N))
- vit+1 = vit + Δvi
为什么预测变化量?
1. 数值稳定性:物理状态通常变化缓慢,预测小的增量更稳定
2. 归纳偏置:如果模型什么都不学,输出0,预测就是当前状态(平凡解),符合物理直觉
3. 易于学习:网络只需要学习"扰动",而不需要学习完整的状态映射
自回归推演(Rollout)
训练时,模型只需预测一步的状态变化。但在推理时,我们需要进行长时间推演: 每一步的输出作为下一步的输入,不断递推。这种方式称为自回归推演。
自回归推演的一个关键挑战是误差累积——每一步的小误差会逐步放大。 常用的解决方案包括:训练时加入噪声扰动(noise corruption)、 使用多步预测损失、或引入稳定化机制。
📝 小节检测
Processor是模型的核心,通过多层消息传递在图上进行信息传播和状态更新。
预测变化量(残差预测)有数值稳定性更好、归纳偏置更强、学习更简单等多重优势。
自回归推演的核心挑战是误差累积——每一步的微小误差会在多步递推中逐渐放大。
残差连接可以缓解梯度消失和过度平滑问题,使深层GNN能够有效训练。
消息传递是Processor的功能,不是Decoder的。Decoder负责将潜空间映射回物理输出。