พื้นที่เก็บข้อมูลนี้ให้รหัสสำหรับ Neurips 2023 (Main Track) ชื่อเรื่อง Don't Stop Stop Pretraining? ทำให้ผู้เรียนที่มีประสิทธิภาพในการปรับแต่งอย่างรวดเร็ว ทำให้การรวมรหัสของเราเข้ากับโครงการอื่น ๆ ที่สามารถเข้าถึงได้มากขึ้น

คุณสามารถทำซ้ำการทดลองของกระดาษของเราไม่หยุดการเตรียมการ? ทำให้ผู้เรียนที่มีประสิทธิภาพปรับแต่งตามคำสั่ง
เชิงนามธรรม
แบบจำลองภาษา (LMS) ที่ผ่านการฝึกอบรมเกี่ยวกับข้อมูลที่ไม่มีป้ายกำกับจำนวนมากมีความก้าวหน้าอย่างมากในด้านการประมวลผลภาษาธรรมชาติ (NLP) ในการศึกษานี้เราเข้าเยี่ยมชมความคิดที่ได้รับการยอมรับอย่างกว้างขวางใน NLP ซึ่งยังคงฝึกอบรมล่วงหน้าอย่างต่อเนื่องในตำราที่เกี่ยวข้องกับงานช่วยเพิ่มประสิทธิภาพของการปรับจูน (FT) ในงานดาวน์สตรีม จากการทดลองในงานประโยคเดียวแปดงานและงานคู่หนึ่งประโยคทั้งในการตั้งค่ากึ่งผู้ดูแลและผู้ดูแลอย่างเต็มที่เราพบว่าการฝึกอบรมก่อนการฝึกอบรมอย่างต่อเนื่องนั้นไม่ได้ให้ประโยชน์อย่างสม่ำเสมอ เพื่อแก้ไขปัญหาเหล่านี้เราเสนอการฝึกอบรมก่อนการฝึกอบรมอย่างต่อเนื่อง (PCP) ซึ่งรวมแนวคิดของการปรับแต่งการเรียนการสอนเข้ากับการฝึกอบรมก่อนการฝึกอบรมอย่างต่อเนื่อง วิธีการของเรามีจุดมุ่งหมายเพื่อปรับปรุงประสิทธิภาพของ FT ตามพรอมต์โดยนำเสนอทั้งข้อความที่เกี่ยวข้องกับงานและเทมเพลตพรอมต์ให้กับ LMS ผ่านวัตถุประสงค์ก่อนการฝึกอบรมที่ไม่ได้รับการดูแลก่อนการปรับแต่งสำหรับงานเป้าหมาย การประเมินเชิงประจักษ์ของเราในการวัดประสิทธิภาพ 21 ครั้งแสดงให้เห็นว่า PCP ปรับปรุงประสิทธิภาพของวิธี FT ที่ทันสมัยอย่างต่อเนื่อง (สูงสุด 20.1% สัมบูรณ์) ทั้งในการตั้งค่ากึ่งกึ่งอ่าวและรองรับ นอกจากนี้ FT ตามพรอมต์ด้วย PCP นั้นมีประสิทธิภาพสูงกว่าวิธีการกึ่งผู้ดูแลที่ทันสมัยด้วยความเรียบง่ายมากขึ้นโดยไม่จำเป็นต้องใช้กระบวนการวนซ้ำและการเพิ่มข้อมูลเพิ่มเติม การวิเคราะห์เพิ่มเติมของเราสำรวจขอบเขตที่ต่ำกว่าของ 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 ไฟล์ TXT ที่ประมวลผลล่วงหน้าของเราสำหรับไฟล์การฝึกอบรมล่วงหน้าและ JSON ที่ปรับแล้วสำหรับการสร้างฉลาก Pseudo ในการฝึกอบรมล่วงหน้าตามพรอมต์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 Checkpoint ตั้งค่า MODEL_TYPE เป็น prompting หรือ dart ซึ่ง prompting หมายถึงการปรับจูนตามพรอมต์และ dart หมายถึงการปรับแต่งตามพรอมต์แบบนุ่มนวล สำหรับแต่ละชุดข้อมูลในกลุ่มแรกเราใช้ตัวอย่าง 16 ตัวอย่างต่อชั้นเรียน ตัวอย่างเช่นในการดำเนินการปรับแต่งตามพรอมต์ (SOFT) บนชุดข้อมูล 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} เพื่อสร้างฉลากหลอกสำหรับข้อมูลการฝึกอบรม สิ่งนี้มีความจำเป็นเนื่องจากเราจำเป็นต้องใช้รถไฟและชุด Dev สำหรับการฝึกอบรมล่วงหน้าต่อไปแทนที่จะเป็นชุดทดสอบดั้งเดิม อ้างถึงโฟลเดอร์ sh_examples เพื่อดูตัวอย่างบางส่วน ฉลากหลอกที่สร้างขึ้นจะถูกบันทึกไว้ใน predict_results_train.json และ predict_results_dev.json ภายในโฟลเดอร์ --output_dir สำหรับรายละเอียดเกี่ยวกับวิธีการใช้ฉลาก Pseudo ที่สร้างขึ้นสำหรับการฝึกอบรมก่อนการฝึกอบรมอย่างต่อเนื่อง (PCP) โปรดดูที่ 4. การฝึกอบรมอย่างต่อเนื่องตามพรอมต์ (PCP)
สำหรับแต่ละชุดข้อมูลในกลุ่มที่สองตั้งค่าจำนวนฉลาก LABEL_SIZE เพื่อกำหนดจำนวนตัวอย่างทั้งหมดที่มีป้ายกำกับ ตัวอย่างเช่นในการเรียกใช้การปรับแต่งตามพรอมต์ (HARD) บนชุดข้อมูล 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 อย่าลืมปรับ --per_device_train_batch_size ตามหน่วยความจำ GPU ที่มีอยู่ เมื่อจำนวนตัวอย่างการฝึกอบรมมีขนาดเล็กให้พิจารณาใช้อัตราการเรียนรู้ที่ต่ำกว่า หลังจากได้รับโมเดลที่ผ่านการฝึกอบรมมาก่อนให้ตั้งค่า 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 หากคุณมีคำถามใด ๆ เกี่ยวกับรหัสหรือกระดาษโปรดอย่าลังเลที่จะติดต่อ Zhengxiang ที่ [email protected] หากคุณประสบปัญหาใด ๆ ในขณะที่ใช้รหัสหรือจำเป็นต้องรายงานข้อผิดพลาดอย่าลังเลที่จะเปิดปัญหา เราขอให้คุณให้ข้อมูลโดยละเอียดเกี่ยวกับปัญหาเพื่อช่วยให้เราให้การสนับสนุนที่มีประสิทธิภาพ
@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}
}
ที่เก็บนี้สร้างขึ้นบนที่เก็บต่อไปนี้: