跳转到主要内容

用于“通过迁移学习建模生命语言 - 深度学习蛋白质序列”的Embeeder工具

项目描述

SeqVec

存放论文通过迁移学习通过蛋白质序列建模生命语言的各个方面的仓库。包含用于创建氨基酸序列嵌入的预训练SeqVec模型。还包含微调的检查点。

摘要

背景:计算生物学中的一项常见任务是预测蛋白质功能和结构方面的各个方面,从其氨基酸序列。26年来,大多数针对此目的的最先进的方法都是将机器学习和进化信息相结合。从不断增长的序列数据库中检索相关蛋白质变得越来越耗时,以至于分析整个蛋白质组变得具有挑战性。此外,对于小型家族,例如来自暗蛋白质组的蛋白质,进化信息的作用较弱。

结果:我们介绍了一种新的方法,通过使用来自自然语言处理(NLP)的深度双向模型ELMo来将蛋白质序列表示为连续向量(嵌入)。该模型有效地捕捉了从未标记的大数据(UniRef50)中蛋白质序列的物理化学特性。经过训练后,这种知识通过预测相关序列特征转移到单个蛋白质序列上。我们把这些新的嵌入称为SeqVec(序列到向量),并通过在现有数据集上训练简单的卷积神经网络来展示它们的有效性,用于两个完全不同的预测任务。在每残基水平上,我们显著提高了二级结构预测(对于NetSurfP-2.0数据集:Q3=79%±1,Q8=68%±1)和无序预测(MCC=0.59±0.03),超过了未使用进化信息的方法。在每蛋白质水平上,我们预测了十类亚细胞定位(对于DeepLoc数据集:Q10=68%±1),并区分了膜结合蛋白和水溶性蛋白(Q2=87%±1)。所有这些结果都是基于从新工具SeqVec获得的嵌入构建的,既没有明确也没有隐式地使用进化信息。尽管如此,它在一些使用此类信息的方法上有所改进。在HHblits需要平均约两分钟来生成目标蛋白的进化信息时,SeqVec平均只需要0.03秒来创建向量表示。

结论:我们已经证明,迁移学习可以用来从大型未标记序列数据库中捕捉蛋白质序列的生化或物理化学特性。通过仅使用单个蛋白质序列展示了所提出方法在多个预测任务中的有效性。SeqVec嵌入使得预测优于甚至使用进化信息的一些方法。因此,它们证明了能够浓缩蛋白质序列的潜在原理。这可能是仅基于单个蛋白质序列进行竞争性预测的第一步。

SeqVec的t-SNE投影

2D t-SNE projections 2D t-SNE投影的无监督SeqVec嵌入突出了蛋白质及其组成部分(氨基酸)的不同现实。 图(b)至图(d)基于相同的数据集(结构分类的蛋白质 - 扩展版(SCOPe)2.07,重复性降低至40%)。对于这些图,可能仅显示包含感兴趣注释的SCOPe子集(酶活性(c)和领域(d))。图(a):嵌入空间证实:20种标准氨基酸根据它们的生化物理特性(即疏水性、电荷或大小)聚集在一起。半胱氨酸(C,主要是疏水和极性)的独特作用得以保持。图(b):SeqVec嵌入捕获了SCOPe主要类中注释的结构信息,而从未明确训练过结构特征。图(c):许多小型局部簇根据酶委员会编号(E.C.)中的主要类共享功能。图(d):同样,小型局部簇代表不同的生物界。

模型可用性

在UniRef50(=SeqVec)上训练的ELMo模型可在以下位置获取:SeqVec模型

预训练模型的检查点可在以下位置获取:SeqVec检查点

安装

pip install seqvec

我们正在开发一个具有更多嵌入器和通用界面的Python包;请参阅bio_embeddings

示例

bio_embeddings的github存储库中,您可以在notebooks文件夹中找到示例。

有关如何使用ELMo提取嵌入的一般示例,请参阅官方ELMo实现:ELMo教程

您可以使用seqvec命令为fasta文件计算嵌入。添加--protein True以获取每个蛋白质的嵌入而不是每个残基。

seqvec -i sequences.fasta -o embeddings.npz

使用numpy加载嵌入

import numpy as np
data = np.load("embeddings.npz")  # type: Dict[str, np.ndarray]

如果您指定输出格式为.npy(例如使用-o embeddings.npy),脚本将保存嵌入向量为一个numpy数组,并将其对应的标识符(从fasta文件的标题行中提取)保存在一个json文件中。json文件中的排序与npy文件中的索引相对应。可以通过以下方式加载npy文件:

import json
import numpy as np

data = np.load("embeddings.npy") # shape=(n_proteins,)
with open("embeddings.json") as fp:
    labels = json.load(fp)

如何将嵌入器集成到现有工作流程中

加载预训练模型

from allennlp.commands.elmo import ElmoEmbedder
from pathlib import Path

model_dir = Path('path/to/pretrained/SeqVec_directory')
weights = model_dir / 'weights.hdf5'
options = model_dir / 'options.json'
embedder = ElmoEmbedder(options,weights, cuda_device=0) # cuda_device=-1 for CPU

获取氨基酸序列的嵌入向量

seq = 'SEQWENCE' # your amino acid sequence
embedding = embedder.embed_sentence(list(seq)) # List-of-Lists with shape [3,L,1024]

批量嵌入序列

seq1 = 'SEQWENCE' # your amino acid sequence
seq2 = 'PROTEIN'
seqs = [list(seq1), list(seq2)]
seqs.sort(key=len) # sorting is crucial for speed
embedding = embedder.embed_sentences(seqs) # returns: List-of-Lists with shape [3,L,1024]

获取每个残基预测的1024维嵌入向量

import torch
residue_embd = torch.tensor(embedding).sum(dim=0) # Tensor with shape [L,1024]

获取每个蛋白质预测的1024维嵌入向量

protein_embd = torch.tensor(embedding).sum(dim=0).mean(dim=0) # Vector with shape [1024]

常见问题解答

PyTorch版本冲突 如果在pip安装seqvec时遇到版本冲突(ERROR: No matching distribution found for torch<1.3,>=1.2 (from seqvec)),可以通过创建一个新的conda环境并使用Python 3.7来解决您的问题。

非常长序列的嵌入速度慢 我们添加了一个选项,如果单个序列在GPU上由于内存问题而处理失败,则自动回退到CPU模式。虽然这允许您嵌入非常长的蛋白质,例如Q8WZ42(Titin,约35k个残基),但它会减慢嵌入过程。

基于SeqVec的预测Web服务

SeqVec预测 - Chris的蛋白质属性

Bibtex引用

@article{heinzinger2019modeling,
  title={Modeling aspects of the language of life through transfer-learning protein sequences},
  author={Heinzinger, Michael and Elnaggar, Ahmed and Wang, Yu and Dallago, Christian and Nechaev, Dmitrii and Matthes, Florian and Rost, Burkhard},
  journal={BMC bioinformatics},
  volume={20},
  number={1},
  pages={723},
  year={2019},
  publisher={Springer}
}

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

seqvec-0.4.1.tar.gz (11.3 kB 查看哈希值)

上传时间:

构建分布

seqvec-0.4.1-py3-none-any.whl (10.9 kB 查看哈希值)

上传时间: Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面