Electra는 자기 감독 언어 표현 학습을위한 방법입니다. 비교적 적은 컴퓨팅을 사용하여 변압기 네트워크를 사전 트레인하는 데 사용할 수 있습니다. Electra 모델은 GAN의 판별 자와 유사한 다른 신경망에서 생성 된 "실제"입력 토큰 대 "가짜"입력 토큰을 구별하도록 훈련됩니다. 소규모로 Electra는 단일 GPU에서 훈련을받을 때에도 강력한 결과를 얻습니다. 대규모로 Electra는 Squad 2.0 데이터 세트에서 최첨단 결과를 달성합니다.
자세한 설명 및 실험 결과는 ICLR 2020 Paper Electra : 사전 훈련 텍스트 인코더를 생성기 대신 판별 자로 참조하십시오.
이 저장소에는 단일 GPU의 작은 전자 모델을 포함하여 사전 트레인 전자에 대한 코드가 포함되어 있습니다. 또한 분류 작업 (예 : 접착제), QA 작업 (예 : Squad) 및 시퀀스 태깅 작업 (예 : 텍스트 청킹)을 포함한 다운 스트림 작업에서 미세 조정 전자를 지원합니다.
이 저장소에는 에너지 기반 모델에서 영감을 얻은 Electra 버전 인 Electric 코드도 포함되어 있습니다. Electric은 Electra를 "음성 샘플링"클로즈 모델로보다 원칙적으로 볼 수 있습니다. 또한 텍스트에 대한 의사-비성기 점수를 효율적으로 생성 할 수 있으며, 이는 음성 인식 또는 기계 번역 시스템의 출력을 다시 평가하는 데 사용할 수 있습니다. 전기에 대한 자세한 내용은 에너지 기반 클로즈 모델로 EMNLP 2020 Paper Pre-Training Transformers를 참조하십시오.
우리는 처음에 세 가지 미리 훈련 된 모델을 출시하고 있습니다.
| 모델 | 레이어 | 숨겨진 크기 | 매개 변수 | 접착제 점수 (테스트 세트) | 다운로드 |
|---|---|---|---|---|---|
| 전자식 | 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 : 전기 예제를 작성해야 할 곳.--max-seq-length : 예당 토큰 수 (기본적으로 128).--num-processes : if> 1이 여러 프로세스에서 병렬화됩니다 (기본적으로 1).--blanks-separate-docs : 빈 줄에 문서 경계를 나타내는 지 (기본적으로 true).--do-lower-case/--no-lower-case : 입력 텍스트를 소문자 여부 (기본적으로 true). run_pretraining.py 사용하여 전자 모델을 사전 트레인하십시오. 다음과 같은 주장이 있습니다.
--data-dir : 사전 훈련 데이터, 모델 가중치 등이 저장되는 디렉토리. 기본적으로 교육은 <data-dir>/pretrain_tfrecords 의 예제와 <data-dir>/vocab.txt 의 어휘를로드합니다.--model-name : 훈련중인 모델의 이름. 모델 가중치는 기본적으로 <data-dir>/models/<model-name> 에 저장됩니다.--hparams (선택 사항) : JSON DICT 또는 모델 하이퍼 파라미터, 데이터 경로 등이 configure_pretraining.py 된 JSON 파일로가는 경로. 훈련이 중단되면 동일한 주장으로 run_pretraining.py 다시 실행하면 중단 된 교육이 계속됩니다.
릴리스 된 Electra 체크 포인트에서 계속 사전 훈련을받을 수 있습니다.
--model-name electra_small $DATA_DIR/electra_small 로 가중치를 다운로드 한 경우)."num_train_steps": 4010000 --hparams 에 추가하여 num_train_steps 설정합니다. 이는 소규모 모델을 10000 단계 더 훈련시킬 것입니다 (이미 4E6 단계로 훈련되었습니다).learning_rate HPARAM을 2E-4 * (4E6 + 10000) / 10000으로 설정해야합니다."generator_hidden_size": 1.0 hparams 해야합니다. 이 지침은 작은 전자 모델 (12 층, 256 개의 숨겨진 크기)을 사전 훈련시킵니다. 불행히도, 논문에서 사용한 데이터는 공개적으로 사용할 수 없으므로 Aaron Gokaslan과 Vanya Cohen이 발표 한 OpenWebTextCorpus를 대신 사용할 것입니다. 완전 훈련 된 모델 (V100 GPU의 ~ 4 일)은 접착제 성능 측면에서 GPT와 Bert-Base 사이에서 대략 수행해야합니다. 기본적으로 모델은 길이 128 시퀀스에서 교육을 받으므로 질문 답변에 실행하는 데 적합하지 않습니다. 모델 성능에 대한 자세한 내용은 아래의 "예상 결과"섹션을 참조하십시오.
$DATA_DIR/vocab.txt 에 배치하십시오. 우리의 Electra Models는 모두 English Uncased 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에는 약 30g의 디스크 공간이 필요합니다. run python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt 데이터에서 백만 단계의 작은 전자 모델을 훈련시킵니다. Tesla V100 GPU에서 4 일이 조금 걸립니다. 그러나이 모델은 200k 단계 (V100 GPU에 대한 10 시간의 교육) 후에 괜찮은 결과를 얻어야합니다.
훈련을 사용자 정의하려면 --hparams '{"hparam1": value1, "hparam2": value2, ...}' 런 명령에 추가하십시오. --hparams 또한 하이퍼 파라 미터를 포함하는 .json 파일로가는 경로 일 수 있습니다. 특히 유용한 옵션 :
"debug": true 몇 단계로 작은 전자 모델을 훈련시킵니다."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> 및 "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 작업의 전자 모델을 미세 조정하고 평가하십시오. 그것은 세 가지 주장을 기대합니다.
--data-dir : 데이터, 모델 가중치 등이 저장되는 디렉토리. 기본적으로 스크립트는 <data-dir>/finetuning_data/<task-name> 의 데이터를 미세 조정하고 <data-dir>/vocab.txt 의 어휘를로드합니다.--model-name : 미리 훈련 된 모델의 이름 : 미리 훈련 된 가중치는 data-dir/models/model-name 에 존재해야합니다.--hparams : 모델 하이퍼 파라미터, 데이터 경로 등을 포함하는 JSON DITT (예 : --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 에 저장됩니다. 평가는 기본적으로 설정된 개발자에서 수행됩니다. 훈련을 사용자 정의하려면 --hparams '{"hparam1": value1, "hparam2": value2, ...}' 런 명령에 추가하십시오. 특히 유용한 옵션 :
"debug": true Fine Fine은 몇 단계 동안 작은 electra 모델을 튜닝합니다."task_names": ["task_name"] : 훈련 할 작업을 지정합니다. 코드베이스는 명목상으로 멀티 태스킹 학습을 지원하기 때문에 목록입니다."model_size": one of "small", "base", or "large" : 모델의 크기를 결정합니다. 미리 훈련 된 모델과 같은 크기로 설정해야합니다."do_train" and "do_eval" : 변형 및/또는 모델을 평가하고 평가합니다 (둘 다 기본적으로 true로 설정 됨). "do_eval": true "do_train": false 와 함께 true를 사용하려면 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 : if> 1 인 경우 여러 개의 미세 조정/평가가 다른 임의의 씨앗으로 실행됩니다."learning_rate": lr, "train_batch_size": n 등을 사용하여 훈련 하이퍼 파라미터를 변경할 수 있습니다."model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m} 등을 사용하여 기본 변압기의 하이퍼 파라미터를 변경할 수 있습니다 ( "model_size" 플래그는 기본값 값을 설정합니다). 자신의 훈련 (위의 사전 훈련 지침 참조)을 통해 미리 훈련 된 Electra 모델을 얻거나 릴리스 Electra Weights를 다운로드하고 $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"]}'
이 코드는 2019 년 MRQA 공유 작업의 데이터 세트뿐만 아니라 팀 1.1 및 2.0을 지원합니다.
$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에 대한 예상 결과입니다 (청킹에 대한 테스트 세트, 다른 작업에 대한 DEV 세트). 미세 조정의 차이는 상당히 클 수 있으므로 일부 작업의 경우 동일한 체크 포인트에서 미세 조정할 때 점수가 큰 변동이 여러 번 나타날 수 있습니다. 아래 점수는 많은 수의 임의의 씨앗에 비해 중간 성능을 보여줍니다. 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 | 여자 이름 | 여자 이름 | 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 |
| 전자식 | 57.0 | 91.2 | 88.0 | 87.5 | 89.0 | 81.3 | 88.4 | 66.7 | 75.8 | 70.1 | 96.5 |
| 전자-매일-우트 | 56.8 | 88.3 | 87.4 | 86.8 | 88.3 | 78.9 | 87.9 | 68.5 | - | - | - |
사전 훈련 중 모델의 손실 / 훈련 곡선은 여기를 참조하십시오.
전기를 훈련 시키려면 동일한 사전 훈련 스크립트를 사용하고 Electra와 명령하십시오. "electra_objective": false and "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] )에게 문의하십시오.