资讯动态

蛋白质语言模型ESM:从Transformer原理到突变预测实战

发布时间:2026/8/6 4:45:40 来源:尧图企业网站定制
1. 从序列到功能蛋白质语言模型的破局之路如果你在生物信息学或者计算生物学领域摸爬滚打过几年一定会对“蛋白质结构预测”这个老大难问题印象深刻。传统的实验方法比如X射线晶体衍射或者冷冻电镜虽然精准但耗时、耗力、耗钱一个结构解析出来几个月甚至几年就过去了。而计算预测方法在AlphaFold2横空出世之前大多像是在黑箱里摸索精度有限尤其是对于没有同源模板的“孤儿蛋白”更是束手无策。这几年情况彻底变了。变化的根源是一种看似来自另一个领域的技术——Transformer架构它被成功地“嫁接”到了生物学序列上催生出了一类强大的新工具蛋白质语言模型。今天要聊的ESM就是其中的一个杰出代表它全称是Evolutionary Scale Modeling由Meta AI原Facebook AI团队开发。简单来说ESM让我们能够像理解人类语言一样去“理解”蛋白质的氨基酸序列从而轻松实现从序列预测结构、功能甚至从头设计全新的蛋白质。这背后的逻辑其实非常巧妙。我们可以把一条蛋白质序列看作是由20种“字母”标准氨基酸写成的“句子”。这个“句子”遵循着严格的语法生物物理和进化约束最终表达出特定的含义三维结构和生物功能。Transformer模型最初是为处理人类自然语言设计的它擅长捕捉长距离的依赖关系理解上下文。比如在“他打开了门然后走了进去”这句话里“他”和“进去”之间存在依赖关系。在蛋白质序列“句子”里两个空间上相隔很远的氨基酸可能因为要形成特定的氢键或疏水核心而在进化上紧密相关。ESM这类模型正是在海量的已知蛋白质序列数十亿条上进行“无监督”训练学会了这种隐藏在序列深处的“进化语法”。一旦学会了语法很多事情就变得可能了你可以让它补全一个残缺的“句子”预测突变效应可以翻译“句子”的含义预测三维结构甚至可以创作符合语法且具有新意的“句子”生成全新的功能蛋白。所以无论你是想研究某个疾病相关蛋白的致病突变还是想设计一种能降解塑料的酶亦或是单纯对AI如何解读生命密码感到好奇ESM都提供了一个前所未有的强大视角。它降低了蛋白质计算研究的门槛让更多研究者能将精力从“如何预测”转移到“预测什么”和“如何验证”这些更有创造性的问题上。2. ESM的核心设计思路与Transformer的生物学适配2.1 为什么是Transformer从RNN/CNN的局限说起在ESM等模型出现之前处理蛋白质序列的主流深度学习方法是循环神经网络RNN和卷积神经网络CNN。它们各有各的痛点。RNN如LSTM理论上可以处理任意长度的序列并考虑历史信息但其顺序计算特性导致了训练速度慢且难以捕捉非常长程的依赖关系即序列开头和结尾的氨基酸之间的相互作用。更麻烦的是RNN在训练时容易遇到梯度消失或爆炸的问题。CNN通过卷积核在序列上滑动能高效提取局部特征比如相邻氨基酸形成的短肽模式但其感受野受限于卷积核的大小。虽然通过堆叠多层或使用空洞卷积可以扩大感受野但捕捉精确的长距离相互作用依然不够直接和高效。Transformer的登场几乎是为蛋白质序列分析量身定做的解决方案。其核心机制“自注意力”Self-Attention允许序列中的任何一个位置氨基酸直接与所有其他位置进行计算和关联无论它们相距多远。这完美契合了蛋白质折叠的核心原理一个氨基酸的最终位置是由整个序列的上下文共同决定的。在训练时这种全连接特性可以并行计算极大提升了效率。ESM模型正是基于Transformer的编码器Encoder部分构建的。编码器负责将输入的氨基酸序列转换为一组富含上下文信息的向量表示即每个氨基酸的嵌入向量这个向量可以理解为该氨基酸在特定蛋白质“句子”中的“词义”。2.2 ESM的训练策略掩码语言建模MLM的生物学诠释ESM是如何学会蛋白质“语法”的呢它采用了一种叫做“掩码语言建模”Masked Language Modeling, MLM的无监督预训练方法。这个过程非常直观输入从海量数据库如UniRef中取出一条真实的蛋白质序列。掩码随机选择序列中一定比例例如15%的氨基酸将它们替换为一个特殊的[MASK]标记。学习目标让模型根据未被掩码的上下文氨基酸去预测被掩码掉的原始氨基酸是什么。这就像我们做英语完形填空。给你一句话 “The cat sat on the [MASK].”模型需要根据“The cat sat on the”这个上下文推断出被遮住的词很可能是“mat”或“rug”。在蛋白质语境下模型看到的是类似“MKAL...V[MASK]D...LPQ”的序列它必须利用整个序列的进化约束和生物物理规律猜出[MASK]处最可能是哪种氨基酸。这个过程的神奇之处在于为了准确完成这个预测任务模型被迫去学习氨基酸之间的协同进化关系、二级结构倾向、疏水性模式等复杂的生物知识。例如如果两个氨基酸在进化中总是共同出现共进化那么当其中一个被掩码时模型会强烈地依赖另一个的存在来做出预测。经过在数十亿条序列上这样的训练模型内部形成的表征即每个位置输出的向量就蕴含了关于蛋白质结构、稳定性和功能的丰富信息。这些预训练好的表征可以作为下游各种任务如结构预测、功能注释的强大特征输入这就是所谓的“预训练-微调”范式。注意这里有一个关键点ESM的预训练是无监督的它只需要蛋白质序列数据不需要任何昂贵的、人工标注的结构或功能标签。这使得我们可以利用自然界数十亿年进化产生的海量序列数据这是监督学习方法无法比拟的数据优势。2.3 模型家族概览从ESM-1到ESM-3ESM并非一个单一的模型而是一个不断进化的家族其能力随着模型参数量的增长而显著提升。ESM-1b这是一个里程碑式的模型拥有6.5亿参数。它证明了基于Transformer的蛋白质语言模型能够学习到足够的信息其输出的氨基酸表征称为ESM-1b embeddings可以直接用于提升下游任务的性能例如远程接触预测预测三维空间中哪些氨基酸会彼此靠近。ESM-2这是目前最广泛使用的版本参数规模从800万到150亿不等。ESM-2系列在架构和训练数据上进行了优化其表征质量更高。其中ESM-2 650M6.5亿参数模型是一个在性能和计算资源之间取得很好平衡的选择。而顶级的ESM-2 15B150亿参数模型其学习到的表征已经包含了极其丰富的结构信息。ESM-3这是更面向未来的探索侧重于生成模型。如果说ESM-1/2主要是“理解”和“预测”那么ESM-3则尝试“创造”。它能够根据用户指定的功能或结构约束从头生成全新的、合理的蛋白质序列。这为蛋白质设计打开了新世界的大门。对于大多数研究者从ESM-2 650M模型开始入手是性价比最高的选择。它的表征能力足够强用于突变效应预测、结构预测的起点如结合AlphaFold2效果显著同时对计算资源的要求相对友好。3. 实战指南如何利用ESM进行蛋白质表征提取与突变预测了解了原理我们来看看怎么用。ESM最直接的应用就是提取蛋白质序列的表征并将这些表征用于下游分析。这里我们以Python环境为例展示最核心的流程。3.1 环境搭建与模型加载首先你需要一个配备GPU的机器CPU也可运行但极慢并安装好PyTorch。ESM模型通过Hugging Face Transformers库或Meta官方提供的esm包来调用。官方esm包通常更新更及时功能也更专一。# 安装ESM官方包和依赖 pip install torch pip install fair-esm # 官方ESM包加载模型和分词器Tokenizer的代码如下。分词器负责将氨基酸字母序列如“MKAL...”转换为模型能理解的数字ID。import torch import esm # 加载预训练的ESM-2模型和分词器 model, alphabet esm.pretrained.esm2_t33_650M_UR50D() # 这里以650M参数模型为例 batch_converter alphabet.get_batch_converter() model.eval() # 切换到评估模式 # 如果有GPU将模型移到GPU上 device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device)实操心得模型第一次加载时会从网上下载几百兆到几十个G不等的权重文件取决于模型大小请确保网络通畅和足够的磁盘空间。对于ESM-2 15B这样的超大模型你需要一块显存非常大的GPU如A100 80GB才能加载。3.2 提取序列的全序列及逐氨基酸表征假设我们有一个蛋白质序列我们想得到它的数学表示。# 定义你的蛋白质序列这里以酵母蛋白UBC9为例 data [ (protein1, MGSSHHHHHHSSGLVPRGSHMSELSTQQLVDMKKVQEMDGVQVETISGEDIKADIKVVLPVGTIVLLEPCGNCLKNDIVYEEVCDECKHKWCPICRFLVCSRCLLS), ] batch_labels, batch_strs, batch_tokens batch_converter(data) batch_tokens batch_tokens.to(device) # 禁用梯度计算加快推理速度并节省内存 with torch.no_grad(): # 前向传播获取输出 results model(batch_tokens, repr_layers[33]) # 提取第33层最后一层的输出 token_representations results[representations][33] # 形状: (batch_size, seq_len, hidden_dim) # token_representations 包含了每个氨基酸位置的特征向量包括特殊的开头和结尾token # 我们通常去掉这些特殊token只保留对应原始氨基酸的向量 sequence_representation token_representations[0, 1:-1, :] # 去除第一个cls和最后一个eostoken print(f序列表征形状: {sequence_representation.shape}) # 输出: torch.Size([seq_length, 1280]) 对于650M模型隐藏维度是1280 # 如果你想得到一个代表整个蛋白质的单一向量全序列表征一个常见的方法是取所有氨基酸向量的平均值 mean_representation sequence_representation.mean(dim0) print(f全序列平均表征形状: {mean_representation.shape}) # torch.Size([1280])这个sequence_representation是一个二维矩阵每一行对应序列中的一个氨基酸每一列是模型学习到的一个特征维度。这个1280维的向量就是该氨基酸在这个特定蛋白质上下文中的“深度画像”。你可以将这些向量用于训练下游分类器比如预测每个氨基酸是否位于蛋白质表面、是否参与催化活性位点。作为结构预测模型的输入AlphaFold2的迭代搜索模块Evoformer就利用了类似ESM的表征作为进化信息的补充。序列比对和相似性搜索在表征空间计算蛋白质之间的“语义”距离可能比传统的基于序列比对的方发现更深层的功能关联。3.3 预测点突变的效应零样本预测Zero-shot PredictionESM一个非常强大的能力是进行“零样本”突变效应预测。也就是说你不需要为你的特定蛋白训练任何模型直接使用预训练的ESM就能评估一个突变如将第50位的亮氨酸L突变为丙氨酸A可能对蛋白质产生的影响。其原理是利用模型在MLM任务中学习到的概率分布。对于一个野生型序列我们让模型去预测每个位置所有可能氨基酸的概率。然后我们引入突变再看模型对这个突变位点新氨基酸的“惊讶”程度。如果突变后的氨基酸在模型的预测中概率很低说明这个突变不符合模型学习到的进化模式很可能是有害的。def predict_mutation_effect(sequence, mut_pos, wildtype_aa, mutant_aa, model, alphabet): 预测单点突变的效应。 sequence: 野生型蛋白质序列字符串 mut_pos: 突变位置从1开始的索引 wildtype_aa: 野生型氨基酸单字母 mutant_aa: 突变型氨基酸单字母 返回模型对野生型和突变型氨基酸的伪似然分数log概率以及它们的差值。 # 确保位置和氨基酸匹配 assert sequence[mut_pos-1] wildtype_aa, f位置{mut_pos}的氨基酸是{sequence[mut_pos-1]}, 不是{wildtype_aa} # 1. 对野生型序列进行掩码并计算 masked_seq list(sequence) masked_seq[mut_pos-1] alphabet.mask_token # 将该位置替换为[MASK] data [(wild_masked, .join(masked_seq))] _, _, tokens alphabet.get_batch_converter()(data) tokens tokens.to(device) with torch.no_grad(): logits model(tokens)[logits] # 形状: (1, seq_len, vocab_size) # 获取掩码位置对所有氨基酸的预测分数 mut_logits logits[0, mut_pos, :] # 注意token索引的偏移可能需要1 # 计算伪似然log-softmax log_probs torch.nn.functional.log_softmax(mut_logits, dim-1) # 获取野生型氨基酸和突变型氨基酸对应的索引 wt_idx alphabet.tok_to_idx[wildtype_aa] mt_idx alphabet.tok_to_idx[mutant_aa] wt_score log_probs[wt_idx].item() mt_score log_probs[mt_idx].item() # 2. 计算分数差。通常分数下降delta 0表示突变可能有害。 delta_score mt_score - wt_score return wt_score, mt_score, delta_score # 使用示例 seq MGSSHHHHHHSSGLVPRGSHMSELSTQQLVDMKKVQEMDGVQVETISGEDIKADIKVVLPVGTIVLLEPCGNCLKNDIVYEEVCDECKHKWCPICRFLVCSRCLLS wt_score, mt_score, delta predict_mutation_effect(seq, mut_pos10, wildtype_aaS, mutant_aaA, modelmodel, alphabetalphabet) print(f野生型(S)分数: {wt_score:.4f}, 突变型(A)分数: {mt_score:.4f}, 差值(Δ): {delta:.4f}) if delta -1: # 阈值可根据实际情况调整 print(预测该突变可能有害。) else: print(预测该突变可能中性或有益。)注意事项这种零样本预测方法虽然方便但其准确性因蛋白和突变类型而异。它主要反映了突变是否符合进化模式而不是直接预测稳定性或功能变化。对于关键应用建议将ESM的预测与基于物理的能量计算或实验验证相结合。4. 进阶应用结合ESM与AlphaFold2进行高精度结构预测ESM的表征可以作为进化信息的强力补充显著提升结构预测模型的性能尤其是在同源序列稀少的情况下。AlphaFold2的官方实现中就集成了使用类似ESM的MSA Transformer来生成“虚拟MSA”表征的选项。这里介绍一种更灵活的本地化结合方式。4.1 生成ESM表征作为特征输入AlphaFold2或其开源复现版本如ColabFold, OpenFold通常接受两种主要输入1) 多序列比对MSA 2) 模板信息。我们可以将ESM提取的序列表征作为第三种输入特征。首先你需要为你的目标序列提取ESM表征并保存为.pkl或.npz文件。import numpy as np # ... (沿用之前的代码提取 sequence_representations) # sequence_representation 是形状为 [seq_len, hidden_dim] 的 tensor # 转换为numpy数组并保存 repr_array sequence_representation.cpu().numpy() np.savez(target_esm_representation.npz, representationrepr_array)4.2 修改预测Pipeline以注入ESM特征接下来你需要修改AlphaFold2的推理代码在模型的数据加载部分读取这个额外的特征并将其拼接到已有的特征中。这通常需要深入模型的feature_pipeline.py或类似的文件。一个简化的概念性步骤是在特征字典feature_dict构建完成后添加一个新的键值对例如“esm_representation”其值就是你保存的repr_array。修改模型配置文件config.yaml在model.embeddings_and_evoformer部分增加一个用于处理ESM表征的线性投影层将其维度投影到模型内部使用的通道数。确保在Evoformer的输入中将投影后的ESM表征与MSA表征、模板表征等进行拼接或相加。这个过程需要对AlphaFold2的代码结构有一定了解技术门槛较高。一个更简单的方法是使用已经集成了此功能的分支或工具例如一些优化版的ColabFold脚本。实操心得对于同源序列非常少的蛋白即MSA很浅注入ESM表征带来的提升最为明显。对于已经有深度MSA的蛋白ESM的补充作用相对较小但有时也能帮助模型在局部细节上做出更准确的判断。在实际操作中务必确保ESM表征的序列与输入AlphaFold2的序列完全一致包括任何添加的特殊标记或填充。5. 常见问题、排查技巧与未来展望5.1 实操中遇到的典型问题与解决方案问题可能原因解决方案CUDA内存不足OOM1. 模型太大如ESM-2 15B。2. 序列过长。3. 批次大小batch_size设置过大。1. 换用更小的模型如ESM-2 650M。2. 对于长序列尝试使用model.truncate_seq或分段处理。3. 将batch_size设为1。使用torch.cuda.empty_cache()清理缓存。预测结果不理想/反直觉1. 蛋白质属于非常规家族训练数据少。2. 突变位于无序区域或柔性环区。3. 零样本预测的固有局限性。1. 尝试集成多个不同蛋白质语言模型的预测结果如ESM, ProtBERT。2. 结合基于结构的预测工具如FoldX, Rosetta ddG。3. 任何计算预测都应以实验验证为最终依据。提取的表征维度不对错误地处理了特殊token如cls,eos,pad。仔细检查batch_tokens的索引。通常有效序列表征位于第1个到倒数第2个token之间[1:-1]。使用alphabet提供的工具函数进行验证。安装或导入错误Python环境冲突PyTorch版本不匹配。创建干净的conda虚拟环境。严格按照ESM官方README的说明安装指定版本的PyTorch。5.2 ESM的局限性在哪里尽管ESM非常强大但我们必须清醒地认识到它的边界它是统计模型不是物理模型ESM学习的是序列中的统计规律进化共变而非第一性的物理定律如分子力场。因此它可能无法准确预测那些在进化中未曾出现过的、违反物理规律的设计。对构象变化和动态性捕捉有限一个蛋白质可能有多个功能构象。标准的ESM模型从一个序列生成一个静态的表征难以直接编码这种动态性。依赖训练数据如果某个蛋白质家族在训练数据中代表性不足模型对其的预测可能不可靠。“黑箱”特性我们很难解释模型究竟基于序列的哪一部分做出了某个特定预测这在需要可解释性的生物医学应用中是一个挑战。5.3 未来方向与个人体会从我自己的使用经验来看ESM这类蛋白质语言模型已经从一个前沿研究概念迅速变成了计算生物学家的日常工具箱的一部分。它的价值不在于替代传统的实验或物理计算方法而在于提供了一个全新的、数据驱动的视角极大地扩展了我们的探索能力。未来的发展可能会集中在几个方向一是多模态融合将序列信息与初步的结构信息、互作组学数据甚至文献知识结合训练更强大的模型二是可解释性开发方法让我们能“读懂”模型做出判断的依据三是生成模型的实用化让像ESM-3这样的工具能够可靠地设计出满足复杂功能需求如高催化活性、特异性结合的新蛋白。对于刚入门的朋友我的建议是不要被“Transformer”、“语言模型”这些词吓到。你可以先把ESM当作一个非常高级的“特征提取器”。从用它计算一下你感兴趣的蛋白的表征开始看看这些表征在简单的分类任务上表现如何。然后尝试用它跑一下突变预测和已知的实验数据对比。在这个过程中你会逐渐建立起对模型能力的直觉。这个领域发展飞快保持学习动手实践才是最好的方式。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价