Code source pour le papier ACL 2022 "Cohérence Boosting: lorsque votre modèle de langue pré-entraîné ne fait pas suffisamment attention" (Arxiv, ACL Anthology)
La cohérence sémantique à longue portée reste un défi dans la génération et la compréhension automatique des langues. Nous démontrons que les modèles de grandes langues ont insuffisamment appris l'effet de mots éloignés sur la prédiction des suivants. Nous présentons une augmentation de la cohérence , une procédure d'inférence qui augmente l'accent d'un LM sur un contexte long. Nous montrons les avantages de l'amélioration de la cohérence avec les modèles pré-entraînés par des analyses de distribution des réponses de texte et de dialogue ordinaires générés. On constate également que le renforcement de la cohérence avec les modèles de pointe pour diverses tâches NLP à tirs zéro fournit des gains de performance sans formation supplémentaire.
Si vous trouvez le papier et le code utiles, veuillez jouer avec cette rémission et citer le papier. Merci beaucoup!
@inproceedings { malkin-etal-2022-coherence , title = " Coherence boosting: When your pretrained language model is not paying enough attention " , author = " Malkin, Nikolay and Wang, Zhen and Jojic, Nebojsa " , booktitle = " Proceedings of the 60th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers) " , month = may, year = " 2022 " , address = " Dublin, Ireland " , publisher = " Association for Computational Linguistics " , url = " https://aclanthology.org/2022.acl-long.565 " , doi = " 10.18653/v1/2022.acl-long.565 " , pages = " 8214--8236 " }Nous présentons un programme de démonstration pour démontrer le manque de cohérence sur le LMS pré-formé existant, c'est-à-dire, à ne pas prédire sur le jet suivant étant donné un contexte, qui nécessite clairement la compréhension des mots éloignés. De telles erreurs peuvent être résolues par notre proposition de cohérence , qui prédit contrastement le jeton suivant par le mélange log-linéaire deux distributions à partir du contexte complet et un contexte partiel.
> >> from cb_demo import contrasting > >> contrasting ( model_name = 'gpt2' , context = ' Ballad metre is "less regular and more conversational" than common metre' , - - partial_length = 8 , - - alpha = 0.5 ) [ out ] Top tokens based on full context : Ballad metre is "less regular and more conversational" than common Rank Tokens Logprobs Probs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 Ġsense - 2.405 9.03 % 2 Ġin - 3.900 2.02 % 3 . - 3.978 1.87 % 4 , - 4.097 1.66 % 5 Ġpractice - 4.287 1.37 % ... ... ... ... 13 Ġmetre ** - 5.098 0.610609 % * * Target Token Top tokens based on partial context : regular and more conversational " than common Rank Tokens Logprobs Probs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 Ġsense - 2.547 7.83 % 2 ĠEnglish - 3.352 3.50 % 3 . - 3.427 3.25 % 4 Ġconversation - 3.445 3.19 % 5 , - 3.634 2.64 % ... ... ... ... 14103 Ġmetre ** - 13.450 0.000144 % * * Target Token Contrastive next token prediction : Rank Tokens Logprobs Probs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 Ġmetre ** - 0.923 39.74 % 2 Ġsense - 2.334 9.69 % 3 Ġmeter - 2.785 6.17 % 4 Ġin - 3.210 4.03 % 5 Ġfoot - 3.220 3.99 % * * Target TokenVous pouvez reproduire les résultats pour certains exemples de la figure 1 du papier par le code suivant:
python cb_demo . py - - context = ' Ballad metre is "less regular and more conversational" than common metre' - - model_name = 'gpt2' - - partial_length = 8 - - alpha = 0.5 python cb_demo . py - - context = ' Isley Brewing Company: Going Mintal — a minty milk chocolate stout' - - model_name = 'gpt2' - - partial_length = 8 - - alpha = 0.5 python cb_demo . py - - context = ' Other times anxiety is not as easy to see, but can still be just as debilitating' - - model_name = 'gpt2' - - partial_length = 8 - - alpha = 0.5La tâche de lambada est similaire aux exemples indiqués ci-dessus où le modèle devrait prédire le dernier mot dans les passages de plusieurs phrases. Cet ensemble de données est une référence standard pour évaluer les modèles Langauge modernes (exemple).
Plus important encore, cette tâche nécessite explicitement le raisonnement sur un contexte large: les humains peuvent deviner de manière fiable le dernier mot lorsqu'il est donné un passage entier, mais pas lorsqu'on lui donne la dernière phrase. Une telle propriété fait de cette référence un banc d'essai parfait pour évaluer l'efficacité de notre augmentation de la cohérence proposée.
Pour exécuter les expériences de Lambada, exécutez simplement la commande suivante:
python main . py - - tasks = 'lambada' - - models = 'gpt2-small' - - use_val = False - - alpha_start = 1 - - alpha_end = 1 - - alpha_step = 0.1 - - slen_start = 10 - - slen_end = 10Certains arguments importants sont répertoriés comme suit, veuillez utiliser python main.py --help .
--models : le nom des modèles de langage pré-formés, séparés par semicolon si vous souhaitez exécuter plusieurs modèles en même temps, par exemple, 'gpt2-small;gpt2-medium' ; Si vous souhaitez utiliser les modèles GPT-3, consultez les notes sur GPT-3.--use_val : s'il faut utiliser un ensemble de validation pour sélectionner deux hyperparamètres, alpha et slen représentant le coefficient de renforcement et la longueur pour le contexte partielalpha --alpha_start --alpha_end , --alpha_step--slen_start --slen_end --slen_step slen hyperparamètre; Notez que les deux configurations d'hyperparamètre influencent la vitesse d'inférence pour la tâche LambadaNous évaluons le renforcement de la cohérence proposée sur les tâches NLU suivantes.
| Tâche | étroite | Question de tâche Répondre à | la classification du texte | NLI | FACT CONNAISSANCES |
|---|---|---|---|---|---|
| Dataset | de récupération de la connaissanceStoryCloze Hellaswag Copa | communeseqa Openbookqa Arc facile / défi Piqa | sst-2/5 Trec Agnews | rte Cb Boolq | Lama |
La plupart des ensembles de données peuvent être chargés par les ensembles de données de Hugginface; Seuls quelques-uns nécessitent un téléchargement manuellement avec des instructions invitées lorsque vous exécutez le code.
Pour exécuter les expériences NLU, exécutez simplement la commande suivante:
python main . py - - tasks = 'storycloze;csqa;openbookqa' - - models = 'gpt2-small;gpt2-medium;gpt2-large' - - alpha_start = 2 - - alpha_end = - 3 - - alpha_step = 0.01Certains arguments importants sont répertoriés comme suit, veuillez utiliser python main.py --help .
--models : le nom des modèles de langage pré 'gpt2-small;gpt2-medium' formésalpha slen --use_val--alpha_start --alpha_end --alpha_step : Paramètres de recherche de la grille pour l'hyperparamètre alpha ; Notez que le code cache les résultats intermédiaires et que vous êtes libre de modifier ces paramètres après avoir exécuté l'inférence pourapi_key.txtEn plus des tâches précédentes, notre base de code est suffisamment flexible pour incorporer tout nouvel ensemble de données multi-choix avec des efforts miniaux (inspiré par le projet open-source, LM-Evaluation-Harness). Il y a environ trois étapes:
__init__.py dans le dossier tasks .MultipleChoiceTask avec des fonctions de prétraitement des données (par exemple, load_data , standardize )get_contrast_ctx , qui est où vous définissez votre propre invite sans prémisse pour la cohérence de la cohérence,recherchez les autres classes de tâches comme exemples et veuillez vous sentir gratuit pour nous faire savoir si vous portez des problèmes lorsque vous adoptez notre code.
Nous fournissons un modèle de modèle de génération compatible avec la bibliothèque transformers HuggingFace dans generation/generation.py . Vous pouvez créer des variantes obligées de cohérence de tout LM autorégressif en utilisant la classe dans l'exemple de script:
> >> boosted_model = generation . BoostedModel ( base_model , k = 8 , alpha_long = 1.5 , alpha_short = - 0.5 )Le boosted_model peut ensuite être utilisé de manière flexible avec la fonction generate ,
> >> ins = T . LongTensor ([ tokenizer . encode ( 'Once upon a midnight dreary,' )]) > >> outputs = boosted_model . generate ( input_ids = ins , do_sample = True , max_length = 100 , top_p = 0.95 ) > >> tokenizer . decode ( outputs [ 0 ]) "Once upon a midnight dreary, while I pondered over these things, I suddenly became aware of a strange and terrible noise. I turned round, and saw that the old man was standing near me. He was wearing a black suit, with a black tie, and a black hat. He had a long, thin, black beard, and his eyes were black. His hair was of a dark brown colour, and was very long. His face was rather large, and his lips were somewhat". Adapté aux scénarios dans lesquels le contexte court est le texte actuellement généré moins un préfixe d'une certaine longueur ( par exemple , le virage précédent dans une conversation) en définissant dynamiquement boosted_model.k à la longueur du préfixe négatif.
Nous présentons quelques sorties de génération conditionnelle. Les mesures d'évaluation montrées dans le tableau 1 peuvent être évaluées à l'aide du code de ce référentiel pour les quatre premières colonnes ou en utilisant le code ici pour les nouvelles mesures de cohérence à longue portée que nous avons introduites.
si vous avez des questions, n'hésitez pas à contacter Kolya (nikolay.malkin à mila.quebec) et Zhen (Wang.9215 à OSU.edu).