Dieses Repository enthält den Code für die Neurips 2023 (Hauptspur-) Papier mit dem Titel "Stop -Vorabbau"? Machen Sie prompte basierte feinabstimmungsmächtige Lernende und machen Sie die Integration unserer Codebeiträge in andere Projekte zugänglich.

Sie können die Experimente unseres Papiers reproduzieren, die die Vorbereitung nicht aufhören? Machen Sie prompt basierte feinabstimmungsmächtige Lernende.
Abstrakt
Sprachmodelle (LMS), die auf riesigen Mengen unbeschriebener Daten ausgebildet wurden, haben das Gebiet der Verarbeitung natürlicher Sprache (NLP) stark fortgeschritten. In dieser Studie besuchen wir den weit verbreiteten Begriff in NLP erneut, dass die Fortsetzung von LMs in aufgabenbezogenen Texten die Leistung der Feinabstimmung (FT) in nachgeschalteten Aufgaben verbessert. Durch Experimente an acht Einsassenaufgaben und acht Sätzenpaaraufgaben in semi-überprüften und vollständig überprüften Einstellungen stellen wir fest, dass herkömmliche fortgesetzte Voraussetzungen nicht konsequent Vorteile bietet und sogar nachteilig für Satzpaaraufgaben oder bei sofortiger FT verwendet werden kann. Um diese Probleme anzugehen, schlagen wir eine prompte-basierte Fort-Training (PCP) vor, die die Idee der Unterrichtsabstimmung mit herkömmlichem fortgesetzten Pre-Training kombiniert. Unser Ansatz zielt darauf ab, die Leistung von prompt-basierten FT zu verbessern, indem sowohl aufgabenbezogene Texte als auch die Erfordernis der Vorlagen von LMS durch unbeaufsichtigte Voraussetzungsziele vorgestellt werden, bevor die Zielaufgabe Feinabstimmung vorliegt. Unsere empirischen Bewertungen an 21 Benchmarks zeigen, dass die PCP die Leistung hochmoderner FT-Ansätze (bis zu 20,1% absolut) in semi-sachlicher und vollständig überragender Umgebungen durchweg verbessert, selbst bei nur Hunderten von ungebundenen Beispielen. Darüber hinaus übertrifft ein prompt-basiertes FT mit dem PCP hochmoderne halbüberwachende Ansätze mit größerer Einfachheit, wodurch die Notwendigkeit eines iterativen Prozesses und zusätzlicher Datenvergrößerung beseitigt wird. Unsere weitere Analyse untersucht die Leistungsuntergrenze des PCP und zeigt, dass die Vorteile von PCP über verschiedene Größen von Modellen und Datensätzen hinweg bestehen.
Um die eingehend basierte oder CLS-basierte Feinabstimmung auszuführen, müssen Sie die folgenden Pakete installieren.
So installieren Sie die erforderlichen Pakete für unsere Basisansätze (halbübergreifende Ansätze), Sie können den folgenden Befehl ausführen.
pip install -r requirements.txtFür unsere Experimente verwenden wir zwei Gruppen von Datensätzen.
SST-2 , SST-5 , mr , cr , mpqa , subj , trec , CoLA ) und Satzpaaraufgaben ( MRPC , QQP , STS-B , MNLI , MNLI-mm , SNLI , QNLI , RTE ). Diese Datensätze befinden sich im data/k-shot -Ordner. Wir verwenden die gleichen Daten aufgeteilt wie LM-BFF. Setzen Sie TASK_TYPE als glue und TASK_NAME als Name des Datensatzes, um die Eingabeaufentwicklung mit diesen Datensätzen auszuführen. Wir setzen die MAX_LENGTH als 128 für einzelne Satzaufgaben und 256 für Satzpaaraufgaben. Die data/glue_pretrain Unsere vorverarbeiteten TXT-Dateien für Task-adaptive Pre-Training- und JSON-Dateien zum Generieren von Pseudo-Beschriftungen in forderungsbasiertem Fort-Training.ag_news , amazon_review , yahoo_answers , yelp_review , aclImdb . Diese Datensätze sind im data verfügbar. Um die Eingabeaufentwicklung mit diesen Datensätzen auszuführen, setzen Sie bitte die TASK_TYPE als ssl und TASK_NAME als Name des Datensatzes ein. Wir setzen die MAX_LENGTH als 256 für all diese Datensätze. Der data/${TASK_NAME}/labeled_idx -Ordner enthält die Indizes ausgewählter beschrifteter Beispiele für fünf verschiedene Samen. Hier bieten wir den Code für promptbasierte Feinabstimmungen an. Führen Sie den folgenden Befehl aus, um das Modell mit dem CHECKPOINT der vorgebreiteten Modelle wie roberta-large oder dem PCP-Checkpoint zu optimieren. Richten Sie den MODEL_TYPE als prompting oder dart ein, wobei prompting harte Eingabeaufentwicklung und dart Ständer für Soft-Eingabeaufforderungen darstellt. Für jeden Datensatz in der ersten Gruppe verwenden wir 16 Beispiele pro Klasse. Führen Sie beispielsweise den Befehl unten aus, um beispielsweise eine prompt-basierte Feinabstimmung (Soft) im SST-2 Datensatz durchzuführen.
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 Sie können das Argument --run_pseduo_label True verwenden und das Argument --test_file data/glue_pretrain/${TASK_NAME} festlegen, um Pseudo -Labels für die Trainingsdaten zu generieren. Dies ist notwendig, da wir den Zug und den Dev-Set für weitere fortgesetzte Voraussetzungen und nicht den ursprünglichen Testsatz verwenden müssen. Weitere Beispiele finden Sie im Ordner sh_examples , um einige Beispiele anzuzeigen. Die generierten Pseudo -Labels werden in predict_results_train.json und predict_results_dev.json im Ordner --output_dir gespeichert. Weitere Informationen zur Verwendung der generierten Pseudo-Etiketten für die forderungsbasierte Fortsetzung (PCP) finden Sie unter 4. Eingabeaufforderung für Fortsetzung (PCP).
Legen Sie für jeden Datensatz in der zweiten Gruppe die Anzahl der Labels LABEL_SIZE fest, um die Gesamtmenge der markierten Beispiele zu definieren. Führen Sie aclImdb den Befehl unten aus.
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 Nachdem Sie Pseudo-Etiketten für die Trainingsdaten einer bestimmten Aufgabe erhalten haben, können Sie den folgenden Befehl ausführen, um eine forderungsbasierte Fortsetzung (PCP) auszuführen. Verwenden Sie das Argument --use_fixed_dart für weiche Eingabeaufforderung, die vor dem Training fortgesetzt werden. Andernfalls wird harte, promptbasierte fortgesetzte Vorverhandlung verwendet. In harten, prompt-basierten fortgesetzten Vorversion verwenden wir menschlich geschriebene Vorlagen und beschriftete Wörter als Eingabeaufforderungen. Für die fortgesetzte, fortgesetzte Voraussetzung für weiche Eingabeaufforderungen verwenden wir dieselben Vorlagen für einzelne Satzaufgaben bzw. Satzpaaraufgaben. Weitere Informationen zu den Unterschieden zwischen weicher und harter prompt-basierter Fortbildung finden Sie im Papier. Führen Sie beispielsweise einen prompt basierten fortgesetzten Vorbildungsaufgaben (Soft) bei einzelnen Satzaufgaben aus, um den folgenden Befehl auszuführen.
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} ;
doneSobald Sie die Daten vor dem Training erfasst haben, können Sie den folgenden Befehl ausführen, um eine forderungsbasierte Fortsetzung vorzubereiten. Zum Beispiel führen Sie den Befehl unten aus, um beispielsweise sofortige Voraussetzungen mit weichen und harten Vorlagen bei einzelnen Satzaufgaben auszuführen.
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 Denken Sie daran, die --per_device_train_batch_size basierend auf dem verfügbaren GPU -Speicher anzupassen. Wenn die Anzahl der Schulungsbeispiele gering ist, sollten Sie eine niedrigere Lernrate verwenden. Stellen Sie nach dem Erhalt des vorgeborenen Modells den CHECKPOINT in 3. Eingangungsbasierter Feinabstimmung auf den in diesem Schritt verwendeten --output_dir . Auf diese Weise können Sie mit unserem PCP-Checkpoint eine prompt-basierte Feinabstimmung in der von Interesse von Interesse durchführen, die den herkömmlichen konventionellen Checkpoint vor dem Training in der Regel übertrifft [4], insbesondere für Satzpaaraufgaben.
Unser Repository enthält auch die Implementierung herkömmlicher CLS-basierter Feinabstimmung, die mit dem folgenden Befehl ausgeführt werden kann.
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 Darüber hinaus unterstützen wir vier Selbsttraining-Ansätze, darunter adamatch , flexmatch , fixmatch und dash . Führen Sie den unten angegebenen Befehl aus, um sich selbst auszurichten.
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 Wenn Sie Fragen zu dem Code oder dem Papier haben, können Sie sich gerne an Zhengxiang unter [email protected] wenden. Wenn Sie Schwierigkeiten haben, wenn Sie den Code verwenden oder einen Fehler melden müssen, können Sie ein Problem öffnen. Wir bitten Sie freundlich, dass Sie detaillierte Informationen über das Problem bereitstellen, damit wir effektive Unterstützung bieten.
@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}
}
Dieses Repository basiert auf folgenden Repositories: