Recherche de site Web

Paradigme d'apprentissage basé sur les invites en TAL


Introduction

Le NLP basé sur les prompts est l'un des sujets les plus en vogue dans le domaine du traitement du langage naturel dont on parle ces jours-ci. Et il y a une raison solide à cela : l'apprentissage basé sur les prompts fonctionne en utilisant les connaissances acquises par les modèles de langage pré-entraînés sur une grande quantité de données textuelles pour résoudre divers types de tâches en aval telles que la classification de texte, la traduction automatique, la détection d'entités nommées, le résumé de texte, etc. Et cela aussi sous la contrainte assouplie de ne pas disposer de données spécifiques à la tâche au départ. Contrairement au paradigme traditionnel de l'apprentissage supervisé, où nous entraînons un modèle pour apprendre une fonction qui associe l'entrée x à la sortie y, ici l'idée repose sur des modèles de langage qui modélisent directement la probabilité du texte.

Certaines des questions intéressantes que vous pouvez poser ici sont : Puis-je utiliser GPT pour faire de la traduction automatique ? Puis-je utiliser BERT pour faire la classification des sentiments ? et tout cela sans avoir à les entraîner spécifiquement pour ces tâches. Et c'est exactement là que le NLP basé sur les prompts vient à la rescousse. Ainsi, dans ce blog, nous tenterons de résumer certains segments initiaux de ce document exhaustif et magnifiquement rédigé - Pré-entraîner, Provoquer, et Prédire : Une étude systématique des méthodes de prompt dans le traitement du langage naturel. Dans ce blog, nous discutons des différents types de paradigmes d'apprentissage présents en TAL, des notations souvent utilisées dans le paradigme basé sur les invites, des applications de démonstration de l'apprentissage basé sur les invites, et examinons certaines des considérations de conception à prendre en compte lors de la conception d'un environnement d'invites. Ce blog est la partie 1 d'une série de 3 blogs qui suivra bientôt, discutant d'autres détails tirés de l'article, comme les défis d'un tel système, l'apprentissage de la conception automatique des invites, etc.

Évolution de l'espace d'apprentissage du traitement du langage naturel

  • Paradigme 1 : Entièrement supervisé (réseaux non neuronaux) — C'étaient les premiers jours où le TF-IDF et d'autres caractéristiques conçues manuellement avec des machines à vecteurs de support, des arbres de décision, des k-plus proches voisins, etc., étaient considérés comme à la mode
  • Paradigme 2 : Entièrement supervisé (réseaux neuronaux) — Le calcul est devenu un peu moins coûteux, et la recherche sur les réseaux neuronaux a enfin progressé. C’était l’époque où l’utilisation de Word2Vec avec la mémoire à long terme (LSTM), d’autres architectures de réseaux neuronaux profonds, etc., est devenue populaire.
  • Paradigme 3 : Pré-entraîner, Affiner — À partir d'environ 2017 jusqu'à aujourd'hui, ce sont les périodes où l'affinement des modèles pré-entraînés comme BERT, CNN, etc., sur des tâches spécifiques était la méthodologie la plus populaire.
  • Paradigme 4 : Pré-entraînement, Invite, Prédiction — Depuis l'année dernière, tout le monde parle du NLP basé sur les invites. Contrairement au paradigme d'apprentissage précédent, où nous essayions de pousser le modèle à s'adapter aux données, ici nous essayons d'adapter les données pour qu'elles correspondent au modèle pré-entraîné.

Paradigmes dans l'espace d'apprentissage du TAL| Source : https://arxiv.org/pdf/2107.13586v1.pdf

Jusqu'à Paradigm3 : Pré-entraîner, Ajuster finement, l'utilisation des modèles de langage comme modèle de base pour presque toutes les tâches n'existait pas. C'est pourquoi nous ne voyons pas de flèche sous la colonne « Relation de tâche » dans la figure ci-dessus parmi les cases. De plus, comme discuté ci-dessus, avec l'apprentissage basé sur les prompts, l'idée est de concevoir l'entrée pour s'adapter au modèle. Cela est également illustré dans le tableau ci-dessus avec des flèches entrants vers LM (Modèle de Langage), où les tâches sont CLS (Classification), TAG (Étiquetage), GEN (Génération).

Notations de l'invite

Comme on peut le voir dans la figure ci-dessous, nous commençons avec l'entrée (x) (disons une critique de film), et la sortie attendue (y). La première tâche consiste à reformater cette entrée en utilisant une fonction de prompt (mentionnée Fprompt dans l'image), dont la sortie est notée (x’). Ensuite, c’est la tâche de notre modèle de langage de prédire les valeurs z à la place de l'espace réservé Z. Puis, pour les prompts où l'emplacement Z est rempli par une réponse, nous l'appelons Filled prompt, et si cette réponse est correcte, nous l'appelons Answered prompt.

