Este repositorio contiene varias funciones para convertir la parte del codificador de un modelo de RoBerta Prained en transformadores de secuencia larga.
El consumo de memoria y el tiempo de ejecución de los modelos de lenguaje con autoatimiento de vainilla crecen cuadráticamente hasta la longitud de la secuencia de entrada. Se propusieron varios modelos para relajar este problema mediante el uso de patrones de atención escasos o locales o aproximando la matriz completa de autoatención con métodos de descomposición. Este repositorio contiene algunas funciones para inicializar algunos de estos modelos con los pesos de un punto de control RoBerta previamente y, por lo tanto, puede ser útil para crear nuevos modelos para tareas de documentos largos de manera eficiente.
Tenga en cuenta que inicializar estos modelos con pesos previos a la aparición no los hace directamente utilizables, y mucho menos competitivos. En la mayoría de los casos, se requieren al menos unos pocos miles de pasos de "pretración continua" para lograr resultados satisfactorios en cualquier tarea aguas abajo.
Convierta modelos RoBerta previamente a los modelos Longformer
El modelo Longformer (Beltagy, I., Peters, Me y Cohan, A. (2020).) Reemplaza el mecanismo de atención completa con patrones de atención locales y atención global específica de la tarea. Aparte de eso, los modelos Longformer usan la arquitectura RoBerta (Liu, Y., Ott, M., Goyal, et. Al (2019).). Por lo tanto, es fácil cargar los pesos de un modelo RoBerta previamente en 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/" )
... La arquitectura Nyströmformer (Xiong et. Al (2021)) se aproxima al mecanismo de autoatención utilizando la decomposición de la matriz Nyström. Por lo tanto, no hay necesidad de lidiar con patrones de atención especiales, haciendo que estos modelos, en teoría, aplicen a una variedad más amplia de tareas. En comparación con los modelos Longformer , Nyströmformers parecen consumir más memoria.
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/" )
...