ESMFold(Lin 等,Science 2023)提出了一条与 AlphaFold2 根本不同的路线:不做 MSA 搜索,只用蛋白语言模型的表示直接预测结构。这带来了数量级的速度提升,代价是准确度下降。
核心思想:语言模型替代 MSA
# AlphaFold2 的流程:
# 序列 → 搜索数据库找同源序列(【最慢的一步】,可能数小时)
# → 构建 MSA
# → 从 MSA 中提取共进化信号
# → 预测结构
#
# ESMFold 的流程:
# 序列 → 蛋白语言模型(ESM-2)编码
# → 直接预测结构
#
# 【完全跳过 MSA 搜索】
#
# 为什么可行?
# ESM-2 在 UniRef 的数十亿条序列上做掩码语言建模预训练
# (遮住某些氨基酸,让模型预测)
#
# 在这个过程中,模型【隐式地学到了进化信息】:
# 要预测被遮住的氨基酸,必须理解序列的约束
# 而这些约束正来自结构与功能的要求
#
# → 注意力图中出现了对应残基接触的模式
# → 【语言模型的内部表示中已经编码了结构信息】
#
# 这是一个重要的发现:
# 共进化信号不必显式提取,
# 大规模语言建模会自发学到它
# 模型规模:
# ESM-2 有 8M 到 15B 参数的多个版本
# ESMFold 用的是 3B 版本
# → 模型越大,隐含的结构信息越丰富
速度与准确度的权衡
| AlphaFold2 | ESMFold | |
|---|---|---|
| MSA 搜索 | 需要(最慢) | 不需要 |
| 单序列耗时 | 数十分钟~数小时 | 秒级 |
| 准确度(有深 MSA 时) | 更高 | 较低 |
| 准确度(MSA 稀少时) | 下降明显 | 相对稳健 |
| 宏基因组蛋白 | 困难(无同源序列) | 可行 |
| 部署复杂度 | 需数 TB 数据库 | 只需模型权重 |
关键判断:如果目标蛋白有深 MSA,用 AF2;如果 MSA 稀少或需要处理大批量,用 ESMFold。
使用
pip install fair-esm[esmfold]
# 需要额外安装 openfold 的部分依赖
import torch
import esm
model = esm.pretrained.esmfold_v1()
model = model.eval().cuda()
# 单序列预测
sequence = "MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQAPILSRVGDGTQDNLSGAEKAVQVKVKALPDAQFEVVHSLAKWKRQTLGQHDFSAGEGLYTHMKALRPDEDRLSPLHSVYVDQWDWERVMGDGERQFSTLKSTVEAIWAGIKATEAAVSEEFGLAPFLPDQIHFVHSQELLSRYPDLDAKGRERAIAKDLGAVFLVGIGGKLSDGHRHDVRAPDYDDWSTPSELGHAGLNGDILVWNPVLEDAFELSSMGIRVDADTLKHQLALTGDEDRLELEWHQALLRGEMPQTIGGGIGQSRLTMLLLQLPHIGQVQAGVWPAAVRESVPSLL"
with torch.no_grad():
output = model.infer_pdb(sequence)
with open("predicted.pdb", "w") as f:
f.write(output)
# 批量预测(这是 ESMFold 的主要优势场景)
sequences = {"seq1": "MKT...", "seq2": "MSK..."}
for name, seq in sequences.items():
with torch.no_grad():
pdb = model.infer_pdb(seq)
with open(f"{name}.pdb", "w") as f:
f.write(pdb)
# 显存不足时:分块处理长序列
model.set_chunk_size(128)
# 也可以用 ESM Metagenomic Atlas 的 API
# https://api.esmatlas.com/foldSequence/v1/pdb/
# (无需本地 GPU,但有长度与频率限制)
只用 ESM-2 的表示做下游任务
# ESMFold 之外,ESM-2 的表示本身很有价值
import torch
import esm
model, alphabet = esm.pretrained.esm2_t33_650M_UR50D()
batch_converter = alphabet.get_batch_converter()
model.eval()
data = [("protein1", "MKTAYIAKQRQISFVKSHFSRQ"),
("protein2", "MSKGEELFTGVVPILVELDGDV")]
_, _, tokens = batch_converter(data)
with torch.no_grad():
results = model(tokens, repr_layers=[33], return_contacts=True)
# 残基级表示
token_reprs = results["representations"][33] # (batch, len, 1280)
# 序列级表示(平均池化,跳过起止 token)
seq_reprs = []
for i, (_, seq) in enumerate(data):
seq_reprs.append(token_reprs[i, 1:len(seq)+1].mean(0))
# 接触图预测(副产品,来自注意力)
contacts = results["contacts"]
# 这些表示的用途:
# - 蛋白性质预测(稳定性、溶解度、表达量)
# - 变异效应预测(见 143)
# - 蛋白功能注释
# - 抗体开发性预测(见 367)
# - 作为下游模型的输入特征
#
# 通常比手工特征(氨基酸组成、理化性质)好得多
ESM Metagenomic Atlas
- 规模:用 ESMFold 预测了超过 6 亿个宏基因组蛋白的结构;
- 为什么只能用 ESMFold 做:宏基因组蛋白大多没有同源序列,MSA 方法不适用;且数量太大,AF2 的速度不可行;
- 价值:探索了「蛋白结构空间」中人类此前未见的区域——很多预测结构的折叠方式在 PDB 中没有对应;
- 用途:新酶发现、新功能蛋白挖掘、结构-功能关系研究;
- 注意:这些是预测结构,平均 pLDDT 不高,使用前要看置信度。
局限
- 准确度低于 AF2:在有深 MSA 的蛋白上,差距明显。不应把 ESMFold 当作 AF2 的等价替代;
- 只做单链:不支持复合物预测;
- 长序列显存需求高:超过约 1000 残基需要分块或降低批量;
- 同样是 apo 样构象:用于对接时的问题与 AF2 相同(见 112《AlphaFold2 论文精读》);
- 对人工设计蛋白的表现:由于没有进化史,语言模型的表示可能不适用——但这一点 AF2 也面临。
方法学的意义
ESMFold 证明了「规模化的自监督学习能隐式学到领域知识」——不需要显式地设计共进化提取模块,只要模型足够大、数据足够多,结构信息会自然涌现在表示中。这个结论超出了结构预测本身,是蛋白语言模型这一整个方向的理论依据(见 143《ESM-2 论文精读》)。
关键要点
- 跳过 MSA 搜索是速度提升数量级的根本原因;
- 语言模型在大规模预训练中隐式学到了共进化信息——不需要显式提取;
- 有深 MSA 时用 AF2,MSA 稀少或需大批量时用 ESMFold;
- ESM-2 的表示本身对蛋白性质预测等下游任务很有价值。
延伸资源
- AlphaFold2:112《AlphaFold2 论文精读》;蛋白语言模型:143《ESM-2 论文精读》;
- ColabFold:118《ColabFold》;抗体应用:365《CDR Loop 建模》。