이 저장소는 Noxips Stop Pretraining이라는 Neurips 2023 (Main Track) 용지에 대한 코드를 제공합니다. 프롬프트 기반의 미세 조정 강력한 학습자를 만들어 코드 기여를 다른 프로젝트에 통합 할 수 있습니다.

우리 논문의 실험을 재현 할 수 있습니까? 프롬프트 기반의 미세 조정 강력한 학습자를 만드십시오.
추상적인
방대한 양의 unlabelled 데이터에 대해 훈련 된 언어 모델 (LMS)은 NLP (Natural Language Processing) 분야를 크게 발전 시켰습니다. 이 연구에서 우리는 작업 관련 텍스트에서 LMS 사전 훈련 LMS를 계속해서 NLP에서 널리 받아 들여지는 개념을 다시 방문하여 다운 스트림 작업에서 미세 조정 (FT)의 성능을 향상시킵니다. 반 감독 및 완전히 감독 된 설정 모두에서 8 개의 단일 문장 작업과 8 개의 문장 쌍 작업에 대한 실험을 통해 기존의 지속적인 사전 훈련은 지속적으로 혜택을 제공하지 않으며 문장 쌍 작업에 해가 될 수 있음을 발견하거나 프롬프트 기반 FT가 사용되는 경우도 있습니다. 이러한 문제를 해결하기 위해 Promptruction Tuning이라는 아이디어와 기존의 지속적인 사전 훈련 아이디어를 결합한 프롬프트 기반 지속적인 사전 훈련 (PCP)을 제안합니다. 우리의 접근 방식은 대상 작업을 미세 조정하기 전에 감독되지 않은 사전 훈련 목표를 통해 작업 관련 텍스트와 프롬프트 템플릿을 LMS에 제시함으로써 프롬프트 기반 FT의 성능을 향상시키는 것을 목표로합니다. 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-mm , SNLI , QNLI , RTE )이 포함됩니다. 이 데이터 세트는 data/k-shot 폴더에 있습니다. 우리는 LM-BFF와 동일한 데이터 분할을 사용합니다. 이 데이터 세트로 프롬프트 기반 미세 조정을 실행하려면 TASK_TYPE glue 로, TASK_NAME 데이터 세트 이름으로 설정하십시오. 단일 문장 작업의 경우 MAX_LENGTH 128로, 문장 쌍 작업의 경우 256을 설정했습니다. data/glue_pretrain 프롬프트 기반 지속적인 사전 훈련에서 의사 레이블을 생성하기위한 작업 적응 사전 훈련 및 JSON 파일에 대한 전처리 된 TXT 파일.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 하드 프롬프트 기반 prompting 미세 조정을 나타내고 dart 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 폴더를 참조하십시오. 생성 된 의사 라벨은 predict_results_train.json 및 predict_results_dev.json 에 --output_dir 폴더 내에 저장됩니다. 프롬프트 기반 지속적인 사전 훈련 (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 (Prompt-Based Contink Pre-Training)를 수행 할 수 있습니다. 소프트 프롬프트 기반 지속적인 사전 훈련을 위해서는 인수 --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 체크 포인트를 사용하여 관심있는 작업에 대한 프롬프트 기반 미세 조정을 수행 할 수 있습니다. 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] 의 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}
}
이 저장소는 다음 리포지토리를 기반으로합니다.