第2章 序列与MSA基础:多序列比对(MSA)的概念
多序列比对,英文叫 Multiple Sequence Alignment,简称 MSA。说白了,就是把一堆相关的蛋白质序列排在一起,看看哪些位置上的氨基酸是保守的、哪些是变异的。我刚开始做结构预测时,觉得这步就是个预处理,后来踩了不少坑才发现——MSA 的质量,直接决定了 EvoFormer 能不能“看懂”蛋白质的进化信息。
为什么 EvoFormer 离不开 MSA?
EvoFormer 的核心机制,就是利用 MSA 里的“共进化信号”。你想想看,如果两个残基在进化过程中总是同时突变成某种模式,那它们在三维结构上很可能离得很近。没有 MSA,EvoFormer 就失去了关键的结构约束来源。
关键认知:MSA 不仅是序列的简单排列,它编码了蛋白质家族数十亿年的进化实验数据,是 EvoFormer 推断残基间相互作用的“训练集”。
MSA 的生成工具:HHSearch 与 Jackhmmer
实际项目中,最常用的两个工具就是 HHSearch 和 Jackhmmer。它们俩干了同一件事——搜数据库找同源序列,但路子完全不同。
HHSearch:基于隐马尔可夫模型的搜索
HHSearch 的做法是把查询序列先转成一个 HMM(隐马尔可夫模型),然后用这个 HMM 去数据库里比对已有的 HMM。我记得第一次跑 HHSearch 时,对着它的输出文件愣了半小时没看懂。后来才发现,它的核心参数就这几个:
hhsearch -i query.a3m -d /path/to/uniprot20 -o result.hhr
-E 0.001 # E-value 阈值,建议先放松到 1 试试
-Z 500 # 最多输出多少条结果
-loc # 局部比对模式,比全局模式快不少
实操小技巧:我个人习惯先用 -E 1.0 跑一轮,看看 MSA 的深度够不够,不够再收紧到 0.001。
Jackhmmer:迭代式剖面搜索
Jackhmmer 的思路更“暴力”。它先用单条序列搜一轮,找到一些同源序列,把这些序列做成一个新的“profile”,再用这个 profile 去搜第二轮。如此反复,直到收敛。
我曾经在项目里用 Jackhmmer 搜一个很“孤儿”的序列,默认参数只找到 5 条同源。后来我把迭代次数从默认的 5 次调到 10 次,前两轮没动静,第三轮突然冒出来 200 条!这就是迭代式的威力——它能发现那些跟查询序列已经比较远、但在 profile 层面还匹配的同源。来看看核心命令:
jackhmmer --cpu 16 -N 5 --noali -A result.sto query.fasta uniprot.fasta
-E 0.001 # 每轮的 E-value 阈值
-N 5 # 迭代轮数,我一般设 8-10
--noali # 不输出中间比对文件,节省磁盘
-A result.sto # 输出 Stockholm 格式的 MSA
MSA 的存储与表示
搞定了搜索,接下来要把 MSA 存成计算机能高效读取的格式。AlphaFold 的 EvoFormer 输入层就是直接吃这个格式化后的 MSA 特征。下面这张图帮你理清整个流程:
三种主流格式对比
| 格式 | 特点 | 适用场景 |
|---|---|---|
| FASTA 对齐式 | 简单直观,每行一个序列,长度一致 | 小规模 MSA,可视化检查 |
| Stockholm (.sto) | 带注释元数据,支持标记插入/缺失 | HMMER 工具链,Jackhmmer 默认输出 |
| A3M | 压缩紧凑,小写字母表示插入位点 | AlphaFold 标准输入,HHSearch 输出 |
EvoFormer 实际吃的是 A3M 格式。为什么?因为 A3M 用大写字母表示比对到的列,用小写字母表示插入的“填充”列。这样既能保留完整序列信息,又极大压缩了存储。随便展示一段:
>seq1
ARNDCQEGHILKMFPSTWYV
>seq2
ARNDCQEGHILKMFPSTWYV
>seq3
-RNDCQEGHILKMFPSTWYV
>seq4
ARNDCQEGHILKMFPSTWYV-
实际文件里,小写字母表示插入——这些都是 EvoFormer 做 masking 和 attention 时的重要信息。
避坑指南:MSA 深度与质量的平衡
我曾经在做一个膜蛋白项目时,搜出来的 MSA 深度只有 20 条左右。按照 AlphaFold 的论文,少于 20 条时预测置信度会显著下降。试了好几种参数组合,最后发现是数据库版本太旧。换了最新的 Uniclust30,深度直接到了 120。
关键指标:MSA 的“有效序列数”建议至少达到 30-50 条。少于 20 条时,EvoFormer 的共进化信号几乎消失,预测结果会偏向于统计先验。不过也别贪多——超过 1000 条后边际收益迅速递减,反而增加计算负担。
还有个容易被忽视的点:MSA 的“覆盖度”。我曾经遇到过有序列在 N 端缺了 30 个残基,但在整体 MSA 里占了一半。EvoFormer 接收时得把这块坑用 gap 填起来,但注意力模块会误以为这是个缺乏共进化信号的区域,导致局部预测跑偏。
我的建议:生成完 MSA 后,先粗略看一眼覆盖度柱状图。如果某些列的 gap 占比超过 50%,要么重新设搜索参数,要么在后续预处理时做剪辑。AlphaFold 的生成脚本里,默认会过滤掉覆盖度低于 50% 的序列,这个经验值可以直接用。
MSA 在 EvoFormer 中的实际处理
拿到 A3M 文件后,EvoFormer 内部会把它编码成两个核心特征张量:
- MSA 特征:形状为 [N_seq, N_res, 22+1](20种氨基酸 + gap + 未知 + 位置编码),这是 EvoFormer 各行之间做 attention 的输入。
- Pair 特征:形状为 [N_res, N_res, 44](残基对的距离约束、角度约束等),这部分由 MSA 的共进化信号通过“伪似然法”或“互信息”计算得到。
你想想看,没有 MSA 的话,这些张量里的共进化信息就是零。EvoFormer 就只能靠单序列的局部 pattern 推理——那效果就跟传统结构预测差不多,达不到现在的精度。
本章总结
MSA 是 EvoFormer 的“燃料”。从 HHSearch 或 Jackhmmer 搜出同源序列,经过格式转换、质量过滤,最终变成结构预测的关键输入。我得说,80% 的预测失败案例,追根溯源都是 MSA 没做好。要么深度不够,要么数据库太老,要么过滤条件太激进。把这些坑填平了,后面的事就好办多了。