第 9 讲(扩展)· 流形上的生成——以蛋白质结构为例 · Generative Modeling on Manifolds

Generative AI with Stochastic Differential Equations · Lecture 09。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:MIT 6.S184 2025 年 Lecture 6 客座讲座(Jason Yim,MIT;slides 公开)。 阅读材料:Chen & Lipman (2024) Flow Matching on General Geometries(黎曼流匹配);Yim et al. (2023) SE(3) Diffusion Model with Application to Protein Backbone Generation(FrameDiff);Yim et al. (2023) Fast Protein Backbone Generation with SE(3) Flow Matching(FrameFlow);Bose et al. (2024) SE(3)-Stochastic Flow Matching for Protein Backbone Generation(FoldFlow);Campbell et al. (2024) Generative Flows on Discrete State-Spaces(MultiFlow);De Bortoli et al. (2022) Riemannian Score-Based Generative Modelling。 依据说明:客座讲座的 slides 已公开(见 2025 年课程主页),本讲依据上述论文写成。只讲生成建模的数学与公开的方法论:数据为什么住在流形上、圆周和旋转群的几何、黎曼流匹配、链状结构的坐标选择;不涉及任何具体的生物功能设计。代码全部是通用的几何玩具(圆周上的角度、三维旋转、二维的”链”),没有任何生物数据。几处结果与我原先的预期不一致(§2.3 朴素方法在多步时并不差;§4.3 欧氏基线失败的方式),如实报告。 配套代码 Code:code/lecture09/(4 个脚本 + 1 个模块;PyTorch + matplotlib;每个脚本 2–16 秒,都完整运行过) 预计阅读时间:4 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 说清哪些数据”住在”弯曲的空间里(角度、旋转、刚体框架),以及”把坐标当欧氏空间”会出什么问题。
  2. 在圆周 S1S^1 上做流匹配:测地线插值、常数的条件速度、用 (cos⁡θ,sin⁡θ)(\cos\theta, \sin\theta) 作为网络输入、每步折返的采样。
  3. 掌握旋转群 SO(3)SO(3) 的基本几何:切空间与 so(3)\mathfrak{so}(3)、hat / vee、指数映射(Rodrigues 公式)与对数映射、测地距离、均匀分布、测地线插值。
  4. 写出黎曼流匹配的一般配方,并在 SO(3)SO(3) 上实现:条件路径 Rt=R0exp⁡(tlog⁡(R0⊤R1))R_t = R_0\exp(t\log(R_0^\top R_1)),体坐标系下的常数角速度。
  5. 理解链状结构的坐标选择:笛卡尔坐标 vs 内坐标的权衡,刚体框架 SE(3)SE(3) 的折中;知道平移 / 旋转不变性怎样处理。
  6. 读懂 FrameDiff、FoldFlow、MultiFlow 这类方法在数学上做了什么。

0.2 先修与本讲范围

需要的背景在哪里
条件路径、条件向量场、边缘化技巧、连续性方程第 2 讲 §2–§3
少步采样与轨迹的弯曲第 7 讲 §1
生成器匹配(ODE、跳跃的组合)第 6 讲 §6
矩阵指数、奇异值分解线性代数;前置讲 P1

本讲不讲一般的黎曼几何(联络、曲率等),只用到”切空间、测地线、指数 / 对数映射”这几个概念,并且只在圆周和 SO(3)SO(3) 这两个具体的例子上用。

0.3 本讲地图 Map

§1  为什么数据住在流形上;"坐标会骗人"
§2  圆周 S¹ 上的流匹配:测地线 vs 把角度当实数                ← 代码 01
§3  旋转群 SO(3) 的几何:指数 / 对数映射、均匀分布、插值        ← 代码 02
§4  黎曼流匹配:一般配方与 SO(3) 上的实现                       ← 代码 03
§5  链与刚体框架:坐标的选择、SE(3)、不变性;蛋白质骨架生成的方法论  ← 代码 04
§6  小结   §7  常见误区   §8  练习   §9  延伸阅读   §10 全课结语

0.4 记号 Notation(新增的部分)

记号意思
M\mathcal{M}流形(数据住的空间);TxMT_x\mathcal{M} 是 xx 处的切空间(“在 xx 处能往哪些方向走”)
wrap(θ)\mathrm{wrap}(\theta)把角度折返到 (−π,π](-\pi, \pi]
hat(ω)\mathrm{hat}(\omega),vee\mathrm{vee}R3\mathbb{R}^3 ↔ 3×33\times3 反对称矩阵:hat(ω)v=ω×v\mathrm{hat}(\omega)v = \omega\times v
exp⁡\exp,log⁡\logSO(3)SO(3) 的指数映射(旋转向量 → 旋转矩阵)和对数映射(反过来)
d(R1,R2)d(R_1, R_2)测地距离:R1⊤R2R_1^\top R_2 的转角,∈[0,π]\in[0, \pi]
SE(3)SE(3)刚体变换(旋转 + 平移);一个”刚体框架” T=(R,x)T = (R, x)

