🏠 总目录📚 本教程 04 · 从序列到结构 ← →
📑 本页目录(点开跳转)

04 · 从序列到结构:换一个没有对称性的预测目标

⏱ 24 分钟 | ⭐ 别预测坐标,预测距离 —— 因为坐标有对称性而距离没有


🎯 一句话

结构预测最难的一点不在网络,在于输出空间。 你要输出几千个原子的三维坐标,而整体旋转平移之后是同一个答案 —— ⭐ 直接回归坐标 + MSE 是错的。整章讲一个通用的绕法:换一个等价但没有对称性的预测目标。


🎯 一、为什么不能直接回归坐标

分类问题输出一个类别,回归输出一个数,都是唯一确定的。 而结构不是:把整个分子旋转 30 度、再平移 10 埃,它还是同一个分子、同一个答案。

于是麻烦来了:

💀 同一个正确答案有无穷多组坐标,而 MSE 只认其中一组。 网络输出了一个完全正确但朝向不同的结构,损失函数会给它一个巨大的惩罚。 ⭐ 你在惩罚它答对。

⚠️ 这不是「训练慢一点」的问题,是梯度在教它错的东西。 你可以每步都先做一次最优对齐再算损失(后面第 3 节那个 Kabsch 就是干这个的), 但那让损失变得不平滑、也更难并行。


📏 二、于是先预测距离

⭐ 距离矩阵对旋转平移天然不变。 两个原子隔多远,你怎么转怎么挪它都不变。

坐标 $(N \times 3)$ 距离矩阵 $(N \times N)$
同一个结构有几种表示 ⚠️ 无穷多 ⭐ 一种
能直接上 MSE 吗 ❌ ✅
大小 小 大(平方级)
是不是完整信息 是 ⭐ 几乎是(见下一节)

⭐⭐ 这就是全站可复用的那招: 当输出空间带着一个对称性、而你的损失函数不认它时, 换一个对这个对称性不变的等价目标去预测。

更省的做法是只预测接触图(距离小于某个阈值就算 1), 把回归变成二分类 —— 信息少了,但更好学,早期的方法大多从这里入手。


🔄 三、距离真的够吗:跑一遍

「几乎是」这个说法要验一下。下面从坐标算出距离矩阵,再只用距离矩阵把坐标恢复出来:

import numpy as np

rng = np.random.default_rng(0)
N = 12
coords = rng.normal(size=(N, 3)) * 5.0                       # 真实的 12 个原子坐标

D = np.linalg.norm(coords[:, None] - coords[None, :], axis=-1)   # 距离矩阵

# ---- 经典 MDS:只用距离矩阵,把坐标恢复出来 ----
J = np.eye(N) - np.ones((N, N)) / N                          # 中心化算子
B = -0.5 * J @ (D ** 2) @ J                                  # 双中心化
vals, vecs = np.linalg.eigh(B)
top = np.argsort(vals)[::-1][:3]                             # 取最大的 3 个特征值
rec = vecs[:, top] * np.sqrt(np.maximum(vals[top], 0))       # 恢复出的坐标

D_rec = np.linalg.norm(rec[:, None] - rec[None, :], axis=-1)

print("距离矩阵最大偏差 : %.2e" % np.abs(D - D_rec).max())
print("坐标本身最大偏差 : %.3f" % np.abs(coords - rec).max())
print()
print("原坐标第 0 个原子 :", np.round(coords[0], 3))
print("恢复第 0 个原子   :", np.round(rec[0], 3))
print()
print("=> 距离完全一致,坐标却对不上 —— 差的正是一个整体刚体变换。")

# 验证:把恢复的坐标做最优刚体对齐(Kabsch)之后,坐标也对得上了
A = coords - coords.mean(0)
Bc = rec - rec.mean(0)
U, _, Vt = np.linalg.svd(Bc.T @ A)
d = np.sign(np.linalg.det(U @ Vt))
R = U @ np.diag([1, 1, d]) @ Vt
print("刚体对齐之后坐标最大偏差 : %.2e" % np.abs(A - Bc @ R).max())

真实输出:

距离矩阵最大偏差 : 1.07e-14
坐标本身最大偏差 : 23.145

原坐标第 0 个原子 : [ 0.629 -0.661  3.202]
恢复第 0 个原子   : [-1.686 -2.989 -1.984]

=> 距离完全一致,坐标却对不上 —— 差的正是一个整体刚体变换。
刚体对齐之后坐标最大偏差 : 8.88e-15
123朝向 A1: (0.0, 0.0)2: (3.0, 0.6)3: (1.2, 2.4)123朝向 B(转了 52 度)1: (1.4, 0.5)2: (2.8, 3.2)3: (0.2, 2.9)旋转三条边的长度1–2 : 3.05941–3 : 2.68332–3 : 2.5456A 和 B 逐位相同坐标:6 个数全都不一样 → MSE 会重罚一个正确答案距离:一个数都没变 → 可以直接上 MSE
对比左右两栏底下那六个坐标数字和右框里那三个长度:同一个形状转个身,坐标全变、距离一个没动。⭐ 这就是「换一个对该对称性不变的等价目标」——把无穷多种合法答案,压成唯一的一种。

⭐⭐ 这三个数把整章的论点钉死了:

⚠️ 两个真实的限制: ① 距离分不出镜像(把结构照镜子,所有距离不变),而分子的手性是真实的,要另外处理。 ② 真实场景里预测出的距离矩阵带噪、还不一定自洽(不满足三角不等式), 恢复出来的构型没有这里这么干净。


