Dieses Repo enthält verschiedene Funktionen, um den Encoder -Teil eines vorbereiteten RoBerta -Models in Langzeittransformatoren umzuwandeln.
Der Gedächtnisverbrauch und die Laufzeit von Sprachmodellen mit Vanille-Selbstbeziehung wachsen quadratisch auf die Länge der Eingangssequenz. Verschiedene Modelle wurden vorgeschlagen, um dieses Problem entweder durch die Verwendung von spärlichen oder lokalen Aufmerksamkeitsmustern zu entspannen oder die vollständige Selbstbekämpfungsmatrix mit Zersetzungsmethoden zu nähern. Dieses Repository enthält einige Funktionen zur Initialisierung einiger dieser Modelle mit den Gewichten eines vorgezogenen RoBerta Checkpoint und kann daher hilfreich sein, um neue Modelle für Langdokumentaufgaben effizient zu erstellen.
Beachten Sie, dass die Initialisierung dieser Modelle mit vorbereiteten Gewichten sie nicht direkt verwendbar macht, geschweige denn wettbewerbsfähig. In den meisten Fällen sind mindestens ein paar tausend "fortgesetzte" Schritte erforderlich, um zufriedenstellende Ergebnisse bei jeder nachgeschalteten Aufgabe zu erzielen.
Konvertieren Sie vorgezogene RoBerta -Modelle in Longformer -Modelle
Das Longformer -Modell (Beltagy, I., Peters, ME & Cohan, A. (2020)) ersetzt den Vollbewegungsmechanismus durch lokale Aufmerksamkeitsmuster und aufgabenspezifische globale Aufmerksamkeit. Abgesehen davon verwenden Longformer -Modelle die Architektur RoBerta (Liu, Y., Ott, M., Goyal et al. (2019).). Daher ist es leicht möglich, die Gewichte eines vorbereiteten RoBerta -Modells in einen Longformer zu laden.
from roberta2longformer import convert_roberta_to_longformer
from transformers import RobertaModel , RobertaTokenizerFast
from transformers import LongformerModel , LongformerTokenizerFast
roberta_model = RobertaModel . from_pretrained ( "uklfr/gottbert-base" )
roberta_tokenizer = RobertaTokenizerFast . from_pretrained ( "uklfr/gottbert-base" )
longformer_model , longformer_tokenizer = convert_roberta_to_longformer (
roberta_model = roberta_model ,
roberta_tokenizer = roberta_tokenizer ,
longformer_max_length = 8192
)
print ( list ( longformer_model . encoder . state_dict (). items ())[ 0 ])
print ( list ( roberta_model . encoder . state_dict (). items ())[ 0 ])
inputs = longformer_tokenizer ( "Er sah eine irdische Zentralregierung, und er erblickte Frieden, Wohlstand und galaktische Anerkennung."
"Es war eine Vision, doch er nahm sie mit vollen Sinnen in sich auf."
"Im Laderaum der STARDUST begann eine rätselhafte Maschine zu summen."
"Die dritte Macht nahm die Arbeit auf."
"Da lächelte Perry Rhodan zum blauen Himmel empor."
"Langsam löste er die Rangabzeichen von dem Schulterstück seiner Kombination." ,
return_tensors = "pt" )
outputs = longformer_model ( ** inputs )
# Or to finetune the model on a task:
from transformers import LongformerForSequenceClassification
longformer_model . save_pretrained ( "tmp/longformer-gottbert" )
longformer_tokenizer . save_pretrained ( "tmp/longformer-gottbert" )
seqclass_model = LongformerForSequenceClassification . from_pretrained ( "tmp/longformer-gottbert/" )
... Die Nyströmformer -Architektur (Xiong et al. (2021)) nähert sich dem Selbstbekämpfungsmechanismus unter Verwendung der Nyström-Matrixabzugsbekomposition. Daher besteht keine Notwendigkeit, mit besonderen Aufmerksamkeitsmustern umzugehen, wodurch diese Modelle theoretisch auf eine breitere Vielzahl von Aufgaben anwendbar sind. Im Vergleich zu Longformer -Modellen scheinen Nyströmformers mehr Gedächtnis zu konsumieren.
from roberta2nyströmformer import convert_roberta_to_nystromformer
from transformers import RobertaModel , RobertaTokenizerFast
from transformers import NystromformerTokenizerFast , NystromformerModel
roberta_model = RobertaModel . from_pretrained ( "uklfr/gottbert-base" )
roberta_tokenizer = RobertaTokenizerFast . from_pretrained ( "uklfr/gottbert-base" )
nystromformer_model , nystromformer_tokenizer = convert_roberta_to_nystromformer (
roberta_model = roberta_model ,
roberta_tokenizer = roberta_tokenizer ,
nystromformer_max_length = 8192
)
print ( list ( nystromformer_model . encoder . state_dict (). items ())[ 0 ])
print ( list ( roberta_model . encoder . state_dict (). items ())[ 0 ])
inputs = nystromformer_tokenizer ( "Er sah eine irdische Zentralregierung, und er erblickte Frieden, Wohlstand und galaktische Anerkennung."
"Es war eine Vision, doch er nahm sie mit vollen Sinnen in sich auf."
"Im Laderaum der STARDUST begann eine rätselhafte Maschine zu summen."
"Die dritte Macht nahm die Arbeit auf."
"Da lächelte Perry Rhodan zum blauen Himmel empor."
"Langsam löste er die Rangabzeichen von dem Schulterstück seiner Kombination." ,
return_tensors = "pt" )
outputs = nystromformer_model ( ** inputs )
# Or to finetune the model on a task:
from transformers import NystromformerForSequenceClassification
nystromformer_model . save_pretrained ( "tmp/nystromformer-gottbert" )
nystromformer_model . save_pretrained ( "tmp/nystromformer-gottbert" )
seqclass_model = NystromformerForSequenceClassification . from_pretrained ( "tmp/nystromformer-gottbert/" )
...