Este repositório contém várias funções para converter a parte do codificador de uma modela pré -treinada RoBerta em transformadores de longa sequência.
O consumo de memória e o tempo de execução dos modelos de idiomas com auto-distribuição de baunilha crescem quadraticamente até o comprimento da sequência de entrada. Vários modelos foram propostos para relaxar esse problema usando padrões de atenção esparsos ou locais ou aproximando a matriz completa de auto-ataque com métodos de decomposição. Esse repositório contém algumas funções para inicializar alguns desses modelos com os pesos de um ponto de verificação RoBerta pré-treinado e, portanto, pode ser útil para criar novos modelos para tarefas de documentos de longa eficiência.
Observe que a inicialização desses modelos com pesos pré -rastreados não os torna diretamente utilizáveis, muito menos competitivos. Na maioria dos casos, são necessários pelo menos alguns milhares de etapas de "pré-contratação" para obter resultados satisfatórios em qualquer tarefa a jusante.
Converter modelos RoBerta pré -teremam em modelos Longformer
O Modelo Longformer (Beltagy, I., Peters, Me, & Cohan, A. (2020).) Substitui o mecanismo de atenção total por padrões de atenção local e atenção global específica da tarefa. Além disso, os modelos Longformer usam a arquitetura RoBerta (Liu, Y., Ott, M., Goyal, et al. (2019). Portanto, é facilmente possível carregar os pesos de um modelo RoBerta pré -treinado em um 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/" )
... O Nyströmformer -Axhitecture (Xiong et. Al. (2021)) aproxima o mecanismo de auto-ataque usando a decomposição da matriz Nyström. Portanto, não há necessidade de lidar com padrões de atenção especiais, tornando esses modelos, em teoria, aplicáveis a uma variedade maior de tarefas. Comparados aos modelos Longformer , Nyströmformers parecem consumir mais memória.
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/" )
...