このリポジトリは、Neurips 2023(メイントラック)の紙「Do n't Stop Pretraining?」のコードを提供します。迅速なベースの微調整強力な学習者を作成し、他のプロジェクトへのコード貢献の統合をよりアクセスしやすくします。

あなたは私たちの論文の実験を再現することができます、事前トレーニングを止めないでください?プロンプトベースの微調整強力な学習者を作成します。
抽象的な
膨大な量の非標識データでトレーニングされた言語モデル(LMS)は、自然言語処理の分野(NLP)を大きく進めています。この研究では、タスク関連のテキストでのトレーニング前のLMSを継続して、ダウンストリームタスクでの微調整(FT)のパフォーマンスが向上するというNLPで広く受け入れられている概念を再確認します。半監視と完全な監視設定の両方で、8つの単一文字タスクと8つの文ペアタスクの実験を通じて、従来の継続的なトレーニングは一貫して利益を提供せず、文章タスクに有害であることも、迅速なFTを使用する場合にさえ有害であることがわかります。これらの問題に取り組むために、指導のチューニングのアイデアを従来の継続前トレーニングと組み合わせたプロンプトベースの継続前トレーニング(PCP)を提案します。私たちのアプローチの目的は、ターゲットタスクを微調整する前に、監視されていない事前トレーニング目標を通じて、タスク関連のテキストとプロンプトテンプレートの両方をLMSに提示することにより、プロンプトベースのFTのパフォーマンスを改善することを目的としています。 21のベンチマークでの経験的評価は、PCPが、数百の非標識の例でさえ、半監視と完全な監視された設定の両方で、最先端のプロンプトベースのFTアプローチ(最大20.1%の絶対)のパフォーマンスを一貫して改善することを示しています。さらに、PCPを備えたプロンプトベースのFTは、よりシンプルで、最先端の半監視されたアプローチよりも優れており、反復プロセスと追加のデータ増強の必要性を排除します。さらなる分析では、PCPのパフォーマンス低下を調査し、PCPの利点がさまざまなサイズのモデルとデータセットに存続することを明らかにしています。
プロンプトベースまたはCLSベースの微調整を実行するには、次のパッケージをインストールする必要があります。
ベースラインアプローチに必要なパッケージをインストールするには、次のコマンドを実行できます。
pip install -r requirements.txt実験では、2つのグループのデータセットを利用します。
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フォルダーには、5つの異なるシードの選択されたラベルの例のインデックスが含まれています。 ここでは、プロンプトベースの微調整のコードを提供します。次のコマンドを実行して、 roberta-largeやPCPチェックポイントなどの事前に訓練されたモデルのCHECKPOINTを使用してモデルを微調整します。 MODEL_TYPE promptingまたはdartとして設定します。ここで、 promptingハードプロンプトベースの微調整を表し、 dartソフトプロンプトベースの微調整を表します。最初のグループの各データセットについて、クラスごとに16の例を使用します。たとえば、 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フォルダーを参照してください。生成された擬似ラベルは、 --output_dirフォルダー内のpredict_results_train.jsonおよびpredict_results_dev.jsonに保存されます。プロンプトベースの継続プレトレーニング(PCP)のために生成された擬似ラベルを使用する方法の詳細については、4。プロンプトベースの継続プリトレーニング(PCP)を参照してください。
2番目のグループの各データセットについて、ラベルLABEL_SIZEの数を設定して、ラベルのある例の合計量を定義します。たとえば、 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利用可能なGPUメモリに基づいて、 --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など、4つのセルフトレーニングアプローチをサポートしています。セルフトレーニングを実行するには、以下のコマンドを実行します。
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 コードまたは論文に関してご質問がある場合は、 [email protected] ucl.ac.ukのZhengxiangにお気軽にお問い合わせください。コードを使用しているときに問題が発生したり、バグを報告する必要がある場合は、お気軽に問題を開いてください。問題に関する詳細な情報を提供して、効果的なサポートを提供するようお願いします。
@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}
}
このリポジトリは、次のリポジトリの上に構築されています。