跳转至

几何深度学习

一句话总结:几何深度学习揭示 CNN、Transformer、GNN 其实是同一原理的不同实例——都在利用数据的对称性;本节讲对称群、群作用、不变性、等变性、五大几何域和尺度分离。

🗺️ 本章导览

  • 本章覆盖图神经网络:几何深度学习 → 图论 → GNN → 图注意力 → 3D 等变
  • 01. 几何深度学习 (本节):对称与不变性、群论视角、五大几何域
  • 02. 图论基础:图、邻接、度、路径、连通性
  • 03. 图神经网络:消息传递、GCN、GraphSAGE
  • 04. 图注意力网络: GAT、Graph Transformer
  • 05. 3D 图网络: SE(3) 等变、SchNet、EGNN

几何深度学习是一个统一框架,它揭示了 CNN、Transformer 和 GNN 其实都是同一原理的实例:利用对称性。 本节涵盖对称群、群作用、不变性、等变性、五大几何域,以及尺度分离.

  • 一路走来,我们研究了许多架构:用于图像的卷积神经网络 (Convolutional Neural Network, CNN) (第 8 章)、用于语言的 Transformer (第 7 章)、以及用于序贯决策的强化学习策略 (第 6 章). 表面上,这些模型完全不同,是为完全不同的问题量身打造的。 但底下藏着一个更深的模式。

  • 几何深度学习告诉我们,上述所有架构其实都是同一个想法的实例:构建尊重数据对称性的网络。 CNN 利用图像的平移对称性。 Transformer 利用序列的置换对称性 (注意力不依赖于绝对位置). 图神经网络 (Graph Neural Network, GNN) 利用图的置换对称性。 一旦看清这点,五花八门的架构动物园就收敛成一个连贯的统一框架。

对称与群

  • 一个对象的对称就是保持它不变的变换。 正方形有 8 个对称:4 个旋转 (0°、90°、180°、270°) 加 4 个反射。 圆有无穷多个:绕圆心的任意旋转都算。 关键洞察是:对称告诉你什么不重要,而"知道什么不重要"对学习来说威力惊人。

  • 用机器学习的话说:如果任务有某种对称性,模型无论看到输入的哪个"版本",都应给出同样的答案。 猫的检测器无论猫在图像左上角还是右下角都得能工作。 这就是平移对称性。

  • 对称在数学上被形式化为群 (group). 一个群 \(G\) 是一组变换,满足四条性质:

    • 封闭性:两个变换的复合仍在群里。 旋转 90° 再旋转 90° 得 180°,仍属于该集合。
    • 结合律: \((g_1 \circ g_2) \circ g_3 = g_1 \circ (g_2 \circ g_3)\). 复合的括号怎么加都无所谓 (回忆第 2 章矩阵乘法的结合律).
    • 单位元:存在一个"啥也不干"的变换 \(e\),使得 \(e \circ g = g \circ e = g\).
    • 逆元:每个变换都有一个撤销操作:\(g \circ g^{-1} = e\).
  • 这些公理和向量空间 (第 1 章) 的公理如出一辙,只不过操作对象从向量换成了变换。 这个联系非常深:群作用在向量空间上,而神经网络必须尊重这种作用。

  • 深度学习里常见的几个群:

    • 平移群 \((\mathbb{R}^n, +)\):对图像或信号的平移。 这是 CNN 利用的对称性。
    • 对称群 (symmetric group) \(S_n\): \(n\) 个元素的所有排列。 这是 GNN 和 Transformer 利用的对称性 (重排节点或 Token 不应改变结果).
    • 旋转群 \(SO(n)\): \(n\) 维空间的全部旋转。 \(SO(2)\) 是平面旋转,\(SO(3)\) 是 3D 旋转 (对分子和 3D 视觉任务至关重要).
    • 欧几里得群 \(E(n)\):全部旋转、反射与平移。 物理空间的对称性。
    • 特殊欧几里得群 \(SE(n)\):旋转与平移 (无反射). 刚体运动的对称性。
  • 群作用 (group action) 描述群如何变换数据。 若 \(G\) 是一个群,\(X\) 是数据空间,则作用 \(\rho: G \times X \to X\) 把每个群元素 \(g\) 和数据点 \(x\) 映到变换后的点 \(\rho(g, x)\). 对图像来说,平移群通过挪动像素坐标来作用。 对图来说,对称群通过给节点重新贴标签来作用。

不变性与等变性

  • 给定一个对称群,函数可以以两种重要方式与之相关:

  • 函数 \(f\) 对群 \(G\) 不变 (invariant),是指输入被变换后输出不变:

\[f(\rho(g, x)) = f(x) \quad \text{for all } g \in G\]
  • 例:平移一张图,它的总亮度不会变。 图像分类应该是平移不变的:不管猫坐在哪,类别都是"猫".

  • 函数 \(f\) 对 \(G\) 等变 (equivariant),是指输入变换会引起输出以对应方式变换:

