使用ESM3进行蛋白质引导生成的技术指南
引言
在蛋白质工程领域,evolutionaryscale/esm项目提供的ESM3模型是一个强大的工具,能够进行蛋白质序列和结构的生成。本教程将重点介绍ESM3中的引导生成(Guided Generation)功能,这是一种通过自定义评分函数来指导蛋白质生成过程的技术。
引导生成的基本原理
引导生成的核心思想是通过评分函数(Scoring Function)来评估生成的蛋白质,并引导模型朝着评分更高的方向生成蛋白质。这种技术基于Soft Value-Based Decoding方法,允许我们:
- 提高生成蛋白质的质量指标(如pTM)
- 控制输出蛋白质的氨基酸组成或结构特征
- 最小化生物物理能量函数
- 利用实验筛选数据通过回归模型指导设计
准备工作
安装必要的库
首先需要安装ESM3相关的Python库以及3D可视化工具:
pip install esm py3dmol
导入必要的模块
import biotite.structure as bs
import py3Dmol
from esm.models.esm3 import ESM3
from esm.sdk.api import ESMProtein, GenerationConfig
from esm.sdk.experimental import ESM3GuidedDecoding, GuidedDecodingScoringFunction
创建评分函数
引导生成的关键是定义合适的评分函数。评分函数需要继承自GuidedDecodingScoringFunction
类,并实现__call__
方法,该方法接收一个ESMProtein
对象并返回一个数值分数。
示例1:pTM评分函数
预测模板建模(pTM)分数是衡量生成蛋白质结构质量的重要指标:
class PTMScoringFunction(GuidedDecodingScoringFunction):
def __call__(self, protein: ESMProtein) -> float:
assert protein.ptm is not None, "蛋白质必须包含pTM分数"
return float(protein.ptm)
模型初始化
引导生成既支持本地推理也支持远程服务:
本地模型初始化
model = ESM3.from_pretrained().to("cuda")
引导生成实践
提高pTM分数的引导生成
ptm_guided_decoding = ESM3GuidedDecoding(
client=model,
scoring_function=PTMScoringFunction()
)
PROTEIN_LENGTH = 256
starting_protein = ESMProtein(sequence="_" * PROTEIN_LENGTH)
generated_protein = ptm_guided_decoding.guided_generate(
protein=starting_protein,
num_decoding_steps=len(starting_protein) // 8,
num_samples_per_step=10,
)
无引导生成的对比
generated_protein_no_guided = model.generate(
input=starting_protein,
config=GenerationConfig(track="sequence", num_steps=len(starting_protein) // 8),
)
通过3D可视化可以明显看出引导生成产生的蛋白质结构更加合理。
序列层面的引导生成
不含半胱氨酸的蛋白质生成
class NoCysteineScoringFunction(GuidedDecodingScoringFunction):
def __call__(self, protein: ESMProtein) -> float:
assert protein.sequence is not None, "蛋白质必须包含序列"
return -protein.sequence.count("C") # 负分数减少半胱氨酸出现
no_cysteine_guided_decoding = ESM3GuidedDecoding(
client=model,
scoring_function=NoCysteineScoringFunction()
)
no_cysteine_protein = no_cysteine_guided_decoding.guided_generate(
protein=starting_protein,
num_decoding_steps=len(starting_protein) // 8,
num_samples_per_step=10,
)
验证生成的蛋白质确实不含半胱氨酸:
print(no_cysteine_protein.sequence)
print(f"半胱氨酸数量: {no_cysteine_protein.sequence.count('C')}")
结构特征的引导生成
最大化蛋白质的球状性
通过回转半径(Radius of Gyration)作为评分标准:
class RadiousOfGyrationScoringFunction(GuidedDecodingScoringFunction):
def __call__(self, protein: ESMProtein) -> float:
score = -1 * self.radius_of_gyration(protein)
assert protein.ptm is not None, "蛋白质必须包含pTM分数"
if protein.ptm < 0.5:
score = score * 2 # 对低pTM分数的蛋白质施加惩罚
return score
@staticmethod
def radius_of_gyration(protein: ESMProtein) -> float:
protein_chain = protein.to_protein_chain()
arr = protein_chain.atom_array_no_insertions
return bs.gyration_radius(arr)
radius_guided_decoding = ESM3GuidedDecoding(
client=model,
scoring_function=RadiousOfGyrationScoringFunction()
)
radius_guided_protein = radius_guided_decoding.guided_generate(
protein=starting_protein,
num_decoding_steps=len(starting_protein) // 8,
num_samples_per_step=10,
)
结论
ESM3的引导生成功能为蛋白质设计提供了强大的工具。通过定义适当的评分函数,研究人员可以:
- 提高生成蛋白质的质量
- 控制特定的序列特征
- 优化结构特性
- 结合实验数据进行定向设计
这种灵活的方法为蛋白质工程开辟了新的可能性,使研究人员能够更精确地控制蛋白质生成过程。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考