Electra是一種自我監督語言表示學習的方法。它可用於使用相對較少的計算來預訓練變壓器網絡。培訓了Electra模型,以區分另一個神經網絡產生的“真實”輸入令牌與“假”輸入令牌,類似於GAN的歧視器。在小規模上,即使在單個GPU上訓練時,Electra也會取得強大的成果。在大規模上,Electra在Squad 2.0數據集上實現了最先進的結果。
有關詳細的描述和實驗結果,請參閱我們的ICLR 2020紙質電氣:培訓前文本編碼器作為歧視器而不是發電機。
該存儲庫包含預先訓練電heletra的代碼,包括單個GPU上的小電氣型號。它還支持在下游任務上進行微調的元素,包括分類任務(例如,膠水),質量檢查任務(例如,squad)和序列標記任務(例如,文本塊)。
該存儲庫還包含用於電動的代碼,這是一種受到基於能量的模型啟發的Electra版本。 Electric提供了Electra作為“負抽樣”披肩模型的更有原則性的視圖。它還可以有效地為文本產生偽樣的分數,該評分可用於將語音識別或機器翻譯系統的輸出重新排列。有關電動的詳細信息,請參閱EMNLP 2020紙張預訓練變壓器作為基於能量的披肩模型。
我們最初正在發布三個預訓練的模型:
| 模型 | 層 | 隱藏尺寸 | 參數 | 膠水評分(測試集) | 下載 |
|---|---|---|---|---|---|
| Electra-small | 12 | 256 | 14m | 77.4 | 關聯 |
| 電氣基 | 12 | 768 | 110m | 82.7 | 關聯 |
| 電氣大 | 24 | 1024 | 335m | 85.2 | 關聯 |
這些模型接受了未經英語文本的培訓。它們對應於我們的論文中的Electra-Small ++,Electra-Base ++,Electra-1.75m。我們希望將來發布其他模型,例如多語言模型。
在膠水上,電氣總得分略高於Albert/Xlnet,Electra-base得分比Bert-Large更好,而Electra-Small得分比Tinybert稍差(但不使用蒸餾)。有關詳細的性能編號,請參見下面的預期結果部分。
使用build_pretraining_dataset.py從原始文本轉儲中創建一個預訓練數據集。它具有以下論點:
--corpus-dir :一個包含原始文本文件的目錄,以轉換為electra示例。文本文件可以包含多個文檔,這些文檔將它們分開。--vocab-file :定義文字詞彙的文件。--output-dir :在哪裡寫electra示例。--max-seq-length :每個示例的令牌數(默認為128)。--num-processes :如果> 1在多個過程中並行化(默認情況下為1)。--blanks-separate-docs :空白行是否表示文檔邊界(默認情況下為true)。--do-lower-case/--no-lower-case :是否降低案例輸入文本(默認情況下為true)。使用run_pretraining.py預先培訓electra模型。它具有以下論點:
--data-dir :存儲預訓練數據,模型權重等的目錄。默認情況下,訓練加載了<data-dir>/pretrain_tfrecords的示例和<data-dir>/vocab.txt的詞彙。--model-name :訓練模型的名稱。默認情況下,模型權重將保存在<data-dir>/models/<model-name>中。--hparams (可選):json dict或包含模型超參數,數據路徑等的JSON文件的路徑。請參閱支持的超configure_pretraining.py 。如果訓練被停止,則重新運行run_pretraining.py具有相同的論點,將繼續進行培訓。
您可以繼續從發布的Electra檢查站進行預訓練
--model-name electra_small (例如,如果您將權重為$DATA_DIR/electra_small )。num_train_steps設置為--hparams "num_train_steps": 4010000 。這將繼續訓練小型型號以10000個步驟(已經接受了4E6步驟的培訓)。learning_rate HPARAM設置為2e-4 *(4E6 + 10000) / 10000。hparams中指定"generator_hidden_size": 1.0因為我們沒有為該型號使用小生成器。 這些說明預先訓練了一個小的電氣型號(12層,256個隱藏尺寸)。不幸的是,我們在論文中使用的數據尚未公開可用,因此我們將使用Aaron Gokaslan和Vanya Cohen發布的OpenWebTextCorpus。在膠水性能方面,全面訓練的模型(V100 GPU上的〜4天)應在GPT和BERT鹼基之間大致執行。默認情況下,該模型對長度為128序列進行了訓練,因此不適合在問答上運行。有關模型性能的更多詳細信息,請參見下面的“預期結果”部分。
$DATA_DIR/vocab.txt中。我們的Electra型號都使用了與英語未露面的Bert完全相同的詞彙,您可以在此處下載。tar xf openwebtext.tar.xz )。將其放入$DATA_DIR/openwebtext中。python3 build_openwebtext_pretraining_dataset.py --data-dir $DATA_DIR --num-processes 5 。它在$DATA_DIR/pretrain_tfrecords下作為tfrecord文件預處理/代幣將數據和輸出示例作為tfrecord文件。 Tfrecords大約需要30克磁盤空間。 運行python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt訓練一個小的electra型號,以100萬個步驟在數據上。這需要在特斯拉V100 GPU上稍有4天的時間。但是,該模型應在200k步驟(在V100 GPU上進行10個小時的訓練)後取得不錯的結果。
要自定義培訓,添加--hparams '{"hparam1": value1, "hparam2": value2, ...}'到運行命令。 --hparams也可能是通往包含超參數的.json文件的途徑。一些特別有用的選擇:
"debug": true訓練了幾個步驟的小型Electra型號。"model_size": one of "small", "base", or "large" :確定模型的大小"electra_objective": false訓練具有掩蓋語言建模的模型,而不是替換令牌檢測(本質上是用動態掩蓋的BERT,沒有下一句子預測)。"num_train_steps": n控制模型預先訓練的時間。"pretrain_tfrecords": <paths>確定預訓練數據的位置。注意,您不僅需要指定特定文件(例如, <data-dir>/pretrain_tf_records/pretrain_data.tfrecord* )"vocab_file": <path>和"vocab_size": n可用於設置自定義文字詞彙。"learning_rate": lr, "train_batch_size": n等。"model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m}等。可以使用基礎變壓器更改超級參數( "model_size"標誌設置默認值值)。有關全套支持的超參數,請參見configure_pretraining.py 。
要在下游任務上評估模型,請參見下面的填充說明。 To evaluate the generator/discriminator on the openwebtext data run python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"do_train": false, "do_eval": true}' .這將打印出評估指標,例如生成器和歧視器的準確性,並將指標寫入data-dir/model-name/results 。
使用run_finetuning.py來微調和評估下游NLP任務上的Electra模型。它期望三個論點:
--data-dir :存儲數據,模型權重等的目錄。默認情況下,該腳本從<data-dir>/finetuning_data/<task-name>和<data-dir>/vocab.txt的詞彙中加載finetuning數據。--model-name :預先訓練的data-dir/models/model-name中。--hparams :一個包含模型超級標準,數據路徑等--hparams '{"task_names": ["rte"], "model_size": "base", "learning_rate": 1e-4, ...}' JSON DICE。有關受支持的超參數,請參見configure_pretraining.py 。這也可以是通往包含超參數的.json文件的途徑。您必須指定"task_names"和"model_size" (請參見下面的示例)。評估指標將保存在data-dir/model-name/results中,默認情況下,將保存在data-dir/model-name/finetuning_models中。默認情況下對開發設置進行評估。要自定義培訓,添加--hparams '{"hparam1": value1, "hparam2": value2, ...}'到運行命令。一些特別有用的選擇:
"debug": true微型Tiny Electra模型幾個步驟。"task_names": ["task_name"] :指定要訓練的任務。列表是因為代碼庫名義上支持多任務學習(儘管警告尚未對此進行徹底測試)。"model_size": one of "small", "base", or "large" :確定模型的大小;您必須將其設置為與預訓練模型相同的大小。"do_train" and "do_eval" :訓練和/或評估模型(默認情況下,兩者都設置為true)。要使用“ do_eval”:與“ do_train”: "do_eval": true :false,您需要指定init_checkpoint ,例如,eg, python3 run_finetuning.py-data-data-dir $ data_dir -model-name electra_base -hme electra_base -hparams-hparams'' "do_train": false 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 :如果> 1,則使用不同的隨機種子進行多個微調/評估。"learning_rate": lr, "train_batch_size": n等。"model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m}等。可以使用基礎變壓器更改超級參數( "model_size"標誌設置默認值值)。通過訓練自己的訓練(請參閱上面的預訓練說明)獲得預先訓練的Electra型號,或者下載Electra重量並在$DATA_DIR/models下解開將其拉開(例如,如果使用大型型號,則應擁有$DATA_DIR/models/electra_large )。
通過運行此腳本下載膠水數據。通過運行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 。
然後運行run_finetuning.py 。例如,要在MNLI上微調電氣基礎
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["mnli"]}'
或使用上述COLA上的說明進行預訓練的小型模型。
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"model_size": "small", "task_names": ["cola"]}'
該代碼支持小隊1.1和2.0,以及2019年MRQA共享任務中的數據集
$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 。然後運行(例如)
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["squad"]}'
該存儲庫使用小隊作者發布的官方評估代碼和MRQA共享任務來計算指標
從此處下載CONLL-2000文本塊數據集,並將其放在$DATA_DIR/finetuning_data/chunk/(train|dev).txt下。然後運行
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["chunk"]}'
運行新任務的最簡單方法是實現新的finetune.task.Task ,將其添加到finetune.task_builder.py ,然後使用run_finetuning.py作為正常。對於分類/QA/序列標記,您可以從finetune.classification.classification_tasks.ClassificationTask , finetune.qa.qa_tasks.QATask或finetune.tagging.tagging_tasks.TaggingTask 。對於預處理數據,我們使用與Bert相同的令牌。
這是Electra在各種任務上的預期結果(用於塊的測試集,設置其他任務的開發設置)。請注意,微調的差異可能很大,因此,對於某些任務,從同一檢查點進行微調時,您可能會看到分數的巨大波動。以下分數顯示出大量隨機種子的中位表現。 Electra-Small/Base/大型是我們發布的型號。 Electra-Small-OWT是上面的OpenWebText訓練模型(由於經過更少的時間和較小的數據集的訓練,其性能比Electra-small差一些)。
| 可樂 | SST | MRPC | sts | QQP | mnli | Qnli | rte | 小隊1.1 | 小隊2.0 | 分塊 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 指標 | MCC | ACC | ACC | 斯皮爾曼 | ACC | ACC | ACC | ACC | Em | Em | F1 |
| 電氣大 | 69.1 | 96.9 | 90.8 | 92.6 | 92.4 | 90.9 | 95.0 | 88.0 | 89.7 | 88.1 | 97.2 |
| 電氣基 | 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 | - - | - - | - - |
請參閱此處,以獲取預訓練期間模型的損失 /訓練曲線。
要訓練電動,請使用與Electra相同的預訓練腳本和命令。傳遞"electra_objective": false和"electric_objective": true 。我們計劃盡快發布預訓練的電動型號!
如果您將此代碼用於出版物,請引用原始論文:
@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}
}
如果您使用電代碼進行電代碼,請引用電紙:
@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}
}
有關使用Electra的幫助或問題,請提交GitHub問題。
有關與Electra相關的個人溝通,請聯繫Kevin Clark( [email protected] )。