Repositori ini merupakan implementasi resmi dari DeBERTa : Decoding -enhanced BERT with Disentangled A ttention dan DeBERTa V3: Meningkatkan DeBERTa menggunakan Pre-Training Bergaya ELECTRA dengan Gradient-Disentangled Embedding Sharing
Kode DeBERTa v2 dan model 900M, 1.5B telah hadir sekarang. Ini termasuk model 1,5B yang digunakan untuk pengiriman model tunggal SuperGLUE kami dan mencapai 89,9, dibandingkan dengan baseline manusia 89,8. Anda dapat menemukan rincian lebih lanjut tentang kiriman ini di blog kami
Dengan model DeBERTa 1.5B, kami melampaui model T5 11B dan performa manusia di papan peringkat SuperGLUE. Kode dan model akan segera dirilis. Silakan periksa makalah kami untuk lebih jelasnya.
Kami merilis model terlatih, kode sumber, dan skrip penyempurnaan untuk mereproduksi beberapa hasil eksperimen di makalah. Anda dapat mengikuti skrip serupa untuk menerapkan DeBERTa pada eksperimen atau aplikasi Anda sendiri. Skrip pra-pelatihan akan dirilis pada langkah berikutnya.
DeBERTa (BERT yang ditingkatkan decoding dengan perhatian terurai) meningkatkan model BERT dan RoBERTa menggunakan dua teknik baru. Yang pertama adalah mekanisme perhatian yang terurai, di mana setiap kata direpresentasikan menggunakan dua vektor yang masing-masing mengkodekan konten dan posisinya, dan bobot perhatian antar kata dihitung menggunakan matriks terurai pada konten dan posisi relatifnya. Kedua, dekoder topeng yang disempurnakan digunakan untuk menggantikan lapisan softmax keluaran guna memprediksi token yang disamarkan untuk pra-pelatihan model. Kami menunjukkan bahwa kedua teknik ini secara signifikan meningkatkan efisiensi pra-pelatihan model dan kinerja tugas-tugas hilir.
Model terlatih kami dikemas ke dalam file zip. Anda dapat mengunduhnya dari rilis kami, atau mengunduh model individual melalui tautan di bawah:
Model | Kosakata(K) | Parameter Tulang Punggung (M) | Ukuran Tersembunyi | Lapisan | Catatan |
---|---|---|---|---|---|
V2-XXL Besar 1 | 128 | 1320 | 1536 | 48 | 128 ribu kosakata SPM baru |
V2-XLarge | 128 | 710 | 1536 | 24 | 128 ribu kosakata SPM baru |
XLarge | 50 | 700 | 1024 | 48 | Kosakata yang sama dengan RoBERTa |
Besar | 50 | 350 | 1024 | 24 | Kosakata yang sama dengan RoBERTa |
Basis | 50 | 100 | 768 | 12 | Kosakata yang sama dengan RoBERTa |
V2-XXLBesar-MNLI | 128 | 1320 | 1536 | 48 | Berubah dengan baik dengan MNLI |
V2-XLarge-MNLI | 128 | 710 | 1536 | 24 | Berubah dengan baik dengan MNLI |
XLarge-MNLI | 50 | 700 | 1024 | 48 | Berubah dengan baik dengan MNLI |
Besar-MNLI | 50 | 350 | 1024 | 24 | Berubah dengan baik dengan MNLI |
Pangkalan-MNLI | 50 | 86 | 768 | 12 | Berubah dengan baik dengan MNLI |
DeBERTa -V3-Besar 2 | 128 | 304 | 1024 | 24 | 128 ribu kosakata SPM baru |
DeBERTa -V3-Basis 2 | 128 | 86 | 768 | 12 | 128 ribu kosakata SPM baru |
DeBERTa -V3-Kecil 2 | 128 | 44 | 768 | 6 | 128 ribu kosakata SPM baru |
DeBERTa -V3-XKecil 2 | 128 | 22 | 384 | 12 | 128 ribu kosakata SPM baru |
m DeBERTa -V3-Base 2 | 250 | 86 | 768 | 12 | 250 ribu kosakata SPM baru, model multibahasa dengan 102 bahasa |
Baca dokumentasi kami
Ada beberapa cara untuk mencoba kode kami,
Docker adalah cara yang disarankan untuk menjalankan kode karena kami telah membangun setiap ketergantungan ke dalam buruh pelabuhan kami bagai/ DeBERTa dan Anda dapat mengikuti situs resmi buruh pelabuhan untuk menginstal buruh pelabuhan di mesin Anda.
Untuk menjalankan dengan buruh pelabuhan, pastikan sistem Anda memenuhi persyaratan dalam daftar di atas. Berikut langkah-langkah untuk mencoba eksperimen GLUE: Tarik kodenya, jalankan ./run_docker.sh
, lalu Anda dapat menjalankan perintah bash di bawah / DeBERTa /experiments/glue/
Tarik kodenya dan jalankan pip3 install -r requirements.txt
di direktori root kode, lalu masuk ke folder experiments/glue/
kode tersebut dan coba perintah bash di bawah folder tersebut untuk eksperimen lem.
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 )
}
Untuk tugas lem,
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
, Anda mungkin perlu membersihkannya jika pengunduhan gagal secara tidak terduga.Eksperimen penyempurnaan kami dilakukan pada setengah node DGX-2 dengan kartu GPU 8x32 V100, hasilnya mungkin berbeda karena model GPU, driver, versi CUDA SDK yang berbeda, menggunakan FP16 atau FP32, dan seed acak. Kami melaporkan nomor kami berdasarkan beberapa proses dengan benih acak berbeda di sini. Berikut hasil dari model Besar:
Tugas | Memerintah | Hasil | Waktu Berjalan (GPU 8x32G V100) |
---|---|---|---|
MNLI xxbesar v2 | experiments/glue/mnli.sh xxlarge-v2 | 91,7/91,9 +/-0,1 | 4 jam |
MNLI xbesar v2 | experiments/glue/mnli.sh xlarge-v2 | 91,7/91,6 +/-0,1 | 2,5 jam |
MNLI xbesar | experiments/glue/mnli.sh xlarge | 91,5/91,2 +/-0,1 | 2,5 jam |
MNLI besar | experiments/glue/mnli.sh large | 91.3/91.1 +/-0.1 | 2,5 jam |
QQP besar | experiments/glue/qqp.sh large | 92,3 +/-0,1 | 6 jam |
QNLI besar | experiments/glue/qnli.sh large | 95,3 +/-0,2 | 2 jam |
MRPC besar | experiments/glue/mrpc.sh large | 91,9 +/-0,5 | 0,5 jam |
RTE besar | experiments/glue/rte.sh large | 86,6 +/-1,0 | 0,5 jam |
SST-2 besar | experiments/glue/sst2.sh large | 96,7 +/-0,3 | 1 jam |
STS-b besar | experiments/glue/Stsb.sh large | 92,5 +/-0,3 | 0,5 jam |
CoLA besar | experiments/glue/cola.sh | 70,5 +/-1,0 | 0,5 jam |
Dan berikut adalah hasil dari Base model
Tugas | Memerintah | Hasil | Waktu Berjalan (GPU 8x32G V100) |
---|---|---|---|
Pangkalan MNLI | experiments/glue/mnli.sh base | 88.8/88.5 +/-0.2 | 1,5 jam |
Kami menyajikan hasil pengembangan pada SQuAD 1.1/2.0 dan beberapa tugas benchmark GLUE.
Model | Pasukan 1.1 | Pasukan 2.0 | MNLI-m/mm | SST-2 | QNLI | CoLA | RTE | MRPC | QQP | STS-B |
---|---|---|---|---|---|---|---|---|---|---|
F1/EM | F1/EM | Acc | Acc | Acc | PKS | Acc | Acc/F1 | Acc/F1 | P/S | |
BERT-Besar | 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-Besar | 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-Besar | 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 -Besar 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-XXLBesar 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-Besar | -/- | 91.5/89.0 | 91.8/91.9 | 96.9 | 96.0 | 75.3 | 92.7 | 92,2/- | 93,0/- | 93,0/- |
DeBERTa -V3-Basis | -/- | 88.4/85.4 | 90.6/90.7 | - | - | - | - | - | - | - |
DeBERTa -V3-Kecil | -/- | 82.9/80.4 | 88.3/87.7 | - | - | - | - | - | - | - |
DeBERTa -V3-XKecil | -/- | 84.8/82.0 | 88.1/88.3 | - | - | - | - | - | - | - |
Kami menyajikan hasil dev pada XNLI dengan setting zero-shot crosslingual transfer, yaitu pelatihan dengan data bahasa inggris saja, tes pada bahasa lain.
Model | rata-rata | en | NS | yaitu | de | el | bg | ru | tr | ar | vi | th | zh | Hai | sw | kamu |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Basis 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 |
Untuk melatih DeBERTa terlebih dahulu dengan tujuan MLM dan RTD, silakan periksa 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}
}