Этот репозиторий является официальной реализацией DeBERTa : расширенное декодирование BERT с распутанным вниманием и DeBERTa V3: улучшение DeBERTa с использованием предварительного обучения в стиле ELECTRA с совместным использованием градиентного распутывания встраивания.
Код DeBERTa v2 и модель 900M, 1.5B уже здесь. Сюда входит модель 1.5B, использованная для нашей заявки на одну модель SuperGLUE и достигшая 89,9 по сравнению с исходным показателем человека 89,8. Более подробную информацию об этом представлении вы можете найти в нашем блоге.
С моделью DeBERTa 1.5B мы превосходим модель T5 11B и производительность человека в таблице лидеров SuperGLUE. Код и модель будут опубликованы в ближайшее время. Пожалуйста, ознакомьтесь с нашей статьей для получения более подробной информации.
Мы выпустили предварительно обученные модели, исходный код и сценарии тонкой настройки, чтобы воспроизвести некоторые экспериментальные результаты, представленные в статье. Вы можете следовать аналогичным сценариям, чтобы применить DeBERTa к своим экспериментам или приложениям. Сценарии предварительного обучения будут опубликованы на следующем этапе.
DeBERTa (BERT с улучшенным декодированием и распутанным вниманием) улучшает модели BERT и RoBERTa с использованием двух новых методов. Первый — это механизм распутанного внимания, в котором каждое слово представляется с помощью двух векторов, которые кодируют его содержимое и положение соответственно, а веса внимания среди слов вычисляются с использованием распутанных матриц их содержания и относительных позиций. Во-вторых, расширенный декодер маски используется для замены выходного слоя softmax для прогнозирования замаскированных токенов для предварительного обучения модели. Мы показываем, что эти два метода значительно повышают эффективность предварительного обучения модели и выполнения последующих задач.
Наши предварительно обученные модели упакованы в заархивированные файлы. Скачать их можно из наших релизов, либо скачать отдельную модель по ссылкам ниже:
Модель | Словарь(К) | Параметры магистральной сети (М) | Скрытый размер | Слои | Примечание |
---|---|---|---|---|---|
V2-XXLбольшой 1 | 128 | 1320 | 1536 | 48 | 128 тысяч новых слов SPM |
V2-XLarge | 128 | 710 | 1536 | 24 | 128 тысяч новых слов SPM |
XLarge | 50 | 700 | 1024 | 48 | Тот же словарный запас, что и у RoBERTa |
Большой | 50 | 350 | 1024 | 24 | Тот же словарный запас, что и у RoBERTa |
База | 50 | 100 | 768 | 12 | Тот же словарный запас, что и у RoBERTa |
V2-XXLarge-MNLI | 128 | 1320 | 1536 | 48 | Точная обработка с помощью MNLI |
V2-XLarge-MNLI | 128 | 710 | 1536 | 24 | Точная обработка с помощью MNLI |
XLarge-MNLI | 50 | 700 | 1024 | 48 | Точная обработка с помощью MNLI |
Большой-МНЛИ | 50 | 350 | 1024 | 24 | Точная обработка с помощью MNLI |
База-МНЛИ | 50 | 86 | 768 | 12 | Точная обработка с помощью MNLI |
DeBERTa -V3-Большой 2 | 128 | 304 | 1024 | 24 | 128 тысяч новых слов SPM |
DeBERTa -V3-База 2 | 128 | 86 | 768 | 12 | 128 тысяч новых слов SPM |
DeBERTa -V3-Маленький 2 | 128 | 44 | 768 | 6 | 128 тысяч новых слов SPM |
DeBERTa -V3-XМаленький 2 | 128 | 22 | 384 | 12 | 128 тысяч новых слов SPM |
м DeBERTa -V3-Base 2 | 250 | 86 | 768 | 12 | 250 тысяч новых слов SPM, многоязычная модель со 102 языками |
Прочтите нашу документацию
Есть несколько способов опробовать наш код:
Docker — рекомендуемый способ запуска кода, поскольку мы уже встроили все зависимости в наш docker Bagai/ DeBERTa , и вы можете перейти на официальный сайт Docker, чтобы установить Docker на свой компьютер.
Чтобы работать с Docker, убедитесь, что ваша система соответствует требованиям, указанным в приведенном выше списке. Вот шаги, чтобы попробовать эксперименты с GLUE: извлеките код, запустите ./run_docker.sh
, а затем вы сможете запускать команды bash в / DeBERTa /experiments/glue/
Извлеките код и запустите pip3 install -r requirements.txt
в корневом каталоге кода, затем войдите в папку experiments/glue/
кода и попробуйте команды bash в этой папке для экспериментов по склеиванию.
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 )
}
Для задач по склеиванию
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
, вам может потребоваться очистить их, если загрузка неожиданно не удалась.Наши эксперименты по тонкой настройке проводятся на половине узла DGX-2 с графическими картами 8x32 V100. Результаты могут различаться в зависимости от моделей графических процессоров, драйверов, версий CUDA SDK, использования FP16 или FP32 и случайных начальных значений. Здесь мы сообщаем наши цифры, основанные на нескольких прогонах с разными случайными исходными числами. Вот результаты Большой модели:
Задача | Команда | Результаты | Время работы (8 графических процессоров 32G V100) |
---|---|---|---|
MNLI xxlarge v2 | experiments/glue/mnli.sh xxlarge-v2 | 91,7/91,9 +/-0,1 | 4 часа |
MNLI xlarge v2 | experiments/glue/mnli.sh xlarge-v2 | 91,7/91,6 +/-0,1 | 2,5 часа |
MNLI xlarge | experiments/glue/mnli.sh xlarge | 91,5/91,2 +/-0,1 | 2,5 часа |
МНЛИ большой | experiments/glue/mnli.sh large | 91,3/91,1 +/-0,1 | 2,5 часа |
QQP большой | experiments/glue/qqp.sh large | 92,3 +/-0,1 | 6 часов |
QNLI большой | experiments/glue/qnli.sh large | 95,3 +/-0,2 | 2 часа |
МРПК большой | experiments/glue/mrpc.sh large | 91,9 +/-0,5 | 0,5 часа |
РТЕ большой | experiments/glue/rte.sh large | 86,6 +/-1,0 | 0,5 часа |
ССТ-2 большой | experiments/glue/sst2.sh large | 96,7 +/-0,3 | 1 час |
СТС-б большой | experiments/glue/Stsb.sh large | 92,5 +/-0,3 | 0,5 часа |
CoLA большой | experiments/glue/cola.sh | 70,5 +/-1,0 | 0,5 часа |
А вот результаты базовой модели
Задача | Команда | Результаты | Время работы (8 графических процессоров 32G V100) |
---|---|---|---|
База МНЛИ | experiments/glue/mnli.sh base | 88,8/88,5 +/-0,2 | 1,5 часа |
Мы представляем результаты разработки SQuAD 1.1/2.0 и нескольких тестов GLUE.
Модель | Отряд 1.1 | Отряд 2.0 | МНЛИ-м/мм | ССТ-2 | КНЛИ | CoLA | РТЕ | МРПК | QQP | СТС-Б |
---|---|---|---|---|---|---|---|---|---|---|
Ф1/ЭМ | Ф1/ЭМ | Акк | Акк | Акк | МСС | Акк | Акк/F1 | Акк/F1 | P/S | |
BERT-Большой | 90,9/84,1 | 81,8/79,0 | 86,6/- | 93,2 | 92,3 | 60,6 | 70,4 | 88,0/- | 91,3/- | 90,0/- |
РОБЕРТа-Большой | 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-Large | 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 -Большой 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 -XLarge 1 | -/- | -/- | 91,5/91,2 | 97,0 | - | - | 93,1 | 92,1/94,3 | - | 92,9/92,7 |
DeBERTa -V2-XLarge 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-XXLбольшой 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-Большой | -/- | 91,5/89,0 | 91,8/91,9 | 96,9 | 96,0 | 75,3 | 92,7 | 92,2/- | 93,0/- | 93,0/- |
DeBERTa -V3-База | -/- | 88,4/85,4 | 90,6/90,7 | - | - | - | - | - | - | - |
DeBERTa -V3-Маленький | -/- | 82,9/80,4 | 88,3/87,7 | - | - | - | - | - | - | - |
DeBERTa -V3-XSmall | -/- | 84,8/82,0 | 88,1/88,3 | - | - | - | - | - | - | - |
Мы представляем результаты разработки XNLI с нулевой настройкой межъязыкового переноса, т. е. обучение только с английскими данными, тестирование на других языках.
Модель | среднее | ru | пт | эс | де | эль | бг | ру | тр | ар | ви | й | ж | привет | SW | ты |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
м 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 |
Чтобы предварительно обучить DeBERTa целям MLM и RTD, проверьте experiments/language_models
Пэнчэн Хэ ([email protected]), Сяодун Лю ([email protected]), Цзяньфэн Гао ([email protected]), Вэйчжу Чен ([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}
}