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": false "do_eval": true :false,您需要指定init_checkpoint ,例如,eg, 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] )。