2. AlphaFold原理简介:Evoformer与Structure Module的核心设计思想

聊到AlphaFold,很多人第一反应是“它怎么把序列变成结构的?”其实说白了,整条流水线上最核心的两个引擎,就是Evoformer和Structure Module。我刚开始啃这块的时候,也觉得概念挺绕,但一旦搞懂它们各自在干什么,后面调参就有方向了。

2.1 两条线索:MSA表示与Pair表示

你想想看,蛋白质结构预测本质上是猜每个原子在三维空间中的坐标。但光看一条序列,信息量远远不够。AlphaFold聪明在哪呢?它同时维护两套信息:

  • MSA表示(1D序列信息):多序列比对的加权演化信息,告诉你哪些位置保守、哪些容易突变。
  • Pair表示(2D残基对信息):任意两个残基之间的距离、相对位置、共进化关系。

这两条线索在Evoformer里不断交叉更新,互相“喂”信息。我在项目中遇到过一种情况:如果MSA质量差,Pair表示也学偏了,结果结构预测直接崩掉。所以从一开始,这两者的交互设计就是整个网络的基石。

2.2 Evoformer:信息交换的“核反应堆”

Evoformer干了件很聪明的事——它不是简单把MSA和Pair拼在一起,而是设计了五组带外积的交互模块。我个人的习惯是把Evoformer想象成一个会议室:

  • MSA行/列注意力:每个序列、每个位置都在“听”其他位置的演化信号。
  • Pair更新与三角乘法:残基对之间的三维几何约束通过三角不等式传递。
  • 外积均值:把MSA的整体演化信号压缩成残基对的更新信号。

为什么要用“外积”?你可能已经想到了,序列层面的共进化信息需要在残基对层面表达出来。外积恰好能完成这个升维任务:从[N_seq, N_res, d_msa]变换为[N_res, N_res, d_pair]。

在实际配置里,这些东西会体现为一些超参数。比如Evoformer块的数量、MSA特征维度、Pair特征维度等。下面是个典型的配置片段:

# AlphaFold模型配置核心参数(Evoformer部分)
model:
  heads:
    evoformer:
      num_blocks: 48          # 堆叠多少个Evoformer块(越多越深)
      msa_channel: 256        # MSA表示的特征维度
      pair_channel: 128       # Pair表示的特征维度
      seq_channel: 384        # 单序列的嵌入维度
      triangle_multiplication: true  # 是否启用三角乘法更新
      outer_product_mean: true       # 是否使用外积均值连接

这里num_blocks: 48是我踩过的坑之一。当初为了省显存,把块数削到24,结果预测精度直接掉了一个档次。后来发现,Evoformer的深度直接影响残基对信息的传播距离,太浅了根本学不到长程相互作用。

2.3 Structure Module:从抽象到坐标的“解算器”

如果说Evoformer是“大脑”,那Structure Module就是“手”——它负责把抽象的表征变成具体的三维坐标。这里面有一个非常优雅的设计:IPA(Invariant Point Attention),也就是等变点注意力。

IPA为什么重要?因为蛋白质结构具有三维空间的旋转和平移不变性。你想想看,如果网络学到的坐标会随着整体旋转而改变,那训练就白费了。IPA通过将注意力计算建立在相对坐标和局部框架上,天然保证了预测结果的等变性。

具体来说,Structure Module反复执行以下操作:

  1. 将残基表征映射为局部框架(每个残基定义自己的坐标系)。
  2. 在局部框架内计算注意力,更新主链扭转角。
  3. 通过扭转角重建完整原子坐标。

这个循环通常重复8次,每次都在微调骨架的精度。我在调试过程中发现,迭代次数太少(比如4次)会导致某些侧链的摆放明显错误,但增加到12次以上收益就非常小了。所以默认的8次是个合理平衡点。

2.4 两条流如何汇合?

Evoformer和Structure Module的数据流向是这样的:

  • Evoformer输出单序列表示(每个残基的抽象向量)和Pair表示(残基对的特征)。
  • Structure Module拿到单序列表示开始构建初始骨架。
  • 每次迭代时,Pair表示会作为成对偏差注入到IPA的注意力计算中。
  • 最终多次迭代收敛到一组三维坐标。

我用个简单的示意图帮你理清这个关系:

AlphaFold整体数据处理流 输入:MSA + 模板 Evoformer (48块) MSA行/列注意力 ↔ MSA行/列注意力 Pair自注意力 + 三角乘法更新 外积均值连接MSA与Pair 单序列表示 Pair表示 Structure Module IPA等变点注意力 × 8轮迭代 从扭转角重建三维坐标 预测残基坐标 两条信息流并行 MSA表示:序列演化信号 Pair表示:残基对几何约束 Evoformer负责两者交叉更新 结构生成阶段 Structure Module读取 单序列表示 + Pair表示 通过IPA输出3D坐标
个人经验小记: 当MSA深度足够(比如>1024条序列)时,Evoformer的pair channel可以适当增大到256以捕获更丰富的共进化信息。反过来,如果MSA很浅(比如<64条),把pair channel开大反而容易过拟合,这时候不如加深num_blocks来强制网络做更充分的信息交换。

2.5 两个模块的对比总结

维度 Evoformer Structure Module
输入 原始MSA矩阵 + 初始Pair矩阵 单序列表示 + Pair表示
核心操作 行/列自注意力、三角乘法、外积均值 IPA(等变点注意力)、框架回归、扭转角重建
输出 精炼的MSA表示 + Pair表示 每个残基的主链+侧链三维坐标
循环方式 48个串行块(共享参数/独立参数均可) 8次迭代(共享参数,重复应用)
核心设计理念 穷尽序列空间的演化信息,构建残基对约束 在局部等变框架下逐步逼近真实几何结构
我曾经踩过的坑: 一开始我以为Structure Module输入的Pair表示和Evoformer输出的Pair表示可以共用一个维度就完事了。结果发现,Structure Module对Pair表示的“空间几何一致性”非常敏感——如果用随机初始化但维度匹配的Pair向量替换Evoformer的输出,预测的全局折叠能错得离谱。说白了,Evoformer才是整个网络的“知识仓库”,Structure Module只是把它解析成坐标的“解码器”。所以训练时,务必让Evoformer充分收敛后再微调Structure Module部分,否则容易陷入局部最优。