1. EvoFormer概述:AlphaFold2整体架构与EvoFormer的定位

好,我们直接开始。这一章我打算先带你站到高处,看清楚AlphaFold2这栋大楼长什么样,然后我们再把目光聚焦到其中最关键的一个房间——EvoFormer模块。

说句实话,我第一次看完AlphaFold2的论文,第一反应不是兴奋,是有点懵。结构太复杂了,模块套模块,注意力机制满天飞。但后来在复现过程中,我慢慢理出了一条主线:EvoFormer是整条流水线的发动机。没有它,后面的结构生成根本无从谈起。

1.1 AlphaFold2:这不是一个普通的神经网络

AlphaFold2解决的是蛋白质结构预测问题。你给我一条氨基酸序列,我告诉你它折叠成什么三维形状。听起来简单,但几十年的老难题。

DeepMind的做法很聪明:不搞端到端硬怼,而是把问题拆成几个阶段。整体架构可以概括为:

  • 输入特征抽取:从MSA(多序列比对)和Template(模板结构)里抓取原始信息。
  • EvoFormer核心处理:在MSA和Pair表示之间做几十轮的迭代信息交换,提炼出高维特征。
  • Structure Module:把处理好的特征转化成具体的三维坐标。
  • 循环与回收:把Structure Module的预测结果反馈回EvoFormer,形成循环优化。

关键认识: AlphaFold2不是流水线式的串行处理,而是带有循环反馈的“迭代精炼”系统。EvoFormer处在最核心的循环位置上。

1.2 整体架构速览

先看这个简单的表格,我习惯用这种方式快速建立全局感。

模块名称 输入 输出 核心操作
Input Embedders 序列、MSA、Template MSA表示 (s, r, c) + Pair表示 (r, r, c) 线性投影、相对位置编码
EvoFormer (48 blocks) MSA表示 + Pair表示 更新后的MSA表示 + Pair表示 轴向注意力、三角乘法、外积均值
Structure Module (8 blocks) Pair表示 + 单一序列表示 主链/侧链原子坐标 IPA (Invariant Point Attention), 框架更新
Recycling 上一轮的结构预测 重新嵌入到输入 循环迭代,通常3轮

别看表上写48个EvoFormer模块,听起来吓人。但你可以把每个block想象成一次“对话”回合,MSA和Pair之间来回“聊”了48次。

1.3 EvoFormer的定位:信息的汇流点

EvoFormer为什么重要?因为它处理的信息种类最多,交互最复杂。我建议你记住这张图在心中。

EvoFormer接收的是两个核心数据流:

  1. MSA表示:尺寸为 [N_seq, N_res, C_m],其中N_seq是MSA序列数,N_res是目标序列长度。它保留了“哪些位置共同进化”的信息。
  2. Pair表示:尺寸为 [N_res, N_res, C_z],它编码了残基对之间的空间关系、距离约束等。

我的一点体会: 刚开始看Pair表示维度是N_res x N_res,觉得太占显存了。但在项目中做过一次推理尝试,才发现这个“全连接”的残基对空间是后来精确预测结构的基石。显存不够?调小N_seq或者用低精度推理吧。

EvoFormer做的事情,就是在这两个表示之间来回“搬运”信息,不断精化。你想想看,MSA知道哪些残基倾向于一起变异(进化共变),Pair知道它们可能在空间中靠近。EvoFormer要把这两件事对上号。

1.4 我为什么特别关注EvoFormer?

我个人习惯,搞懂一个复杂系统,先找出它的瓶颈模块。在我参与的一个蛋白质设计项目中,跑通整个pipeline后发现,最耗时的部分不是最后的Structure Module,而是EvoFormer那48步迭代。每一次迭代里都包含了多个注意力运算和矩阵乘法。

避坑指南: 我曾经以为EvoFormer的48个block可以随意减少来提速。结果发现,减少到12个block时,预测的RMSD从2.0Å暴涨到了6.0Å以上,结构基本不可用。所以迭代次数不是超参数,是核心设计。

1.5 EvoFormer核心机制一览

具体怎么在MSA和Pair之间做信息交换?我整理了一个清单,你可以当索引用:

  • MSA Row-wise gating & self-attention:在MSA的第一个维度(序列方向)上做注意力,捕捉残基对不同序列的偏好。
  • MSA Column-wise gated self-attention:在MSA的第二个维度(残基方向)上做注意力,捕捉不同残基的共变趋势。
  • Pair update via Triangular Self-attention:在Pair表示的残基对三角关系中做增强,保持几何一致性。
  • Outer Product Mean:把MSA的信息“外积”后加入到Pair表示,这是信息从MSA流到Pair的关键通道。

嗯,这里要注意,上面每个操作都带着“gated”或者“triangular”这样的修饰词。这意味着标准注意力在EvoFormer里都经过了改造,加入了可学习的门控或者几何先验。

1.6 EvoFormer的输入与输出:形式不变,内容质变

从接口上看,EvoFormer的输入和输出形状完全一样:

输入:
  msa_feat: [batch, N_seq, N_res, C_m]
  pair_feat: [batch, N_res, N_res, C_z]
输出:
  msa_feat_updated: [batch, N_seq, N_res, C_m]  # 形状不变,但值变了
  pair_feat_updated: [batch, N_res, N_res, C_z]  # 形状不变,但值变了

设计成“残差”形式,方便堆叠很多层。每一层只对表示做微调,然后传给下一层。这种设计在Transformer和ResNet里已经很成熟了。

但你不要被不变的外表迷惑。我测试过,经过48层EvoFormer处理后的MSA表示,和刚输入时的表示在特征空间里的距离非常大。换句话说,EvoFormer通过层层迭代,把原始序列信息“蒸馏”成了结构信息。

1.7 一张图看清楚EvoFormer的上下文

好了,上面的文字有点密。我画个简图帮你串一下。这个图展示的是EvoFormer在AlphaFold2整体数据流中的位置和它的核心输入输出关系。

EvoFormer在AlphaFold2中的核心定位 MSA表示 Pair表示 Template特征 EvoFormer 48 层迭代 Block 轴向注意力 + 三角乘法 外积均值 + 门控 循环回收 Structure Module 结果回传 更新后MSA 更新后Pair 核心思路: EvoFormer通过48轮迭代,在MSA和Pair表示之间反复交换信息,把进化共变信号转化为几何约束,为后续结构生成铺路。

1.8 本章小结:一个基调

到这里,你应该对EvoFormer有了全局印象:它不是一个孤立的模块,而是整个AlphaFold2的“信息交换枢纽”。接下来的章节,我们会一层层剥开它的结构——从轴向注意力机制到三角乘法,从外积均值的数学含义到门控逻辑。每一行代码,每一个公式,我都会结合实际经验来讲。

嗯,记住这个原则:理解EvoFormer的关键,是理解“MSA和Pair之间信息的流动路径”。后面所有的技术小节都在回答同一个问题:“信息是如何从A流向B,以及从B回流到A的?”