\[f(\rho_{\text{in}}(g, x)) = \rho_{\text{out}}(g, f(x)) \quad \text{for all } g \in G\]
  • 例:把图像向右平移 5 像素,CNN 的特征图也随之向右平移 5 像素。 卷积操作是平移等变的:它保留了空间关系。 目标检测应当是等变的:猫一动,边界框也得跟着动。

不变性: 无论如何变换输入, 输出保持不变. 等变性: 输出随之做对应变换

  • 这个区分很重要:中间层通常应当等变 (为下游层保留结构),而最终输出应当不变 (答案不该依赖于变换). CNN 的做法是堆叠等变的卷积层,最后套一个全局池化 (它是不变的).

  • 把等变性内建进架构,比从数据里学出来高效得多。 一个带权重共享的平移等变 CNN,所需参数远少于必须独立学习"猫在 (10,10)"和"猫在 (200,150)"两种情形的全连接网络。 对称约束把假设空间指数级地缩小。

五大几何域

  • 几何深度学习识别出五种基本的数据域,每一种都有自己的对称群。 每一个神经网络架构,都可以理解为在利用其中某个域的对称性。

五大几何域: 网格、集合、序列、图、流形, 每种各有对称性与对应架构

  • 1. 网格 (欧几里得数据):图像、音频频谱图、体数据。 底层结构是一个规则网格,具有平移对称性。 群是平移群 (可能再加旋转与反射). 利用此对称性的架构就是 CNN:卷积正是那个对平移等变的操作。 空间位置间的权重共享,就是把平移等变具体化。

  • 2. 集合 (无序集合):点云、粒子系统。 对称性是置换不变:元素顺序无关。 架构是 DeepSets (以及第 8 章的 PointNet):对每个元素应用一个共享函数,再用一个置换不变的操作 (求和、求均值或求最大) 聚合。 形式上,\(f(\{x_1, \ldots, x_n\}) = \phi\left(\sum_i \psi(x_i)\right)\).

  • 3. 序列 (有序数据):文本、时间序列。 序列是 1D 的网格,但对称性更微妙:绝对位置可能重要也可能不重要。 循环神经网络 (Recurrent Neural Network, RNN) 自回归地处理序列。 带位置编码的 Transformer 可以关注任意位置,而它的自注意力在加入位置编码前是置换等变的。 这正是 Transformer 泛化能力强的原因:它一开始就是置换等变的,再补上刚好够用的位置结构。

  • 4. 图 (关系型数据):社交网络、分子、知识图谱。 对称性是节点的置换:给节点重新贴标签不该改变图的性质。 架构就是 GNN:相连节点之间做消息传递,使用与节点顺序无关的共享函数。 这也是本章后续内容的重点。

  • 5. 流形与网格 (mesh):曲面、3D 形状。 对称性包括微分同胚 (光滑形变). 架构使用内在算子 (如 Laplace-Beltrami 算子),这些算子由曲面几何本身定义,与曲面如何嵌入到空间中无关。 这与微分几何相通,在形状分析、球面上的气候建模、以及蛋白质表面分析中都用得上。

  • 这个框架的威力在于统一. CNN 就是网格图上的 GNN. Transformer 就是全连接图上的 GNN. DeepSets 就是没有边的 GNN. 把它们视为同一原理的实例,就能指导新架构的设计:找出数据的对称性,再构建一个尊重它的网络。

尺度分离与粗化

  • 现实世界的数据在多个尺度上都有结构。 一张图像有细粒度纹理 (像素级)、局部模式 (边缘、角点)、物体部件 (轮子、窗户),以及全局结构 (整个场景). 一个分子有原子级特征、官能团、以及整体分子形状。

  • 尺度分离 (scale separation) 就是这样一个原则:这些不同层次的细节可以被分层处理——先捕捉局部结构,再逐级聚合成越来越粗的表示。 这就是粗化 (coarsening) 或池化 (pooling).

  • 在 CNN 里,池化层 (最大池化、平均池化) 对空间分辨率做下采样,迫使更高层去捕捉更大尺度的模式。 从感受野的视角看 (第 8 章),更深的层"看到"的图像范围更大。 这就是尺度分离在起作用。

  • 在图上,粗化意味着把一组节点聚成一个"超节点",得到一个更小但保留了核心结构的图。 这就是图池化,我们会在第 3 节详细讲。 它与图像池化的类比很直接:降低分辨率,同时保留重要特征。

  • 在序列里,分层处理 (例如 句子 → 段落 → 文档) 捕捉不同时间或语义尺度上的结构。 Swin Transformer (第 8 章) 把这个思路搬到了图像上,用的是移位窗口的层级结构。

  • 数学上,粗化定义出一个逐渐抽象的表示层级:

\[x \xrightarrow{\text{local features}} h^{(1)} \xrightarrow{\text{coarsen}} h^{(2)} \xrightarrow{\text{coarsen}} \cdots \xrightarrow{\text{global}} y\]
  • 在每一级上,表示都对该级的对称群等变。 最终的全局表示是不变的,它抓住了输入的本质,而不再对无关变换敏感。

  • 这也是为什么深网络在处理结构化数据时比浅网络更好用:每一层都增加一级抽象,而许多等变层的复合,从简单的局部特征逐步搭建出复杂的不变特征。

编程练习 (在 CoLab 或 notebook 中做)

  1. 验证卷积的平移等变性。 对一张图像做卷积,再把图像平移后重新卷积。 检查两次的输出是否互为平移版本。

    import jax
    import jax.numpy as jnp
    
    # 1D 信号和一个简单滤波器
    signal = jnp.array([0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0], dtype=float)
    kernel = jnp.array([1, 0, -1], dtype=float)
    
    # 先卷积, 再平移
    conv_result = jnp.convolve(signal, kernel, mode="same")
    shifted_signal = jnp.roll(signal, 3)
    conv_shifted = jnp.convolve(shifted_signal, kernel, mode="same")
    shifted_conv = jnp.roll(conv_result, 3)
    
    print(f"Conv then shift:  {shifted_conv}")
    print(f"Shift then conv:  {conv_shifted}")
    print(f"Equivariant: {jnp.allclose(shifted_conv, conv_shifted, atol=1e-5)}")
    

  2. 验证 DeepSets 风格聚合的置换不变性。 对集合中每个元素施加一个共享函数,把结果求和,检查输出是否与元素顺序无关。

    import jax
    import jax.numpy as jnp
    
    # 一个由 4 个向量组成的"集合" (顺序不该影响结果)
    x = jnp.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]])
    
    # 简单的共享函数: 逐元素平方
    psi = lambda v: v ** 2
    
    # 用求和做聚合
    def deepsets(points):
        return jnp.sum(jax.vmap(psi)(points), axis=0)
    
    # 原始顺序
    result1 = deepsets(x)
    
    # 打乱顺序
    perm = jnp.array([2, 0, 3, 1])
    result2 = deepsets(x[perm])
    
    print(f"Original order:  {result1}")
    print(f"Permuted order:  {result2}")
    print(f"Invariant: {jnp.allclose(result1, result2)}")
    

  3. 探索群结构。 通过验证封闭性、结合律、单位元、逆元,确认 2D 旋转矩阵构成一个群。

    import jax.numpy as jnp
    
    def rot2d(theta):
        return jnp.array([[jnp.cos(theta), -jnp.sin(theta)],
                           [jnp.sin(theta),  jnp.cos(theta)]])
    
    R1 = rot2d(jnp.pi / 6)
    R2 = rot2d(jnp.pi / 4)
    R3 = rot2d(jnp.pi / 3)
    
    # 封闭性: 两个旋转的乘积仍是一个旋转
    R12 = R1 @ R2
    print(f"Closure (det=1, orthogonal): det={jnp.linalg.det(R12):.4f}, "
          f"R^T R = I: {jnp.allclose(R12.T @ R12, jnp.eye(2), atol=1e-5)}")
    
    # 结合律
    print(f"Associative: {jnp.allclose((R1 @ R2) @ R3, R1 @ (R2 @ R3), atol=1e-5)}")
    
    # 单位元
    I = rot2d(0.0)
    print(f"Identity: {jnp.allclose(R1 @ I, R1, atol=1e-5)}")
    
    # 逆元
    R1_inv = rot2d(-jnp.pi / 6)
    print(f"Inverse: {jnp.allclose(R1 @ R1_inv, jnp.eye(2), atol=1e-5)}")
    


📌 本节要点

  • 对称性:对象在某种变换下保持不变的性质,告诉模型"什么不重要",是学习效率的关键杠杆。
  • 群的四条公理:封闭性、结合律、单位元、逆元——刻画一切"变换集合"的最小结构。
  • 深度学习常见群:平移群、对称群 \(S_n\)、旋转群 \(SO(n)\)、欧几里得群 \(E(n)\)、特殊欧几里得群 \(SE(n)\).
  • 不变性 vs 等变性:不变 = 变换输入输出不变;等变 = 变换输入输出跟着一起变。
  • 架构设计原则:中间层等变以保留结构,最终输出不变以稳定答案。
  • 五大几何域:网格 (CNN)、集合 (DeepSets)、序列 (RNN / Transformer)、图 (GNN)、流形 (内在算子).
  • 架构统一视角: CNN 是网格图上的 GNN, Transformer 是全连接图上的 GNN, DeepSets 是无边图上的 GNN.
  • 尺度分离:通过粗化 / 池化把数据分层抽象——从局部特征到全局表示。
  • 粗化层级: \(x \to h^{(1)} \to h^{(2)} \to \cdots \to y\),每级对该级的对称群等变,最终全局表示不变。
  • 深比浅好的深层原因:多层等变复合能把简单的局部特征逐步构造出复杂的不变特征。