Terminologie dans l'incitation | Source : https://arxiv.org/pdf/2107.13586v1.pdf

Applications

Certaines des applications populaires de ce paradigme sont la génération de texte, la réponse aux questions, le raisonnement, la reconnaissance d'entités nommées, l'extraction de relations, la classification de texte, etc.

  • Génération de texte - La génération de texte consiste à générer du texte, généralement en fonction d'une autre information. Avec l'utilisation de modèles entraînés dans un cadre auto-régressif, la tâche de génération de texte devient naturelle. Souvent, les invites conçues sont de nature préfixée avec un jeton déclencheur servant d'indice pour que le modèle commence le processus de génération.

  • Réponse aux questions - La réponse aux questions (QA) vise à répondre à une question donnée, souvent basée sur un document contextuel. Par exemple - étant donné un passage d'entrée, si nous voulons obtenir tous les noms mentionnés dans le passage, nous pouvons formuler notre requête de la manière suivante : « Générez tous les noms de personnes mentionnés dans le passage ci-dessus. » Notre modèle se comporte maintenant de manière similaire à la génération de texte, où la question devient le préfixe.

  • Reconnaissance d'entités nommées - La reconnaissance d'entités nommées (REN) est une tâche consistant à identifier des entités nommées (par exemple, nom de personne, lieu) dans une phrase donnée. Par exemple - si l'entrée est « Prakhar aime jouer au cricket », pour déterminer quel type d'entité est « Prakhar », nous pouvons formuler l'invite comme « Prakhar est une entité Z », et l'espace de réponses Z généré par le modèle de langage pré-entraîné devrait être personne, organisation, etc., « personne » ayant la probabilité la plus élevée.

  • Extraction de relations - L'extraction de relations est la tâche consistant à prédire la relation entre deux entités dans une phrase donnée. Cette explication vidéo parle de la modélisation de la tâche d'extraction de relations comme une tâche d'inférence en langage naturel en utilisant un modèle de langage pré-entraîné dans un cadre zéro-shot.

  • Classification de texte - La classification de texte est la tâche qui consiste à attribuer une étiquette prédéfinie à un texte donné. Le prompt possible pour cette tâche pourrait être « le sujet de ce document est Z. », qui est ensuite utilisé dans des modèles de langage pré-entraînés avec masque pour le remplissage des emplacements.

Disponible après avoir obtenu l'accès à l'API GPT-3 Le 18 novembre 2021, OpenAI a annoncé la disponibilité élargie de son service OpenAI API, ce qui permet…

Démo

Nous allons utiliser OpenPrompt - Un cadre open-source pour l'apprentissage par prompts pour coder un cas d'utilisation de classification de texte basé sur des prompts. Il prend en charge les modèles de langage pré-entraînés et les tokenizeurs de HuggingFace Transformers.

Vous pouvez installer la bibliothèque avec une simple commande pip comme montré ci-dessous -

>> pip install openprompt

Nous simulons un problème à 2 classes avec classes étant sport et santé. Nous définissons également trois exemples d'entrée pour lesquels nous souhaitons obtenir les étiquettes de classification.

from openprompt.data_utils import InputExample
classes = [
    "Sports",
    "Health"
]
dataset = [
    InputExample(
        guid = 0,
        text_a = "Cricket is a really popular sport in India.",
    ),
    InputExample(
        guid = 1,
        text_a = "Coronavirus is an infectious disease.",
    ),
    InputExample(
        guid = 2,
        text_a = "It's common to get hurt while doing stunts.",
    )
]

Définir des exemples d'entrée

Ensuite, nous chargeons notre modèle de langage et nous choisissons RoBERTa pour nos besoins.

from openprompt.plms import load_plm
plm, tokenizer, model_config, WrapperClass = load_plm("roberta", "roberta-base")

Chargement des modèles de langage pré-entraînés

Ensuite, nous définissons notre modèle qui nous permet d'insérer notre exemple d'entrée stocké dans la variable « text_a » de manière dynamique. Le jeton {« mask »} est ce que le modèle complète. N'hésitez pas à consulter Comment écrire un modèle ? pour des étapes plus détaillées sur la conception du vôtre.

from openprompt.prompts import ManualTemplate
promptTemplate = ManualTemplate(
    text = '{"placeholder":"text_a"} It was {"mask"}',
    tokenizer = tokenizer,
)

Définir des modèles

Ensuite, nous définissons le verbaliseur qui nous permet de projeter la prédiction de notre modèle sur nos étiquettes de classe pré-définies. N'hésitez pas à consulter Comment écrire un verbaliseur ? pour des étapes plus détaillées dans la conception du vôtre.

