Ce référentiel fournit le code pour le document des Neirips 2023 (piste principale) intitulé Don't Stop Pretaining? Rendez un apprenant puissant basé sur une base rapide , ce qui rend l'intégration de nos contributions de code dans d'autres projets plus accessibles.

Vous pouvez reproduire les expériences de notre papier, ne cessez pas de pré-formation? Faites un apprenant puissant final basé sur une base.
Abstrait
Les modèles linguistiques (LMS) formés sur de grandes quantités de données non marquées ont considérablement progressé le domaine du traitement du langage naturel (PNL). Dans cette étude, nous revisitons la notion largement acceptée dans la PNL qui a continué la LMS pré-formation sur les textes liés aux tâches améliore les performances du réglage fin (FT) dans les tâches en aval. Grâce à des expériences sur huit tâches à une seule phrase et huit tâches de paire de phrases dans des paramètres semi-supervisés et entièrement supervisés, nous constatons que la pré-formation continue conventionnelle ne fournit pas de manière cohérente des avantages et peut même être préjudiciable aux tâches de pair de phrase ou lorsque le FT basé sur une invitation est utilisé. Pour résoudre ces problèmes, nous proposons une pré-formation continue (PCP), qui combine l'idée de réglage des instructions avec la pré-formation continue conventionnelle. Notre approche vise à améliorer les performances du FT basé sur une invite en présentant à la fois des textes liés aux tâches et des modèles rapides à LMS via des objectifs pré-formation non supervisés avant de régler la tâche cible. Nos évaluations empiriques sur 21 repères démontrent que le PCP améliore constamment les performances des approches FT invites à la pointe de la technologie (jusqu'à 20,1% absolues) dans des paramètres semi-supervisés et entièrement supervisés, même avec seulement des centaines d'exemples non étiquetés. De plus, le FT basé sur une invite avec le PCP surpasse les approches semi-supervisées de pointe avec une plus grande simplicité, éliminant le besoin d'un processus itératif et une augmentation supplémentaire des données. Notre analyse plus approfondie explore la limite inférieure des performances du PCP et révèle que les avantages du PCP persistent sur différentes tailles de modèles et de jeux de données.
Pour exécuter le réglage fin basé sur l'invite ou basé sur CLS, vous devez installer les packages suivants.
Pour installer les packages requis pour nos approches de référence (approches semi-supervisées), vous pouvez exécuter la commande suivante.
pip install -r requirements.txtPour nos expériences, nous utilisons deux groupes d'ensembles de données.
SST-2 , SST-5 , mr , cr , mpqa , subj , trec , CoLA ) et des tâches de paire de phrases ( MRPC , QQP , STS-B , MNLI , MNLI-mm , SNLI , QNLI , RTE ). Ces ensembles de données sont situés dans le dossier data/k-shot . Nous utilisons les mêmes divisions de données que LM-BFF. Pour exécuter un réglage fin basé sur l'invite avec ces ensembles de données, définissez TASK_TYPE en tant que glue et TASK_NAME comme nom de l'ensemble de données. Nous définissons le MAX_LENGTH en 128 pour les tâches de phrase unique et 256 pour les tâches de paire de phrases. Les data/glue_pretrain nos fichiers TXT prétraités pour les fichiers pré-formation et JSON adaptatifs à la tâche pour générer des étiquettes pseudo dans une pré-formation continue basée sur une base.ag_news , amazon_review , yahoo_answers , yelp_review , aclImdb . Ces ensembles de données sont disponibles dans le dossier data . Pour exécuter des réglages fins basés sur une invite avec ces ensembles de données, veuillez définir le TASK_TYPE en ssl et TASK_NAME comme nom de l'ensemble de données. Nous définissons le MAX_LENGTH en 256 pour tous ces ensembles de données. Le dossier data/${TASK_NAME}/labeled_idx contient les indices d'exemples étiquetés sélectionnés pour cinq graines différentes. Ici, nous fournissons le code pour un réglage fin basé sur une base. Exécutez la commande suivante pour affiner le modèle en utilisant le CHECKPOINT des modèles pré-formés, tels que roberta-large ou le point de contrôle PCP. Configurez le MODEL_TYPE en tant prompting ou dart , où prompting représente un réglage fin basé sur une invite et dart représente un réglage fin basé sur une invite. Pour chaque ensemble de données du premier groupe, nous utilisons 16 exemples par classe. Par exemple, pour effectuer un réglage fin basé sur une invite (Soft) sur l'ensemble de données SST-2 , exécutez la commande ci-dessous.
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 Vous pouvez utiliser l'argument --run_pseduo_label True et définir l'argument --test_file data/glue_pretrain/${TASK_NAME} pour générer des étiquettes pseudo pour les données de formation. Cela est nécessaire car nous devons utiliser l'ensemble de train et de développement pour une pré-formation continue, plutôt que l'ensemble de test d'origine. Reportez-vous au dossier sh_examples pour afficher quelques exemples. Les pseudo-étiquettes générées seront enregistrées dans predict_results_train.json et predict_results_dev.json dans le dossier --output_dir . Pour plus de détails sur la façon d'utiliser les pseudo-étiquettes générées pour la pré-formation continue basée sur l'invite (PCP), veuillez vous référer à 4. Pré-formation continue basée sur l'invite (PCP).
Pour chaque ensemble de données du deuxième groupe, définissez le nombre d'étiquettes LABEL_SIZE pour définir la quantité totale d'exemples étiquetés. Par exemple, pour exécuter un réglage fin basé sur l'invite (dur) sur l'ensemble de données aclImdb , exécutez la commande ci-dessous.
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 Après avoir obtenu des pseudo-étiquettes pour les données de formation d'une tâche spécifique, vous pouvez exécuter la commande suivante pour effectuer une pré-formation continue basée sur une invite (PCP). Utilisez l'argument --use_fixed_dart pour la pré-formation continue basée sur une invite Soft; Sinon, la pré-formation continue basée sur une invite dure sera utilisée. Dans la pré-formation continue basée sur une invite, nous utilisons des modèles écrits par l'homme et les mots étiquetés comme invites. Pour la pré-formation continue basée sur une invite en douceur, nous utilisons les mêmes modèles pour les tâches de phrase unique et les tâches de paire de phrases, respectivement. Pour plus de détails sur les différences entre la pré-formation continue basée sur une invite douce et dure, veuillez vous référer au document. Par exemple, pour effectuer une pré-formation continue basée sur une base invite (Soft) sur les tâches de phrase unique, exécutez la commande ci-dessous.
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} ;
doneUne fois que vous avez acquis les données de pré-formation, vous pouvez exécuter la commande suivante pour effectuer une pré-formation continue basée sur une invite. Par exemple, pour effectuer une pré-formation continue basée sur une base invite à l'aide de modèles doux et durs sur les tâches de phrase unique, exécutez la commande ci-dessous.
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 N'oubliez pas d'ajuster le --per_device_train_batch_size en fonction de la mémoire GPU disponible. Lorsque le nombre d'exemples de formation est faible, envisagez d'utiliser un taux d'apprentissage inférieur. Après avoir obtenu le modèle pré-formé, définissez le CHECKPOINT en 3. Fonctionment basé sur une invite sur le --output_dir utilisé dans cette étape. Cela vous permet d'effectuer un réglage fin basé sur une tâche d'intérêt en utilisant notre point de contrôle PCP, qui surpasse généralement le point de contrôle pré-formation continu conventionnel [4], en particulier pour les tâches de paire de phrases.
Notre référentiel comprend également la mise en œuvre du réglage fin basé sur CLS conventionnel, qui peut être exécuté à l'aide de la commande ci-dessous.
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 De plus, nous prenons en charge quatre approches auto-entraînées, notamment adamatch , flexmatch , fixmatch et dash . Pour exécuter l'auto-entraînement, exécutez la commande fournie ci-dessous.
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 Si vous avez des questions concernant le code ou le journal, n'hésitez pas à contacter Zhengxiang à [email protected] . Si vous rencontrez des difficultés tout en utilisant le code ou devez signaler un bogue, n'hésitez pas à ouvrir un problème. Nous vous demandons de fournir des informations détaillées sur le problème pour nous aider à fournir un soutien efficace.
@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}
}
Ce référentiel est construit sur les référentiels suivants: