CCG 09-08:几何深度学习、实现与检查

本页只解决一个问题

谱卷积、内在消息传递和输运损失分别使用了哪些几何结构?

本页是原长篇讲义的单概念版本。第一次阅读只追踪本页定义的对象;看见未掌握的前置符号时,先沿链接退回,不要跳过定义硬背结论。

开始前

13. 几何深度学习中的三类结构

13.1 图 Laplacian 与谱卷积

离散 Laplace–Beltrami 广义特征问题:

Lϕk=λkMϕk.L\phi_k=\lambda_kM\phi_k.

特征函数是曲面上的 Fourier 基。谱滤波:

y=g(Δ)x≈∑k=0K−1g(λk)⟨x,ϕk⟩Mϕk.y=g(\Delta)x \approx\sum_{k=0}^{K-1}g(\lambda_k) \langle x,\phi_k\rangle_M\phi_k.

问题:不同曲面的特征基可能有符号、旋转和重特征空间不唯一,不能直接逐列对齐。

13.2 内在消息传递

图神经网络

hi(l+1)=Φ(hi(l),Agg⁡j∈N(i)Ψ(hi(l),hj(l),eij))h_i^{(l+1)} =\Phi\left(h_i^{(l)}, \operatorname{Agg}_{j\in N(i)} \Psi(h_i^{(l)},h_j^{(l)},e_{ij}) \right)

若eije_{ij} 使用测地距离、角度、平行移动等内在量,可减少对三维刚体姿态和网格嵌入的依赖。

但普通 message passing 只保证顶点置换等变,不自动保证旋转、Möbius 或重新参数化等变。

13.3 测度损失与生成模型

OT 可用于:

  • 点云分布匹配;
  • 形状生成的分布损失;
  • domain adaptation;
  • 特征分布对齐;
  • unbalanced OT 处理质量不等或局部缺失。

需要区分:精确 OT、熵正则 OT、sliced Wasserstein、Chamfer distance 并不是同一个量。

14. 共形结构在神经网络中的作用边界

共形几何可提供:

  1. canonical domain:把不同形状映到球面、平面或双曲域;
  2. 角度稳定的局部坐标:定义卷积核方向;
  3. 内在 Laplacian:谱特征和扩散算子;
  4. Beltrami 场:把形变编码成空间分布的各向异性;
  5. 曲率和拓扑特征:跨网格分辨率的几何信号。

它不能自动解决:

  • 语义对应;
  • 对称形状上的唯一规范化;
  • 不同拓扑间的双射;
  • 噪声/缺失导致的拓扑错误;
  • 离散化改变后的跨网格泛化。

15. Python:Sinkhorn 教学实现

import numpy as np


def sinkhorn(a, b, cost, epsilon=0.05, max_iter=5000, tol=1e-9):
    """教学实现;小 epsilon 时应改用 log-domain 版本。"""
    a = np.asarray(a, dtype=float)
    b = np.asarray(b, dtype=float)
    C = np.asarray(cost, dtype=float)

    if not np.isclose(a.sum(), b.sum()):
        raise ValueError("source and target mass must match")
    if np.any(a < 0) or np.any(b < 0):
        raise ValueError("mass must be nonnegative")

    K = np.exp(-C / epsilon)
    u = np.ones_like(a)
    v = np.ones_like(b)

    for iteration in range(max_iter):
        old_u = u.copy()
        u = a / np.maximum(K @ v, 1e-300)
        v = b / np.maximum(K.T @ u, 1e-300)
        if np.max(np.abs(u - old_u)) < tol:
            break

    P = u[:, None] * K * v[None, :]
    row_error = np.max(np.abs(P.sum(axis=1) - a))
    col_error = np.max(np.abs(P.sum(axis=0) - b))
    return P, {
        "iterations": iteration + 1,
        "cost": float(np.sum(P * C)),
        "row_error": float(row_error),
        "col_error": float(col_error),
    }

这个实现容易下溢。工程版应维护对偶 log-potentials:

fi=εlog⁡ui,gj=εlog⁡vj,f_i=\varepsilon\log u_i, \qquad g_j=\varepsilon\log v_j,

并用 logsumexp 更新。

16. 研究/工程检查表

使用 OT 损失时必须报告:

  • 代价cc 的定义与单位;
  • 是否精确 OT、熵正则、unbalanced 或 sliced 近似;
  • ε\varepsilon 与迭代停止条件;
  • 边缘残差;
  • 点数/网格分辨率变化下的稳定性;
  • 是否对输入质量归一化;
  • 梯度是否穿过迭代求解器,采用何种隐式/展开求导;
  • 与 Chamfer、Hausdorff、普通L2L^2 的对照实验。

使用共形参数域时还要报告:

  • Möbius 自由度如何固定;
  • 切缝和奇点位置;
  • 共形/面积畸变分布;
  • 不同 triangulation 下结果是否稳定。

读完必须能回答

  1. 不看公式,用自己的话回答开头的核心问题。
  2. 指出本页最重要公式中每个符号的类型:标量、向量、矩阵、映射还是集合。
  3. 找出定理成立所需的假设,并举一个删除某条假设后可能失败的例子。
  4. 对最小例子手算一遍;若本页含代码,再比较手算与程序输出。

前后课程

上一课:曲面代价与共形坐标 | 返回模块目录