Этот репозиторий предоставляет код для бумаги Neurips 2023 (основной дорожку) под названием «Не останавливайся» предварительно? Сделайте быструю настройку точной настройки мощного ученика , делая интеграцию наших вкладов кода в другие проекты более доступной.

Вы можете воспроизвести эксперименты нашей бумаги, не прекращайте предварительную подготовку? Сделайте быструю настройку точной настройки мощного ученика.
Абстрактный
Языковые модели (LMS), обученные огромным количеству немыслимых данных, значительно продвинули область обработки естественного языка (NLP). В этом исследовании мы переоцениваем общепринятое понятие в НЛП, которое продолжает предварительно тренировать LMS по текстам, связанным с задачами, повышает производительность тонкой настройки (FT) в последующих задачах. Благодаря экспериментам по восьми задачам с одним предложением и восьми задачами в пастах предложений как в полупроницаемых, так и в полных условиях, мы обнаруживаем, что традиционное продолжение предварительного обучения не приносит неизменно и может даже наносит ущерб задачам о паре предложения или при использовании быстрого на основе быстрого ФТ. Чтобы решить эти проблемы, мы предлагаем быстрое предварительное обучение на основе быстрого обучения (PCP), что сочетает в себе идею настройки инструкций с обычным продолжением предварительного обучения. Наш подход направлен на улучшение производительности FT на основе быстрого на основе быстрого на основе быстрого обучения, представляя как тексты, связанные с задачами, так и шаблоны быстрого подготовки к LMS с помощью неконтролируемых целей предварительного обучения перед настройкой целевой задачи. Наши эмпирические оценки на 21 критериях демонстрируют, что PCP последовательно улучшает производительность современных подходов FT на основе быстрого подсказок (до 20,1% абсолютных) как в полупрозрачных, так и в полных условиях, даже с сотнями немеплеванных примеров. Кроме того, FT на основе быстрого на основе PCP превосходит современные полуоттрагиваемые подходы с большей простотой, устраняя необходимость в итерационном процессе и дополнительном увеличении данных. Наш дальнейший анализ исследует более низкую границу PCP и показывает, что преимущества PCP сохраняются в разных размерах моделей и наборов данных.
Чтобы запустить точную настройку на основе быстрого или CLS, вам необходимо установить следующие пакеты.
Чтобы установить необходимые пакеты для наших базовых подходов (полупрофильные подходы), вы можете запустить следующую команду.
pip install -r requirements.txtДля наших экспериментов мы используем две группы наборов данных.
SST-2 , SST-5 , mr , cr , mpqa , subj , trec , CoLA ) и задачи пары предложений ( MRPC , QQP , STS-B , MNLI , MNLI-mm , SNLI , QNLI , RTE ). Эти наборы данных расположены в папке data/k-shot . Мы используем те же разрывы данных, что и LM-BFF. Чтобы выполнить точную настройку на основе приглашения с помощью этих наборов данных, установите TASK_TYPE в качестве glue и TASK_NAME в качестве имени набора данных. Мы устанавливаем MAX_LENGTH как 128 для задач с одним предложением и 256 для задач пары предложений. data/glue_pretrain наши предварительные файлы TXT для файлов, адаптивных предварительных тренировок и JSON для генерации псевдо-меток в постоянном предварительном обучении на основе быстрого обучения.ag_news , amazon_review , yahoo_answers , yelp_review , aclImdb . Эти наборы данных доступны в папке data . Чтобы запустить точную настройку на основе быстрого настройки с этими наборами данных, установите TASK_TYPE как ssl и TASK_NAME в качестве имени набора данных. Мы устанавливаем MAX_LENGTH как 256 для всех этих наборов данных. Папка data/${TASK_NAME}/labeled_idx содержит индексы выбранных помеченных примеров для пяти разных семян. Здесь мы предоставляем код для быстрого настройки на основе быстрого настройки. Выполните следующую команду, чтобы точно настроить модель, используя CHECKPOINT предварительно обученных моделей, таких как roberta-large или PCP Checkpoint. Установите MODEL_TYPE как prompting или dart , где prompting представляет собой жесткую настройку на основе быстрого настройки, а dart обозначает тонкую настройку на основе мягкой подсказки. Для каждого набора данных в первой группе мы используем 16 примеров на класс. Например, чтобы выполнить точную настройку на основе быстрого настройки (Soft) в наборе данных SST-2 , запустите команду ниже.
TASK_NAME=SST-2
TASK_TYPE=glue
MODEL_TYPE=dart
CHECKPOINT=roberta-large
MAX_LENGTH=128
for lr in 1e-5 2e-5 5e-5 ; do
for seed in 13 21 42 87 100 ; do
CUDA_VISIBLE_DEVICES=0 python run_prompt_ft.py
--task_type ${TASK_TYPE}
--model_type ${MODEL_TYPE}
--downstream_task_name ${TASK_NAME}
--train_file data/k-shot/ ${TASK_NAME} /16- ${seed}
--validation_file data/k-shot/ ${TASK_NAME} /16- ${seed}
--test_file data/k-shot/ ${TASK_NAME} /16- ${seed}
--model_name_or_path ${CHECKPOINT}
--do_train
--do_eval
--do_predict
--per_device_train_batch_size 8
--per_device_eval_batch_size 8
--max_seq_length ${MAX_LENGTH}
--save_strategy steps
--evaluation_strategy steps
--max_steps 1000
--eval_steps 100
--save_steps 100
--learning_rate ${lr}
--weight_decay 0.01
--warmup_ratio 0.06
--load_best_model_at_end
--save_total_limit 1
--output_dir saved_ ${TASK_TYPE} / ${MODEL_TYPE} _ ${TASK_NAME} _ ${seed} _ ${lr} ;
done ;
done Вы можете использовать аргумент --run_pseduo_label True и установить аргумент --test_file data/glue_pretrain/${TASK_NAME} чтобы сгенерировать псевдо -метки для учебных данных. Это необходимо, поскольку нам нужно использовать набор поездов и разработки для дальнейшего продолжения предварительного обучения, а не исходного тестового набора. Обратитесь к папке sh_examples , чтобы просмотреть некоторые примеры. Сгенерированные псевдо -метки будут сохранены в predict_results_train.json и predict_results_dev.json в папке --output_dir . Для получения подробной информации о том, как использовать сгенерированные псевдо-метки для постоянного предварительного обучения на основе быстрого обучения (PCP), пожалуйста, см.
Для каждого набора данных во второй группе установите количество меток LABEL_SIZE , чтобы определить общее количество помеченных примеров. Например, чтобы выполнить точную настройку на основе быстрого настройки (Hard) в наборе данных aclImdb , запустите команду ниже.
TASK_NAME=aclImdb
TASK_TYPE=ssl
MODEL_TYPE=prompting
CHECKPOINT=roberta-large
NUMBER_LABELS=20
MAX_LENGTH=256
for lr in 1e-5 2e-5 5e-5 ; do
for seed in 1 2 3 4 5 ; do
CUDA_VISIBLE_DEVICES=0 python run_prompt_ft.py
--task_type ${TASK_TYPE}
--model_type ${MODEL_TYPE}
--downstream_task_name ${TASK_NAME}
--seed ${seed}
--num_labelled_data ${NUMBER_LABELS}
--train_file data/ ${TASK_NAME}
--validation_file data/ ${TASK_NAME}
--test_file data/ ${TASK_NAME}
--model_name_or_path ${CHECKPOINT}
--do_train
--do_eval
--do_predict
--per_device_train_batch_size 8
--per_device_eval_batch_size 16
--max_seq_length ${MAX_LENGTH}
--save_strategy steps
--evaluation_strategy steps
--max_steps 1000
--eval_steps 100
--save_steps 100
--learning_rate ${lr}
--weight_decay 0.01
--warmup_ratio 0.06
--load_best_model_at_end
--save_total_limit 1
--output_dir saved_ ${TASK_TYPE} / ${MODEL_TYPE} _ ${TASK_NAME} _ ${seed} _ ${lr} _ ${NUMBER_LABELS} ;
done ;
done После получения псевдо меток для обучающих данных конкретной задачи вы можете выполнить следующую команду для выполнения продолжения предварительного обучения на основе быстрого обучения (PCP). Используйте аргумент --use_fixed_dart для непрерывного предварительного обучения на основе программы; В противном случае будет использоваться жесткая бывая предварительная тренировка. В жестком быстром продолжительном предварительном обучении мы используем шаблоны, написанные человеком и помеченные словами в качестве подсказок. Для продолжения предварительной тренировки на основе мягких подсказок мы используем те же шаблоны для задач с одним предложением и задачами пары предложений соответственно. Для получения более подробной информации о различиях между мягким и жестким продолжением предварительной тренировки, пожалуйста, обратитесь к статье. Например, для выполнения быстрого предварительного обучения на основе быстрого обучения (мягко) по одному предложению запустите команду ниже.
MODEL_TYPE=dart
for TASK_NAME in subj sst-5 trec CoLA mr SST-2 cr mpqa ; do
python src/convert_to_pretrain_pcp.py
--use_fixed_dart
--task_name ${TASK_NAME}
--train_file output_path/predict_results_train.json
--dev_file output_path/predict_results_dev.json
--output_path data/glue_pretrain/ ${TASK_NAME} _ ${MODEL_TYPE} ;
doneПосле того, как вы получили данные перед тренировкой, вы можете выполнить следующую команду для выполнения постоянного предварительного обучения на основе быстрого обучения. Например, чтобы выполнить постоянные предварительные тренировки на основе быстрого обучения, используя мягкие и жесткие шаблоны в задачах с одним предложением, запустите команду ниже.
for MODEL_TYPE in prompting dart ; do
for TASK_NAME in subj sst-5 trec CoLA mr SST-2 cr mpqa ; do
python run_mlm.py
--model_name_or_path roberta-large
--train_file data/glue_pretrain/ ${TASK_NAME} _ ${MODEL_TYPE} /train.txt
--validation_file data/glue_pretrain/ ${TASK_NAME} _ ${MODEL_TYPE} /dev.txt
--line_by_line
--per_device_train_batch_size 16
--per_device_eval_batch_size 16
--gradient_accumulation_steps 8
--learning_rate 1e-04
--optim adamw_torch
--weight_decay 0.01
--adam_beta1 0.9
--adam_beta2 0.98
--adam_epsilon 1e-06
--do_train
--do_eval
--save_steps 500
--evaluation_strategy steps
--eval_steps 500
--num_train_epochs 100
--warmup_ratio 0.06
--mlm_probability 0.15
--always_mask_label_token False
--fp16
--output_dir saved_checkpoint/ ${TASK_NAME} _ ${MODEL_TYPE}
--load_best_model_at_end ;
done ;
done Не забудьте настроить -на основе доступной памяти --per_device_train_batch_size на основе доступной памяти графического процессора. Когда количество примеров обучения мало, рассмотрите возможность использования более низкой скорости обучения. После получения предварительно обученной модели установите CHECKPOINT в 3. Настройте тонкую настройку на основе быстрого на основе приглашения на --output_dir используемый на этом этапе. Это позволяет вам выполнять точную настройку на основе приглашения на интересующей задаче, используя нашу контрольную точку PCP, которая обычно превосходит традиционную продолжительную проверку перед тренировкой [4], особенно для задач пары предложений.
Наш репозиторий также включает в себя реализацию обычной точной настройки на основе CLS, которая может быть выполнена с помощью приведенной ниже команды.
TASK_TYPE=glue
MAX_LENGTH=128
CHECKPOINT=roberta-large
for TASK_NAME in subj sst-5 trec CoLA mr SST-2 cr mpqa ; do
for lr in 1e-5 2e-5 5e-5 ; do
for seed in 13 21 42 87 100 ; do
CUDA_VISIBLE_DEVICES=0 python run_cls_ft.py
--task_type ${TASK_TYPE}
--task_name ${TASK_NAME}
--train_file data/k-shot/ ${TASK_NAME} /16- ${seed}
--validation_file data/k-shot/ ${TASK_NAME} /16- ${seed}
--test_file data/k-shot/ ${TASK_NAME} /16- ${seed}
--model_name_or_path ${CHECKPOINT}
--do_train
--do_eval
--do_predict
--per_device_train_batch_size 8
--per_device_eval_batch_size 8
--max_seq_length ${MAX_LENGTH}
--save_strategy steps
--evaluation_strategy steps
--max_steps 1000
--eval_steps 100
--save_steps 100
--learning_rate ${lr}
--weight_decay 0.01
--warmup_ratio 0.06
--load_best_model_at_end
--save_total_limit 1
--output_dir saved_ ${TASK_TYPE} _cls/ ${TASK_NAME} _ ${seed} _ ${lr} ;
done ;
done ;
done Кроме того, мы поддерживаем четыре подхода к самостоятельному обработке, в том числе adamatch , flexmatch , fixmatch и dash . Чтобы запустить самолечение, выполните команду, указанную ниже.
TASK_NAME=aclImdb
LABEL_SIZE=20
CHECKPOINT=roberta-large
for ALGORITHM in adamatch flexmatch fixmatch dash ; do
for lr in 1e-5 2e-5 5e-5 ; do
for seed in 1 2 3 4 5 ; do
CUDA_VISIBLE_DEVICES=0 python run_st.py
--seed ${seed}
--num_labels ${LABEL_SIZE}
--dataset ${TASK_NAME}
--batch_size 8
--eval_batch_size 8
--num_train_iter 25600
--num_eval_iter 2560
--epoch 10
--lr ${lr}
--use_pretrain True
--pretrain_path ${CHECKPOINT}
--net roberta_for_prompting_classification
--c config_roberta/ ${ALGORITHM} / ${ALGORITHM} _ ${TASK_NAME} _ ${LABEL_SIZE} _0.yaml
--save_dir saved_st
--save_name output_path
--load_path saved_st/output_path/latest_model.pth ;
done ;
done ;
done Если у вас есть какие -либо вопросы относительно кода или статьи, пожалуйста, не стесняйтесь обратиться к Zhengxiang по адресу [email protected] . Если вы испытываете какие -либо трудности при использовании кода или вам нужно сообщать об ошибке, не стесняйтесь открывать проблему. Мы просим, чтобы вы предоставили подробную информацию о проблеме, чтобы помочь нам оказать эффективную поддержку.
@inproceedings{shi2023dont,
title={Don't Stop Pretraining? Make Prompt-based Fine-tuning Powerful Learner},
author={Shi, Zhengxiang and Lipani, Aldo},
booktitle={Thirty-seventh Conference on Neural Information Processing Systems},
year={2023},
url={https://openreview.net/forum?id=s7xWeJQACI}
}
Этот репозиторий построен на следующих репозиториях: