Electra adalah metode untuk pembelajaran representasi bahasa sendiri. Ini dapat digunakan untuk jaringan transformator pra-kereta menggunakan komputasi yang relatif sedikit. Model electra dilatih untuk membedakan token input "nyata" vs token input "palsu" yang dihasilkan oleh jaringan saraf lain, mirip dengan diskriminator GAN. Dalam skala kecil, Electra mencapai hasil yang kuat bahkan ketika dilatih pada GPU tunggal. Dalam skala besar, Electra mencapai hasil canggih pada dataset Skuad 2.0.
Untuk deskripsi terperinci dan hasil eksperimen, silakan merujuk ke Paper Electra ICLR 2020 kami: Encoder teks pra-pelatihan sebagai diskriminator daripada generator.
Repositori ini berisi kode untuk pra-pelatihan electra, termasuk model elektra kecil pada satu GPU. Ini juga mendukung elektra fine-tuning pada tugas hilir termasuk tugas klasifikasi (mis.
Repositori ini juga berisi Code for Electric , versi Electra yang terinspirasi oleh model berbasis energi. Electric memberikan pandangan yang lebih berprinsip tentang Electra sebagai model cloze "pengambilan sampel negatif". Ini juga dapat secara efisien menghasilkan skor pseudo-likelihood untuk teks, yang dapat digunakan untuk menata ulang output pengenalan ucapan atau sistem terjemahan mesin. Untuk detail tentang listrik, silakan merujuk ke transformator pra-pelatihan kertas EMNLP 2020 sebagai model cloze berbasis energi.
Kami awalnya merilis tiga model pra-terlatih:
| Model | Lapisan | Ukuran tersembunyi | Params | Skor lem (set tes) | Unduh |
|---|---|---|---|---|---|
| Electra-Small | 12 | 256 | 14m | 77.4 | link |
| Basis elektra | 12 | 768 | 110m | 82.7 | link |
| Electra-Large | 24 | 1024 | 335m | 85.2 | link |
Model -model itu dilatih pada teks bahasa Inggris yang tidak dibuang. Mereka sesuai dengan electra-small ++, electra-base ++, electra-1.75m dalam makalah kami. Kami berharap dapat merilis model lain, seperti model multibahasa, di masa depan.
Pada lem, skor Electra-Large sedikit lebih baik daripada skor Albert/XLNET, Electra-Base lebih baik daripada Bert-Large, dan skor Electra-Small sedikit terburuk daripada Tinybert (tetapi tidak menggunakan distilasi). Lihat bagian Hasil yang Diharapkan di bawah ini untuk nomor kinerja terperinci.
Gunakan build_pretraining_dataset.py untuk membuat dataset pra-pelatihan dari dump teks mentah. Ini memiliki argumen berikut:
--corpus-dir : Direktori yang berisi file teks mentah untuk berubah menjadi contoh elektra. File teks dapat berisi beberapa dokumen dengan garis kosong yang memisahkannya.--vocab-file : File Menentukan Kosakata Wordpiece.--output-dir : tempat menulis contoh elektra.--max-seq-length : Jumlah token per contoh (128 secara default).--num-processes : Jika> 1 paralelis di beberapa proses (1 secara default).--blanks-separate-docs : Apakah garis kosong menunjukkan batasan dokumen (true secara default).--do-lower-case/--no-lower-case : Apakah akan menurunkan case teks input (true secara default). Gunakan run_pretraining.py untuk pra-pelatihan model electra. Ini memiliki argumen berikut:
--data-dir : Direktori tempat data pra-pelatihan, bobot model, dll. disimpan. Secara default, pelatihan memuat contoh-contoh dari <data-dir>/pretrain_tfrecords dan kosakata dari <data-dir>/vocab.txt .--model-name : Nama untuk model yang dilatih. Bobot model akan disimpan dalam <data-dir>/models/<model-name> secara default.--hparams (opsional): JSON Dict atau jalur ke file JSON yang berisi model hyperparameters, jalur data, dll. Lihat configure_pretraining.py untuk hiperparameter yang didukung. Jika pelatihan dihentikan, menjalankan kembali run_pretraining.py dengan argumen yang sama akan melanjutkan pelatihan di mana ia ditinggalkan.
Anda dapat melanjutkan pra-pelatihan dari pos pemeriksaan electra yang dilepaskan oleh
--model-name electra_small jika Anda mengunduh bobot ke $DATA_DIR/electra_small ).num_train_steps oleh (misalnya) Menambahkan "num_train_steps": 4010000 ke --hparams . Ini akan terus melatih model kecil untuk 10.000 langkah lebih banyak (telah dilatih untuk 4E6 langkah).learning_rate ke 2e-4 * (4e6 + 10000) / 10000."generator_hidden_size": 1.0 di hparams karena kami tidak menggunakan generator kecil untuk model itu. Instruksi ini pra-pelatihan model elektra kecil (12 lapisan, 256 ukuran tersembunyi). Sayangnya, data yang kami gunakan dalam makalah ini tidak tersedia untuk umum, jadi kami akan menggunakan OpenWebTextCorpus yang dirilis oleh Aaron Gokaslan dan Vanya Cohen sebagai gantinya. Model yang terlatih sepenuhnya (~ 4 hari pada GPU V100) harus melakukan secara kasar di antara GPT dan BERT-BASE dalam hal kinerja lem. Secara default model dilatih pada urutan panjang-128, sehingga tidak cocok untuk menjalankan pertanyaan. Lihat bagian "Hasil yang Diharapkan" di bawah ini untuk detail lebih lanjut tentang kinerja model.
$DATA_DIR/vocab.txt . Semua model electra kami menggunakan kosa kata yang sama persis dengan Bahasa Inggris yang tidak terpecah Bert, yang dapat Anda unduh di sini.tar xf openwebtext.tar.xz ). Tempatkan di $DATA_DIR/openwebtext .python3 build_openwebtext_pretraining_dataset.py --data-dir $DATA_DIR --num-processes 5 . Ini pra-proses/tokenizes data dan output contoh sebagai file tfrecord di bawah $DATA_DIR/pretrain_tfrecords . Tfrecords membutuhkan sekitar 30g ruang disk. Jalankan python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt untuk melatih model elektra kecil untuk 1 juta langkah pada data. Ini membutuhkan waktu lebih dari 4 hari pada GPU Tesla V100. Namun, model harus mencapai hasil yang layak setelah langkah 200 ribu (10 jam pelatihan pada GPU V100).
Untuk menyesuaikan pelatihan, tambahkan --hparams '{"hparam1": value1, "hparam2": value2, ...}' ke perintah run. --hparams juga bisa menjadi jalur ke file .json yang berisi hiperparameter. Beberapa opsi yang sangat berguna:
"debug": true melatih model elektra kecil untuk beberapa langkah."model_size": one of "small", "base", or "large" : menentukan ukuran model"electra_objective": false melatih model dengan pemodelan bahasa bertopeng alih-alih menggantikan deteksi token (pada dasarnya Bert dengan masking dinamis dan tidak ada prediksi kalimat berikutnya)."num_train_steps": n mengontrol berapa lama model tersebut sudah terlatih."pretrain_tfrecords": <paths> menentukan di mana data pra-pelatihan berada. CATATAN Anda perlu menentukan file spesifik bukan hanya direktori (misalnya, <data-dir>/pretrain_tf_records/pretrain_data.tfrecord* )"vocab_file": <path> dan "vocab_size": n dapat digunakan untuk mengatur kosa kata wordpiece khusus."learning_rate": lr, "train_batch_size": n , dll. Dapat digunakan untuk mengubah hyperparameters pelatihan"model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m} , dll. Dapat digunakan untuk mengubah hyperparameters untuk transformator yang mendasarinya (bendera "model_size" menetapkan nilai -nilai default). Lihat configure_pretraining.py untuk set lengkap hyperparameters yang didukung.
Untuk mengevaluasi model pada tugas hilir, lihat instruksi finetuning di bawah ini. Untuk mengevaluasi generator/diskriminator pada data OpenWebText yang dijalankan python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"do_train": false, "do_eval": true}' . Ini akan mencetak metrik eval seperti keakuratan generator dan diskriminator, dan juga menulis metrik ke data-dir/model-name/results .
Gunakan run_finetuning.py untuk menyempurnakan dan mengevaluasi model electra pada tugas NLP hilir. Itu mengharapkan tiga argumen:
--data-dir : Direktori tempat data, bobot model, dll. disimpan. Secara default, skrip memuat data finetuning dari <data-dir>/finetuning_data/<task-name> dan kosakata dari <data-dir>/vocab.txt .--model-name : Nama model pra-terlatih: Bobot pra-terlatih harus ada dalam data-dir/models/model-name .--hparams : Dikt JSON yang berisi model hiperparameter, jalur data, dll. (Misalnya, --hparams '{"task_names": ["rte"], "model_size": "base", "learning_rate": 1e-4, ...}' ). Lihat configure_pretraining.py untuk hiperparameter yang didukung. Alih -alih dikte, ini juga bisa menjadi jalur ke file .json yang berisi hiperparameter. Anda harus menentukan "task_names" dan "model_size" (lihat contoh di bawah). Metrik eval akan disimpan dalam data-dir/model-name/results dan bobot model akan disimpan dalam data-dir/model-name/finetuning_models secara default. Evaluasi dilakukan pada dev yang ditetapkan secara default. Untuk menyesuaikan pelatihan, tambahkan --hparams '{"hparam1": value1, "hparam2": value2, ...}' ke perintah run. Beberapa opsi yang sangat berguna:
"debug": true Fine-Tunes Model Electra kecil untuk beberapa langkah."task_names": ["task_name"] : Menentukan tugas untuk berlatih. Daftar karena basis kode nominal mendukung pembelajaran multi-tugas, (meskipun diperingatkan ini belum diuji secara menyeluruh)."model_size": one of "small", "base", or "large" : menentukan ukuran model; Anda harus mengatur ini ke ukuran yang sama dengan model pra-terlatih."do_train" and "do_eval" : kereta dan/atau evaluasi model (keduanya diatur ke true secara default). Untuk menggunakan "do_eval": true dengan "do_train": false , Anda perlu menentukan init_checkpoint , misalnya, python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["mnli"], "do_train": false, "do_eval": true, "init_checkpoint": "<data-dir>/models/electra_base/finetuning_models/mnli_model_1"}'"num_trials": n : jika> 1, melakukan beberapa penyesuaian/evaluasi berjalan dengan biji acak yang berbeda."learning_rate": lr, "train_batch_size": n , dll. Dapat digunakan untuk mengubah pelatihan hyperparameters."model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m} , dll. Dapat digunakan untuk mengubah hyperparameters untuk transformator yang mendasarinya (bendera "model_size" menetapkan nilai -nilai default). Dapatkan model electra yang terlatih baik dengan melatih Anda sendiri (lihat instruksi pra-pelatihan di atas), atau mengunduh bobot elektra pelepasan dan unziping di bawah $DATA_DIR/models (misalnya, Anda harus memiliki direktori $DATA_DIR/models/electra_large jika Anda menggunakan model besar).
Unduh data lem dengan menjalankan skrip ini. Siapkan data dengan menjalankan mv CoLA cola && mv MNLI mnli && mv MRPC mrpc && mv QNLI qnli && mv QQP qqp && mv RTE rte && mv SST-2 sst && mv STS-B sts && mv diagnostic/diagnostic.tsv mnli && mkdir -p $DATA_DIR/finetuning_data && mv * $DATA_DIR/finetuning_data .
Kemudian jalankan run_finetuning.py . Misalnya, untuk menyempurnakan basis elektrik pada mnli
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["mnli"]}'
Atau menyempurnakan model kecil yang pra-terlatih menggunakan instruksi di atas pada cola.
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"model_size": "small", "task_names": ["cola"]}'
Kode mendukung Skuad 1.1 dan 2.0, serta kumpulan data dalam tugas bersama MRQA 2019
$DATA_DIR/finetuning_data/squadv1/(train|dev).json$DATA_DIR/finetuning_data/squad/(train|dev).json$DATA_DIR/finetuning_data/(newsqa|naturalqs|triviaqa|searchqa)/(train|dev).jsonl .Kemudian jalankan (misalnya)
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["squad"]}'
Repositori ini menggunakan kode evaluasi resmi yang dirilis oleh penulis pasukan dan tugas bersama MRQA untuk menghitung metrik
Unduh dataset chunking teks CONLL-2000 dari sini dan letakkan di bawah $DATA_DIR/finetuning_data/chunk/(train|dev).txt . Lalu jalankan
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["chunk"]}'
Cara termudah untuk menjalankan tugas baru adalah dengan mengimplementasikan finetune.task.Task baru, tambahkan ke finetune.task_builder.py , dan kemudian gunakan run_finetuning.py seperti biasa. Untuk klasifikasi/qa/urutan penandaan, Anda dapat mewarisi dari finetune.classification.classification_tasks.ClassificationTask , finetune.qa.qa_tasks.QATask , atau finetune.tagging.tagging_tasks.TaggingTask . Untuk data preprocessing, kami menggunakan tokenizer yang sama seperti Bert.
Berikut adalah hasil yang diharapkan untuk electra pada berbagai tugas (ditetapkan tes untuk chunking, set dev untuk tugas lain). Perhatikan bahwa varians dalam penyempurnaan bisa sangat besar, jadi untuk beberapa tugas Anda mungkin melihat fluktuasi besar dalam skor saat menyempurnakan dari pos pemeriksaan yang sama beberapa kali. Skor di bawah ini menunjukkan kinerja median pada sejumlah besar biji acak. Electra-Small/Base/Large adalah model kami yang dilepaskan. Electra-Small-owt adalah model yang dilatih OpenWebtext dari atas (berkinerja sedikit lebih buruk daripada electra-small karena dilatih untuk waktu yang lebih sedikit dan pada dataset yang lebih kecil).
| Cola | SST | Mrpc | STS | QQP | Mnli | Qnli | Rte | Skuad 1.1 | Skuad 2.0 | Chunking | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Metrik | MCC | ACC | ACC | Spearman | ACC | ACC | ACC | ACC | Em | Em | F1 |
| Electra-Large | 69.1 | 96.9 | 90.8 | 92.6 | 92.4 | 90.9 | 95.0 | 88.0 | 89.7 | 88.1 | 97.2 |
| Basis elektra | 67.7 | 95.1 | 89.5 | 91.2 | 91.5 | 88.8 | 93.2 | 82.7 | 86.8 | 80.5 | 97.1 |
| Electra-Small | 57.0 | 91.2 | 88.0 | 87.5 | 89.0 | 81.3 | 88.4 | 66.7 | 75.8 | 70.1 | 96.5 |
| Electra-Small-owt | 56.8 | 88.3 | 87.4 | 86.8 | 88.3 | 78.9 | 87.9 | 68.5 | - | - | - |
Lihat di sini untuk kehilangan / kurva pelatihan model selama pra-pelatihan.
Untuk melatih listrik, gunakan skrip pra-pelatihan yang sama dan perintah sebagai electra. Pass "electra_objective": false dan "electric_objective": true untuk hyperparameters. Kami berencana untuk segera merilis model listrik pra-terlatih!
Jika Anda menggunakan kode ini untuk publikasi Anda, silakan kutip kertas asli:
@inproceedings{clark2020electra,
title = {{ELECTRA}: Pre-training Text Encoders as Discriminators Rather Than Generators},
author = {Kevin Clark and Minh-Thang Luong and Quoc V. Le and Christopher D. Manning},
booktitle = {ICLR},
year = {2020},
url = {https://openreview.net/pdf?id=r1xMH1BtvB}
}
Jika Anda menggunakan kode untuk listrik, silakan kutip kertas listrik:
@inproceedings{clark2020electric,
title = {Pre-Training Transformers as Energy-Based Cloze Models},
author = {Kevin Clark and Minh-Thang Luong and Quoc V. Le and Christopher D. Manning},
booktitle = {EMNLP},
year = {2020},
url = {https://www.aclweb.org/anthology/2020.emnlp-main.20.pdf}
}
Untuk bantuan atau masalah menggunakan Electra, silakan kirimkan masalah GitHub.
Untuk komunikasi pribadi yang terkait dengan Electra, silakan hubungi Kevin Clark ( [email protected] ).