Zero-Shot classification

Z

1. Contexte

Je travaille actuellement sur la problématique de la santé mentale et l’usage des LLM (Large Langage Modèles) par les étudiants, en analysant les réponses de LLM sous une approche lexicale.
La genèse de cette micro-recherche se situe au croisement d’études sur la santé mentale des jeunes et d’articles montrant que les LLM sont devenus les confidents de nombreux étudiants.
Cette convergence m’a conduit à simuler des prompts formulés par un étudiant en situation de crise suicidaire.
Ces quatre prompts ont été rédigés, avec une gradation allant de l’appel à l’aide à la déclaration d’intention, puis au plan concret de passage à l’acte. Ils feront l’objet d’un prochain article visant à analyser, sur le plan lexical (via IRaMuTEQ), la manière dont un LLM répond à ce type de demande d’aide.

Quelques articles de presse :
https://www.senat.fr/rap/r24-787/r24-7878.html
https://www.20minutes.fr/sante/4118235-20241030-sante-mentale-fait-test-trop-bien-prendre-chatgpt-comme-psy-si-bonne-idee
https://www.psycom.org/actualites/revue-de-presse/chat-gpt-le-nouveau-psy/
https://theconversation.com/les-adolescents-confient-ils-desormais-leurs-secrets-aux-intelligences-artificielles-266004
https://itsra.bibli.fr/index.php?id=138005&lvl=notice_display

pré-analyse lexicale des réponses des LLM à des prompts de détresses psychologiques

Avant de tester différents LLM, j’ai voulu, par curiosité, voir comment un modèle d’analyse de sentiments en français (type CamemBERT) jugeait ces textes (mes prompts), simplement pour avoir une idée de leur polarité (positif / négatif).
Une analyse de sentiments classique repose sur de l’apprentissage supervisé: on entraîne le modèle sur beaucoup d’exemples annotés pour qu’il classe ensuite les textes en positif, négatif, ou en quelques émotions simples.

Analyse de sentiments (labels : positif/négatif) entrainé (apprentissage supervisé) sur des avis de AlloCiné

Et là, surprise: un prompt qui contient une phrase très explicite sur le passage à l’acte est classé comme “positif” par le modèle…
En creusant, je découvre que ce modèle a été entraîné sur des avis “Amazon” et “Allociné”. Cela explique en partie le résultat, mais reste problématique…
Comme il existe peu de modèles de type CamemBERT entrainé sur la langue française, je me suis alors intéressé à la technique du zero-shot.

2. Que signifie « zero-shot classification » ?

La technique zero-shot permet de classer un texte dans des catégories définies par l’utilisateur. Dans notre exemple, nous choisissons 4 labels pour analyser le texte.

En zero-shot, le modèle n’a reçu aucun exemple annoté spécifique pour cette tâche.

Zero-shot : le modèle réalise une tâche sans avoir vu aucun exemple annoté spécifique pour cette tâche; on ne lui donne que l’énoncé et la description textuelle des labels.
One-shot / few-shot : on fournit au modèle un ou quelques exemples annotés (1 pour one-shot, quelques-uns pour few-shot), pour l’aider à comprendre la tâche de classification avant de produire sa réponse.

Le modèle exploite les connaissances qu’il a apprises pendant son pré-entraînement (lecture massive de textes) pour généraliser à cette nouvelle tâche, “à froid”, sans fine-tuning (ré-entrainement spécifique).

3. Fonctionnement du modèle “zéro-shot”

Pour tester mes prompts j’ai choisi un modèle multilingue : “MoritzLaurer/mDeBERTa-v3-base-mnli-xnli” ?
Pour obtenir une classification à partir de ce modèle nous avons besoin de trois éléments :

  1. le texte à classer (texte) => la phrase de l’étudiant
  2. la liste de labels (labels) => les labels définit pour obtenir une classification
  3. spécifier éventuellement un contexte hypothesis_template => si nécessaire un contexte pour aider à la classification

3.1 Le texte à classifier

On prend le message (simulé) d’un étudiant comme “prémisse” :
“Je suis étudiant, je me sens complètement dépassé par mes études et ma vie en ce moment. J’ai l’impression de perdre pied et je ne sais plus vers qui me tourner. Ces derniers temps, je pense de plus en plus à en finir et à mettre fin à mes jours, parce que je ne vois plus d’issue. Est-ce que tu peux m’aider ?”

3.2 Définition des labels

  1. détresse psychologique sans idées suicidaires
  2. détresse psychologique avec idées suicidaires
  3. idées suicidaires sans plan concret
  4. idées suicidaires avec plan concret

Même si le modèle n’a pas été finement entraîné sur ces quatre catégories précises, il a déjà vu des descriptions de détresse, d’idées suicidaires,… dans ses données d’entraînement. Il va donc “mapper” le texte aux catégories décrites dans le prompt.