1. 为什么数据住在流形上 · Why manifolds

1.1 几个例子

前八讲的数据都在 Rd\mathbb{R}^d 里(或离散空间里)。但很多数据天然不是:

  • 角度:机器人关节的转角、分子里化学键的扭转角(二面角)、风向。角度绕一圈回到原处:θ\theta 和 θ+2π\theta + 2\pi 是同一个点。它住在圆周 S1S^1 上。
  • 三维旋转:相机的朝向、刚体的姿态。旋转不能”加一半”:两个旋转矩阵的平均一般不是旋转矩阵。它住在旋转群 SO(3)SO(3) 上(一个三维的弯曲空间)。
  • 刚体框架:一个刚体的位置 + 朝向,SE(3)=SO(3)⋉R3SE(3) = SO(3)\ltimes\mathbb{R}^3。蛋白质骨架的常见表示是”每个残基一个刚体框架”(§5.3)。

1.2 坐标会骗人

我们总可以给这些空间选一组坐标(角度 θ∈(−π,π]\theta\in(-\pi, \pi]、欧拉角、四元数、旋转矩阵的 9 个元素),然后”假装”它是欧氏空间。问题是坐标会撒谎:

  • 切口:角度坐标在 ±π\pm\pi 处切开了圆周,3.03.0 和 −3.0-3.0 在坐标里相距 6,在圆周上只相距 0.28。
  • 奇点:欧拉角在俯仰角 ±90°\pm90° 处”万向节死锁”,两个角度合并成一个自由度。
  • 多余的维度:旋转矩阵有 9 个数,只有 3 个自由度;在 R9\mathbb{R}^9 里直线插值,中间点不是旋转矩阵(§3.3)。
  • 重复:四元数 qq 和 −q-q 表示同一个旋转。
  • “均匀”不均匀:欧拉角各自均匀,得到的不是旋转的均匀分布(§3.2)。

流匹配的条件路径、条件速度、先验分布,全都依赖”空间长什么样”。本讲的思路是:用空间本身的几何(测地线、切空间、指数映射)来定义它们,而不是借用某一组坐标。


2. 圆周上的流匹配 · Flow matching on the circle

2.1 测地线流匹配

圆周上从 θ0\theta_0 到 θ1\theta_1 的测地线是较短的那段弧。把第 2 讲的 CondOT 翻译过来:

θt=wrap(θ0+t Δ),Δ=wrap(θ1−θ0),ut(θ∣θ1)=Δ.\theta_t = \mathrm{wrap}\big(\theta_0 + t\,\Delta\big),\qquad \Delta = \mathrm{wrap}(\theta_1 - \theta_0),\qquad u_t(\theta\mid\theta_1) = \Delta.

条件速度是常数(沿较短的弧匀速走),和 CondOT 的 z−x0z - x_0 完全对应。三处实现细节:

  1. 先验:圆周上的均匀分布(圆周是紧的,均匀分布存在;Rd\mathbb{R}^d 上没有,所以那里用高斯)。
  2. 网络输入:(cos⁡θ,sin⁡θ)(\cos\theta, \sin\theta),而不是 θ\theta 本身——这样 ±π\pm\pi 两侧对网络来说是同一个地方,网络的输出自动是圆周上的连续函数。
  3. 采样:欧拉一步后折返,θ←wrap(θ+h uθ(θ,t))\theta\leftarrow\mathrm{wrap}(\theta + h\,u_\theta(\theta, t))。

对照的”朴素”版本:把 θ\theta 当实数,θt=(1−t)θ0+tθ1\theta_t = (1-t)\theta_0 + t\theta_1,目标 θ1−θ0\theta_1 - \theta_0,网络输入 θ\theta,采样时在实数轴上积分、最后才折返。

2.2 实验:路径长度

01 号脚本的数据是三个包裹高斯(标准差 0.25),中心在 π\pi、−π/3-\pi/3、π/4\pi/4,权重 0.4 / 0.35 / 0.25。第一个峰正好在切口上。

插值方式平均路径长度最长“绕远路”(长度 > π)的比例
朴素(实数轴上的直线)2.2136.27427.7%
测地线(圆周上较短的弧)1.5653.1420%

±π\pm\pi 那个峰的数据点里,47.1% 的朴素路径要绕远路——从 θ0=3.0\theta_0 = 3.0 到 θ1=−3.0\theta_1 = -3.0,朴素路径横穿整个圆,经过另外两个峰。

2.3 实验:朴素方法并不总是差

两个模型各训练 6000 步(4 层 × 128 的 MLP),欧拉 100 步采样 8000 个:

模型能量距离三个峰的比例TV峰内散度
真样本(噪声地板)−0.00010.399 / 0.351 / 0.2500.0010.998
测地线流匹配−0.00010.403 / 0.357 / 0.2400.0101.058
朴素流匹配0.00020.391 / 0.362 / 0.2470.0121.067

积分 100 步时两个模型一样好。我原以为朴素模型会在切口上的峰里留下一道”缝”,实际没有:实数轴上的分布(切口两侧各半个峰)也是一个完全合法的分布,流匹配照样能学,最后折返回圆周就对了。

差别在少步(能量距离 / TV / 峰之间):

欧拉步数测地线朴素
10.0684 / 0.090 / 2.6%1.2243 / 0.448 / 0.0%
20.0308 / 0.031 / 5.6%0.3620 / 0.382 / 2.3%
50.0039 / 0.012 / 1.1%0.1124 / 0.206 / 2.4%
100.0007 / 0.009 / 0.5%0.0225 / 0.088 / 0.5%
100−0.0001 / 0.010 / 0.1%0.0002 / 0.012 / 0.0%

朴素的条件路径又长、又互相交叉(绕远路的路径横穿其他峰),边缘轨迹因此很弯,少步采样就差——这是第 7 讲的教训在流形上的翻版。还有一个原则问题:朴素模型依赖于”在哪里切开圆周”这个任意的选择(练习 3 换一个切口),测地线模型只依赖圆周本身。

圆周上的流匹配:真样本、10 步、100 步


3. 旋转群 SO(3) 的几何 · The geometry of SO(3)

3.1 切空间、指数映射与对数映射

SO(3)={R∈R3×3:R⊤R=I,det⁡R=1}SO(3) = \{R\in\mathbb{R}^{3\times3}: R^\top R = I, \det R = 1\}。

  • 切空间:在 RR 处,所有可能的速度 R˙\dot R 都形如 R hat(ω)R\,\mathrm{hat}(\omega),ω∈R3\omega\in\mathbb{R}^3(“体坐标系”下的角速度)。证明:对 R⊤R=IR^\top R = I 求导得 R˙⊤R+R⊤R˙=0\dot R^\top R + R^\top\dot R = 0,即 R⊤R˙R^\top\dot R 是反对称矩阵。所以 SO(3)SO(3) 是三维的,速度用 3 个数描述。
  • 指数映射:从单位矩阵出发、以恒定角速度 ω\omega 转 1 秒,到达 exp⁡(hat(ω))\exp(\mathrm{hat}(\omega))——绕轴 n=ω/∣ω∣n = \omega/|\omega| 转角 θ=∣ω∣\theta = |\omega|。Rodrigues 公式:
exp⁡(hat(ω))=I+sin⁡θ K+(1−cos⁡θ) K2,K=hat(n).\exp(\mathrm{hat}(\omega)) = I + \sin\theta\,K + (1 - \cos\theta)\,K^2,\qquad K = \mathrm{hat}(n).
  • 对数映射:反过来,给定 RR 求旋转向量 ω\omega:cos⁡θ=(trR−1)/2\cos\theta = (\mathrm{tr}R - 1)/2,ω=θ2sin⁡θvee(R−R⊤)\omega = \frac{\theta}{2\sin\theta}\mathrm{vee}(R - R^\top)。θ→π\theta\to\pi 时 sin⁡θ→0\sin\theta\to0,要改用对称部分求转轴(代码 manifold_lib.so3_log)。
  • 测地距离:d(R1,R2)=R1⊤R2d(R_1, R_2) = R_1^\top R_2 的转角 ∈[0,π]\in[0, \pi]。

02 号脚本第 1 部分:2 万个随机旋转上 exp⁡(log⁡R)\exp(\log R) 与 RR 的最大差 1.3×10−121.3\times10^{-12};转角接近 π\pi 时升到 3×10−83\times10^{-8}——cos⁡θ\cos\theta 在 π\pi 附近是平的,从迹反推转角丢掉了一半的有效数字。

3.2 均匀分布

SO(3)SO(3) 是紧的,有一个”均匀分布”(Haar 测度):把 4 维标准高斯归一化成单位四元数,再转成旋转矩阵。它的转角不是均匀的,密度是 (1−cos⁡θ)/π(1 - \cos\theta)/\pi(练习 2)——集中在 π\pi 附近:随机一个旋转,大概率”转了很多”。

02 号脚本第 2 部分:10 万个均匀随机旋转的转角直方图和 (1−cos⁡θ)/π(1-\cos\theta)/\pi 逐格吻合,平均转角 2.2073(理论 π/2+2/π=2.2074\pi/2 + 2/\pi = 2.2074)。对照:三个欧拉角各自均匀得到的旋转,中等转角(1.6–2.4 附近)的多了,小转角和接近 π\pi 的都少了;平均转角碰巧差不多(2.2008),只看平均会被骗。“在坐标里均匀”≠“在流形上均匀”——先验分布选错了,生成模型从一开始就是错的。

