Ce référentiel contient le code et les données du document suivant:
Mixce: formation des modèles de langage autorégressifs en mélangeant les entrées transversales avant et inversées
@inproceedings{zhang2023mixce,
title={MixCE: Training Autoregressive Language Models by Mixing Forward and Reverse Cross-Entropies},
author={Zhang, Shiyue and Wu, Shijie and İrsoy, Ozan and Lu, Steven and Bansal, Mohit and Dredze, Mark and Rosenberg, David},
booktitle={Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics},
year={2023}
}
Code Auteur: Shiyue Zhang
python -m pip install -r requirements.txtFacultatif: Pour éviter toute version contre les forfaits existants, vous souhaiterez peut-être effectuer l'installation dans un environnement virtuel:
python -m venv yourenv
. yourenv/bin/activate # for bash, might be something else for your particular shell
python -m pip install -r requirements.txtSynthetic.py est le script pour exécuter des expériences synthétiques. Les expériences de course sont très simples, il suffit de courir:
python synthetic.py
Les configurations (comme les graines, la taille du vocabulaire, etc.) peuvent être spécifiées et modifiées dans le script et sous if __name__ == '__main__': .
Il existe quelques configurations importantes dans synthétique.py qui déterminent quel type d'expériences synthétiques vous pouvez exécuter:
real_dataset : s'il None est pas, la matrice de transition sera initialisée au hasard; Ou s'il s'agit de 'webtext' , la matrice de transition sera initialisée à partir des matrices de transition pré-calculées sur WebText.
zero_percent : détermine le nombre de valeurs dans la matrice de transition 0. Par exemple, si zero_percent==0.5 , alors 50% de probabilités dans la matrice de transition sont 0.
Vocab_size : la taille du vocabulaire. Nous testons 21, 51, 101, 501 ou 1001. Notez que 21 signifie que nous avons 20 jetons normaux (y compris les EOS) et 1 jeton de pad.
Graines : Nous exécutons 5 graines (7, 42, 777, 4222, 99999) pour chaque expérience.
Loss_func : nous testons 4 fonctions de perte: (1) 'two_xens' : il est désigné comme mixce * dans notre article et utilise la distribution des données d'or p et gumbel softmax; (2) 'qlogq_mix' : c'est notre fonction de perte de mixce approximative; (3) 'two_kls' : le mélange de deux divergences KL; (4) 'js' : JS Divergence.
Train_eta : le rapport de mélange pour ces fonctions de perte. Si train_eta==1.0 pour 'two_xens' , c'est MLE. Si train_eta==1.0 pour 'two_kls' , il est en avant KL (égal à MLE). Si train_eta==0.0 pour 'two_kls' , c'est l'inverse KL. Nous utilisons une définition générale de JS (voir cet article pour plus de détails) et JS converge vers 0 lorsque train_eta se rapproche de 0,0 ou 1.0. Lorsque Train_eta = 0,5, c'est la définition normale de la divergence JS.
Nous évaluons Bigram LMS formé synthétique en comparant la matrice de transition apprise à la matrice de transition de l'or. Nous utilisons deux mesures:
(1) avg. JS : Nous calculons la divergence JS entre chaque rangée de l'or et les matrices de transition apprises et la moyenne entre les lignes.
(2) avg. 0S : Nous obtenons les valeurs de la matrice apprise à la probabilité d'or = 0 positions, puis les moyenne.
La fonction compare_parameters() dans synthétique.py est utilisée pour calculer ces deux mesures.
Les modèles seront tous enregistrés sous le répertoire synthetic_logs/ . Le nom de chaque répertoire de modèle commence par le DateTime que l'expérience a été exécutée. Dans le cadre du répertoire du modèle, vous trouverez également les fichiers d'événements Tensorboard, ainsi qu'un all_best_metrics.json qui enregistre les meilleures scores de métriques pour chaque rapport de mélange. Voir des exemples sous synthétique_logs /.
L'évaluation du modèle est réalisée après chaque époque, et le meilleur point de contrôle est sélectionné en fonction de la perte sur l'ensemble de développement.
Finalement, pour chaque expérience, nous en moyenne les résultats de 5 graines; Et pour chaque objectif, nous choisissons le meilleur rapport de mélange basé sur AVG. JS.
get_synthetic_results() dans les résultats.py est une fonction utilisée pour faire la moyenne des résultats de 5 graines et trier les résultats de différents rapports de mélange accordés à AVG. JS.
Pour utiliser get_synthetic_results() , vous devez d'abord préparer synthétique_models.json pour spécifier les répertoires du modèle. Un exemple est illustré dans synthétique_models.json. Ensuite, vous pouvez obtenir le résultat de l'expérience qui utilise la matrice de transition initialisée WebText, Vocab = 20 et Objective = Two_kls en exécutant get_synthetic_results('webtext', '20', 'two_kls') .
Detokezizer. Vous devez d'abord télécharger detokenizer.perl à partir de Moïse ici, et les placer sous les data/detokenizer.perl parce que les scripts Python suivants en dépendent.
Alors:
cd data
python wikitext_data.py
python webtext_data.py
curl https://dl.fbaipublicfiles.com/fairseq/data/writingPrompts.tar.gz | tar xvzf -
python writingprompts_data.py
Les données prétraitées seront enregistrées sous data/wikitext , data/webtext et data/writingPrompts .
Clone GPT-2 Modèles utilisant git lfs suivant les instructions fournies par un visage étreint.
git lfs install
git clone https://huggingface.co/gpt2
GPT2 est le plus petit modèle GPT-2. Nous expérimentons également GPT2-Medium et GPT2-grand. GPT2-GARD est utilisé dans l'informatique Mauve, alors veuillez les télécharger également:
git clone https://huggingface.co/gpt2-medium
git clone https://huggingface.co/gpt2-large
Faites une copie de GPT2-Large pour Mauve:
cp -r gpt2-large gpt2-large-mauve
Parce que nous écrivons directement à GPT2-Large, ce qui affectera le calcul Mauve.
Vous pouvez simplement commencer à exécuter des expériences en faisant:
python run.py
Les configurations peuvent être spécifiées manuellement dans run.py Voir un exemple sous if __name__ == '__main__' .
Il existe quelques configurations importantes dans run.py :
Training_Size : La taille des données de formation, nous testons '10K' , '25K' , '50K' et '100K' ; Par défaut, nous utilisons '50K' .
Modèle : il peut s'agir 'gpt2' , 'gpt2-meidum' ou 'gpt2-large' .
Ensemble de données : il peut s'agir "wikitext" , "webtext" ou "writingPrompts" .
Mixing_ratio : Nous recherchons à travers [0.0, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99, 1.0] et choisissons le meilleur mixing_ratio en fonction du score MAUVE Set Set.
Train_batch_size, Accumulation, EVAL_BATCH_SIZE : Ces configurations doivent être déterminées par la plate-forme que vous utilisez. Nous utilisons un seul GPU Tesla V100 (mémoire 32G), et les configurations recommandées dans ce paramètre sont dans run.py
Il y a un dict et trois fonctions dans run.py :
data_sets {} : il enregistre les chemins de données des fichiers de données.
run_no_trainer () : la fonction utilisée pour la formation et l'évaluation des modèles.
run_no_trainer_eval () : la fonction utilisée pour l'évaluation du modèle uniquement.
run_no_trainer_turn_topp () : la fonction utilisée pour régler p.
Outre Run.py , je présente ici les autres scripts Python importants pour la formation et l'évaluation du modèle:
gpt2.py (le fichier le plus essentiel) contient une classe de modèle GPT2MixModel qui implémente notre fonction de perte de mixce .
run_clm_no_trainer.py est le script pour former et évaluer les modèles GPT-2.
run_clm_no_trainer_tune_topp.py est similaire à run_clm_no_trainer.py , sauf qu'il n'est utilisé que pour régler l'hyperparamètre p de l'échantillonnage TOP-P.
metras.py contient les mesures que nous utilisons pour évaluer les générations du modèle.
Les modèles seront enregistrés dans train/ répertoire.
Le nom de chaque répertoire de modèle commence par le DateTime que l'expérience a été exécutée. Dans le cadre du répertoire du modèle, nous enregistrons le meilleur point de contrôle (sélectionné en fonction de Dev Loss).
dev/test.sample , dev/test.sample1 , dev/test.sample2 et dev/test.human sont 3 générations d'échantillonnage non biaisées et du texte humain.
dev/test_results.json Économisez les résultats de perplexité, de diversité et de répétition.
Après le réglage P pour l'échantillonnage TOP-P, dev/test.topp(p=*) sont des générations d'échantillonnage TOP-P avec différentes valeurs de p.
Après avoir calculé Mauve et Coherence (voir la section suivante pour plus de détails), dev/test_mauve_coherence_*.json ont les scores Mauve et Coherence avec différentes longueurs maximales.
Après calcul de Mauve et de cohérence contrôlées (voir la section suivante pour plus de détails), dev/test_controlled_mauve_coherence_*.json sont des scores MAUVE et cohérence contrôlés avec différentes longueurs maximales.
Nous rapportons les scores de 6 mesures dans notre article:
La perplexité est calculée avec la formation / évaluation du modèle (voir run_clm_no_trainer.py ).
La diversité est implémentée par la fonction diversity() dans metrys.py , et elle est également calculée avec la formation / évaluation du modèle en appelant la fonction compute_diversity_repetition() dans run_clm_no_trainer.py . Notez que la répétition est une autre métrique que nous avons mise en œuvre mais n'a pas signalé dans notre article; Il vérifie quel pourcentage du texte est des boucles de répétition et renvoie également la longueur de phrase répétitive.
Mauve et la cohérence sont calculés de manière post-hoc en utilisant des fichiers de génération enregistrés. compute_mauve() et compute_coherence() dans Metrics.py sont deux fonctions d'assistance pour calculer Mauve et Coherence. Ils sont appelés par la fonction compute_mauve_coherence() dans les résultats.py . Pour utiliser compute_mauve_coherence() , vous devez d'abord préparer les modèles.json pour spécifier les noms de répertoire de modèle pour l'évaluation.
De même, la mauve contrôlée et la cohérence contrôlée peuvent également être calculées de manière post-hoc par la fonction compute_controlled_mauve_coherence() dans les résultats.py .
| Ensemble de données | Taille du modèle | Taille des données de formation | Objectif | Nom du moyeu de visage étreint |
|---|---|---|---|---|
| wikitext | gpt2-grand | 50k | Mle | shiyue / wikitext_train50k_gpt2-Large_mix1.0 |
| wikitext | gpt2-grand | 50k | Mixce (ETA = 0,1) | shiyue / wikitext_train50k_gpt2-Large_mix0.1 |
| webtext | gpt2-grand | 50k | Mle | shiyue / webtext_train50k_gpt2-Large_mix1.0 |
| webtext | gpt2-grand | 50k | Mixce (ETA = 0,3) | shiyue / webtext_train50k_gpt2-Large_mix0.3 |
| Écriture | gpt2-grand | 50k | Mle | Shiyue / WritingPrompts_Train50K_GPT2-LARGE_MIX1.0 |
| Écriture | gpt2-grand | 50k | Mixce (ETA = 0,7) | Shiyue / WritingPrompts_Train50K_GPT2-LARGE_MIX0.7 |
Essayez les modèles pré-étendus de la manière suivante:
>>> from gpt2 import GPT2MIXModel
>>> from transformers import GPT2Tokenizer
>>> model = GPT2MIXModel.from_pretrained("shiyue/wikitext_train50K_gpt2-large_mix1.0")
>>> tokenizer = GPT2Tokenizer.from_pretrained('shiyue/wikitext_train50K_gpt2-large_mix1.0')
>>> text = "Hey, how are you?"
>>> encoded_input = tokenizer(text, return_tensors='pt')
>>> model.eval()
>>> out_ids = model.lm.generate(inputs=encoded_input["input_ids"], max_length=50, do_sample=True)
>>> print(tokenizer.batch_decode(out_ids, skip_special_tokens=True))
Nous ❤️ contributions.
Avez-vous eu une bonne expérience avec ce projet? Pourquoi ne pas partager un code d'amour et contribuer, ou tout simplement nous faire part des problèmes que vous avez eu avec?
Nous accueillons ici des rapports de problèmes; Assurez-vous de choisir le modèle de problème approprié pour votre problème, afin que nous puissions être sûrs de nous fournir les informations nécessaires.
Avant d'envoyer une demande de traction, assurez-vous de lire nos directives de contribution.
Les deux fichiers suivants sont empruntés et adoptés au référentiel transformers , et conservent donc leurs droits d'auteur d'origine.
Ceci est initialement choisi sur https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm_no_trainer.py. En plus, nous avons appliqué les modifications suivantes:
--test_file--reduction--mixing_ratio--max_length--prompt_length--eval_prompt_length--cache_dir--do_train--do_evalpush_to_hub ".DataCollatorWithPadding collateur par défaut au lieu du collor par défaut.do_eval ", dont la plupart entrent dans la nouvelle fonction ' evaluate() '. Ce fichier est en outre modifié à partir de run_clm_no_trainer.py (voir ci-dessus) en modifiant comment la fonction generate() est invoquée pour activer l'option pour top_p .
Ce projet a adopté un code de conduite. Si vous avez des préoccupations concernant le code ou le comportement que vous avez connu dans le projet, veuillez nous contacter à [email protected].