from openprompt.prompts import ManualVerbalizer
promptVerbalizer = ManualVerbalizer(
    classes = classes,
    label_words = {
        "Health": ["Medicine"],
        "Sports": ["Game", "Play"],
    },
    tokenizer = tokenizer,
)

Définir le verbaliseur

Ensuite, nous créons notre modèle d'invite pour la classification en passant les paramètres nécessaires tels que les modèles, le modèle de langage et le verbaliseur.

from openprompt import PromptForClassification
promptModel = PromptForClassification(
    template = promptTemplate,
    plm = plm,
    verbalizer = promptVerbalizer,
)

Ensuite, nous créons notre chargeur de données pour échantillonner des mini-lots à partir d'un ensemble de données.

from openprompt import PromptDataLoader
data_loader = PromptDataLoader(
        dataset = dataset,
        tokenizer = tokenizer,
        template = promptTemplate,
        tokenizer_wrapper_class=WrapperClass,
    )

Définir le Dataloader

Ensuite, nous plaçons notre modèle en mode évaluation et effectuons des prédictions pour chaque exemple d'entrée dans un mode Modèle de langage masqué (MLM).

import torch

promptModel.eval()
with torch.no_grad():
     for batch in data_loader:
         logits = promptModel(batch)
         preds = torch.argmax(logits, dim = -1)
         print(tokenizer.decode(batch['input_ids'][0], skip_special_tokens=True), classes[preds])

Faire des prédictions

L'extrait ci-dessous montre la sortie pour chacun des exemples d'entrée.

>> Cricket is a really popular sport in India. The topic is about Sports
>> Coronavirus is an infectious disease. The topic is about Health
>> It's common to get hurt while doing stunts. The topic is about Health

Prédictions de sortie

Considérations de conception pour l'incitation

Ici, nous discutons de quelques-unes des considérations de conception de base qui peuvent être utilisées lors de la conception de l'environnement d'invite

  1. Choix des modèles pré-entraînés — Il s'agit de l'une des étapes très importantes dans la conception de l'ensemble du système de prompt. L'objectif pré-entraîné et le style d'entraînement déterminent l'adéquation d'un modèle pour une tâche en aval. Par exemple — un objectif de type BERT peut être utilisé pour des tâches de classification mais n'est pas trop adapté aux tâches de génération de texte, tandis que les modèles basés sur une stratégie d'entraînement autoregressive comme GPT conviennent parfaitement aux tâches de génération de langage naturel.
  2. Conception des prompts — Une fois le modèle pré-entraîné fixé, concevoir les prompts/signaux et formater le texte d'entrée de manière à obtenir la réponse souhaitée est à nouveau une tâche très importante. Cela a un effet considérable sur la précision globale du système. Une méthode évidente consiste à créer manuellement ces prompts, mais compte tenu des limites d'une telle méthode, qui est laborieuse et demande beaucoup de temps, il y a eu de nombreuses recherches pour automatiser le processus de génération de prompts. Un exemple de prompt pourrait être, disons X Globalement, c'était un film Z. Ici, X est l'avis (entrée originale), et Z est ce que notre modèle prédit, et l'ensemble de la séquence “gras” est appelée prompt.
  3. Concevoir des réponses — Chaque tâche aura son propre ensemble de marqueurs qui apparaissent couramment dans le corpus spécifique à la tâche. Créer un tel ensemble est également important, puis avoir une fonction de mappage qui traduit ces marqueurs en réponses/étiquettes réelles est une autre chose que nous devons concevoir. Par exemple "****J'adore ce film. Dans l'ensemble, c'était un film Z." Dans cette phrase, le modèle pourrait prédire des mots comme génial, fantastique, très bien, bien, etc., à la place de Z. Et disons que notre tâche est de détecter le sentiment, alors nous devons avoir un mappage de ces mots (très bien, génial, etc.) vers leur étiquette correspondante, c'est-à-dire très positif, disons.
  4. Stratégies d'entraînement basées sur les invites : Il peut y avoir des situations où nous disposons de données d'entraînement pour des tâches en aval. Dans ces cas, nous pouvons élaborer des méthodes pour entraîner les paramètres, soit de l'invite, du LM, ou des deux.

Il est intéressant de voir apparaître un nouveau courant de recherche en PNL traitant de données d'entraînement minimales et utilisant les grands modèles de langage pré-entraînés disponibles. Nous développerons chacune des considérations de conception mentionnées ci-dessus dans les parties suivantes de ce blog.

Références

  1. Pré-entraîner, Inciter et Prédire : Une revue systématique des méthodes d'incitation en traitement du langage naturel