Electraは、自己教師の言語表現学習の方法です。比較的少ない計算を使用して、トランストランスネットワークをプレトレイントランスネットワークに使用できます。 Electraモデルは、GANの識別器と同様に、別のニューラルネットワークによって生成された「実際の」入力トークンvs「偽の」入力トークンを区別するように訓練されています。小規模では、Electraは単一のGPUで訓練された場合でも、強力な結果を達成します。大規模に、ElectraはSquad 2.0データセットで最先端の結果を達成します。
詳細な説明と実験結果については、ICLR 2020 Paper Electra:Pre-Training Text Encodersを発電機ではなく判別器として参照してください。
このリポジトリには、単一のGPU上の小さなエレクトラモデルを含む、エレクトラ以前のエレクトラへのコードが含まれています。また、分類タスク(例えば、接着剤)、QAタスク(例:分隊)、シーケンスタグ付けタスク(テキストチャンキング)を含む下流タスクで微調整されたエレクトラをサポートします。
このリポジトリには、エネルギーベースのモデルに触発されたエレクトラのバージョンである電気のコードも含まれています。 Electricは、「ネガティブサンプリング」Clozeモデルとして、Electraのより原則的な見解を提供します。また、テキストの擬似棒スコアを効率的に生成することもできます。これは、音声認識または機械翻訳システムの出力を再度ランクするために使用できます。 Electricの詳細については、EMNLP 2020ペーパープリトレーニング変圧器をエネルギーベースのClozeモデルとして参照してください。
当初、3つの事前に訓練されたモデルをリリースしています。
| モデル | レイヤー | 隠されたサイズ | パラメージ | 接着剤スコア(テストセット) | ダウンロード |
|---|---|---|---|---|---|
| Electra-Small | 12 | 256 | 14m | 77.4 | リンク |
| エレクトラベース | 12 | 768 | 110m | 82.7 | リンク |
| エレクトラ・ラージ | 24 | 1024 | 335m | 85.2 | リンク |
モデルは、強化された英語のテキストで訓練されました。それらは、私たちの論文では、Electra-Small ++、Electra-Base ++、Electra-1.75mに対応しています。将来的には、多言語モデルなどの他のモデルをリリースしたいと考えています。
接着剤では、Electra-LargeスコアはAlbert/XLNetよりもわずかに優れており、Electra-BaseスコアはBert-Largeよりも優れており、Electra-SmallスコアはTinybertよりもわずかに最悪です(ただし、蒸留はありません)。詳細なパフォーマンス番号については、以下の予想結果セクションを参照してください。
build_pretraining_dataset.pyを使用して、生のテキストのダンプからトレーニング前のデータセットを作成します。次の議論があります。
--corpus-dir :エレクトラの例に変わる生のテキストファイルを含むディレクトリ。テキストファイルには、空の行を分離する空の行を持つ複数のドキュメントを含めることができます。--vocab-file :ワードピースの語彙を定義するファイル。--output-dir :Electraの例を書く場所。--max-seq-length :例ごとのトークンの数(デフォルトでは128)。--num-processes :> 1が複数のプロセスに並行している場合(デフォルトで1)。--blanks-separate-docs :空白線がドキュメントの境界を示すかどうか(デフォルトでは真)。--do-lower-case/--no-lower-case :入力テキストを下回るかどうか(デフォルトでは真)。 run_pretraining.pyを使用して、electraモデルを事前にトレインします。次の議論があります。
--data-dir :トレーニング前のデータ、モデルの重みなどが保存されるディレクトリ。デフォルトでは、トレーニングには<data-dir>/pretrain_tfrecordsの例と<data-dir>/vocab.txtからの語彙があります。--model-name :トレーニング中のモデルの名前。モデルの重みは、デフォルトで<data-dir>/models/<model-name>に保存されます。--hparams (オプション):モデルハイパーパラメーター、データパスなどを含むJSONファイルへのパスまたはサポートされているハイパーパラメーターについては、 configure_pretraining.py参照してください。トレーニングが停止した場合、同じ引数でrun_pretraining.py再実行すると、中断された場所からトレーニングが継続されます。
リリースされたエレクトラチェックポイントからの事前トレーニングを続けることができます
--model-name electra_small $DATA_DIR/electra_smallにWeightsをダウンロードした場合)。"num_train_steps": 4010000 --hparams num_train_steps設定します。これにより、さらに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に配置します。私たちのエレクトラモデルはすべて、英語のマッコースバートとまったく同じ語彙を使用していました。これをここからダウンロードできます。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の下のTrecordファイルとしてデータを前処理/トークン化します。 Trecordsには、約30gのディスクスペースが必要です。 python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owtデータの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トークン検出を交換する代わりに、マスクされた言語モデリングでモデルを訓練します(基本的には、動的マスキングと次の文の予測なし)。"num_train_steps": nモデルが事前に訓練されている期間を制御します。"pretrain_tfrecords": <paths>トレーニング前のデータがどこにあるかを決定します。注あなたは、ディレクトリだけでなく特定のファイルを指定する必要があります(例: <data-dir>/pretrain_tf_records/pretrain_data.tfrecord* )"vocab_file": <path> and "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参照してください。
下流タスクでモデルを評価するには、以下の微調整命令を参照してください。 OpenWeBtextデータのジェネレーター/差別器を評価するには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タスクでエレクトラモデルを微調整して評価します。それは3つの議論を期待しています:
--data-dir :データ、モデルの重みなどが保存されるディレクトリ。デフォルトでは、スクリプトは<data-dir>/finetuning_data/<task-name>のFinetuningデータと<data-dir>/vocab.txtからの語彙をロードします。--model-name :事前に訓練されたモデルの名前:事前に訓練された重みはdata-dir/models/model-nameに存在する必要があります。--hparams :モデルハイパーパラメーター、データパスなどを含むJSON DICT(例: --hparams '{"task_names": ["rte"], "model_size": "base", "learning_rate": 1e-4, ...}' )。サポートされているハイパーパラメーターについては、 configure_pretraining.py参照してください。 DICTの代わりに、これはハイパーパラメーターを含む.jsonファイルへのパスでもあります。 "task_names"と"model_size"を指定する必要があります(以下の例を参照)。評価メトリックはdata-dir/model-name/resultsに保存され、モデルの重みはデフォルトでdata-dir/model-name/finetuning_modelsに保存されます。評価は、デフォルトで設定されたDEVで行われます。トレーニングをカスタマイズするには、 --hparams '{"hparam1": value1, "hparam2": value2, ...}'実行コマンドに追加します。いくつかの特に便利なオプション:
"debug": trueいくつかのステップで小さなエレクトラモデルを微調整します。"task_names": ["task_name"] :トレーニングするタスクを指定します。コードベースは名目上マルチタスク学習をサポートしているため、リストです(ただし、これは徹底的にテストされていないことが警告されていますが)。"model_size": one of "small", "base", or "large" :モデルのサイズを決定します。これを事前に訓練されたモデルと同じサイズに設定する必要があります。"do_train" and "do_eval" :モデルのトレーニングおよび/または評価(両方ともデフォルトでTrueに設定されます)。 "do_eval": true with "do_train": falseを使用するには、 init_checkpointを指定する必要があります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"フラグはデフォルト値を設定します)。独自のトレーニング(上記の事前トレーニング命令を参照)またはリリースエレクトラの重みをダウンロードして$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でElectra-Baseを微調整します
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"]}'
このコードは、Squad 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"]}'
このリポジトリは、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/Largeはリリースされたモデルです。 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_objective": falseおよび"electric_objective": true to the HyperParameters。事前に訓練された電動モデルをまもなくリリースする予定です!
このコードを公開に使用する場合は、元の論文を引用してください。
@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] )にお問い合わせください。