第3章:AlphaFold 架构简介

3.1 整体架构:从序列到结构的"工厂流水线"

AlphaFold 的架构设计,我个人的理解,就像一条精心设计的"信息工厂流水线"。多数初学者一上来就被各种模块——Evoformer、结构模块、循环迭代——搞得眼花缭乱。别慌,咱们一步步拆开看。它本质上就是把输入的多序列比对(MSA)和模板信息,通过一系列可学习的操作,最终"折叠"成一个三维原子坐标。

我也得说实话,这个架构在2021年刚出来时,很多结构生物学家都觉得"这不科学"——因为它不像传统能量计算那样基于物理原理,而是纯粹靠"猜"模式。但事实证明,这个猜法惊人的准确。

整体上来讲,Pipeline 可以分为三个主要环节:

  1. 特征提取与表示构建——把原始序列、MSA、模板变成高维向量。
  2. Evoformer 核心骨干——在 MSA 和 pair 表示之间反复做"信息交换",捕捉共进化关系。
  3. 结构模块——从 pairwise 表示出发,用迭代的方式"投射"出原子坐标。

嗯,如果你想用一句话记住:Evoformer 是大脑,负责"理解"序列间的关系;结构模块是小手,负责把理解变成立体的结构。

3.2 输入特征:MSA 和模板是怎样被"编码"的

先说说 AlphaFold 怎么"看"输入序列的。原始的目标序列和它的 MSA 当然是核心,但直接扔给神经网络是不行的——得先做一次"翻译"。

我个人习惯把特征分成三块:

  • MSA 特征:它包括 one-hot 编码的氨基酸类型、位置特异性得分矩阵(PSSM)、以及一些间隙标记。维度大概在 22 维左右(20种氨基酸+未知+间隙)。每个残基位置都会被编码,然后在 MSA 的 N_seq x N_res 矩阵上做操作。
  • Pair 特征:这是关于残基对(i, j)之间关系的特征矩阵。最常见的就是"相对位置编码"。两个残基在序列上的索引差会被映射成一个向量。
  • 模板特征:如果有多条已知结构的同源蛋白,它们的结构会被提取出来,用(Cα 原子间的距离和方位)形成一个 N_res x N_res 的"结构距离图",然后也变成 pair 特征的一部分。

对了,我在早期复现 AlphaFold 时,踩过一个大坑:相对位置编码的截断阈值设置错误。这会直接导致 pair 表示中"远端残基关系"的丢失。细小的参数对结果影响巨大。

这些特征会先被投射成初始表示:

  • msa_feat → N_seq x N_res x c_m (c_m 通常 256)
  • pair_feat → N_res x N_res x c_z (c_z 通常 128)
一个小细节:特征向量中的每个元素在送入网络前都有独立的"线性层"做初始化变换。所以,不要手动做归一化——它自己学的。

3.3 Evoformer:MSA 多样性的"搅拌机"

接下来是整个架构中最核心的部分:Evoformer。它由一串相同结构但权重不同的 Transformer 层堆叠而成。每层都由两个并行的"轨道"组成:

轨道名称 维度 功能描述
MSA 表示 (msa_act) N_seq × N_res × c_m 以残基为"注意力对象",更新每条序列的表示
Pair 表示 (pair_act) N_res × N_res × c_z 以残基对为"注意力对象",更新所有残基间的关系

这两个轨道并不是孤立的。Evoformer 中最关键的设计就是"MSA 到 pair"以及"pair 到 MSA"的注意力信息交换。你想想看:MSA 的多样性(序列间的差异)可以帮助推断哪些残基对在进化上是耦合的(即结构上可能接近);反过来,pair 表示中已经知道的"残基对距离"又能指导 MSA 中哪些列是共进化的。这就是循环校验。

我曾经为了尽快拿到结果,被迫把 Evoformer 的层数从 48 砍到 24——嗯,结果很差。后来我意识到,少层数没法让这种"信息交换"充分收敛。所以,深度就是质量的一部分。

# 以简化的伪码表示 MSA → pair 的注意力(行注意力)
# 假设我们已经有了 msa_act: [N_seq, N_res, c_m]
# 和 pair_act: [N_res, N_res, c_z]
# 操作步骤:
# 1. 对 MSA 做"行注意力"(每条序列内部残基的注意力)
# 2. 从 msa_act 中提取出"残基对"的特征
# 3. 加到 pair_act 上

def row_attention_with_pair_bias(msa_act, pair_act):
    # pair_act 增加一个偏置项到注意力分数中
    # 注意力分数 = Q * K^T + pair_bias
    return updated_msa_act

实际上,Evoformer 的堆叠数是 48 块(caspar 版本)。每一块都进行上述的"行/列注意力"和"三角乘法更新"。这听起来很重,但正是这种重复,才让模型在复杂的共进化信号中提炼出稳定模式。

3.4 结构模块:把抽象的表示"翻译"成三维坐标

经过 Evoformer 的多轮"搅拌",我们得到了一个非常"聪明"的 pair 表示。结构模块的任务,就是用这个表示来构建一个具体的蛋白质骨架。

AlphaFold 用的是迭代细化的做法:

  • 初始化一个"粗"的骨架(比如所有残基都在同一个点)。
  • 然后通过一个"结构调整器"(由 IPA 模块和 backbone 更新组成),根据当前的 pair 表示,逐步移动每个残基的定位。
  • 每移动一次,就用 pair 表示重新计算一下残基间的约束。这个约束会反馈给调整器。
  • 这样重复 8 次(如果我没记错的话),得到最终的三维结构。

IPA(Invariant Point Attention)模块是结构模块的核心——它保证输出的坐标是旋转平移不变的。这意味着不管你如何旋转整个系统,注意力计算的结果都一样。这个设计,说白了,确保了最终结构的物理合理性。

3.5 整体流程图

下面这张图概括了从输入到输出的整体逻辑。我用一种简单大家都能看懂的方式画了出来:

AlphaFold 架构整体流程图 原始序列 MSA 数据库 模板库 MSA 特征提取 模板特征提取 初始表示 (msa, pair) Evoformer 骨干网络(48层堆叠) MSA ↔ Pair 信息交替更新 结构模块 8 步循环细化 三维原子坐标

这张图展示了信息从输入到输出的整体流动方向,以及每个阶段所执行的核心操作。你看,它其实不像有些文献画的那么复杂——关键就是"提取特征 → 双向交流 → 迭代构建"。这也是我每次给学生讲 AlphaFold 时手画的第一张图。

3.6 AlphaFold 架构的局限与启发

虽然这个架构效果惊人,但仔细审视,还是有些潜在的缺陷。我自己在实际项目中感受比较深的有这么几条:

  • 对 MSA 深度的敏感度:模型很大程度依赖于 MSA 中多样性的数量——缺少同源序列时,Evoformer 的"共进化信号"就弱很多。
  • 计算成本高:48 层 Evoformer + 每层的行/列注意力,意味着一次推理需要大量 GPU 内存。长度超过 300 残基的蛋白质,单卡基本跑不动。
  • 没有显式的能量优化:传统的分子力场(如 Rosetta、Amber)根本不参与训练或推理。偶尔会出现一些"物理上不合理"的结构(如环状结构中的极度扭曲)——AlphaFold 没法自我修复。
注意:如果你尝试复现 AlphaFold 的 Evoformer 层,一定不要忘了"三角乘法更新"和"pair 的前馈神经网络"——它们直接决定了 pair 表示的更新质量。我见过有的教程把这两步给砍了,结果 RMSD 差了两埃不止。

好了,AlphaFold 的架构就是这么回事。它不是万能钥匙,但它给了我们一个非常重要的启示:在结构预测这件事上,恰当的归纳偏置(pair 表示、迭代细化、旋转不变注意力)比单纯的扩大模型规模更有效。

明天你需要准备的是什么?我想你已经心中有数了——就是深入理解 MSA 特征和 Evoformer 之间的关系。别急,我们会一章一章拆透。