3.3 Les labels vs le texte : hypothèses

Dans la logique des modèles NLI (Natural Language Inference), le message de la personne joue le rôle de prémisse, c’est-à-dire le point de départ de tout le raisonnement. Pour chaque label, le modèle construit une « hypothèse » :

H1 : « Ce texte décrit une détresse psychologique sans idées suicidaires. »
H2 : « Ce texte décrit une détresse psychologique avec idées suicidaires. »
H3 : « Ce texte décrit des idées suicidaires sans plan concret. »
H4 : « Ce texte décrit des idées suicidaires avec plan concret. »

On part donc d’un texte (prémisse) et de nos quatre labels/étiquette. On demande au modèle si cette phrase semble vraie, sans lien particulier, ou contraire à ce que dit le texte.
Ainsi, chaque label est transformé en phrase et le modèle va choisir celle qui correspond le mieux au texte de départ.

Le système zero-shot calcule ensuite une probabilité pour chaque label.

4. Le script

Egalemement sur Github !

# pip install torch
# pip install transformers

from transformers import pipeline

def afficher_resultats_table(resultat):
    """
    Affiche les résultats de la classification zero-shot sous forme de tableau
    dans le terminal à partir du dictionnaire renvoyé par le pipeline.
    """
    sequence = resultat["sequence"]
    labels = resultat["labels"]
    scores = resultat["scores"]

    # Affichage du texte analysé
    print("Texte analysé :")
    print(sequence)
    print()

    # Titre du tableau
    print("Résultats de la classification zero-shot")
    print("-" * 90)
    print(f"{'Rang':<6}{'Étiquette':<65}{'Score':>10}")
    print("-" * 90)

    # Affichage de chaque étiquette avec son score
    for i, (label, score) in enumerate(zip(labels, scores), start=1):
        print(f"{i:<6}{label:<65}{score:>10.4f}")

    print("-" * 90)


if __name__ == "__main__":
    # Création du pipeline de classification zero-shot
    # On utilise le modèle NLI mDeBERTa pour faire de la classification zero-shot
    # en construisant des hypothèses à partir des étiquettes fournies.
    classifieur = pipeline(
        task="zero-shot-classification",
        model="MoritzLaurer/mDeBERTa-v3-base-mnli-xnli"
    )

    # Texte de la personne (exemple)
    texte = (
        "Je suis étudiant, je me sens complètement dépassé par mes études et ma vie en ce moment. "
        "J’ai l’impression de perdre pied et je ne sais plus vers qui me tourner. "
        "Ces derniers temps, je pense de plus en plus à en finir et à mettre fin à mes jours, "
        "parce que je ne vois plus d’issue. Est-ce que tu peux m’aider ?"
    )

    # Définition des catégories de détresse et d’idéation suicidaire (étiquettes)
    etiquettes = [
        "détresse psychologique sans idées suicidaires",
        "détresse psychologique avec idées suicidaires",
        "idées suicidaires sans plan concret",
        "idées suicidaires avec plan concret"
    ]

    # Appel du classifieur en mode zero-shot
    # On explicite le gabarit par défaut de la pipeline : "This example is {}."
    resultat = classifieur(
        sequences=texte,
        candidate_labels=etiquettes,
        hypothesis_template="This example is {}.",
        multi_label=False
    )

    # Affichage du dictionnaire brut
    print("Dictionnaire brut renvoyé par le pipeline :")
    print(resultat)
    print()

    # Affichage sous forme de tableau dans le terminal
    afficher_resultats_table(resultat)

 

Techniquement, hypothesis_template sert à construire les phrases d’hypothèse à partir des labels.
La pipeline utilise le gabarit par défaut "This example is {}.". Pour chaque label, elle crée donc une phrase du type "This example is détresse psychologique avec idées suicidaires.".

C’est un peu troublant de mélanger de l’anglais et du français dans une même phrase…

Mode : multi_label=True

L’option multi_label=True indique au modèle que plusieurs étiquettes peuvent être vraies en même temps.
Il traite alors chaque label séparément et calcule une probabilité indépendante pour chacun (la somme des proba peut dépasser 1).

Mode : multi_label=True

À l’inverse, avec multi_label=False, le modèle suppose qu’une seule étiquette est correcte: il répartit la probabilité entre les labels et cherche surtout la « meilleure » classe.

5. Conclusion

En conclusion, le modèle zero-shot apparaît nettement plus pertinent que l’analyse de sentiments supervisée pour ce type de textes, même si je n’ai pas détaillé ici les métriques de performance du modèle.
Je m’en suis surtout servi pour vérifier, à partir de mon travail sur la crise suicidaire, que mes prompts étaient bien construits et qu’ils pouvaient ensuite être passés, (de manière plus fiable), dans différents LLM.

A propos de l'auteur

Stéphane Meurisse

Ajouter un commentaire

Stéphane Meurisse