模型概述
模型特點
模型能力
使用案例
🚀 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許可證。