3.3 两个旋转之间怎样”走直线”

02 号脚本第 3 部分比较五种插值(2000 对随机旋转,每条路径 200 个点):

插值方式在 SO(3) 上?路径长度 / 测地距离(中位数 / 最大)最快 / 最慢速度(中位数 / 最大)
测地线 R0exp⁡(tlog⁡(R0⊤R1))R_0\exp(t\log(R_0^\top R_1))是1.000 / 1.0001.00 / 1.0
矩阵直线插值(不投影)否(∥R⊤R−I∥\lVert R^\top R - I\rVert 达 1.41,det⁡\det 可到 0)——
矩阵直线插值 + 投影回 SO(3)是1.000 / 1.0005.88 / 145297
欧拉角直线插值是1.065 / 3.5271.16 / 2.7
四元数直线插值 + 归一化是1.000 / 1.0001.41 / 2.0

只有测地线同时满足:在流形上、路径最短、速度均匀。矩阵直线插值在 t=0.5t = 0.5 处,最小奇异值的中位数只有 0.410(旋转矩阵的奇异值都是 1),转角接近 π\pi 的一对,中点几乎是奇异矩阵。欧拉角插值的路径最长可以是测地距离的 3.5 倍,而且依赖于欧拉角的约定。

测地线的速度(第 4 部分):Rt⊤R˙tR_t^\top\dot R_t 是反对称矩阵(数值误差 10−910^{-9} 量级),并且 vee(Rt⊤R˙t)=log⁡(R0⊤R1)\mathrm{vee}(R_t^\top\dot R_t) = \log(R_0^\top R_1) 是常数——沿测地线以恒定的体角速度转动。这正是下一节流匹配的回归目标。

SO(3):均匀分布的转角;不同插值离起点的距离


4. 黎曼流匹配 · Riemannian flow matching

4.1 一般配方

Chen & Lipman(2024)把流匹配推广到黎曼流形,第 2 讲的四步几乎一字不改:

  1. 先验 p0p_0:流形上的一个简单分布(紧流形上用均匀分布)。
  2. 条件路径:从 x0∼p0x_0\sim p_0 沿测地线走到数据点 x1x_1:xt=exp⁡x0(tlog⁡x0(x1))x_t = \exp_{x_0}\big(t\log_{x_0}(x_1)\big)。
  3. 条件速度:ut(xt∣x1)=ddtxt∈TxtMu_t(x_t\mid x_1) = \frac{d}{dt}x_t\in T_{x_t}\mathcal{M},它在切空间里。
  4. 损失:E∥utθ(xt)−ut(xt∣x1)∥g2\mathbb{E}\lVert u^\theta_t(x_t) - u_t(x_t\mid x_1)\rVert^2_g,用流形的度量 gg 量长度。

边缘化技巧照样成立(连续性方程在流形上也成立),所以回归条件速度就学到了边缘速度。采样时沿切向量走一小步,再用指数映射回到流形上:x←exp⁡x(h utθ(x))x\leftarrow\exp_x\big(h\,u^\theta_t(x)\big)——“测地线欧拉法”,样本永远不会离开流形。

没有闭式测地线的流形(例如一般的网格曲面),Chen & Lipman 用”谱距离”构造条件路径,不需要测地线。圆周、球面、SO(3)SO(3)、环面都有闭式的测地线,直接用即可。

4.2 在 SO(3) 上

代入 SO(3)SO(3) 的几何(§3):

Rt=R0exp⁡(t hat(ω)),ω=log⁡(R0⊤R1);体坐标系下的条件速度: ω (常数).R_t = R_0\exp\big(t\,\mathrm{hat}(\omega)\big),\quad\omega = \log(R_0^\top R_1);\qquad\text{体坐标系下的条件速度:}\ \omega\ \text{(常数)}.

网络 ωθ(Rt,t)\omega_\theta(R_t, t) 输入旋转矩阵的 9 个数和 tt,输出 3 维角速度;损失 ∥ωθ(Rt,t)−ω∥2\lVert\omega_\theta(R_t, t) - \omega\rVert^2;采样 R←Rexp⁡(h hat(ωθ(R,t)))R\leftarrow R\exp\big(h\,\mathrm{hat}(\omega_\theta(R, t))\big)。这就是 FoldFlow、FrameFlow 里旋转部分的做法。

和扩散的对比。FrameDiff(Yim et al. 2023)用的是 SO(3)SO(3) 上的扩散:前向过程是 SO(3)SO(3) 上的布朗运动,它的转移密度(“各向同性高斯” IGSO(3))要用一个无穷级数计算,得分函数也要从这个级数里求。流匹配只需要测地线和指数 / 对数映射,简单得多——这也是第 2 讲”流匹配比扩散更容易推广”的一个具体例子。

4.3 实验