🧬 四、距离信息从哪来

回到 03 章:共进化就是接触信号。 MSA 里两列强相关 → 这两个残基大概率挨着 → 这是距离矩阵里的一格。

⚠️ 而 03 章也验过那个坑:互信息会把间接相关误报成接触 (实验里假接触拿到 2.973 bit,比背景高四十倍)。 ⭐ 所以从 MSA 到接触图这一步本身就需要「扣掉中介」,不是简单统计。


🔗 五、为什么端到端最后赢了

早期是分段的:MSA → 接触图 → 距离几何 → 结构。每一段单独优化。 后来的做法把这些合进一个网络一起训,思路上有三个改变:

  1. 序列表示和结构表示互相更新 —— 不是单向的流水线,而是反复来回。
  2. ⭐ 等变性内建进结构模块 —— 网络直接输出三维的东西, 但它的层被设计成「输入转一下、输出跟着转」,于是不再需要靠损失函数去消化对称性。 这是 05 章的正题。
  3. 端到端的梯度 —— 中间表示为最终目标服务,而不是为某个中间指标。

🗓️ 具体是哪一代模型、当前最好的是什么,请去查最新的。 ⭐ 不会过期的是这三条思路本身,以及第 2 条和第 1 节那个矛盾的关系 —— 要么换一个没有对称性的目标(第 2 节),要么把对称性内建进网络(第 5 节第 2 条)。 这两条路解决的是同一个问题。


⚠️ 六、拿到预测结构之后

① 置信度不是均匀的。 这类模型通常会给每个残基一个置信分数, ⚠️ 而天生无序的区域分数一定低 —— 那不是模型没预测好,是那个区域本来就没有固定构象。 💀 把低分区域当成「模型的错」去修,是在修一个不存在的问题。

② 预测结构不等于实验结构。 骨架大致对,不代表侧链朝向、结合口袋的细节能直接用。 ⚠️ 拿它去做对接和虚拟筛选时,误差会被放大。

③ 对分布外的序列不可靠。 和 03 章第五节同一条: 数据库里全是演化产物,你设计出来的序列不在那个分布里。


🔗 这一章连到哪里

去哪 为什么
05 · 等变与不变 ⭐⭐ 同一个问题的另一条路。这一章:换一个对旋转不变的预测目标绕开对称性;那一章:把等变性内建进网络结构。第 5 节第 2 条就是那一章的入口
03 · 蛋白质语言模型 距离信息从哪来 —— 共进化,以及互信息会把间接相关误报成接触那个坑
07 · 评测的坑 ⚠️ 结构预测的评估同样受同源泄漏影响:测试蛋白在训练集里有近亲,指标就是虚的
机器学习的数学原理 05b · PCA 的推导 第三节的经典 MDS 和 PCA 是同一套特征分解 —— 双中心化之后取最大的几个特征向量

✅ 检查点

  1. 为什么不能直接回归三维坐标 + MSE?说清机制。
  2. 距离矩阵解决了什么问题?它相比坐标付出了什么代价?
  3. 实验里三个数字各是多少?它们分别证明了什么?
  4. 距离矩阵有哪两个真实限制?
  5. 端到端做法的三个改变是什么?其中哪一条和第 2 节是「同一个问题的两条路」?
  6. 预测结构里置信度低的区域,一定是模型没预测好吗?
👀 答案
  1. 因为整体旋转平移之后是同一个结构 —— 同一个正确答案有无穷多组坐标,而 MSE 只认其中一组。💀 网络输出一个完全正确但朝向不同的结构会被给巨大惩罚,你在惩罚它答对。这不是训练慢的问题,是梯度在教错的东西。
  2. 距离对旋转平移天然不变,同一个结构只有一种表示,可以直接上 MSE。代价是大小变成平方级($N \times N$ 而不是 $N \times 3$)。
  3. 距离矩阵恢复偏差 1.07e-14(机器精度,信息没丢);坐标本身偏差 23.145(差着整体旋转平移);刚体对齐后回到 8.88e-15 —— ⭐ 证明差的只是那个刚体变换,别的什么都没差。
  4. ①分不出镜像(照镜子所有距离不变),而手性是真实的;②真实预测出的距离矩阵带噪且不一定自洽(不满足三角不等式),恢复的构型没有实验里这么干净。
  5. ①序列表示和结构表示互相更新(不是单向流水线)②等变性内建进结构模块③端到端的梯度。⭐ 第 2 条和第 2 节是同一个问题的两条路:要么换一个没有对称性的目标,要么把对称性内建进网络。
  6. 不一定。 天生无序的区域置信分数一定低 —— 那不是模型没预测好,是那个区域本来就没有固定构象。💀 把它当成「模型的错」去修,是在修一个不存在的问题。

🛑 可以停在这里

到这里你拿到了一个远不止用在结构预测上的招式: 输出空间带对称性、而损失函数不认它时,换一个对该对称性不变的等价目标。 ⭐ 这条思路在任何「预测几何对象」的问题上都成立。

⚠️ 什么时候看下一页:你想知道另一条路 —— 不换目标,而是把对称性直接写进网络结构。

⚡ 走神救援

先记住这几件事

下一节 👉 05-等变与不变.md

打卡记录保存在你的浏览器里,首页能看到总进度