Este repositorio es la implementación oficial de DeBERTa : Decodificación de BERT mejorado con atención desenredada y DeBERTa V3: mejora de DeBERTa usando el entrenamiento previo de estilo ELECTRA con uso compartido de incrustación desenredada de gradiente
El código DeBERTa v2 y el modelo 900M, 1.5B ya están aquí. Esto incluye el modelo de 1.500 millones utilizado para nuestro envío de modelo único SuperGLUE y el logro de 89,9, frente a la línea base humana de 89,8. Puedes encontrar más detalles sobre este envío en nuestro blog.
Con el modelo DeBERTa 1.5B, superamos el modelo T5 11B y el desempeño humano en la clasificación SuperGLUE. El código y el modelo se publicarán pronto. Consulte nuestro documento para obtener más detalles.
Publicamos los modelos previamente entrenados, el código fuente y los scripts de ajuste para reproducir algunos de los resultados experimentales del artículo. Puede seguir guiones similares para aplicar DeBERTa a sus propios experimentos o aplicaciones. Los guiones previos a la capacitación se publicarán en el siguiente paso.
DeBERTa (BERT mejorado con decodificación con atención desenredada) mejora los modelos BERT y RoBERTa utilizando dos técnicas novedosas. El primero es el mecanismo de atención desenredada, donde cada palabra se representa mediante dos vectores que codifican su contenido y posición, respectivamente, y los pesos de atención entre palabras se calculan utilizando matrices desenredadas sobre sus contenidos y posiciones relativas. En segundo lugar, se utiliza un decodificador de máscara mejorado para reemplazar la capa softmax de salida para predecir los tokens enmascarados para el preentrenamiento del modelo. Mostramos que estas dos técnicas mejoran significativamente la eficiencia del preentrenamiento del modelo y el desempeño de las tareas posteriores.
Nuestros modelos previamente entrenados están empaquetados en archivos comprimidos. Puede descargarlos de nuestros lanzamientos o descargar un modelo individual a través de los enlaces a continuación:
Modelo | Vocabulario(K) | Parámetros de la red troncal (M) | Tamaño oculto | capas | Nota |
---|---|---|---|---|---|
V2-XXGrande 1 | 128 | 1320 | 1536 | 48 | 128.000 nuevos vocabulario SPM |
V2-XL | 128 | 710 | 1536 | 24 | 128.000 nuevos vocabulario SPM |
XL | 50 | 700 | 1024 | 48 | Mismo vocabulario que RoBERTa. |
Grande | 50 | 350 | 1024 | 24 | Mismo vocabulario que RoBERTa. |
Base | 50 | 100 | 768 | 12 | Mismo vocabulario que RoBERTa. |
V2-XXLarge-MNLI | 128 | 1320 | 1536 | 48 | Torneado fino con MNLI |
V2-XLarge-MNLI | 128 | 710 | 1536 | 24 | Torneado fino con MNLI |
XL-MNLI | 50 | 700 | 1024 | 48 | Torneado fino con MNLI |
MNLI grande | 50 | 350 | 1024 | 24 | Torneado fino con MNLI |
Base-MNLI | 50 | 86 | 768 | 12 | Torneado fino con MNLI |
DeBERTa -V3-Grande 2 | 128 | 304 | 1024 | 24 | 128.000 nuevos vocabulario SPM |
DeBERTa -V3-Base 2 | 128 | 86 | 768 | 12 | 128.000 nuevos vocabulario SPM |
DeBERTa -V3-Pequeño 2 | 128 | 44 | 768 | 6 | 128.000 nuevos vocabulario SPM |
DeBERTa -V3-XSmall 2 | 128 | 22 | 384 | 12 | 128.000 nuevos vocabulario SPM |
m DeBERTa -V3-Base 2 | 250 | 86 | 768 | 12 | Nuevo vocabulario SPM de 250.000, modelo multilingüe con 102 idiomas |
Lea nuestra documentación
Hay varias formas de probar nuestro código,
Docker es la forma recomendada de ejecutar el código, ya que ya hemos integrado todas las dependencias en nuestro Docker Bagai/ DeBERTa y puede seguir el sitio oficial de Docker para instalar Docker en su máquina.
Para ejecutar con Docker, asegúrese de que su sistema cumpla con los requisitos de la lista anterior. Estos son los pasos para probar los experimentos de GLUE: extraiga el código, ejecute ./run_docker.sh
y luego podrá ejecutar los comandos bash en / DeBERTa /experiments/glue/
Extraiga el código y ejecute pip3 install -r requirements.txt
en el directorio raíz del código, luego ingrese a la carpeta experiments/glue/
del código y pruebe los comandos bash en esa carpeta para experimentos de pegamento.
pip install DeBERTa
# To apply DeBERTa to your existing code, you need to make two changes to your code,
# 1. change your model to consume DeBERTa as the encoder
from DeBERTa import DeBERTa
import torch
class MyModel ( torch . nn . Module ):
def __init__ ( self ):
super (). __init__ ()
# Your existing model code
self . DeBERTa = DeBERTa . DeBERTa ( pre_trained = 'base' ) # Or 'large' 'base-mnli' 'large-mnli' 'xlarge' 'xlarge-mnli' 'xlarge-v2' 'xxlarge-v2'
# Your existing model code
# do inilization as before
#
self . DeBERTa . apply_state () # Apply the pre-trained model of DeBERTa at the end of the constructor
#
def forward ( self , input_ids ):
# The inputs to DeBERTa forward are
# `input_ids`: a torch.LongTensor of shape [batch_size, sequence_length] with the word token indices in the vocabulary
# `token_type_ids`: an optional torch.LongTensor of shape [batch_size, sequence_length] with the token types indices selected in [0, 1].
# Type 0 corresponds to a `sentence A` and type 1 corresponds to a `sentence B` token (see BERT paper for more details).
# `attention_mask`: an optional parameter for input mask or attention mask.
# - If it's an input mask, then it will be torch.LongTensor of shape [batch_size, sequence_length] with indices selected in [0, 1].
# It's a mask to be used if the input sequence length is smaller than the max input sequence length in the current batch.
# It's the mask that we typically use for attention when a batch has varying length sentences.
# - If it's an attention mask then if will be torch.LongTensor of shape [batch_size, sequence_length, sequence_length].
# In this case, it's a mask indicating which tokens in the sequence should be attended by other tokens in the sequence.
# `output_all_encoded_layers`: whether to output results of all encoder layers, default, True
encoding = DeBERTa . bert ( input_ids )[ - 1 ]
# 2. Change your tokenizer with the tokenizer built-in DeBERTa
from DeBERTa import DeBERTa
vocab_path , vocab_type = DeBERTa . load_vocab ( pretrained_id = 'base' )
tokenizer = DeBERTa . tokenizers [ vocab_type ]( vocab_path )
# We apply the same schema of special tokens as BERT, e.g. [CLS], [SEP], [MASK]
max_seq_len = 512
tokens = tokenizer . tokenize ( 'Examples input text of DeBERTa ' )
# Truncate long sequence
tokens = tokens [: max_seq_len - 2 ]
# Add special tokens to the `tokens`
tokens = [ '[CLS]' ] + tokens + [ '[SEP]' ]
input_ids = tokenizer . convert_tokens_to_ids ( tokens )
input_mask = [ 1 ] * len ( input_ids )
# padding
paddings = max_seq_len - len ( input_ids )
input_ids = input_ids + [ 0 ] * paddings
input_mask = input_mask + [ 0 ] * paddings
features = {
'input_ids' : torch . tensor ( input_ids , dtype = torch . int ),
'input_mask' : torch . tensor ( input_mask , dtype = torch . int )
}
Para tareas de pegamento,
cache_dir=/tmp/ DeBERTa /
cd experiments/glue
./download_data.sh $cache_dir /glue_tasks
task=STS-B
OUTPUT=/tmp/ DeBERTa /exps/ $task
export OMP_NUM_THREADS=1
python3 -m DeBERTa .apps.run --task_name $task --do_train
--data_dir $cache_dir /glue_tasks/ $task
--eval_batch_size 128
--predict_batch_size 128
--output_dir $OUTPUT
--scale_steps 250
--loss_scale 16384
--accumulative_update 1
--num_train_epochs 6
--warmup 100
--learning_rate 2e-5
--train_batch_size 32
--max_seq_len 128
$HOME/.~ DeBERTa
; es posible que deba limpiarlos si la descarga falla inesperadamente.Nuestros experimentos de ajuste se llevan a cabo en medio nodo DGX-2 con tarjetas GPU 8x32 V100; los resultados pueden variar debido a diferentes modelos de GPU, controladores, versiones de CUDA SDK, uso de FP16 o FP32 y semillas aleatorias. Aquí informamos nuestros números basados en múltiples ejecuciones con diferentes semillas aleatorias. Aquí están los resultados del modelo grande:
Tarea | Dominio | Resultados | Tiempo de ejecución (8x32G V100 GPU) |
---|---|---|---|
MNLI extragrande v2 | experiments/glue/mnli.sh xxlarge-v2 | 91,7/91,9 +/-0,1 | 4h |
MNLI extragrande v2 | experiments/glue/mnli.sh xlarge-v2 | 91,7/91,6 +/-0,1 | 2,5h |
MNLI extragrande | experiments/glue/mnli.sh xlarge | 91,5/91,2 +/-0,1 | 2,5h |
MNLI grande | experiments/glue/mnli.sh large | 91,3/91,1 +/-0,1 | 2,5h |
QQP grande | experiments/glue/qqp.sh large | 92,3 +/-0,1 | 6h |
QNLI grande | experiments/glue/qnli.sh large | 95,3 +/-0,2 | 2h |
MRPC grande | experiments/glue/mrpc.sh large | 91,9 +/-0,5 | 0,5h |
RTE grande | experiments/glue/rte.sh large | 86,6 +/-1,0 | 0,5h |
SST-2 grande | experiments/glue/sst2.sh large | 96,7 +/-0,3 | 1h |
STS-b grande | experiments/glue/Stsb.sh large | 92,5 +/-0,3 | 0,5h |
Cola grande | experiments/glue/cola.sh | 70,5 +/-1,0 | 0,5h |
Y aquí están los resultados del modelo Base.
Tarea | Dominio | Resultados | Tiempo de ejecución (8x32G V100 GPU) |
---|---|---|---|
base MNLI | experiments/glue/mnli.sh base | 88,8/88,5 +/-0,2 | 1,5h |
Presentamos los resultados del desarrollo en SQuAD 1.1/2.0 y varias tareas comparativas de GLUE.
Modelo | escuadrón 1.1 | escuadrón 2.0 | MNLI-m/mm | SST-2 | QNLI | Reajuste salarial | RTE | MRPC | QQP | STS-B |
---|---|---|---|---|---|---|---|---|---|---|
F1/EM | F1/EM | Acc | Acc | Acc | MCC | Acc | Acc/F1 | Acc/F1 | PD | |
BERT-Grande | 90,9/84,1 | 81,8/79,0 | 86,6/- | 93.2 | 92.3 | 60,6 | 70,4 | 88,0/- | 91,3/- | 90,0/- |
Roberta-Grande | 94,6/88,9 | 89,4/86,5 | 90,2/- | 96,4 | 93,9 | 68.0 | 86,6 | 90,9/- | 92,2/- | 92,4/- |
XLNet-Grande | 95,1/89,7 | 90,6/87,9 | 90,8/- | 97.0 | 94,9 | 69.0 | 85,9 | 90,8/- | 92,3/- | 92,5/- |
DeBERTa -Grande 1 | 95,5/90,1 | 90,7/88,0 | 91,3/91,1 | 96,5 | 95,3 | 69,5 | 91.0 | 92,6/94,6 | 92,3/- | 92,8/92,5 |
DeBERTa -XL 1 | -/- | -/- | 91,5/91,2 | 97.0 | - | - | 93.1 | 92,1/94,3 | - | 92,9/92,7 |
DeBERTa -V2-XL 1 | 95,8/90,8 | 91,4/88,9 | 91,7/91,6 | 97,5 | 95,8 | 71.1 | 93,9 | 92,0/94,2 | 92,3/89,8 | 92,9/92,9 |
DeBERTa -V2-XXGrande 1,2 | 96,1/91,4 | 92,2/89,7 | 91,7/91,9 | 97,2 | 96.0 | 72.0 | 93,5 | 93,1/94,9 | 92,7/90,3 | 93,2/93,1 |
DeBERTa -V3-Grande | -/- | 91,5/89,0 | 91,8/91,9 | 96,9 | 96.0 | 75,3 | 92,7 | 92,2/- | 93,0/- | 93,0/- |
DeBERTa -V3-Base | -/- | 88,4/85,4 | 90,6/90,7 | - | - | - | - | - | - | - |
DeBERTa -V3-Pequeño | -/- | 82,9/80,4 | 88,3/87,7 | - | - | - | - | - | - | - |
DeBERTa -V3-XSmall | -/- | 84,8/82,0 | 88,1/88,3 | - | - | - | - | - | - | - |
Presentamos los resultados del desarrollo en XNLI con configuración de transferencia multilingüe de disparo cero, es decir, entrenamiento solo con datos en inglés, prueba en otros idiomas.
Modelo | promedio | es | fr | es | Delaware | el | bg | ru | tr | Arkansas | vi | th | zh | Hola | sudoeste | tu |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Base XLM-R | 76.2 | 85,8 | 79,7 | 80,7 | 78,7 | 77,5 | 79,6 | 78.1 | 74.2 | 73,8 | 76,5 | 74,6 | 76,7 | 72,4 | 66,5 | 68.3 |
m DeBERTa -V3-Base | 79,8 +/-0,2 | 88.2 | 82,6 | 84,4 | 82,7 | 82.3 | 82,4 | 80,8 | 79,5 | 78,5 | 78.1 | 76,4 | 79,5 | 75,9 | 73,9 | 72,4 |
Para entrenar previamente DeBERTa con objetivos de MLM y RTD, consulte experiments/language_models
Pengcheng He([email protected]), Xiaodong Liu([email protected]), Jianfeng Gao([email protected]), Weizhu Chen([email protected])
@misc{he2021 DeBERTa v3,
title={ DeBERTa V3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-Disentangled Embedding Sharing},
author={Pengcheng He and Jianfeng Gao and Weizhu Chen},
year={2021},
eprint={2111.09543},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
@inproceedings{
he2021 DeBERTa ,
title={ DeBERTa : DECODING-ENHANCED BERT WITH DISENTANGLED ATTENTION},
author={Pengcheng He and Xiaodong Liu and Jianfeng Gao and Weizhu Chen},
booktitle={International Conference on Learning Representations},
year={2021},
url={https://openreview.net/forum?id=XPZIaotutsD}
}