Ce repo contient diverses fonctions pour convertir la partie de l'encodeur d'un modèle RoBerta pré-entraîné en transformateurs à longue séquence.
La consommation de mémoire et le temps d'exécution des modèles de langue avec une auto-agence d'auto-vanille se développent quadratiquement à la longueur de la séquence d'entrée. Divers modèles ont été proposés pour assouplir ce problème soit en utilisant des modèles d'attention clairsemés ou locaux, soit en approximant la matrice d'auto-agence d'auto-agence complète avec des méthodes de décomposition. Ce référentiel contient des fonctions pour initialiser certains de ces modèles avec les poids d'un point de contrôle RoBerta pré-entraîné et, par conséquent, peut être utile pour créer efficacement de nouveaux modèles pour les tâches à long terme.
Notez que l'initialisation de ces modèles avec des poids pré-entraînés ne les rend pas directement utilisables, et encore moins compétitifs. Dans la plupart des cas, au moins quelques milliers d'étapes "continues" continues "sont nécessaires pour obtenir des résultats satisfaisants sur toute tâche en aval.
Convertir les modèles RoBerta prétraités en modèles Longformer
Le modèle Longformer (Beltagy, I., Peters, Me et Cohan, A. (2020).) Remplace le mécanisme d'attention complet par des modèles d'attention locaux et une attention mondiale spécifique à la tâche. En dehors de cela, les modèles Longformer utilisent le RoBerta (Liu, Y., Ott, M., Goyal, et al (2019).) Architecture. Il est donc facilement possible de charger les poids d'un modèle RoBerta pré-entraîné dans un Longformer .
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/" )
... L'architecture Nyströmformer (Xiong et. Al (2021)) se rapproche du mécanisme d'auto-altération à l'aide de la décomposition de la matrice de Nyström. Ainsi, il n'est pas nécessaire de gérer des modèles d'attention particuliers, ce qui rend ces modèles, en théorie, applicables à une plus grande variété de tâches. Par rapport aux modèles Longformer , Nyströmformers semblent consommer plus de mémoire.
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/" )
...