模型简介
模型特点
模型能力
使用案例
🚀 ProtGPT2
ProtGPT2是一个能够“理解”蛋白质语言的语言模型,可用于从头设计和改造蛋白质。它所生成的序列在探索蛋白质空间未知区域的同时,还保留了天然蛋白质的关键特征,如氨基酸倾向、二级结构内容和球状性。
🚀 快速开始
ProtGPT2可与HuggingFace的transformer Python包配合使用。详细的安装说明可查看:HuggingFace Transformers安装指南。
由于ProtGPT2是基于经典语言模型目标进行训练的,因此它在生成蛋白质序列方面表现出色。它既可以进行零样本序列生成,也可以在用户自定义数据集上进行微调后,生成特定类型的序列。
✨ 主要特性
- 基于GPT2 Transformer架构,包含36层,模型维度为1280,总计7.38亿个参数。
- 在蛋白质空间数据库UniRef50(2021_04版本)上进行预训练,采用自监督学习方式,学习蛋白质的内部表示,从而“理解”蛋白质语言。
📦 安装指南
详细安装说明请参考:HuggingFace Transformers安装指南。
💻 使用示例
基础用法
示例1:零样本生成从头蛋白质
在以下示例中,ProtGPT2生成以氨基酸'M'开头的序列。也可以选择其他氨基酸、寡聚物、片段或蛋白质作为输入。模型将生成最可能跟随输入的序列。或者,也可以留空输入字段,让模型选择起始标记。
>>> from transformers import pipeline
>>> protgpt2 = pipeline('text-generation', model="nferruz/ProtGPT2")
# length is expressed in tokens, where each token has an average length of 4 amino acids.
>>> sequences = protgpt2("<|endoftext|>", max_length=100, do_sample=True, top_k=950, repetition_penalty=1.2, num_return_sequences=10, eos_token_id=0)
>>> for seq in sequences:
print(seq)
{'generated_text': 'MINDLLDISRIISGKMTLDRAEVNLTAIARQVVEEQRQAAEAKSIQLLCSTPDTNHYVFG\nDFDRLKQTLWNLLSNAVKFTPSGGTVELELGYNAEGMEVYVKDSGIGIDPAFLPYVFDRF\nRQSDAADSRNYGGLGLGLAIVKHLLDLHEGNVSAQSEGFGKGATFTVLLPLKPLKRELAA\nVNRHTAVQQSAPLNDNLAGMKILIVEDRPDTNEMVSYILEEAGAIVETAESGAAALTSLK\nSYSPDLVLSDIGMPMMDGYEMIEYIREWKTTKGG'}
{'generated_text': 'MQGDSSISSSNRMFT\nLCKPLTVANETSTLSTTRNSKSNKRVSKQRVNLAESPERNAPSPASIKTNETEEFSTIKT\nTNNEVLGYEPNYVSYDFVPMEKCNLCNENCSIELASLNEETFVKKTICCHECRKKAIENA\nENNNTKGSAVSNNSVTSSSGRKKIIVSGSQILRNLDSLTSSKSNISTLLNPNHLAKLAKN\nGNLSSLSSLQSSASSISKSSSTSSTPTTSPKVSSPTNSPSSSPINSPTP'}
{'generated_text': 'M\nSTHVSLENTLASLQATFFSLEARHTALETQLLSTRTELAATKQELVRVQAEISRADAQAQ\nDLKAQILTLKEKADQAEVEAAAATQRAEESQAALEAQTAELAQLRLEKQAPQHVAEEGDP\nQPAAPTTQAQSPVTSAAAAASSAASAEPSKPELTFPAYTKRKPPTITHAPKAPTKVALNP\nSTLSTSGSGGGAKADPTPTTPVPSSSAGLIPKALRLPPPVTPAASGAKPAPSARSKLRGP\nDAPLSPSTQS'}
{'generated_text': 'MVLLSTGPLPILFLGPSLAELNQKYQVVSDTLLRFTNTV\nTFNTLKFLGSDS\n'}
{'generated_text': 'M\nNNDEQPFIMSTSGYAGNTTSSMNSTSDFNTNNKSNTWSNRFSNFIAYFSGVGWFIGAISV\nIFFIIYVIVFLSRKTKPSGQKQYSRTERNNRDVDSIKRANYYG\n'}
{'generated_text': 'M\nEAVYSFTITETGTGTVEVTPLDRTISGADIVYPPDTACVPLTVQPVINANGTWTLGSGCT\nGHFSVDTTGHVNCLTGGFGAAGVHTVIYTVETPYSGNSFAVIDVNVTEPSGPGDGGNGNG\nDRGDGPDNGGGNNPGPDPDPSTPPPPGDCSSPLPVVCSDRDCADFDTQAQVQIYLDRYGG\nTCDLDGNHDGTPCENLPNNSGGQSSDSGNGGGNPGTGSTHQVVTGDCLWNIASRNNGQGG\nQAWPALLAANNESITNP'}
{'generated_text': 'M\nGLTTSGGARGFCSLAVLQELVPRPELLFVIDRAFHSGKHAVDMQVVDQEGLGDGVATLLY\nAHQGLYTCLLQAEARLLGREWAAVPALEPNFMESPLIALPRQLLEGLEQNILSAYGSEWS\nQDVAEPQGDTPAALLATALGLHEPQQVAQRRRQLFEAAEAALQAIRASA\n'}
{'generated_text': 'M\nGAAGYTGSLILAALKQNPDIAVYALNRNDEKLKDVCGQYSNLKGQVCDLSNESQVEALLS\nGPRKTVVNLVGPYSFYGSRVLNACIEANCHYIDLTGEVYWIPQMIKQYHHKAVQSGARIV\nPAVGFDSTPAELGSFFAYQQCREKLKKAHLKIKAYTGQSGGASGGTILTMIQHGIENGKI\nLREIRSMANPREPQSDFKHYKEKTFQDGSASFWGVPFVMKGINTPVVQRSASLLKKLYQP\nFDYKQCFSFSTLLNSLFSYIFNAI'}
{'generated_text': 'M\nKFPSLLLDSYLLVFFIFCSLGLYFSPKEFLSKSYTLLTFFGSLLFIVLVAFPYQSAISAS\nKYYYFPFPIQFFDIGLAENKSNFVTSTTILIFCFILFKRQKYISLLLLTVVLIPIISKGN\nYLFIILILNLAVYFFLFKKLYKKGFCISLFLVFSCIFIFIVSKIMYSSGIEGIYKELIFT\nGDNDGRFLIIKSFLEYWKDNLFFGLGPSSVNLFSGAVSGSFHNTYFFIFFQSGILGAFIF\nLLPFVYFFISFFKDNSSFMKLF'}
{'generated_text': 'M\nRRAVGNADLGMEAARYEPSGAYQASEGDGAHGKPHSLPFVALERWQQLGPEERTLAEAVR\nAVLASGQYLLGEAVRRFETAVAAWLGVPFALGVASGTAALTLALRAYGVGPGDEVIVPAI\nTFIATSNAITAAGARPVLVDIDPSTWNMSVASLAARLTPKTKAILAVHLWGQPVDMHPLL\nDIAAQANLAVIEDCAQALGASIAGTKVGTFGDAAAFSFYPTKNMTTGEGGMLVTNARDLA\nQAARMLRSHGQDPPTAYMHSQVGFN'}
示例2:在用户定义的序列集上进行微调
这种零样本生成的替代方法允许在生成过程中引入方向性。将包含感兴趣序列的用户定义训练和验证文件提供给模型。在对模型权重进行短暂更新后,ProtGPT2将生成符合输入属性的序列。
要创建验证和训练文件,需要:
- 用表达式 "<|endoftext|>" 替换每个序列的FASTA标题。
- 将原始数据集拆分为训练和验证文件(通常比例为90/10、80/20或95/5)。
然后,使用以下示例对模型进行微调。这里显示的学习率为1e - 06,但理想情况下,应在单独的运行中优化学习率。训练后,微调后的模型将存储在 ./output
文件夹中。最后,ProtGPT2可以像示例1一样生成定制序列。
python run_clm.py --model_name_or_path nferruz/ProtGPT2 --train_file training.txt --validation_file validation.txt --tokenizer_name nferruz/ProtGPT2 --do_train --do_eval --output_dir output --learning_rate 1e-06
HuggingFace脚本 run_clm.py
可在以下链接找到:https://github.com/huggingface/transformers/blob/master/examples/pytorch/language-modeling/run_clm.py
高级用法
选择最佳序列
我们观察到困惑度值与AlphaFold2的plddt相关。建议按以下方式计算每个序列的困惑度:
sequence='MGEAMGLTQPAVSRAVARLEERVGIRIFNRTARAITLTDEGRRFYEAVAPLLAGIEMHGYR\nVNVEGVAQLLELYARDILAEGRLVQLLPEWAD'
#Convert the sequence to a string like this
#(note we have to introduce new line characters every 60 amino acids,
#following the FASTA file format).
sequence = "<|endoftext|>\nMGEAMGLTQPAVSRAVARLEERVGIRIFNRTARAITLTDEGRRFYEAVAPLLAGIEMHGY\nRVNVEGVAQLLELYARDILAEGRLVQLLPEWAD\n<|endoftext|>"
# ppl function
def calculatePerplexity(sequence, model, tokenizer):
input_ids = torch.tensor(tokenizer.encode(sequence)).unsqueeze(0)
input_ids = input_ids.to(device)
with torch.no_grad():
outputs = model(input_ids, labels=input_ids)
loss, logits = outputs[:2]
return math.exp(loss)
#And hence:
ppl = calculatePerplexity(sequence, model, tokenizer)
其中 ppl
是该序列的困惑度值。目前我们还没有一个关于什么困惑度值对应“好”或“坏”序列的阈值,但由于推理速度快,最好的方法是采样多个序列,按困惑度排序,并选择困惑度较低的序列(越低越好)。
📚 详细文档
ProtGPT2基于GPT2 Transformer架构,包含36层,模型维度为1280,总计7.38亿个参数。它是一个仅解码器的Transformer模型,在蛋白质空间数据库UniRef50(2021_04版本)上进行预训练。预训练使用的是没有FASTA标题的原始序列。训练和数据集的详细信息可查看:https://huggingface.co/datasets/nferruz/UR50_2021_04。
ProtGPT2采用自监督学习方式进行训练,即训练过程中使用原始序列数据,不包含序列注释。具体而言,ProtGPT2使用因果建模目标进行训练,模型学习预测序列中的下一个标记(或在这种情况下为寡聚物)。通过这种方式,模型学习到蛋白质的内部表示,从而能够“理解”蛋白质语言。
🔧 技术细节
训练规格
该模型在128个NVIDIA A100 GPU上训练了50个epoch,使用的块大小为512,总批量大小为1024(每批65,536个标记)。使用的优化器是Adam(beta1 = 0.9,beta2 = 0.999),学习率为1e - 3。
📄 许可证
本项目采用Apache-2.0许可证。











