Electra -это метод для самоотверженного изучения языкового представления. Его можно использовать для предварительного обучения трансформаторных сетей, используя относительно небольшой вычислитель. Модели Electra обучаются различать входные токены «реальных» входных токенов против «поддельных» токенов, генерируемых другой нейронной сетью, аналогично дискриминатору GAN. В небольшом масштабе Electra достигает сильных результатов, даже когда обучается на одном графическом процессоре. В крупном масштабе Electra достигает современных результатов в наборе данных Squad 2.0.
Для получения подробного описания и экспериментальных результатов, пожалуйста, обратитесь к нашим ICLR 2020 Paper Electra: Traving Text Encoders в качестве дискриминаторов, а не генераторами.
Этот репозиторий содержит код для предварительного обучения Electra, включая малые модели Electra на одном графическом процессоре. Он также поддерживает тонкую настройку electra на нижестоящих задачах, включая задачи классификации (например, клей), QA-задачи (например, команда) и задачи с меткой последовательности (например, текстовый брюк).
Этот репозиторий также содержит код для Electric , версию Electra, вдохновленную энергетическими моделями. Electric обеспечивает более принципиальное представление о Electra как модели «отрицательной выборки». Он также может эффективно производить псевдо-правдоподобные оценки для текста, которые можно использовать для повторного оценки выходов систем распознавания речи или машинного перевода. Для получения подробной информации об электричестве, пожалуйста, обратитесь к Out Emnlp 2020 Paper Pres Transformers в качестве моделей Cloze на основе энергии.
Первоначально мы выпускаем три предварительно обученные модели:
| Модель | Слои | Скрытый размер | Параметры | Оценка клея (набор тестирования) | Скачать |
|---|---|---|---|---|---|
| Электра-Смалл | 12 | 256 | 14 м | 77.4 | связь |
| Электрабаза | 12 | 768 | 110 м | 82,7 | связь |
| Электро-широкий | 24 | 1024 | 335M | 85,2 | связь |
Модели были обучены на необычайном английском тексте. Они соответствуют Electra-Small ++, Electra-Base ++, Electra-1,75 м в нашей статье. Мы надеемся выпустить другие модели, такие как многоязычные модели, в будущем.
На клей, электронные баллы с электро-большим, немного лучше, чем Albert/Xlnet, Electra-Base Bates лучше, чем Bert-Large, и Electra-Small Bores немного хуже, чем Tinybert (но не использует дистилляцию). См. Раздел ожидаемых результатов ниже для подробных чисел производительности.
Используйте build_pretraining_dataset.py , чтобы создать набор данных перед тренировкой из дампа необработанного текста. У него есть следующие аргументы:
--corpus-dir : каталог, содержащий необработанные текстовые файлы, чтобы превратиться в Electra примеры. Текстовый файл может содержать несколько документов с пустыми линиями, разделяющими их.--vocab-file : файл, определяющий словарный запас.--output-dir : где написать примеры Electra.--max-seq-length : количество токенов за пример (128 по умолчанию).--num-processes : если> 1 параллелизируется по нескольким процессам (1 по умолчанию).--blanks-separate-docs : указывают ли пустые строки границы документов (верно по умолчанию).--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 (необязательно): DICT JSON или путь к файлу JSON, содержащий модель гиперпараметров, пути данных и т. Д. См. configure_pretraining.py для поддерживаемых гиперпараметров. Если обучение будет остановлено, повторно выполнять run_pretraining.py с одинаковыми аргументами, продолжит обучение, где оно остановилось.
Вы можете продолжить тренировку с выпущенных контрольных точек Electra
--model-name electra_small если вы загрузили веса на $DATA_DIR/electra_small ).num_train_steps по (например) добавление "num_train_steps": 4010000 в - --hparams . Это продолжит обучение небольшой модели для еще 10000 шагов (она уже была обучена для 4E6 шагов).learning_rate HParam на 2E-4 * (4E6 + 10000) / 10000."generator_hidden_size": 1.0 в hparams , потому что мы не использовали небольшой генератор для этой модели. Эти инструкции предварительно обучают небольшую модель Electra (12 слоев, 256 скрытый размер). К сожалению, данные, которые мы использовали в статье, не доступны общедоступны, поэтому мы будем использовать OpenWebTextCorpus, выпущенный Аароном Гокасланом и Ванью Коэн вместо этого. Полностью обученная модель (~ 4 дня на графическом процессоре V100) должна работать примерно между GPT и BERT-базой с точки зрения клея. По умолчанию модель обучена последовательностям длины-128, поэтому она не подходит для работы с ответом на вопросы. См. Раздел «Ожидаемые результаты» ниже для получения более подробной информации о производительности модели.
$DATA_DIR/vocab.txt . Наши модели Electra использовали тот же словарный запас, что и English Uncasted Bert, который вы можете скачать здесь.tar xf openwebtext.tar.xz ). Поместите его в $DATA_DIR/openwebtext .python3 build_openwebtext_pretraining_dataset.py --data-dir $DATA_DIR --num-processes 5 . Он предварительно обрабатывает/токенизирует примеры данных и выходов в виде файлов tfrecord под $DATA_DIR/pretrain_tfrecords . Tfrecords требует примерно 30 г дискового пространства. Запустите python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt чтобы обучить небольшую модель Electra для 1 миллиона шагов на данных. Это занимает немного более 4 дней на графическом процессоре Tesla V100. Тем не менее, модель должна достичь приличных результатов после 200 тыс. Этап (10 часов обучения на графическом процессоре V100).
Чтобы настроить обучение, добавить --hparams '{"hparam1": value1, "hparam2": value2, ...}' к команде запуска. --hparams также могут быть пути к файлу .json , содержащему гиперпараметры. Некоторые особенно полезные варианты:
"debug": true Trains крошечная модель 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> и "vocab_size": n можно использовать для установки пользовательского словаря Wordiece."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}' . Это будет распечатать метрики Eval, такие как точность генератора и дискриминатора, а также выписывает метрики в data-dir/model-name/results .
Используйте run_finetuning.py , чтобы настраивать и оценить модель Electra на нижней задаче NLP. Он ожидает три аргумента:
--data-dir : каталог, где хранятся данные, веса модели и т. Д. По умолчанию скрипт загружает данные о финалзации из <data-dir>/finetuning_data/<task-name> и словарного запаса от <data-dir>/vocab.txt .--model-name : имя предварительно обученной модели: предварительно обученные веса должны существовать в data-dir/models/model-name .--hparams : дикт JSON, содержащий модель гиперпараметров, пути данных и т. Д. (Например, --hparams '{"task_names": ["rte"], "model_size": "base", "learning_rate": 1e-4, ...}' ). См. configure_pretraining.py для поддерживаемых гиперпараметров. Вместо дикта это также может быть пути к файлу .json , содержащему гиперпараметры. Вы должны указать "task_names" и "model_size" (см. Примеры ниже). Метрики Eval будут сохранены в data-dir/model-name/results , и веса модели будут сохранены в data-dir/model-name/finetuning_models по умолчанию. Оценка проводится в DEV, установленном по умолчанию. Чтобы настроить обучение, добавить --hparams '{"hparam1": value1, "hparam2": value2, ...}' к команде запуска. Некоторые особенно полезные варианты:
"debug": true тонкая настройка крошечная модель Electra для нескольких шагов."task_names": ["task_name"] : определяет задачи для обучения. Список, потому что кодовая база номинально поддерживает многозадачное обучение (хотя будьте осторожны, это не было тщательно проверено)."model_size": one of "small", "base", or "large" : определяет размер модели; Вы должны установить это до того же размера, что и предварительно обученная модель."do_train" and "do_eval" : поездка и/или оценивать модель (оба установлены по умолчанию по умолчанию). Для использования "do_eval": true с "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" устанавливает значения по умолчанию). Получите предварительно обученную модель 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"]}'
Или тонкая настройка небольшой модели, предварительно обученной, используя вышеуказанные инструкции по коле.
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"model_size": "small", "task_names": ["cola"]}'
Код поддерживает команду 1.1 и 2.0, а также наборы данных в общей задаче MRQA 2019 года.
$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 Shared Task для вычисления метрик
Загрузите здесь набор данных Conll-2000 Text Hunking и поместите его под $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 по различным задачам (набор тестов для Chunking, Dev, набор для других задач). Обратите внимание, что дисперсия в тонкой настройке может быть довольно большой, поэтому для некоторых задач вы можете увидеть большие колебания в оценках, когда настраивайтесь с одной и той же контрольной точки несколько раз. Приведенные ниже оценки показывают медианную производительность по большему количеству случайных семян. Electra-Small/Base/Large-наши выпущенные модели. Electra-Small-Wowt-это модель, обученная OpenWebText, сверху (она работает немного хуже, чем Electra-Small из-за обучения для меньшего времени и в меньшем наборе данных).
| Кола | SST | MRPC | Стр | QQP | Mnli | Qnli | Rte | Отряд 1.1 | Отряд 2.0 | Канкинг | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Метрики | МакК | Акк | Акк | Спирмен | Акк | Акк | Акк | Акк | ЭМ | ЭМ | 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 |
| 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, пожалуйста, свяжитесь с Кевином Кларком ( [email protected] ).