Este repositorio proporciona el código para el documento Neurips 2023 (pista principal) titulado ¿No dejes de pretrarse? Haga que el aprendiz de poder potente basado en el aviso , lo que hace que la integración de nuestras contribuciones de código en otros proyectos sea más accesible.

¿Puedes reproducir los experimentos de nuestro artículo, ¿no dejes de previamente? Haga un aprendizaje poderoso basado en el intento de poder.
Abstracto
Los modelos de lenguaje (LMS) capacitados en grandes cantidades de datos no marcados han avanzado en gran medida en el campo del procesamiento del lenguaje natural (PNL). En este estudio, volvemos a visitar la noción ampliamente aceptada en PNL que continuó previamente al entrenamiento LMS en los textos relacionados con la tarea mejora el rendimiento de la ajuste fino (FT) en las tareas aguas abajo. A través de experimentos en ocho tareas de una sola oración y ocho tareas de par de oraciones en entornos semi-supervisados y totalmente supervisados, encontramos que el pre-entrenamiento continuo convencional no proporciona constantemente beneficios e incluso puede ser perjudicial para las tareas de pares de oraciones o cuando se usa FT basado en el aviso. Para abordar estos problemas, proponemos un pretruento continuo (PCP) continuo, lo que combina la idea del ajuste de instrucciones con el pre-entrenamiento continuo convencional. Nuestro enfoque tiene como objetivo mejorar el rendimiento de FT basado en el aviso presentando textos relacionados con la tarea y plantillas de inmediato a LMS a través de objetivos de pre-entrenamiento no supervisados antes del ajuste de la tarea de destino. Nuestras evaluaciones empíricas en 21 puntos de referencia demuestran que el PCP mejora constantemente el rendimiento de los enfoques FT basados en el aviso de última generación (hasta 20.1% absoluto) en entornos semiupervisos y totalmente supervisados, incluso con solo cientos de ejemplos no etiquetados. Además, el FT basado en el aviso con el PCP supera a los enfoques semi-supervisados de última generación con mayor simplicidad, eliminando la necesidad de un proceso iterativo y un aumento de datos adicionales. Nuestro análisis posterior explora el límite inferior de rendimiento del PCP y revela que las ventajas de PCP persisten en diferentes tamaños de modelos y conjuntos de datos.
Para ejecutar el ajuste fino basado en el aviso o basado en CLS, debe instalar los siguientes paquetes.
Para instalar los paquetes requeridos para nuestros enfoques de línea de base (enfoques semi-supervisados), puede ejecutar el siguiente comando.
pip install -r requirements.txtPara nuestros experimentos, utilizamos dos grupos de conjuntos de datos.
SST-2 , SST-5 , mr , cr , mpqa , subj , trec , CoLA ) y tareas de pares de oraciones ( MRPC , QQP , STS-B , MNLI , MNLI-mm , SNLI , QNLI , RTE ). Estos conjuntos de datos se encuentran en la carpeta data/k-shot . Empleamos las mismas divisiones de datos que LM-BFF. Para ejecutar el ajuste de fino basado en el aviso con estos conjuntos de datos, establezca TASK_TYPE como glue y TASK_NAME como el nombre del conjunto de datos. Establecimos el MAX_LENGTH como 128 para tareas de oración única y 256 para tareas de par de oraciones. data/glue_pretrain Nuestros archivos TXT preprocesados para los archivos JSON de pre-entrenamiento y JSON adaptados por tareas para generar etiquetas pseudo en el pre-entrenamiento continuo basado en información.ag_news , amazon_review , yahoo_answers , yelp_review , aclImdb . Estos conjuntos de datos están disponibles en la carpeta data . Para ejecutar el ajuste fino basado en el aviso con estos conjuntos de datos, establezca el TASK_TYPE como ssl y TASK_NAME como el nombre del conjunto de datos. Establecimos el MAX_LENGTH como 256 para todos estos conjuntos de datos. La carpeta data/${TASK_NAME}/labeled_idx contiene los índices de ejemplos etiquetados seleccionados para cinco semillas diferentes. Aquí proporcionamos el código para el ajuste de fino basado en el aviso. Ejecute el siguiente comando para ajustar el modelo utilizando el CHECKPOINT de los modelos previamente capacitados, como roberta-large o el punto de control PCP. Configure el MODEL_TYPE como prompting o dart , donde prompting representa el ajuste y dart de tiro a fondo y los lados de DART basados en el aviso. Para cada conjunto de datos en el primer grupo, utilizamos 16 ejemplos por clase. Por ejemplo, para realizar un ajuste fino basado en el aviso (SOFT) en el conjunto de datos SST-2 , ejecute el comando a continuación.
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 Puede usar el argumento --run_pseduo_label True y establecer el argumento --test_file data/glue_pretrain/${TASK_NAME} para generar etiquetas pseudo para los datos de entrenamiento. Esto es necesario ya que necesitamos usar el tren y el conjunto de desarrolladores para una mayor pretrabeación continua, en lugar del conjunto de pruebas original. Consulte la carpeta sh_examples para ver algunos ejemplos. Las etiquetas de pseudo generadas se guardarán en predict_results_train.json y predict_results_dev.json dentro de la carpeta --output_dir . Para obtener detalles sobre cómo usar las etiquetas de pseudo generadas para el pre-entrenamiento continuo basado en el aviso (PCP), consulte 4. Pretración continua (PCP) continuada.
Para cada conjunto de datos en el segundo grupo, establezca el número de etiquetas LABEL_SIZE para definir la cantidad total de ejemplos etiquetados. Por ejemplo, para ejecutar el ajuste de fino (duro) basado en el aviso en el conjunto de datos aclImdb , ejecute el comando a continuación.
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 Después de obtener etiquetas pseudo para los datos de capacitación de una tarea específica, puede ejecutar el siguiente comando para realizar un pre-entrenamiento continuo (PCP) basado en el aviso. Use el argumento --use_fixed_dart para la pretruación continua basada en el aviso suave; De lo contrario, se utilizará la pretruña continua basada en el aviso. En el pre-entrenamiento continuo basado en el pedido en el sentido, utilizamos plantillas escritas humanas y palabras etiquetadas como indicaciones. Para el pre-entrenamiento continuo basado en aviso suave, utilizamos las mismas plantillas para tareas de oraciones individuales y tareas de pares de oraciones, respectivamente. Para obtener más detalles sobre las diferencias entre el pre-entrenamiento continuo basado en el aviso suave y duro, consulte el documento. Por ejemplo, para llevar a cabo una capacitación continua (suave) continua en tareas de oraciones individuales, ejecute el comando a continuación.
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} ;
doneUna vez que haya adquirido los datos previos al entrenamiento, puede ejecutar el siguiente comando para realizar una pretruña continua basada en el aviso. Por ejemplo, para llevar a cabo un pre-entrenamiento continuo basado en el aviso utilizando plantillas suaves y duras en tareas de oraciones individuales, ejecute el comando a continuación.
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 Recuerde ajustar el --per_device_train_batch_size en función de la memoria GPU disponible. Cuando el número de ejemplos de capacitación es pequeño, considere usar una tasa de aprendizaje más baja. Después de obtener el modelo previamente capacitado, establezca el CHECKPOINT en 3. Ajuste de fino basado en el aviso al --output_dir utilizado en este paso. Esto le permite realizar un ajuste fino basado en el aviso en la tarea de interés utilizando nuestro punto de control de PCP, que generalmente supera el punto de control continuo continuo de priorización [4], especialmente para las tareas de pares de oraciones.
Nuestro repositorio también incluye la implementación del ajuste fino basado en CLS convencional, que se puede ejecutar utilizando el comando a continuación.
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 Además, admitimos cuatro enfoques de autodenencia, incluidos adamatch , flexmatch , fixmatch y dash . Para ejecutar la autocuración, ejecute el comando proporcionado a continuación.
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 Si tiene alguna pregunta sobre el código o el documento, no dude en comunicarse con Zhengxiang en [email protected] . Si experimenta alguna dificultad mientras usa el código o necesita informar un error, no dude en abrir un problema. Pedimos amablemente que proporcione información detallada sobre el problema para ayudarnos a proporcionar un soporte efectivo.
@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}
}
Este repositorio se basa en los siguientes repositorios: