116

ESMFold 论文精读:语言模型如何预测蛋白结构

ESMFold 用语言模型替代 MSA,把结构预测提速两个数量级。这篇讲清它的原理、速度优势与准确度代价。

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 的表示本身对蛋白性质预测等下游任务很有价值。

延伸资源