文章目录
-
- [1. 引入 Frame](#1. 引入 Frame)
- [2. Gram-Schmidt 正交化](#2. Gram-Schmidt 正交化)
- [3. 坐标系的升降维](#3. 坐标系的升降维)
-
- [3.1 局部化 (Localize / Global-to-Local)](#3.1 局部化 (Localize / Global-to-Local))
- [3.2 全局化 (Globalize / Local-to-Global)](#3.2 全局化 (Globalize / Local-to-Global))
- [4. 残基气体 (Residue Gas) 与黑洞初始化](#4. 残基气体 (Residue Gas) 与黑洞初始化)
- [5. S E ( 3 ) SE(3) SE(3) 流形上的更新](#5. S E ( 3 ) SE(3) SE(3) 流形上的更新)
在处理蛋白质这种具有复杂约束的生物大分子时,如果你还停留在"点云(Point Cloud)"的思维模型里,那算法的搜索空间就太大了。在 OpenFold 和 AF2 的架构中,核心的直觉是将残基建模为 S E ( 3 ) SE(3) SE(3) 空间中的刚体。
这一章我们重点讨论:如何从混乱的原子坐标中抽象出标准的局部框架(Local Frames)。
1. 引入 Frame
在第一章我们提到了 S E ( 3 ) SE(3) SE(3) 不变性。直接回归 N N N 个原子的 ( x , y , z ) (x, y, z) (x,y,z) 坐标会面临两个致命问题:
- 自由度冗余:原子间的键长和键角在物理上基本是锁死的,直接回归坐标会导致化学结构的畸变。
- 参考系缺失:没有局部坐标系,模型很难学习到诸如"侧链相对于骨架的偏转"这种相对几何信息。
因此,我们给每个残基 i i i 定义一个变换矩阵 T i = ( R i , t i ) T_i = (R_i, \mathbf{t}_i) Ti=(Ri,ti)。
- t i \mathbf{t}i ti (Translation):通常定位于 C α C\alpha Cα 的位置,承载了位置信息。
- R i R_i Ri (Rotation):承载了残基骨架的指向信息。
2. Gram-Schmidt 正交化
我们需要从三个骨架原子 x N , x C a , x C \mathbf{x}N, \mathbf{x}{Ca}, \mathbf{x}_C xN,xCa,xC 中"搓"出一个标准正交基 R = [ e x , e y , e z ] R = [\mathbf{e}_x, \mathbf{e}_y, \mathbf{e}_z] R=[ex,ey,ez]。
注意,由于真实的原子位置存在热振动或模型预测偏差, N − C α N-C_\alpha N−Cα 和 C − C α C-C_\alpha C−Cα 两个向量通常不是严格垂直的。为了构建直角坐标系,我们必须使用 Gram-Schmidt 过程:
-
确定 x x x 轴:我们人为规定 C α → C C_\alpha \rightarrow C Cα→C 为主轴。
v 1 = x C − x C a , e x = v 1 ∥ v 1 ∥ \mathbf{v}_1 = \mathbf{x}C - \mathbf{x}{Ca}, \quad \mathbf{e}_x = \frac{\mathbf{v}_1}{\|\mathbf{v}_1\|} v1=xC−xCa,ex=∥v1∥v1
-
构建平面的辅助向量:取 N → C α N \rightarrow C_\alpha N→Cα 方向的向量 v 2 = x N − x C a \mathbf{v}_2 = \mathbf{x}N - \mathbf{x}{Ca} v2=xN−xCa。
-
计算 z z z 轴(法向量):通过叉乘直接得到垂直于 N − C α − C N-C_\alpha-C N−Cα−C 平面的向量。
e z = unit ( e x × v 2 ) \mathbf{e}_z = \text{unit}(\mathbf{e}_x \times \mathbf{v}_2) ez=unit(ex×v2)
-
补全 y y y 轴:再通过一次叉乘,确保三者构成右手系。
e y = e z × e x \mathbf{e}_y = \mathbf{e}_z \times \mathbf{e}_x ey=ez×ex
这样得到的 R i = [ e x , e y , e z ] R_i = [\mathbf{e}_x, \mathbf{e}_y, \mathbf{e}_z] Ri=[ex,ey,ez] 是一个完美的正交矩阵。在 OpenFold 的代码实现中,这个逻辑被封装在 Rigid.from_3_points 函数里。
3. 坐标系的升降维
在动力学算法中,会频繁用到以下两个数学操作,这是所有 IPA 注意力和力场计算的基石:
3.1 局部化 (Localize / Global-to-Local)
将空间中任意一点 x \mathbf{x} x 投影到残基 i i i 的视角下:
x l o c a l = R i T ( x − t i ) x_{local} = R_i^T (\mathbf{x} - \mathbf{t}_i) xlocal=RiT(x−ti)
注:由于 R i R_i Ri 是正交阵,其逆变换就是转置。
3.2 全局化 (Globalize / Local-to-Global)
将残基内部定义的理想原子坐标映射回实验室坐标系:
x g l o b a l = R i x l o c a l + t i x_{global} = R_i x_{local} + \mathbf{t}_i xglobal=Rixlocal+ti
4. 残基气体 (Residue Gas) 与黑洞初始化
在深度学习训练的初始阶段,我们其实并不知道蛋白质长什么样。OpenFold 采用了一个非常激进的策略:Residue Gas。
- 物理状态:所有残基在初始时刻都是独立的,互不连接,就像一团气体。
- 黑洞初始化 (Black Hole Initialization):我们将所有的 T i T_i Ti 都初始化为 ( I , 0 ) (I, \mathbf{0}) (I,0)。
- 这意味着最初所有的残基都重叠在坐标原点。
- 随着
Structure Module层数的加深,模型通过 IPA(下一节内容) 预测出 Δ T i \Delta T_i ΔTi,逐渐将这些残基"推"到它们该去的位置。
这种设计强制模型去学习如何从零构建全局拓扑,而不是依赖输入的初始坐标偏置。
5. S E ( 3 ) SE(3) SE(3) 流形上的更新
这里有个细节:我们能不能直接对 R i R_i Ri 做加法更新?绝对不行。
旋转矩阵 R R R 属于 S O ( 3 ) SO(3) SO(3) 李群,普通的加法会破坏其正交性。在每一层更新中,模型会预测一个李代数元素(通常是一个增量旋转向量 ω ⃗ \vec{\omega} ω 和位移向量 v ⃗ \vec{v} v ),然后通过指数映射将其映射回 S E ( 3 ) SE(3) SE(3)。
T n e w = T o l d ∘ exp ( Δ ξ ) T_{new} = T_{old} \circ \exp(\Delta \xi) Tnew=Told∘exp(Δξ)
这种在流形上更新姿态的做法,保证了蛋白质结构在迭代过程中永远不会出现"化学键拉断"或"原子变形"的数值误差。
下一章预告:
既然每个残基都有了自己的 Frame,它们该如何"交流"?下一章我们将拆解最难的点:IPA (Invariant Point Attention),看看它是如何在不破坏 S E ( 3 ) SE(3) SE(3) 不变性的前提下,让两个 Frame 产生跨越空间的吸引力。