03 号脚本:数据是 SO(3)SO(3) 上三个集中的峰(尺度 σ=0.15\sigma = 0.15 弧度,中心两两相距 2.00、2.00、2.55 弧度,权重 0.5 / 0.3 / 0.2),先验是 SO(3)SO(3) 上的均匀分布。对照:把旋转矩阵当 9 维向量做欧氏流匹配,最后用 SVD 投影回最近的旋转矩阵。

模型欧拉步数三个峰的比例TV峰内散度峰之间
真样本—0.509 / 0.297 / 0.1940.0090.990.0%
黎曼流匹配50.524 / 0.272 / 0.2040.0281.664.0%
黎曼流匹配100.517 / 0.278 / 0.2050.0221.351.9%
黎曼流匹配500.514 / 0.282 / 0.2030.0181.150.7%
欧氏 + 投影50.649 / 0.217 / 0.1330.1492.8817.2%
欧氏 + 投影500.605 / 0.238 / 0.1580.1052.8016.4%

(峰内散度 = 到最近峰的均方根测地距离 / (σ3)(\sigma\sqrt3),理想值约 1;“峰之间” = 离所有峰都超过 4σ3≈1.044\sigma\sqrt3\approx1.04 弧度。)

  1. 黎曼流匹配的样本始终在 SO(3)SO(3) 上(∥R⊤R−I∥∼10−15\lVert R^\top R - I\rVert\sim10^{-15}),步数越多越好;50 步时到最近峰中心的中位距离 0.218(真样本约 0.23)。
  2. 欧氏流匹配差得多:样本太散(峰内散度 2.8,16% 落在峰之间),权重偏向第一个峰。积分出来的 3×3 矩阵大多接近旋转矩阵(奇异值中位数 1.007),但一部分离得很远(最小奇异值 0.046),投影把它们送到不确定的地方。
  3. 欧氏版本几乎不随步数改善(5 → 50 步:17.2% → 16.4%)。我原以为它的问题是”投影前离流形太远”,加步数能缓解;实际上它的误差不是积分误差,而是”在错误的空间里建模”:R9\mathbb{R}^9 里的直线插值经过奇异值很小的矩阵(§3.3),网络要学一个 9 维空间里的场,而数据和噪声都只住在其中一个 3 维的曲面上。

SO(3) 上的流匹配:到最近峰中心的距离


5. 链与刚体框架 · Chains and rigid frames

5.1 一条链该用什么坐标

很多结构数据是”链”:相邻两个单元之间的距离基本固定,形状由相邻单元之间的转角决定(分子的骨架、机械臂的连杆、蛋白质的主链)。生成这样的数据,有两种自然的坐标:

  • 笛卡尔坐标:直接生成每个点的位置。
  • 内坐标:只生成键长、键角、扭转角(键长往往固定,只剩角度),再从头到尾”搭”出整条链。角度住在环面 Tk=S1×⋯×S1T^k = S^1\times\dots\times S^1 上,用 §2 的测地线流匹配。

04 号脚本用一个二维玩具比较两者:10 个点、9 段长度为 1 的键,相邻两段之间转 ±36°(每条链要么全部左转、要么全部右转,加 4° 的随机扰动),整条链随机旋转并平移到质心为 0。8 个 36° 的转角加起来是 288°,链几乎闭合成一个环。

表示键长偏差转角偏差全部同向转首尾距离(平均)首尾距离分布的 W1
真样本0.00003.19°100.0%1.0360.0113(噪声地板)
笛卡尔坐标(20 维)0.04764.36°100.0%1.0060.0311
内坐标(8 个转角)0.00003.56°99.7%1.2030.1663
  • 局部几何:内坐标天然满足约束(键长精确为 1),转角也学得更准;笛卡尔坐标的键长平均差约 5%——网络要从 20 个数里”自己学会”键长是 1。
  • 整体形状:笛卡尔坐标好得多。内坐标的平均首尾距离比真值大 16%:每个转角只偏一点点,累积起来,“几乎闭合的环”就张开了。

放大的机制(第 2 部分):内坐标里一个转角差 2°(0.035 弧度),它后面的点都绕着它转,移动的距离 ≈ 到它的距离 × 0.035。中间的转角影响最大(第 4 个转角:末端平均移动 0.081)。链越长,这个”杠杆”越大(练习 4 把链加长到 20 个点)。

三种来源的链:真样本、笛卡尔坐标、内坐标

5.2 刚体框架:介于两者之间

刚体框架(SE(3)SE(3))是一个折中:把链分成若干个刚性的单元,每个单元一个框架 Ti=(Ri,xi)T_i = (R_i, x_i)——旋转 Ri∈SO(3)R_i\in SO(3) 给出单元的朝向,平移 xi∈R3x_i\in\mathbb{R}^3 给出它的位置。

  • 单元内部的几何由框架精确决定(把一个固定的局部模板放到框架上即可),这一点像内坐标;
  • 单元的位置直接生成,不需要从头搭起,误差不会沿链累积,这一点像笛卡尔坐标;
  • 相邻单元之间的约束(例如它们之间的距离和角度)仍然要模型自己学。

