该存储库提供了神经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}
}
该存储库建立在以下存储库上: