Ch12 §05 3D 图网络 · 讲解稿¶
章节定位: 教"3D 物理世界"的 GNN — 必须满足旋转/平移等变性。覆盖几何图 / SchNet / DimeNet / EGNN / 等变网络 / 分子动力学应用。 承接: §04 GAT 注意力 → §05 在 3D 上做"等变"网络 走向: 后续 Ch13+ 章节可结合 3D GNN 应用 (蛋白结构、推荐系统) 篇幅: ~4400 字 / 阅读 13 分钟 / 讲解 25-30 分钟
一 · 一句话总览¶
3D 图网络 = 满足 SE(3) / E(n) 等变性的 GNN。SchNet (距离基, 不变)、DimeNet (加角度)、EGNN (位置等变更新)、Equiformer (球谐等变) 是四代 3D GNN 演进, 物理化学/蛋白/分子动力学核心。
二 · 心智模型¶
3D 数据有两个核心特性:
- 几何对称: 旋转 / 平移 / 反射不应改变物理量
- 距离/角度/二面角: 三种基本几何量
| 量 | 不变性 | 等变性 |
|---|---|---|
| 距离 \(d_{ij}\) | ✓ (旋转/平移都不变) | — |
| 角度 \(\theta_{ijk}\) | ✓ | — |
| 二面角 \(\phi_{ijkl}\) | ✓ | — |
| 相对位置 \(\mathbf{r}_{ij} = \mathbf{r}_j - \mathbf{r}_i\) | 平移 ✓, 旋转 ✗ | 旋转等变 |
三 · 章节主线 (5 段)¶
第 1 段 · 几何图与对称性 (8 分钟)¶
3.1.1 几何图¶
定义: 节点 \(i\) 在 \(\mathbb{R}^3\) 中有位置 \(\mathbf{r}_i\), 同时有特征 \(\mathbf{h}_i\)。
| 数据 | 节点 | 边 | 位置 |
|---|---|---|---|
| 分子 | 原子 (类型/电荷) | 化学键 | 原子坐标 |
| 蛋白 | 氨基酸残基 | 肽键/空间邻近 | Cα 原子坐标 |
| 点云 | LiDAR 点 (颜色/强度) | kNN 邻接 | 3D 坐标 |
| 晶体 | 原子 | 晶格 | 晶胞坐标 |
3.1.2 关键几何量¶
| 量 | 公式 | 物理含义 |
|---|---|---|
| 距离 | \(d_{ij} = \|\mathbf{r}_i - \mathbf{r}_j\|\) | 原子对空间距离 |
| 键角 | \(\theta_{ijk} = \angle(\mathbf{r}_j - \mathbf{r}_i, \mathbf{r}_k - \mathbf{r}_i)\) | 三原子几何 |
| 二面角 | \(\phi_{ijkl}\) | 四原子扭转 |
| 相对位置 | \(\mathbf{r}_{ij} = \mathbf{r}_j - \mathbf{r}_i\) | 旋转等变 |
3.1.3 SE(3) 与 E(n) 群¶
| 群 | 包含 | 物理意义 |
|---|---|---|
| SO(3) | 旋转 | 刚体方向 |
| SE(3) | 旋转 + 平移 | 刚体运动 |
| E(3) | 旋转 + 平移 + 反射 | 物理对称 (含手性翻转) |
3.1.4 输出决定架构¶
| 输出 | 要求 | 架构选择 |
|---|---|---|
| 标量 (能量) | 旋转不变 | Invariant (距离/角度) |
| 向量 (力) | 旋转等变 | Equivariant (TFN / EGNN) |
| 张量 (偶极矩) | 旋转等变 | 高阶等变 |
第 2 段 · SchNet: 距离基消息传递 (10 分钟)¶
SchNet (Schütt 2017) 是 3D GNN 的奠基 — 用距离作为连续滤波。
3.2.1 距离 → 特征 (RBF)¶
距离是连续值, 网络需要把它"展开"成高维向量。SchNet 用径向基函数 (RBF):
\(K\) 个高斯, 中心 \(\mu_k\) 在 \([0, r_{\text{cut}}]\) 均匀分布, 宽度 \(\gamma_k\)。
类比: 类似 NLP 的 positional encoding — 把标量距离编码成可学习的"距离 embedding"。
3.2.2 消息公式¶
- \(W_{\text{filter}}\): MLP, 把 RBF 距离 → 滤波向量
- \(\odot\): 元素乘 (Hadamard 积, 类似门控机制)
3.2.3 关键性质¶
- 只用了距离 — 整个模型自动满足旋转/平移不变
- 不需要专门处理对称性
- 输出: 标量 (如能量 \(E\))
3.2.4 PyTorch 实现¶
import torch
import torch.nn as nn
class RBF(nn.Module):
def __init__(self, n_rbf=64, cutoff=10.0):
super().__init__()
centers = torch.linspace(0, cutoff, n_rbf)
widths = torch.full((n_rbf,), 2.0 / cutoff)
self.register_buffer('centers', centers)
self.register_buffer('widths', widths)
def forward(self, d):
# d: [..., 1]
diff = d - self.centers
return torch.exp(-self.widths * diff**2) # [..., n_rbf]
class SchNetLayer(nn.Module):
def __init__(self, dim, n_rbf=64):
super().__init__()
self.rbf = RBF(n_rbf)
self.filter_mlp = nn.Sequential(
nn.Linear(n_rbf, dim),
nn.SiLU(),
nn.Linear(dim, dim)
)
self.msg_mlp = nn.Sequential(nn.Linear(dim, dim), nn.SiLU())
self.update_mlp = nn.Sequential(nn.Linear(dim, dim), nn.SiLU())
def forward(self, h, pos, edge_index):
src, dst = edge_index
# 距离
dist = torch.norm(pos[src] - pos[dst], dim=-1, keepdim=True)
# 滤波
rbf_feat = self.rbf(dist)
filter_w = self.filter_mlp(rbf_feat)
# 消息
msg = h[src] * filter_w
msg = self.msg_mlp(msg)
# 聚合
agg = torch.zeros_like(h).index_add_(0, dst, msg)
# 更新
return self.update_mlp(h + agg)
第 3 段 · DimeNet 与 SphereNet: 角度与二面角 (8 分钟)¶
3.3.1 距离不够¶
两分子可距离完全相同但构型不同 — 这叫"距离几何模糊性"。
例: - 顺式 vs 反式: 距离相同, 角度不同 - 蛋白折叠: 主链二面角决定形状
3.3.2 DimeNet 加角度¶
DimeNet (Gasteiger 2020) 在消息中加键角:
- 沿有向边传播消息
- 角度 \(\theta_{kji}\) 在边上 \(j \to i\) 处 (即 \(j\) 的入射角)
- 用球 Bessel 函数展开 (球面的自然基)
3.3.3 SphereNet 加二面角¶
SphereNet (Liu 2022) 进一步加二面角:
| 量 | 复杂度 |
|---|---|
| 距离 | \(O(\|E\|)\) |
| 角度 | \(O(\|E\| \cdot k)\) |
| 二面角 | \(O(\|E\| \cdot k^2)\) |
其中 \(k\) 是平均度。层次越深, 信息越丰富, 计算越贵。
3.3.4 三种几何量的物理意义¶
- 距离: 原子间远近 (范德华力)
- 角度: 局部几何 (弯曲 vs 直线)
- 二面角: 3D 扭转 (蛋白骨架, 药物结合姿态)
第 4 段 · 等变 GNN: EGNN 与球谐 (10 分钟)¶
3.4.1 限制: 不变架构¶
SchNet / DimeNet 只输出标量。要预测力向量 (分子动力学) 或偶极矩 (向量), 必须用等变架构。
3.4.2 EGNN: 位置等变更新¶
EGNN (Satorras 2021) 同时更新特征和位置:
关键: 位置更新用相对位置 \((\mathbf{r}_i - \mathbf{r}_j)\) 加权求和。如果输入旋转 \(R\), 输出也旋转 \(R\) — 严格等变。
3.4.3 Tensor Field Network (TFN)¶
TFN (Thomas 2018) 用球谐函数当基, 把特征编码为不可约表示:
- type-0 (\(l=0\)): 标量, 旋转不变
- type-1 (\(l=1\)): 向量, 旋转等变
- type-2 (\(l=2\)): 二阶张量
每层按 Wigner-Eckart 定理作用。
3.4.4 Equiformer: Transformer + 等变¶
Equiformer (Liao, ICLR 2023) = E(3) 等变 + Transformer:
class EquiformerLayer(nn.Module):
def __init__(self, dim, lmax=2):
super().__init__()
self.lmax = lmax
# 每个 l 阶有自己的 MLP / 注意力
self.type0_mlp = nn.Linear(dim, dim) # 标量
self.type1_mlp = nn.Linear(dim, dim) # 向量
# 球谐基
self.sphere_harm = SphereHarmonics(lmax)
def forward(self, x_type0, x_type1, pos):
# x_type0: 标量特征
# x_type1: 向量特征
# pos: 原子坐标
# 1. 计算球谐表示
sh = self.sphere_harm(pos) # [n_atom, n_sh]
# 2. 标量 + 向量做 attention (类型感知)
msg0 = self.type0_mlp(x_type0)
# 3. 等变更新位置
return msg0
3.4.5 OGB-mol SOTA 对比¶
| 模型 | OGB-mol ROC-AUC |
|---|---|
| GIN | 76.0% |
| SchNet | 73.0% |
| DimeNet++ | 76.4% |
| EGNN | 78.6% |
| Equiformer | 80.4% |
| GemNet | 81.5% |
等变 + Transformer 是当前 SOTA。
第 5 段 · 实践: 分子动力学应用 (10 分钟)¶
3.5.1 用 EGNN 模拟 MD¶
分子动力学 (MD) 需要快速预测能量 + 力场。EGNN 替代 DFT:
import torch
from torch_geometric.nn import EGNNConv
class EGNN(torch.nn.Module):
def __init__(self, in_dim, hid_dim, out_dim):
super().__init__()
self.conv1 = EGNNConv(in_dim, hid_dim)
self.conv2 = EGNNConv(hid_dim, hid_dim)
self.head = torch.nn.Linear(hid_dim, out_dim)
def forward(self, h, pos, edge_index):
# h: [n, d]
# pos: [n, 3]
h, pos = self.conv1(h, pos, edge_index)
h = torch.relu(h)
h, pos = self.conv2(h, pos, edge_index)
# 能量 (READOUT)
energy = self.head(h).sum()
return energy, pos
3.5.2 力的预测 (等变)¶
# 自动微分得到力
pos.requires_grad_(True)
energy, _ = model(h, pos, edge_index)
force = -torch.autograd.grad(energy, pos)[0]
# force 旋转等变: 如果 pos 旋转 R, force 也旋转 R
3.5.3 应用: 药物发现¶
| 任务 | 模型 | 指标 |
|---|---|---|
| OGB-molhiv | GIN/EGNN | ROC-AUC ~80% |
| QM9 能量 | SchNet | MAE 0.5 meV |
| MD17 力场 | EGNN | MAE 0.1 kcal/mol/Å |
| OCP 催化 | Equiformer | E MAE 0.1 eV |
3.5.4 应用: AlphaFold 3¶
AlphaFold 3 (DeepMind, 2024) 处理蛋白 + DNA + RNA + 小分子复合结构, 在三角注意力 (AlphaFold 2) 基础上引入 GNN 模块:
- 节点: 残基 + 核苷酸 + 原子
- 边: 化学键 + 距离 (≤ 30 Å)
- 消息: 距离 + 角度 + 边特征
- 输出: 3D 坐标 (等变更新)
3.5.5 应用: 点云 (Ch08/Ch11)¶
# PointNet++ 处理 LiDAR 点云
from torch_geometric.nn import PointNetConv
class PointNetPlusPlus(torch.nn.Module):
def __init__(self):
super().__init__()
self.conv1 = PointNetConv(local_nn=torch.nn.Linear(3+3, 64), add_self_loops=False)
self.conv2 = PointNetConv(local_nn=torch.nn.Linear(64+3, 128), add_self_loops=False)
# ...
def forward(self, pos, batch):
# kNN 邻接
edge_index = knn_graph(pos, k=16, batch=batch)
h = self.conv1(pos, pos, edge_index)
h = self.conv2(h, pos, edge_index)
# READOUT (max pool)
return global_max_pool(h, batch)
四 · 四代 3D GNN 对比¶
| 模型 | 几何量 | 不变/等变 | 输出类型 | 复杂度 | OGB-mol |
|---|---|---|---|---|---|
| SchNet | 距离 | 不变 | 标量 | \(O(E)\) | 73% |
| DimeNet++ | 距离 + 角度 | 不变 | 标量 | \(O(E k)\) | 76% |
| EGNN | 距离 + 位置 | 等变 | 标量+向量 | \(O(E)\) | 78% |
| Equiformer | 球谐 (l≤2) | 等变 | 多阶 | \(O(E k^2)\) | 80% |
| GemNet | 二面角 | 等变 | 多阶 | \(O(E k^2)\) | 81% |
五 · 易错点 (5 条)¶
- 平移不变 vs 旋转等变: 距离对两者都不变; 相对位置 \(\mathbf{r}_{ij}\) 平移不变但旋转等变。
- SchNet 只能标量输出: 想预测力向量, 必须用 EGNN/TFN 等变架构。
- RBF 中心范围: 必须覆盖物理距离 (典型 [0, 10] Å); 超出范围预测不准。
- 球谐函数的 l: \(l=0\) 标量, \(l=1\) 向量, \(l=2\) 二阶张量; \(l\) 越大计算越贵。
- EGNN 的位置更新: 只在推理时更新, 训练时通常冻结 (否则优化困难)。
六 · 跨章连接¶
| 章节 | 关联 |
|---|---|
| Ch02 §04 矩阵论 | 旋转矩阵 \(R \in SO(3)\), 等变操作 |
| Ch03 §05 梯度 | 力 = \(-\nabla E\) 自动微分 |
| Ch08 §04 Diffusion | 等变扩散模型 (分子生成) |
| Ch08 §05 NeRF | 3D 表征另一路径 (隐式辐射场) |
| Ch11 §05 VLA | 机器人空间推理可用 EGNN |
| Ch05 §04 贝叶斯 | 贝叶斯优化分子性质 |
七 · 自测 5 题¶
- SchNet 的 RBF 有什么作用? 为什么必须?
- 距离不变 vs 相对位置等变的区别?
- DimeNet 相对 SchNet 多了什么? 复杂度?
- EGNN 如何保证位置等变更新?
- 球谐函数在 Equiformer 中的角色?
八 · 一句话总结¶
3D 图网络 = 在物理空间满足 SE(3) / E(n) 等变性的 GNN。SchNet (距离基) → DimeNet (加角度) → EGNN (位置等变) → Equiformer (球谐等变), 表达力递增。分子动力学、蛋白结构 (AlphaFold 3)、药物发现是其核心应用。Ch12 至此讲完: GDL 范式 (§01) + 图论 (§02) + GNN 三件套 (§03) + 图注意力 (§04) + 3D 图 (§05)。
九 · 板书建议¶
[板书 1: 几何量]
d_ij = ||r_i - r_j|| 旋转+平移 不变
θ_ijk = angle at i 旋转+平移 不变
r_ij = r_j - r_i 平移 不变, 旋转 等变
[板书 2: SchNet]
RBF(d) = [exp(-γ₁(d-μ₁)²), ...]
m_{j→i} = h_j ⊙ W_filter(RBF(d_ij))
[板书 3: EGNN 位置更新]
r_i' = r_i + C Σ (r_i - r_j) · φ_r(m_ij)
← 等变 (旋转 R 输入 → 旋转 R 输出)
[板书 4: 球谐]
l=0: 标量
l=1: 向量
l=2: 二阶张量
SO(3) 作用: Y_l^m → D^l(R) Y_l^m
十 · 参考资料¶
- Schütt et al., "SchNet: A Continuous-filter Convolutional Neural Network for Modeling Quantum Interactions", NeurIPS 2017
- Gasteiger et al., "Directional Message Passing for Molecular Graphs", ICLR 2020 (DimeNet)
- Satorras et al., "E(n) Equivariant Graph Neural Networks", ICML 2021 (EGNN)
- Thomas et al., "Tensor Field Networks", ICML 2018 (TFN)
- Liao et al., "Equiformer: A Generic Graph Transformer for Molecular Property Prediction", ICLR 2023
- Jumper et al., "AlphaFold 3", Nature 2024
- Ch03 §05 梯度下降 (本套书)
- Ch08 §04 Diffusion (本套书)