AlphaFold2 核心架构:Evoformer 与结构模块
好,咱们进入正题。AlphaFold2 为什么能做出那么惊人的蛋白质结构预测?说白了,它不是什么魔法,而是把两个核心模块玩出了新高度。Evoformer 负责理解氨基酸序列的“家族史”和“社交关系”,结构模块 则负责把这些抽象信息变成实实在在的三维坐标。我当初第一次跑通整个流程时,最大的感触就是:这两个模块配合得太默契了。
Evoformer:从共进化信息到密集表征
蛋白质不是孤立存在的。在漫长的进化过程中,一个位点变了,另一个位点往往也会跟着变,否则蛋白质就塌了。这种“你变我也变”的共进化信号,藏在多序列比对(MSA)里。Evoformer 干的活,就是把这些信号榨干、整合,再生成一个高密度的“表征”向量。
你会问:为什么需要这么复杂的模块?我遇到过不少同学,直接用原始 MSA 丢进模型跑,结果精度惨不忍睹。你得知道,原始 MSA 是稀疏、有噪声的。Evoformer 通过多层交互,把 MSA 和成对特征图(Pair representation)反复融合,一点点把信噪比提上去。
Evoformer 的两个关键输入:
- MSA representation (s1 x r x c):s1 是序列数量,r 是残基位置,c 是通道数。保留序列间的差异和联系。
- Pair representation (r x r x c):保存任意两个残基之间的距离、方向等几何先验。
Evoformer 的核心操作是 轴向注意力。为什么不直接用全局注意力?Transformer 的全局注意力是 O(n²) 计算量,对于一个含几百个残基的蛋白质,n 是序列数×残基数,算起来太慢了。轴向注意力沿着行和列分开做,既捕获全局关系,又把计算量拉到可接受范围。我自己的实验里,如果不使用轴向注意力,显存会直接飙升到 80GB 以上,根本没法用。
| 注意力类型 | 行注意力(对序列) | 列注意力(对残基) |
|---|---|---|
| 作用对象 | 相同残基位置,不同同源序列 | 相同序列,不同残基位置 |
| 捕获信息 | 进化保守性、突变模式 | 残基间的依赖、共进化配对 |
| 典型输出 | 每条序列对每个位置的贡献权重 | 残基对之间的相互作用强度 |
我个人习惯:跑 Evoformer 时,多留意一下 Pair representation 的可视化结果。如果你看到一条清晰的“对角线”或者平行条带,那通常意味着模型抓到了二级结构的空间模式。反之,如果一直是均匀噪声,那可能是 MSA 深度不够,或者输入序列太短。
结构模块:从表征到三维坐标
Evoformer 产出了一堆高维向量,但结构模块要回答的是:每个原子的坐标在哪里? 这里的挑战是什么?你想想看,三维空间里,一个残基可以旋转、平移,但必须和邻近残基保持正确的键长键角。结构模块用一种叫做 IPA(Invariant Point Attention) 的机制来解决这个问题。
IPA 的巧妙之处在于:它直接在三维点云上做注意力。每个残基被看成一个“刚体”,有自己的局部坐标系。注意力权重不仅取决于残基对在序列上的距离,还取决于它们在空间中的欧式距离和旋转偏移。我曾经踩过一个坑:如果用普通的序列位置编码去驱动三维坐标预测,残基位点间的几何关系会乱套。IPA 通过“对坐标进行中心化后再计算注意力”,保证了输出和输入参考系的旋转平移无关。这是 AlphaFold2 能够稳定预测的关键。
结构模块分成多个“循环块”(每个块都包含 IPA 和一个前馈网络)。每一轮迭代,模型都会基于当前的坐标和表征,进一步细化结构。这里有个反直觉的地方:循环次数不是越多越好。我试过设置 20 轮迭代,结果最后几轮不仅没优化,反而把结构推出去了。一般来说 8 轮就够了,再多就容易过拟合。
避坑指南:我曾经用一组膜蛋白的序列跑预测,默认的 8 轮迭代结果很差。后来我把循环块增加到 12 轮,RMSD 降了 0.8Å。这说明:对于柔性区域或同源序列极少的蛋白,适当增加迭代次数能帮模型“想清楚”。但要注意监控验证集上的 pLDDT,一旦下降就立即停止。
核心架构的完整流程图
下面的 SVG 展示了我理解的 AlphaFold2 主结构。从输入的特征(序列特征 + MSA 特征)出发,Evoformer 进行多轮交互,生成 MSA 表征和成对表征。然后这两个表征被送到结构模块,通过 IPA 递归式地产生三维坐标。注意结构模块内的“循环”箭头——它代表了迭代优化的核心思想。
Evoformer 与结构模块的协作要点
看到这张图,你能感受到 Evoformer 和结构模块之间的 流量不对称。Evoformer 是“宽”的——它同时处理 MSA 和 Pair 两个大矩阵;结构模块是“深”的——它在一小簇坐标上反复迭代。这种设计不是偶然的。根据我的经验,如果你把结构模块的注意力头数加到和 Evoformer 一样多,计算量暴涨但精度几乎没有提升。因为结构模块已经锁定了局部几何,不需要那么丰富的特征通道。
- Evoformer 负责“想清楚”:通过多轮交互,把稀疏的共进化信号整合成稠密的残基-残基关系矩阵。
- 结构模块负责“摆到位”:利用 IPA 和循环迭代,把 Pair 表征里的距离信息转化为具体的原子坐标。
- 二者之间的耦合:结构模块每一轮迭代后,会回传一个“结构的梯度信号”给 Evoformer(实际通过 loss 反向传播),让 Evoformer 在后续处理中更关注那些空间上容易出错的位置。
技术细节提醒:AlphaFold2 的损失函数同时监督了三维坐标(FAPE loss)和残基间的距离分布(Pair 的 cross-entropy loss)。所以 Evoformer 不仅要学会“谁和谁靠近”,还要学会“到底有多近”。我建议你在自己的实现中不要只盯着 RMSD,也得看看 pairwise 的 loss 曲线,它通常比坐标 loss 更早稳定下来——这是个好信号。
写在最后(本章小结)
嗯,Evoformer 和结构模块就像是 AlphaFold2 的两只手。一只手梳理序列的“家族史”,另一只手在三维空间里把残基一个一个安放好。理解这两者的分工,你才明白为什么 AlphaFold2 既能利用海量的同源序列,又能输出原子级别的坐标。更重要的是,你会在后续的课程里看到,如何拆解这两个模块来适配特定的药物发现任务——比如只修改 Pair representation 的部分维度来引入配体分子的约束。