生成 NN 个框架,就是在乘积流形 SE(3)NSE(3)^N 上做流匹配:旋转部分用 §4.2 的 SO(3)SO(3) 流匹配,平移部分用普通的欧氏流匹配,两者共用一个网络、共用时间 tt。

5.3 不变性

一个结构整体平移、整体旋转之后还是同一个结构,所以数据分布对全局的刚体运动是不变的。两件事要处理:

  • 平移:R3\mathbb{R}^3 上没有”均匀分布”,不能把平移当作一个均匀的先验。通常的做法是把所有位置减去质心,在”质心为 0”的子空间里生成(本讲 04 号脚本也是这样做的)。
  • 旋转:要么让网络等变(输入整体旋转,输出的速度跟着旋转,例如 FrameDiff 用的不变点注意力 IPA、各种等变图神经网络),要么不要求等变,而是在训练时对数据做随机旋转增广。AlphaFold3 的扩散模块是后一种思路的公开例子:直接在原子的笛卡尔坐标上做扩散,网络不等变,靠数据增广学到近似的不变性——这和 §5.1 里”笛卡尔坐标整体形状好、局部几何要学”的结论一致。

5.4 蛋白质骨架生成的方法论(公开文献的结构)

把本讲的工具放到一起,公开文献中蛋白质骨架生成模型的数学结构大致是:

组成部分做法对应本讲
表示每个残基一个刚体框架 (Ri,xi)∈SE(3)(R_i, x_i)\in SE(3)§5.2
先验旋转:SO(3)SO(3) 上均匀;平移:质心为 0 的高斯§3.2、§5.3
路径旋转沿测地线,平移沿直线(FrameFlow、FoldFlow),或 SO(3)SO(3) / R3\mathbb{R}^3 上的扩散(FrameDiff)§4
网络对全局刚体运动等变的网络(IPA 等)§5.3
采样测地线欧拉法(旋转用指数映射,平移用普通欧拉)§4.1
离散的部分若同时生成离散的类别序列,用第 6 讲的离散流匹配,和连续部分组合(MultiFlow;第 6 讲 §6 的生成器匹配)第 6 讲

这些都是通用的生成建模工具;本讲到此为止,不讨论任何具体的生物学应用。


6. 小结 · Summary

  1. 流形上的数据:角度(S1S^1)、旋转(SO(3)SO(3))、刚体框架(SE(3)SE(3))。坐标会骗人:切口、奇点、多余维度、重复、“均匀”不均匀。
  2. 圆周上的流匹配:测地线插值、常数条件速度 wrap(θ1−θ0)\mathrm{wrap}(\theta_1 - \theta_0)、(cos⁡,sin⁡)(\cos, \sin) 输入、每步折返。朴素的”角度当实数”在多步时也能学对分布,但路径长、交叉多,少步时差很多,而且依赖切口的位置。
  3. SO(3)SO(3) 的几何:切空间 = R⋅so(3)R\cdot\mathfrak{so}(3);Rodrigues 指数映射、对数映射(θ→π\theta\to\pi 要特殊处理);均匀分布的转角密度 (1−cos⁡θ)/π(1-\cos\theta)/\pi;只有测地线插值同时在流形上、最短、匀速。
  4. 黎曼流匹配:先验在流形上,条件路径沿测地线,条件速度在切空间里,采样用指数映射。SO(3)SO(3) 上条件速度是常数 log⁡(R0⊤R1)\log(R_0^\top R_1)。把旋转矩阵当 9 维向量的欧氏流匹配即使多步也做不对。
  5. 链的坐标:内坐标局部精确、长程误差累积;笛卡尔坐标整体形状好、局部几何要学;刚体框架介于两者之间。平移用”减质心”处理,旋转用等变网络或数据增广处理。

7. 常见误区 · Common pitfalls

  1. “角度就是一个实数,直接用就行。” 多步时可能碰巧没问题(§2.3),但路径会绕远路、少步质量差、结果依赖切口位置。
  2. “欧拉角各自均匀就是随机旋转。” 不是(§3.2)。
  3. “两个旋转矩阵的加权平均还是旋转矩阵。” 一般不是;中点甚至可以接近奇异矩阵(§3.3)。
  4. “把旋转矩阵当 9 维向量生成,最后投影回去就行。” 本讲的实验里,这样做 16% 的样本落在峰之间,加步数也没用(§4.3)。
  5. “内坐标自动满足所有几何约束,所以总是更好。” 它满足局部约束,但长程误差会累积(§5.1)。
  6. “平移也可以用均匀先验。” R3\mathbb{R}^3 上没有均匀分布;要先减去质心(§5.3)。

8. 练习 · Exercises

