Repositori ini menyediakan kode untuk kertas Neurips 2023 (Track Utama) berjudul Don't Stop Pretraining? Buat pelajar yang kuat dan menyempurnakan berbasis prompt , membuat integrasi kontribusi kode kami ke dalam proyek lain lebih mudah diakses.

Anda dapat mereproduksi eksperimen makalah kami, jangan berhenti pretraining? Buat pelajar yang kuat dan menyempurnakan berbasis prompt.
Abstrak
Model Bahasa (LMS) yang dilatih pada sejumlah besar data yang tidak berlabel telah sangat memajukan bidang pemrosesan bahasa alami (NLP). Dalam penelitian ini, kami mengunjungi kembali gagasan yang diterima secara luas di NLP yang melanjutkan LMS pra-pelatihan pada teks terkait tugas meningkatkan kinerja fine-tuning (FT) dalam tugas hilir. Melalui eksperimen pada delapan tugas kalimat tunggal dan delapan tugas pasangan kalimat di kedua pengaturan semi-diawasi dan sepenuhnya diawasi, kami menemukan bahwa pra-pelatihan yang berkelanjutan tidak secara konsisten memberikan manfaat dan bahkan dapat merugikan untuk tugas-tugas pasangan kalimat atau ketika FT berbasis prompt digunakan. Untuk mengatasi masalah ini, kami mengusulkan ProP Pre-Training (PCP) berbasis prompt berbasis prompt, yang menggabungkan gagasan penyetelan instruksi dengan pra-pelatihan lanjutan konvensional. Pendekatan kami bertujuan untuk meningkatkan kinerja FT berbasis prompt dengan menghadirkan kedua teks terkait tugas dan templat prompt ke LMS melalui tujuan pra-pelatihan yang tidak diawasi sebelum menyempurnakan untuk tugas target. Evaluasi empiris kami pada 21 tolok ukur menunjukkan bahwa PCP secara konsisten meningkatkan kinerja pendekatan FT berbasis prompt yang canggih (hingga 20,1% absolut) di kedua pengaturan semi-diawasi dan sepenuhnya diawasi, bahkan dengan hanya ratusan contoh yang tidak dilukiskan. Selain itu, FT berbasis prompt dengan PCP mengungguli pendekatan semi-diawasi canggih dengan kesederhanaan yang lebih besar, menghilangkan kebutuhan untuk proses berulang dan augmentasi data tambahan. Analisis lebih lanjut kami mengeksplorasi kinerja batas bawah PCP dan mengungkapkan bahwa keunggulan PCP bertahan di berbagai ukuran model dan dataset.
Untuk menjalankan fine-tuning berbasis CLS atau CLS, Anda perlu menginstal paket berikut.
Untuk memasang paket yang diperlukan untuk pendekatan dasar kami (pendekatan semi-diawasi), Anda dapat menjalankan perintah berikut.
pip install -r requirements.txtUntuk eksperimen kami, kami menggunakan dua kelompok dataset.
SST-2 , SST-5 , mr , cr , mpqa , subj , trec , CoLA ) dan tugas pasangan kalimat ( MRPC , QQP , STS-B , MNLI , MNLI-mm , SNLI , QNLI , RTE ). Kumpulan data ini terletak di folder data/k-shot . Kami menggunakan pemisahan data yang sama dengan LM-BFF. Untuk mengeksekusi fine-tuning berbasis prompt dengan set data ini, atur TASK_TYPE sebagai glue dan TASK_NAME sebagai nama dataset. Kami mengatur MAX_LENGTH sebagai 128 untuk tugas kalimat tunggal dan 256 untuk tugas pasangan kalimat. data/glue_pretrain file txt preproses kami untuk file pra-pelatihan dan JSON adaptif untuk menghasilkan label semu di pra-pelatihan lanjutan berbasis prompt.ag_news , amazon_review , yahoo_answers , yelp_review , aclImdb . Dataset ini tersedia di folder data . Untuk menjalankan fine-tuning berbasis prompt dengan dataset ini, silakan atur TASK_TYPE sebagai ssl dan TASK_NAME sebagai nama dataset. Kami mengatur MAX_LENGTH sebagai 256 untuk semua set data ini. Folder data/${TASK_NAME}/labeled_idx berisi indeks contoh berlabel yang dipilih untuk lima biji yang berbeda. Di sini kami menyediakan kode untuk fine-tuning berbasis prompt. Jalankan perintah berikut untuk menyempurnakan model menggunakan CHECKPOINT model pra-terlatih, seperti roberta-large atau pos pemeriksaan PCP. Siapkan MODEL_TYPE sebagai prompting atau dart , di mana prompting mewakili fine-tuning berbasis prompt dan dart untuk fine-tuning berbasis prompt lunak. Untuk setiap dataset dalam grup pertama, kami menggunakan 16 contoh per kelas. Misalnya, untuk melakukan fine-tuning berbasis prompt (lunak) pada dataset SST-2 , jalankan perintah di bawah ini.
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 Anda dapat menggunakan argumennya --run_pseduo_label True dan mengatur argumen --test_file data/glue_pretrain/${TASK_NAME} untuk menghasilkan label semu untuk data pelatihan. Ini diperlukan karena kita perlu menggunakan kereta dan set dev untuk pra-pelatihan lebih lanjut, daripada set tes asli. Lihat folder sh_examples untuk melihat beberapa contoh. Label semu yang dihasilkan akan disimpan di predict_results_train.json dan predict_results_dev.json di dalam folder --output_dir . Untuk perincian tentang cara menggunakan label semu yang dihasilkan untuk prompt berbasis lanjutan pra-pelatihan (PCP), silakan merujuk ke 4. Pra-pelatihan lanjutan (PCP) berbasis prompt berbasis prompt.
Untuk setiap dataset di grup kedua, atur jumlah label LABEL_SIZE untuk menentukan jumlah total contoh berlabel. Misalnya, untuk menjalankan fine-tuning berbasis prompt (keras) pada dataset aclImdb , jalankan perintah di bawah ini.
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 Setelah mendapatkan label semu untuk data pelatihan dari tugas tertentu, Anda dapat menjalankan perintah berikut untuk melakukan Pro-Pelatihan Lanjutan (PCP) berbasis prompt. Gunakan argumen --use_fixed_dart untuk pra-pelatihan lanjutan berbasis prompt lunak; Kalau tidak, pra-pelatihan lanjutan berbasis hard prompt akan digunakan. Dalam pra-pelatihan lanjutan berbasis keras, kami menggunakan templat yang ditulis manusia dan memberi label kata-kata sebagai petunjuk. Untuk pra-pelatihan lanjutan berbasis prompt lunak, kami menggunakan templat yang sama untuk tugas kalimat tunggal dan tugas pasangan kalimat. Untuk detail lebih lanjut tentang perbedaan antara pra-pelatihan lanjutan berbasis lembut dan keras, silakan merujuk ke makalah ini. Misalnya, untuk melakukan pra-pelatihan lanjutan berbasis prompt (lunak) pada tugas kalimat tunggal, jalankan perintah di bawah ini.
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} ;
doneSetelah Anda memperoleh data pra-pelatihan, Anda dapat menjalankan perintah berikut untuk melakukan pra-pelatihan lanjutan berbasis prompt. Misalnya, untuk melakukan pra-pelatihan lanjutan berbasis prompt menggunakan templat lembut dan keras pada tugas kalimat tunggal, jalankan perintah di bawah ini.
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 Ingatlah untuk menyesuaikan --per_device_train_batch_size berdasarkan memori GPU yang tersedia. Ketika jumlah contoh pelatihan kecil, pertimbangkan untuk menggunakan tingkat pembelajaran yang lebih rendah. Setelah mendapatkan model pra-terlatih, atur CHECKPOINT dalam 3. Fine-tuning berbasis prompt ke-- --output_dir yang digunakan dalam langkah ini. Ini memungkinkan Anda untuk melakukan penyempurnaan berbasis prompt pada tugas yang menarik menggunakan pos pemeriksaan PCP kami, yang biasanya mengungguli pos pemeriksaan pra-pelatihan lanjutan konvensional [4], terutama untuk tugas pasangan kalimat.
Repositori kami juga mencakup implementasi fine-tuning berbasis CLS konvensional, yang dapat dieksekusi menggunakan perintah di bawah ini.
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 Selain itu, kami mendukung empat pendekatan pelatihan mandiri, termasuk adamatch , flexmatch , fixmatch , dan dash . Untuk menjalankan pelatihan sendiri, jalankan perintah yang disediakan di bawah ini.
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 Jika Anda memiliki pertanyaan tentang kode atau kertas, jangan ragu untuk menghubungi Zhengxiang di [email protected] . Jika Anda mengalami kesulitan saat menggunakan kode atau perlu melaporkan bug, jangan ragu untuk membuka masalah. Kami dengan senang hati meminta Anda memberikan informasi terperinci tentang masalah untuk membantu kami memberikan dukungan yang efektif.
@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}
}
Repositori ini dibangun di atas repositori berikut: