Electra ist eine Methode für das Lernen von selbstbewertetem Sprachrepräsentation. Es kann verwendet werden, um Transformator-Netzwerke mit einem relativ geringen Computer vorzubeugen. Elektralodelle werden geschult, um "echte" Eingangs -Token gegenüber "gefälschten" Eingabetken zu unterscheiden, die von einem anderen neuronalen Netzwerk generiert werden, ähnlich wie der Diskriminator eines GaN. In kleinem Maßstab erzielt Electra starke Ergebnisse, selbst wenn sie auf einer einzelnen GPU trainiert werden. In großem Maßstab erzielt Electra im Squad 2.0-Datensatz hochmoderne Ergebnisse.
Eine detaillierte Beschreibung und experimentelle Ergebnisse finden Sie in unseren ICLR 2020 Paper Electra: Pre-Training-Text-Encoder als Diskriminatoren und nicht als Generatoren.
Dieses Repository enthält Code zu Electra vor dem Training, einschließlich kleiner Elektralmodelle auf einer einzelnen GPU. Es unterstützt auch Feinabstimmungselektra bei nachgeschalteten Aufgaben, einschließlich Klassifizierungsaufgaben (z. B. Kleber), QA-Aufgaben (z. B. Squad) und Sequenz-Tagging-Aufgaben (z. B. Text-Chunking).
Dieses Repository enthält auch Code für Electric , eine Version von Electra, die von energiebasierten Modellen inspiriert ist. Electric bietet eine mehr prinzipielle Sichtweise von Electra als "negativer Probenahme" -KLOZE -Modell. Es kann auch effizient Pseudo-Likelihood-Scores für Text erzeugen, mit denen die Ausgänge von Spracherkennung oder maschinellen Übersetzungssystemen erneut erreicht werden können. Weitere Informationen zu Electric finden Sie unter EMNLP 2020 Papier Pre-Training-Transformatoren als energiebasierte Lückmodelle.
Wir veröffentlichen zunächst drei vorgebildete Modelle:
| Modell | Schichten | Versteckte Größe | Parameter | Kleberbewertung (Testset) | Herunterladen |
|---|---|---|---|---|---|
| Electra-Small | 12 | 256 | 14m | 77,4 | Link |
| Elektrikbasis | 12 | 768 | 110 m | 82.7 | Link |
| Elektrafarge | 24 | 1024 | 335 m | 85.2 | Link |
Die Modelle wurden auf ungezogenem englischem Text geschult. Sie entsprechen Electra-Small ++, Electra-Base ++, Electra-1,75m in unserem Papier. Wir hoffen, in Zukunft andere Modelle wie mehrsprachige Modelle zu veröffentlichen.
Beim Kleber bewertet Electra-Large etwas besser als Albert/XLNET, Elektralbasiswerte besser als Bert-Large und Electra-Small ist etwas schlimmste als Tinybert (verwendet jedoch keine Destillation). Den Abschnitt "Erwartete Ergebnisse" finden Sie unten für detaillierte Leistungsnummern.
Verwenden Sie build_pretraining_dataset.py um einen Datensatz vor dem Training aus einer Dump aus Rohtext zu erstellen. Es hat die folgenden Argumente:
--corpus-dir : Ein Verzeichnis, das Rohtextdateien enthält, um in Elektralbeispiele zu werden. Eine Textdatei kann mehrere Dokumente mit leeren Zeilen enthalten, die sie trennen.--vocab-file : Datei zum Definieren des Wortstücksvokabulars.--output-dir : Wo muss Electra-Beispiele aufschreiben.--max-seq-length : Die Anzahl der Token pro Beispiel (128 standardmäßig).--num-processes : Wenn> 1 parallel über mehrere Prozesse hinweg parallelisieren (1 standardmäßig).--blanks-separate-docs : Ob leere Zeilen Dokumentgrenzen angeben (standardmäßig wahr).--do-lower-case/--no-lower-case : Ob Sie den Eingabetxt senken (standardmäßig wahr). Verwenden Sie run_pretraining.py , um ein Elektralodell vorzuverüben. Es hat die folgenden Argumente:
--data-dir : Ein Verzeichnis, in dem Daten vor dem Training, Modellgewichte usw. gespeichert werden. Standardmäßig lädt das Training Beispiele von <data-dir>/pretrain_tfrecords und ein Vokabular aus <data-dir>/vocab.txt .--model-name : Ein Name für das ausgebildete Modell. Modellgewichte werden standardmäßig in <data-dir>/models/<model-name> gespeichert.--hparams (optional): Ein JSON-Diktat oder Pfad zu einer JSON-Datei mit Modellhyperparametern, Datenpfaden usw. Siehe configure_pretraining.py für die unterstützten Hyperparameter. Wenn das Training gestoppt wird, wird das Wiederieren der run_pretraining.py mit den gleichen Argumenten das Training fortsetzen, in dem es aufgehört hat.
Sie können vor dem Training von den freigegebenen Electra-Checkpoints von fortfahren
--model-name electra_small , wenn Sie Gewichte auf $DATA_DIR/electra_small heruntergeladen haben).num_train_steps durch (zum Beispiel) Hinzufügen von "num_train_steps": 4010000 zu den --hparams . Dies wird das kleine Modell für 10000 weitere Schritte fortsetzen (es wurde bereits für 4E6 Schritte geschult).learning_rate HPARAM auf 2E-4 * (4E6 + 10000) / 10000 festlegen."generator_hidden_size": 1.0 in den hparams spezifizieren, da wir für dieses Modell keinen kleinen Generator verwendet haben. Diese Anweisungen vor dem Training eines kleinen Elektrikmodells (12 Schichten, 256 versteckte Größe). Leider sind die Daten, die wir in dem Papier verwendet haben, nicht öffentlich verfügbar, sodass wir stattdessen den von Aaron Gokaslan und Vanya Cohen veröffentlichten OpenWebtextCorpus verwenden. Das voll ausgebildete Modell (~ 4 Tage auf einer V100-GPU) sollte ungefähr zwischen GPT und Bert-Base in Bezug auf die Kleberleistung abschneiden. Standardmäßig ist das Modell auf Länge-128-Sequenzen trainiert, sodass es nicht zum Laufen bei der Beantwortung von Fragen geeignet ist. Weitere Informationen zur Modellleistung finden Sie im Abschnitt "Erwartete Ergebnisse".
$DATA_DIR/vocab.txt . Unsere Electra -Modelle verwendeten alle genau das gleiche Wortschatz wie die englische Bert, die Sie hier herunterladen können.tar xf openwebtext.tar.xz ). Platzieren Sie es in $DATA_DIR/openwebtext .python3 build_openwebtext_pretraining_dataset.py --data-dir $DATA_DIR --num-processes 5 aus. Es gibt die Daten und gibt Beispiele als TFRECORD-Dateien unter $DATA_DIR/pretrain_tfrecords aus. Die TFRECORDS benötigen rund 30 g Scheibenraum. Führen Sie python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt um ein kleines Elektralodell für 1 Million Schritte für die Daten zu trainieren. Dies dauert über 4 Tage bei einem Tesla V100 GPU. Das Modell sollte jedoch nach 200 K -Schritten (10 Stunden Training am V100 GPU) anständige Ergebnisse erzielen.
Um das Training anzupassen, fügen Sie --hparams '{"hparam1": value1, "hparam2": value2, ...}' an den Befehl run. --hparams kann auch ein Weg zu einer .json Datei sein, die die Hyperparameter enthält. Einige besonders nützliche Optionen:
"debug": true Trains für ein paar Schritte ein winziges Elektralodell."model_size": one of "small", "base", or "large" : bestimmt die Größe des Modells"electra_objective": false Trains Ein Modell mit maskierter Sprachmodellierung anstelle einer Ersatz-Token-Erkennung (im Wesentlichen Bert mit dynamischer Maskierung und ohne Vorhersage des nächsten Sentenz)."num_train_steps": n steuert, wie lange das Modell vorgeschrieben ist."pretrain_tfrecords": <paths> bestimmt, wo sich die Voraussetzungsdaten befinden. Hinweis Sie müssen die spezifischen Dateien nicht nur das Verzeichnis angeben (z. B. <data-dir>/pretrain_tf_records/pretrain_data.tfrecord* ))"vocab_file": <path> und "vocab_size": n kann verwendet werden, um ein benutzerdefiniertes Wortstück zu setzen."learning_rate": lr, "train_batch_size": n usw. kann verwendet werden, um das Trainingshyperparameter zu ändern"model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m} usw. kann verwendet werden, um die Hyperparameter für den zugrunde liegenden Transformator zu ändern (das Flag "model_size" legt die Standardwerte fest). Siehe configure_pretraining.py für den gesamten Satz unterstützter Hyperparameter.
Um das Modell einer nachgelagerten Aufgabe zu bewerten, finden Sie in den folgenden Fellhirtsanweisungen. Um den Generator/Diskriminator auf den OpenWebText-Daten zu bewerten, rennen Sie python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"do_train": false, "do_eval": true}' . Dadurch werden Eval-Metriken wie die Genauigkeit des Generators und des Diskriminators und das Schreiben der Metriken in data-dir/model-name/results ausgedruckt.
Verwenden Sie run_finetuning.py , um ein Elektralodell für eine nachgeschaltete NLP-Aufgabe zu optimieren und zu bewerten. Es erwartet drei Argumente:
--data-dir : Ein Verzeichnis, in dem Daten, Modellgewichte usw. gespeichert werden. Standardmäßig lädt das Skript Finetuning-Daten aus <data-dir>/finetuning_data/<task-name> und ein Vokabular aus <data-dir>/vocab.txt .--model-name : Ein Name des vorgeborenen Modells: Die vorgebreiteten Gewichte sollten in data-dir/models/model-name vorhanden sein.--hparams : Ein JSON-DICT mit Modellhyperparametern, Datenpfaden usw. (z. --hparams '{"task_names": ["rte"], "model_size": "base", "learning_rate": 1e-4, ...}' ). Siehe configure_pretraining.py für die unterstützten Hyperparameter. Anstelle eines Diktats kann dies auch ein Weg zu einer .json -Datei sein, die die Hyperparameter enthält. Sie müssen die "task_names" und "model_size" angeben (siehe Beispiele unten). Eval-Metriken werden in data-dir/model-name/results gespeichert, und Modellgewichte werden standardmäßig in data-dir/model-name/finetuning_models gespeichert. Die Bewertung erfolgt standardmäßig im Dev -Set. Um das Training anzupassen, fügen Sie --hparams '{"hparam1": value1, "hparam2": value2, ...}' an den Befehl run. Einige besonders nützliche Optionen:
"debug": true Fine-Tunes Ein winziges Elektralodell für ein paar Schritte."task_names": ["task_name"] : Gibt die Aufgaben an, auf die man trainieren soll. Eine Liste, weil das Codebasis nominell das Lernen von Multitasking unterstützt (obwohl dies gewarnt wird, dass dies nicht gründlich getestet wurde)."model_size": one of "small", "base", or "large" : bestimmt die Größe des Modells; Sie müssen dies auf die gleiche Größe wie das vorgeborene Modell einstellen."do_train" and "do_eval" : trainieren und/oder evaluieren Sie ein Modell (beide sind standardmäßig auf True eingestellt). Für die Verwendung "do_eval": true mit "do_train": false müssen Sie die init_checkpoint , z 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 : if> 1, führt mehrere Feinabstimmungen/Bewertungen mit unterschiedlichen zufälligen Samen aus."learning_rate": lr, "train_batch_size": n usw. kann verwendet werden, um das Trainingshyperparameter zu ändern."model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m} usw. kann verwendet werden, um die Hyperparameter für den zugrunde liegenden Transformator zu ändern (das Flag "model_size" legt die Standardwerte fest). Holen Sie sich ein vorgebildetes Elektralodell entweder durch Training Ihres eigenen (siehe Anweisungen vor dem Training oben) oder herunterladen die Release Electra-Gewichte und entpacken Sie sie unter $DATA_DIR/models (z. B. über ein Verzeichnis $DATA_DIR/models/electra_large wenn Sie das große Modell verwenden).
Laden Sie die Klebendaten herunter, indem Sie dieses Skript ausführen. Richten Sie die Daten ein, indem Sie 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 .
Dann run run_finetuning.py . Zum Beispiel, um die Elektralbasis auf MNLI zu optimieren
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["mnli"]}'
Oder fein ein kleines Modell, das mit den oben genannten Anweisungen auf Cola ausgebildet ist.
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"model_size": "small", "task_names": ["cola"]}'
Der Code unterstützt Squad 1.1 und 2.0 sowie Datensätze in der MRQA Shared Aufgabe 2019
$DATA_DIR/finetuning_data/squadv1/(train|dev).json$DATA_DIR/finetuning_data/squad/(train|dev).json die Datensätze von der Squad -Website herunter und bewegen$DATA_DIR/finetuning_data/(newsqa|naturalqs|triviaqa|searchqa)/(train|dev).jsonl .Dann rennen (zum Beispiel)
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["squad"]}'
Dieses Repository verwendet den offiziellen Bewertungscode, der von den Squad -Autoren veröffentlicht wurde, und die MRQA -Aufgabe zur Berechnung von Metriken
Laden Sie hier den Conll-2000-Text-Chunking-Datensatz herunter und setzen Sie ihn unter $DATA_DIR/finetuning_data/chunk/(train|dev).txt . Dann rennen
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["chunk"]}'
Der einfachste Weg, um eine neue Aufgabe auszuführen, besteht darin, eine neue finetune.task.Task zu implementieren, sie zu finetune.task_builder.py hinzuzufügen und dann wie normal run_finetuning.py zu verwenden. Für die Klassifizierung/QA/Sequenz -Tagging können Sie von einer finetune.classification.classification_tasks.ClassificationTask , finetune.qa.qa_tasks.QATask oder finetune.tagging.tagging_tasks.TaggingTask erben. Für die Vorverarbeitungsdaten verwenden wir denselben Tokenizer wie Bert.
Hier sind erwartete Ergebnisse für Electra bei verschiedenen Aufgaben (Testsatz für das Knacken, Dev -Set für die anderen Aufgaben). Beachten Sie, dass die Abweichung der Feinabstimmung ziemlich groß sein kann. Bei einigen Aufgaben können Sie bei der Feinabstimmung mehrmals große Schwankungen bei der Feinabstimmung aus demselben Kontrollpunkt sehen. Die folgenden Ergebnisse zeigen die mittlere Leistung über eine große Anzahl von zufälligen Samen. Electra-Small/Base/Large sind unsere freigegebenen Modelle. Electra-Small-Owt ist das von oben ausgestrahlte OpenWebtext-Modell (es wird etwas schlechter als Electra-Small erzielt, da es für weniger Zeit und auf einem kleineren Datensatz trainiert wurde).
| Cola | Sst | MRPC | Sts | QQP | Mnli | Qnli | Rte | Kader 1.1 | Kader 2.0 | Chunking | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Metriken | MCC | Acc | Acc | Spearman | Acc | Acc | Acc | Acc | Em | Em | F1 |
| Elektrafarge | 69.1 | 96,9 | 90,8 | 92.6 | 92.4 | 90,9 | 95.0 | 88.0 | 89.7 | 88.1 | 97,2 |
| Elektrikbasis | 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 | - | - | - |
Weitere Verluste / Trainingskurven der Modelle während der Vorausbildung finden Sie hier.
Verwenden Sie zum Trainieren von Electric das gleiche Skript und den gleichen Befehl vor dem Training wie Electra. Pass "electra_objective": false und "electric_objective": true für die Hyperparameter. Wir planen, bald vorgeborene elektrische Modelle freizugeben!
Wenn Sie diesen Code für Ihre Veröffentlichung verwenden, zitieren Sie bitte das Originalpapier:
@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}
}
Wenn Sie den Code für Elektro verwenden, zitieren Sie bitte das elektrische Papier:
@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}
}
Für Hilfe oder Probleme mit Electra senden Sie bitte ein GitHub -Problem.
Für persönliche Mitteilung im Zusammenhang mit Electra wenden Sie sich bitte an Kevin Clark ( [email protected] ).