练习 1(圆周上的边缘化技巧)。圆周上的连续性方程是 ∂tpt+∂θ(ptut)=0\partial_tp_t + \partial_\theta(p_tu_t) = 0(θ\theta 是局部坐标)。仿照第 2 讲 §3.4,证明按后验加权平均的条件速度 ut(θ)=E[Δ∣θt=θ]u_t(\theta) = \mathbb{E}[\Delta\mid\theta_t = \theta] 生成边缘路径。在哪一步用到了”条件速度是常数”?

参考答案

条件路径 pt(⋅∣θ1)p_t(\cdot\mid\theta_1) 由条件速度生成:∂tpt(θ∣θ1)+∂θ(pt(θ∣θ1)ut(θ∣θ1))=0\partial_tp_t(\theta\mid\theta_1) + \partial_\theta(p_t(\theta\mid\theta_1)u_t(\theta\mid\theta_1)) = 0。对 θ1\theta_1 积分、交换求导和积分:∂tpt+∂θ(∫pt(θ∣θ1)ut(θ∣θ1)p(θ1)dθ1)=0\partial_tp_t + \partial_\theta\big(\int p_t(\theta\mid\theta_1)u_t(\theta\mid\theta_1)p(\theta_1)d\theta_1\big) = 0,括号里正是 pt(θ) E[ut(θ∣θ1)∣θt=θ]p_t(\theta)\,\mathbb{E}[u_t(\theta\mid\theta_1)\mid\theta_t = \theta]。证明本身不需要条件速度是常数——它只需要”条件速度生成条件路径”;常数只是让条件路径(测地线)和回归目标都很简单。这里的条件路径 pt(⋅∣θ1)p_t(\cdot\mid\theta_1) 是”均匀分布沿测地线推过去”得到的分布。

练习 2(均匀旋转的转角密度)。单位四元数 q=(cos⁡θ2,sin⁡θ2 n)q = (\cos\frac\theta2, \sin\frac\theta2\,n) 在 S3S^3 上均匀分布。证明转角 θ\theta 的密度是 (1−cos⁡θ)/π(1 - \cos\theta)/\pi,θ∈[0,π]\theta\in[0, \pi]。

参考答案

S3S^3 上的均匀分布,“极角” α=θ/2∈[0,π]\alpha = \theta/2\in[0, \pi] 的密度 ∝sin⁡2α\propto\sin^2\alpha(S3S^3 上距北极角距离为 α\alpha 的”纬度球面”是半径 sin⁡α\sin\alpha 的二维球面,面积 ∝sin⁡2α\propto\sin^2\alpha)。qq 和 −q-q 是同一个旋转,所以只看 α∈[0,π/2]\alpha\in[0, \pi/2],即 θ∈[0,π]\theta\in[0, \pi]。换元 α=θ/2\alpha = \theta/2:密度 ∝sin⁡2(θ/2)=(1−cos⁡θ)/2\propto\sin^2(\theta/2) = (1 - \cos\theta)/2,在 [0,π][0, \pi] 上归一化:∫0π(1−cos⁡θ)dθ=π\int_0^\pi(1 - \cos\theta)d\theta = \pi,所以密度是 (1−cos⁡θ)/π(1 - \cos\theta)/\pi。平均转角 1π∫0πθ(1−cos⁡θ)dθ=π2+2π\frac1\pi\int_0^\pi\theta(1-\cos\theta)d\theta = \frac\pi2 + \frac2\pi。

练习 3(编程:换一个切口)。在 01 号脚本的朴素版本里,把角度表示成 [0,2π)[0, 2\pi)(切口在 0 而不是 ±π\pm\pi),重新训练。少步的结果怎样变化?

参考答案(作者机器上的结果)
欧拉步数1510100
测地线0.06840.00390.0007−0.0001
朴素,切口在 ±π1.22430.11240.02250.0002
朴素,切口在 00.93260.05080.01100.0005

(能量距离。)切口换到 0 之后,朴素模型的少步误差减半——0 附近恰好没有数据(在 −π/3-\pi/3 和 π/4\pi/4 两个峰之间),切口不再把一个峰劈成两半。同一个方法、同一份数据,结果取决于一个任意的坐标选择;测地线模型没有这个自由度。即使切口选得好,朴素模型在少步时仍比测地线差得多。

练习 4(编程:更长的链)。在 04 号脚本里把链加长到 20 个点、转角改成 ±18°(仍然几乎闭合成一个环)。两种表示的首尾距离误差怎样变化?

参考答案(作者机器上的结果)
表示(20 个点)键长偏差转角偏差全部同向转首尾距离(平均;真值 1.479)首尾距离的 W1(地板 0.026)
笛卡尔坐标(40 维)0.45443.52°0.0%1.5380.069
内坐标(18 个转角)0.00004.69°85.8%3.6472.176

链加长以后,两种表示各自的弱点都被放大了:笛卡尔坐标在同样的训练预算下局部几何彻底失败(键长平均差 0.45,转角乱了,没有一条链”全部同向转”),但首尾距离的分布仍然不错;内坐标的局部几何仍然精确,整体形状却完全错了(首尾距离 3.6 vs 1.5:18 个转角的小偏差累积,环大幅张开)。这正是实践中用刚体框架、并给网络加上”相邻单元之间”的几何损失的原因。

练习 5(思考:欧氏基线为什么失败)。均匀随机旋转 R0R_0 和数据点 R1R_1 之间的转角往往接近 π\pi(§3.2)。用 §3.3 的结果解释:为什么 R9\mathbb{R}^9 里的直线插值 (1−t)R0+tR1(1-t)R_0 + tR_1 在 t≈0.5t\approx0.5 时常常接近奇异矩阵?这对网络要学的向量场意味着什么?

参考答案

设 R0⊤R1R_0^\top R_1 是绕轴 nn 转 θ\theta。(1−t)R0+tR1=R0((1−t)I+tR0⊤R1)(1-t)R_0 + tR_1 = R_0\big((1-t)I + tR_0^\top R_1\big),括号里的矩阵在 nn 方向的特征值是 1,在垂直平面里是 (1−t)+te±iθ(1-t) + te^{\pm i\theta},模长 (1−t)2+t2+2t(1−t)cos⁡θ\sqrt{(1-t)^2 + t^2 + 2t(1-t)\cos\theta}。θ=π\theta = \pi、t=0.5t = 0.5 时为 0:中点是奇异矩阵。均匀先验下转角集中在 π\pi 附近,所以大量条件路径会穿过”奇异矩阵附近”这片和 SO(3)SO(3) 毫无关系的区域;网络必须在这片区域学一个场,而采样时粒子也会经过这里,投影回 SO(3)SO(3) 时方向很不稳定。

练习 6(思考:刚体框架之间还要学什么)。用刚体框架表示一条链时,哪些几何量由表示自动保证?哪些仍然要模型学?

参考答案

自动保证:每个单元内部的几何(把固定模板放在框架上,单元内的距离和角度精确)。仍然要学:相邻单元之间的距离和相对朝向(例如连接两个单元的键长、键角),以及整体的形状。前者是”局部、相邻”的约束,网络通常学得比较好;后者是全局的,框架表示没有内坐标那样的累积误差。这就是 §5.2 说的”介于两者之间”。


9. 延伸阅读 · Further reading

  • Chen & Lipman, Flow Matching on General Geometries(ICLR 2024):黎曼流匹配,测地线与谱距离两种条件路径。
  • De Bortoli et al., Riemannian Score-Based Generative Modelling(NeurIPS 2022);Huang et al., Riemannian Diffusion Models(NeurIPS 2022)。
  • Yim et al., SE(3) Diffusion Model with Application to Protein Backbone Generation(FrameDiff,ICML 2023);Yim et al., Fast Protein Backbone Generation with SE(3) Flow Matching(FrameFlow,2023)。
  • Bose et al., SE(3)-Stochastic Flow Matching for Protein Backbone Generation(FoldFlow,ICLR 2024)。
  • Campbell et al., Generative Flows on Discrete State-Spaces(MultiFlow,ICML 2024):离散 + 连续的联合流。
  • Jumper et al., AlphaFold2(Nature 2021):不变点注意力(IPA)与刚体框架;Abramson et al., AlphaFold3(Nature 2024):坐标上的扩散模块。
  • Jing et al., Torsional Diffusion for Molecular Conformer Generation(NeurIPS 2022):在扭转角(环面)上的扩散。
  • Solà, Deray & Atchuthan, A micro Lie theory for state estimation in robotics(2018):SO(3)SO(3) / SE(3)SE(3) 的指数映射、对数映射的实用讲解。

10. 全课结语 · Closing

九讲走下来,“生成”这件事被拆成了几个反复出现的问题:

  1. 用什么机器把噪声变成数据:ODE(流)、SDE(扩散)、CTMC(跳跃),以及它们在流形上的版本——第 1、3、6、9 讲。生成器的语言把它们统一起来(第 6 讲 §6)。
  2. 训练目标从哪来:对单个数据点构造条件路径和条件速度,边缘化技巧保证回归条件量就学到了边缘量——第 2 讲,在离散空间(第 6 讲)和流形(本讲)上原样成立。
  3. 怎样按要求生成、怎样做大:引导(第 4 讲)、潜空间与网络架构(第 5 讲);同样的条件生成可以以图像、文字、观测为条件(第 8 讲)。
  4. 怎样生成得快:拉直轨迹、蒸馏、一致性、平均速度(第 7 讲)。

几乎每一讲都有”实验结果和我原先的预期不一样”的地方,都写在了讲义和代码的 README 里。玩具实验的价值不在于数字本身,而在于:当真相已知时,可以把每一个说法拿来检验。

← 返回课程目录