該存儲庫提供了神經2023(主軌道)紙的代碼,標題為“不要停止訓練”?使基於迅速的微調功能強大的學習者將代碼貢獻集成到其他項目中。

您可以復制我們論文的實驗不停止訓練嗎?使基於迅速的微調強大的學習者。
抽象的
接受大量未標記數據培訓的語言模型(LMS)已大大推進了自然語言處理領域(NLP)。在這項研究中,我們重新探討了NLP中廣泛接受的概念,該概念繼續對與任務相關的文本進行預訓練LMS,可改善下游任務中微調(FT)的性能。通過在半監督和完全監督的設置中對八個單一句子任務和八個句子對任務進行實驗,我們發現傳統的持續持續預訓練不會始終如一地提供好處,甚至可能對句子對任務或使用及時的FT有害。為了解決這些問題,我們提出了迅速的持續預培訓(PCP),該培訓結合了教學調整的概念與常規的持續預訓練。我們的方法旨在通過在對目標任務進行微調之前,通過無監督的預訓練預訓練目標來提高基於及時的FT的性能,並通過無監督的預訓練預培訓目標向LMS提出及時的模板。我們對21個基準測試的經驗評估表明,即使只有數百個無虐待的示例,PCP始終提高了最先進的基於及時的FT方法的性能(最高20.1%的絕對絕對)。此外,基於PCP的及時FT以更簡單的方式優於最先進的半監督方法,從而消除了對迭代過程和額外數據增強的需求。我們的進一步分析探討了PCP的性能下限,並揭示了PCP在不同尺寸的模型和數據集中持續存在的優勢。
要運行基於及時或基於CLS的微調,您需要安裝以下軟件包。
要為我們的基線方法安裝所需的軟件包(半監督方法),您可以運行以下命令。
pip install -r requirements.txt對於我們的實驗,我們使用兩組數據集。
SST-2 , SST-5 , mr , cr , mpqa , subj , trec , CoLA )和句子對任務( MRPC , QQP , STS-B ,MNLI, MNLI ,MNLI, MNLI-mm , SNLI ,QNLI, 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檢查點)微調模型。將MODEL_TYPE設置為prompting或dart ,其中prompting代表基於硬提示的微調,而dart代表基於軟及時的微調。對於第一個組中的每個數據集,我們每個類都使用16個示例。例如,要在SST-2數據集上執行基於提示的微調(SOFT),請在下面運行命令。
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)。
對於第二組中的每個數據集,設置標籤標籤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進行基於軟提示的持續預訓練;否則,將使用基於硬及時的持續預訓練。在基於硬及時的持續預訓練中,我們利用人寫的模板並將單詞標記為提示。對於基於軟及時的持續預訓練,我們分別使用相同的模板來完成單句任務和句子對任務。有關持續預培訓的軟件和基於硬及時的差異之間的差異的更多詳細信息,請參考該論文。例如,要在單個句子任務上進行基於及時的持續預訓練(SOFT),請在下面運行命令。
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 。要運行自我訓練,請執行下面提供的命令。
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]與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}
}
該存儲庫建立在以下存儲庫上: