Este repositório fornece o código para o artigo Neurips 2023 (faixa principal) intitulada Don't Stop Peerrening? Torne o aluno poderoso de ajuste fino , tornando a integração de nossas contribuições de código em outros projetos mais acessíveis.

Você pode reproduzir os experimentos do nosso artigo, não pare de pré -treinamento? Faça um rápido aluno de ajuste fino baseado em fino.
Resumo
Os modelos de idiomas (LMS) treinados em vastas quantidades de dados não marcados avançaram bastante o campo do processamento de linguagem natural (PNL). Neste estudo, visitamos novamente a noção amplamente aceita na PNL de que o LMS continuado pré-treinamento em textos relacionados à tarefa melhora o desempenho do ajuste fino (FT) em tarefas a jusante. Através de experimentos em oito tarefas de frase única e oito tarefas de pares de frases em configurações semi-supervisionadas e totalmente supervisionadas, descobrimos que o pré-treinamento contínuo convencional não fornece benefícios de forma consistente e pode até ser prejudicial para tarefas de pares de sentença ou quando o FT baseado em rápido é usado. Para resolver esses problemas, propomos que o pré-treinamento contínuo baseado em imediato (PCP), que combina a idéia de ajuste de instrução com o pré-treinamento contínuo convencional. Nossa abordagem visa melhorar o desempenho do FT rápido, apresentando textos relacionados a tarefas e modelos de promotos ao LMS por meio de objetivos pré-treinamento não supervisionados antes de ajustar a tarefa de destino. Nossas avaliações empíricas em 21 benchmarks demonstram que o PCP melhora consistentemente o desempenho das abordagens de FT de ponta (até 20,1% absolutas) em ambientes semi-supervisionados e totalmente supervisionados, mesmo com apenas centenas de exemplos não identificados. Além disso, o FT baseado no PCP supera as abordagens semi-supervisionadas de última geração com maior simplicidade, eliminando a necessidade de um processo iterativo e um aumento de dados extras. Nossa análise adicional explora o limite inferior do desempenho do PCP e revela que as vantagens do PCP persistem em diferentes tamanhos de modelos e conjuntos de dados.
Para executar o ajuste fino baseado em prompt ou baseado em CLS, você precisa instalar os pacotes a seguir.
Para instalar os pacotes necessários para nossas abordagens de linha de base (abordagens semi-supervisionadas), você pode executar o seguinte comando.
pip install -r requirements.txtPara nossos experimentos, utilizamos dois grupos de conjuntos de dados.
SST-2 , SST-5 , mr , cr , mpqa , subj , trec , CoLA ) e tarefas de pares de frases ( MRPC , QQP , STS-B , MNLI , MNLI-mm , SNLI , QNLI , RTE ). Esses conjuntos de dados estão localizados na pasta data/k-shot . Empregamos as mesmas divisões de dados que LM-BFF. Para executar o ajuste fino baseado em prompt com esses conjuntos de dados, defina TASK_TYPE como glue e TASK_NAME como o nome do conjunto de dados. Definimos o MAX_LENGTH como 128 para tarefas de frase única e 256 para tarefas de pares de frases. Os data/glue_pretrain Nossos arquivos TXT pré-processados para arquivos pré-treinamento e JSON de tarefas para gerar rótulos de pseudo em pré-treinamento contínuo baseado em imediato.ag_news , amazon_review , yahoo_answers , yelp_review , aclImdb . Esses conjuntos de dados estão disponíveis na pasta de data . Para executar o ajuste fino baseado em pront com esses conjuntos de dados, defina o TASK_TYPE como ssl e TASK_NAME como o nome do conjunto de dados. Definimos o MAX_LENGTH como 256 para todos esses conjuntos de dados. A pasta data/${TASK_NAME}/labeled_idx contém os índices de exemplos marcados selecionados para cinco sementes diferentes. Aqui, fornecemos o código para ajuste fino baseado em imediato. Execute o seguinte comando para ajustar o modelo usando o CHECKPOINT dos modelos pré-treinados, como roberta-large ou PCP Checkpoint. Configure o MODEL_TYPE como prompting ou dart , onde prompting representa o ajuste fino e dart baseado no prompt. Para cada conjunto de dados no primeiro grupo, utilizamos 16 exemplos por classe. Por exemplo, para executar o ajuste fino (SOFT) baseado em Prompt (SOFT) no conjunto de dados SST-2 , execute o comando abaixo.
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 Você pode usar o argumento --run_pseduo_label True e definir o argumento --test_file data/glue_pretrain/${TASK_NAME} para gerar rótulos pseudo para os dados de treinamento. Isso é necessário, pois precisamos usar o trem e o Dev configurado para um pré-treinamento contínuo, em vez do conjunto de testes original. Consulte a pasta sh_examples para visualizar alguns exemplos. Os rótulos de pseudo gerados serão salvos em predict_results_train.json e predict_results_dev.json na pasta --output_dir . Para obter detalhes sobre como usar os rótulos de pseudo gerado para pré-treinamento contínuo (PCP) baseado em prompt (PCP), consulte 4. Pré-treinamento contínuo baseado em prompt (PCP).
Para cada conjunto de dados no segundo grupo, defina o número de rótulos LABEL_SIZE para definir a quantidade total de exemplos rotulados. Por exemplo, para executar o ajuste fino baseado em prompt (Hard) no conjunto de dados aclImdb , execute o comando abaixo.
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 Depois de obter rótulos de pseudo para os dados de treinamento de uma tarefa específica, você pode executar o seguinte comando para executar o pré-treinamento contínuo (PCP) baseado em prompt. Use o argumento --use_fixed_dart para obter o pré-treinamento contínuo baseado em prompts suaves; Caso contrário, será usado o pré-treinamento contínuo baseado em prompt. Em um pré-treinamento contínuo baseado em prompt difícil, utilizamos modelos escritos por humanos e palavras rotuladas como prompts. Para pré-treinamento contínuo baseado em prompt suave, usamos os mesmos modelos para tarefas de sentença única e tarefas de pares de sentenças, respectivamente. Para obter mais detalhes sobre as diferenças entre o pré-treinamento contínuo e com base no aviso suave, consulte o artigo. Por exemplo, para realizar o pré-treinamento contínuo baseado em prompt (SOFT) em tarefas de frase única, execute o comando abaixo.
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} ;
doneDepois de adquirir os dados de pré-treinamento, você pode executar o seguinte comando para executar o pré-treinamento contínuo baseado em prompt. Por exemplo, para realizar o pré-treinamento contínuo baseado em prompt usando modelos suaves e difíceis em tarefas de frase única, execute o comando abaixo.
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 Lembre -se de ajustar o --per_device_train_batch_size com base na memória GPU disponível. Quando o número de exemplos de treinamento for pequeno, considere usar uma taxa de aprendizado mais baixa. Depois de obter o modelo pré-treinado, defina o CHECKPOINT em 3. Ajuste fino baseado em prompt para o --output_dir usado nesta etapa. Isso permite que você execute o ajuste fino com base no PCP, que normalmente supera o ponto de verificação de pré-treinamento contínuo convencional de pré-treinamento [4], especialmente para tarefas de pares de frases.
Nosso repositório também inclui a implementação do ajuste fino convencional baseado em CLS, que pode ser executado usando o comando abaixo.
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 Além disso, apoiamos quatro abordagens de auto-treinamento, incluindo adamatch , flexmatch , fixmatch e dash . Para executar o auto-treinamento, execute o comando fornecido abaixo.
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 Se você tiver alguma dúvida sobre o código ou o artigo, sinta -se à vontade para entrar em contato com Zhengxiang em [email protected] . Se você tiver alguma dificuldade ao usar o código ou precisar relatar um bug, fique à vontade para abrir um problema. Pedimos gentilmente que você forneça informações detalhadas sobre o problema para nos ajudar a fornecer suporte eficaz.
@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 repositório é construído sobre os seguintes repositórios: