Ce référentiel couvre la mise en œuvre de l'article suivant : Apprentissage contrastif pour les apprenants de langues à base d'invites par Yiren Jian, Chongyang Gao et Soroush Vosoughi, accepté à la NAACL 2022.
Si vous trouvez ce référentiel utile pour votre recherche, pensez à citer l'article.
@inproceedings { jian-etal-2022-contrastive ,
title = " Contrastive Learning for Prompt-based Few-shot Language Learners " ,
author = " Jian, Yiren and
Gao, Chongyang and
Vosoughi, Soroush " ,
booktitle = " Proceedings of the 2022 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies " ,
month = jul,
year = " 2022 " ,
address = " Seattle, United States " ,
publisher = " Association for Computational Linguistics " ,
url = " https://aclanthology.org/2022.naacl-main.408 " ,
pages = " 5577--5587 " ,
abstract = "The impressive performance of GPT-3 using natural language prompts and in-context learning has inspired work on better fine-tuning of moderately-sized models under this paradigm. Following this line of work, we present a contrastive learning framework that clusters inputs from the same class for better generality of models trained with only limited examples. Specifically, we propose a supervised contrastive framework that clusters inputs from the same class under different augmented {``}views{''} and repel the ones from different classes. We create different {``}views{''} of an example by appending it with different language prompts and contextual demonstrations. Combining a contrastive loss with the standard masked language modeling (MLM) loss in prompt-based few-shot learners, the experimental results show that our method can improve over the state-of-the-art methods in a diverse set of 15 language tasks. Our framework makes minimal assumptions on the task or the base model, and can be applied to many recent methods with little modification.",
}
Notre code est fortement emprunté à LM-BFF et SupCon ( /src/losses.py
).
Ce dépôt a été testé avec Ubuntu 18.04.5 LTS, Python 3.7, PyTorch 1.6.0 et CUDA 10.1. Vous aurez besoin d'un GPU de 48 Go pour les expériences avec RoBERTa-base et de 4 GPU de 48 Go pour RoBERTa-large. Nous effectuons nos expériences sur Nvidia RTX-A6000 et RTX-8000, mais Nvidia A100 avec 40 Go devrait également fonctionner.
Nous utilisons des ensembles de données prétraités (SST-2, SST-5, MR, CR, MPQA, Subj, TREC, CoLA, MNLI, SNLI, QNLI, RTE, MRPC, QQP) de LM-BFF. LM-BFF propose des scripts utiles pour télécharger et préparer l'ensemble de données. Exécutez simplement les commandes ci-dessous.
cd data
bash download_dataset.sh
Utilisez ensuite la commande suivante pour générer des ensembles de données de 16 plans que nous avons utilisés dans l'étude.
python tools/generate_k_shot_data.py
Les invites principales (modèles) utilisées pour les tâches ont été prédéfinies dans run_experiments.sh
. Les modèles auxiliaires utilisés lors de la génération de vues multiples d'entrées pour l'apprentissage contrastif peuvent être trouvés dans /auto_template/$TASK
.
En supposant que vous disposez d'un GPU dans votre système, nous montrons un exemple d'exécution de notre réglage fin sur SST-5 (modèles aléatoires et démonstrations aléatoires pour des "vues augmentées" des entrées).
for seed in 13 21 42 87 100 # ### random seeds for different train-test splits
do
for bs in 40 # ### batch size
do
for lr in 1e-5 # ### learning rate for MLM loss
do
for supcon_lr in 1e-5 # ### learning rate for SupCon loss
do
TAG=exp
TYPE=prompt-demo
TASK=sst-5
BS= $bs
LR= $lr
SupCon_LR= $supcon_lr
SEED= $seed
MODEL=roberta-base
bash run_experiment.sh
done
done
done
done
rm -rf result/
Notre cadre s'applique également aux méthodes basées sur des invites sans démonstration, c'est-à-dire TYPE=prompt
(dans ce cas, nous échantillonnons uniquement de manière aléatoire des modèles pour générer des « vues augmentées »). Les résultats sont enregistrés dans log
.
L'utilisation de RoBERTa-large comme modèle de base nécessite 4 GPU, chacun avec 48 Go de mémoire. Vous devez d'abord modifier la ligne 20 dans src/models.py
pour qu'elle soit def __init__(self, hidden_size=1024)
.
for seed in 13 21 42 87 100 # ### random seeds for different train-test splits
do
for bs in 10 # ### batch size for each GPU, total batch size is then 40
do
for lr in 1e-5 # ### learning rate for MLM loss
do
for supcon_lr in 1e-5 # ### learning rate for SupCon loss
do
TAG=exp
TYPE=prompt-demo
TASK=sst-5
BS= $bs
LR= $lr
SupCon_LR= $supcon_lr
SEED= $seed
MODEL=roberta-large
bash run_experiment.sh
done
done
done
done
rm -rf result/
python tools/gather_result.py --condition "{'tag': 'exp', 'task_name': 'sst-5', 'few_shot_type': 'prompt-demo'}"
Il collectera les résultats du log
et calculera la moyenne et l'écart type sur ces 5 divisions de test de train.
Pour toute question, veuillez contacter les auteurs.
Merci à LM-BFF et SupCon, pour les implémentations préliminaires.