Aide

Besoin d’aide ?

Posez votre question sur le Discord de MiniLab, dans le salon de cette page :

#questions-generation

Ouvrir le salon ↗

Pas encore membre ? Rejoindre le Discord, puis revenez sur ce bouton.

Ma progression

Sauvegarder ma progression

Chargement…

Votre progression est enregistrée dans ce navigateur, pour cette adresse seulement. Gardez ce code : il la restaure dans un autre navigateur, sur un autre ordinateur, ou si les données du site ont été effacées.

MINILAB-0-1C
Mentions légales
Affichage

Personnaliser l’affichage

Ce réglage s’applique à la vue côte à côte.
LEÇON 09FONDAMENTAL

Sampling et décodage.

Dans la leçon précédente, le modèle a fini son travail de calcul : la tête de langage et softmax lui ont donné une probabilité pour chaque token du vocabulaire. Mais une liste de pourcentages n’est toujours pas un texte. Il faut maintenant choisir un token, l’écrire, puis recommencer, encore et encore, jusqu’à décider de s’arrêter. Cette étape, qui semble anodine, change énormément la qualité des réponses. C’est elle que règlent les paramètres que vous croiserez dans toutes les API : température, top-k, top-p, seed ou max_tokens.

01

Prédire, choisir, ajouter, recommencer

Vous l’avez découvert à la leçon 04 : un modèle de langage écrit un token à la fois. Il prédit une distribution, choisit un token, l’ajoute au texte, puis repart de ce texte un peu plus long. Cette boucle s’appelle la génération autorégressive (autoregressive generation) : chaque token produit devient une entrée pour le suivant.

La boucle de génération
texte = prompt
répéter :
    probabilités = modèle(texte)       # leçons 01 à 08
    token = choisir(probabilités)       # cette leçon
    texte = texte + token
    si on doit s’arrêter : sortir

La façon de choisir s’appelle la stratégie de décodage (decoding strategy). Le modèle ne décide rien à ce stade : il a déjà donné ses probabilités. C’est un petit algorithme, autour du modèle, qui fait le choix.

02

Toujours le favori : le décodage glouton

La stratégie la plus simple consiste à prendre à chaque fois le token le plus probable, celui que l’on note argmax. C’est le décodage glouton (greedy decoding), celui de la leçon 04. Il est déterministe : le même prompt donne toujours exactement la même réponse.

Son défaut est célèbre : il tourne en rond. Partez de « Phileas Fogg » avec notre modèle par comptage, et le glouton écrit :

Décodage glouton, contexte de 3 caractères
Phileas Fogg et de la partout de la partout de la partout de la partout…

Chaque choix, pris isolément, est le meilleur. Mais une fois entré dans « de la partout », le modèle retombe toujours sur les mêmes favoris. Les grands modèles souffrent du même travers, en plus subtil : des réponses plates, répétitives, toujours formulées pareil. Une variante, la recherche en faisceau (beam search), suit plusieurs pistes à la fois pour trouver la phrase la plus probable dans son ensemble ; elle reste utile en traduction, mais elle est rarement utilisée pour les conversations.

03

Tirer au sort : le sampling

L’autre approche est de tirer au sort le token, en respectant les probabilités. Imaginez une roue de loterie où chaque token occupe une part proportionnelle à sa probabilité : le « e », à 24 %, prend presque un quart de la roue ; un token à 1 % n’en a qu’une fine tranche. On lance la roue, et on écrit le token sur lequel elle s’arrête. C’est l’échantillonnage, en anglais sampling.

Le texte devient plus varié et plus naturel, mais deux lancers donnent deux réponses différentes. Pour pouvoir reproduire un résultat, on fixe la graine du générateur aléatoire, la seed : avec la même seed, le même prompt et les mêmes réglages, on retrouve le même tirage. L’API d’OpenAI propose d’ailleurs un paramètre seed dans ce but, sans garantir une reproductibilité parfaite.

04

La température : régler l’audace

Avant le tirage, on peut déformer la distribution. Le réglage le plus connu est la température (temperature), notée T. On divise chaque logit par T avant softmax. Une température basse creuse les écarts : le favori devient écrasant. Une température haute les aplatit : les outsiders reprennent des chances.

Après « Passepar » (contexte d’un caractère : « r »)
                 e      espace    a
T = 0,5  →     52 %     17 %    10 %    plus sûr
T = 1    →     24 %     14 %    10 %    la distribution d’origine
T = 1,5  →     15 %     10 %     9 %    plus audacieux

Pourquoi une température basse creuse-t-elle les écarts ? Diviser les logits par 0,5 revient à les multiplier par 2 : tous les écarts entre les notes doublent avant de passer dans l’exponentielle de softmax, qui les accentue encore. Le « e » passe ainsi de 24 % à 52 %. À l’inverse, diviser par 1,5 resserre les notes, et la distribution s’aplatit.

Quand T se rapproche de 0, le favori prend tout : on retrouve le décodage glouton. Et comme on ne peut pas diviser par zéro, le code traite T = 0 à part : il bascule directement sur le décodage glouton (argmax). Quand T grandit, le texte devient créatif, puis incohérent. À T = 2, notre modèle invente des mots comme « impagnal » ou « apportish ». Dans l’API d’OpenAI, la température va de 0 à 2 : une valeur basse convient aux réponses factuelles ou au code, une valeur plus haute à l’écriture créative.

05

Couper la longue traîne : top-k et top-p

Même improbables, les dizaines de tokens en bas du classement finissent par être tirés de temps en temps, et chacun de ces accidents peut faire dérailler la suite. On appelle cet ensemble de petits candidats la longue traîne (long tail). Deux réglages la coupent avant le tirage, puis redistribuent les probabilités entre les tokens restants pour que le total refasse 100 %.

Le top-k garde seulement les k tokens les plus probables. Avec k = 3, après « r », il ne reste que « e », l’espace et « a », qui pesaient 24 %, 14 % et 10 %. Ensemble, ils ne totalisent qu’environ 48 % de la roue. On les renormalise : on divise chaque probabilité par ce total de 48 %, pour que les trois survivants se partagent à nouveau 100 %. On obtient 50 %, 28 % et 22 %.

Top-k, k = 3, après « r »
          avant    ÷ 48 %    après
e         24 %   →          50 %
espace    14 %   →          28 %
a         10 %   →          22 %
          ────               ────
          48 %              100 %

Le top-p, ou échantillonnage par noyau (nucleus sampling), garde les meilleurs tokens jusqu’à ce que leurs probabilités cumulées atteignent p. Avec p = 0,5, les trois premiers tokens ne cumulent que 24 + 14 + 10 = 48 % : c’est encore sous le seuil. Il faut donc inclure le 4e, le « i » à 8 %, pour atteindre et dépasser 50 % (environ 56 % au total). On coupe alors après ces 4 tokens, puis on renormalise : le « e » passe à 43 %. Son avantage : il s’adapte. Quand le modèle est sûr de lui, le noyau est petit ; quand il hésite, le noyau s’élargit. OpenAI recommande en général de régler soit la température, soit top-p, mais pas les deux à la fois.

Vous croiserez aussi des pénalités de répétition, comme frequency_penalty et presence_penalty chez OpenAI : elles baissent les logits des tokens déjà écrits, pour limiter les redites du décodage glouton.

Tous ces réglages s’enchaînent toujours dans le même ordre, à chaque token généré :

Logits→Division par T→Softmax→Filtre top-k / top-p→Renormalisation→Tirage
06

Savoir s’arrêter

La boucle pourrait tourner sans fin. Trois mécanismes l’arrêtent. D’abord, un token de fin (end-of-sequence, ou EOS) : un token spécial du vocabulaire que le modèle a appris à produire quand sa réponse est terminée. Chez GPT-2, il s’écrit <|endoftext|>. Ensuite, une limite de longueur, max_tokens : au-delà, on coupe, même au milieu d’une phrase. Enfin, des séquences d’arrêt (stop sequences), des textes choisis par le développeur qui interrompent la génération dès qu’ils apparaissent.

Les API indiquent toujours pourquoi la génération s’est arrêtée. Chez OpenAI, le champ finish_reason vaut stop pour un arrêt naturel ou une séquence d’arrêt, et length quand la limite de tokens a coupé la réponse. Notre modèle par comptage n’a pas de token de fin : le laboratoire utilise le point comme séquence d’arrêt, avec une limite de 80 tokens.

07

Observez par vous-même

Dans le laboratoire, tapez Phileas Fogg (avec l’espace final). Le laboratoire génère une suite avec une température de 0,8 et un top-p de 0,9, et affiche à côté le résultat du décodage glouton : la boucle « de la partout » saute aux yeux.

Changez la seed : le texte change, mais revient à l’identique si vous reprenez une seed déjà essayée. Montez la température à 2, puis descendez-la à 0 : vous retrouvez exactement le texte glouton. Enfin, observez la carte de la distribution : avec top-p, les tokens grisés ne peuvent plus être tirés.

08

Les limites de notre exemple

Notre laboratoire tire ses tokens dans le modèle par comptage de la leçon 04, car notre Transformer de démonstration n’est pas entraîné : ses tirages seraient du pur hasard. Avec seulement quelques caractères de contexte, le texte ressemble à du Jules Verne de loin, mais n’a pas de sens. Les réglages, eux, agissent exactement comme dans un vrai LLM.

Vous connaissez maintenant tout le chemin d’un token, de l’entrée du modèle jusqu’au texte généré. Mais une question est restée en suspens depuis la leçon 03 : tous nos poids sont « non entraînés ». D’où viennent les vrais poids, ceux qui font qu’un modèle sait écrire ? C’est le sujet de la prochaine leçon : l’entraînement, ou comment le modèle apprend ses poids à partir de ses propres erreurs.

À retenir

La génération est autorégressive : à chaque étape, le modèle donne une distribution, une stratégie de décodage choisit un token, puis on recommence avec le texte allongé. Le décodage glouton (argmax) est déterministe mais répétitif ; le sampling tire au sort selon les probabilités, de façon reproductible avec une seed.

La température divise les logits par T avant softmax, selon p = softmax(logits ÷ T) : une température inférieure à 1 concentre la distribution sur les favoris, une température supérieure à 1 l’aplatit, et une température nulle redonne le décodage glouton. Dans l’API d’OpenAI, elle se règle de 0 à 2. Top-k garde les k meilleurs tokens ; top-p (nucleus sampling) garde le plus petit ensemble dont la probabilité cumulée atteint p ; dans les deux cas, on renormalise. La génération s’arrête sur un token de fin (EOS), une séquence d’arrêt ou max_tokens, ce que signale finish_reason (stop ou length).

Référence de l’API Chat Completions : temperature, top_p, seed, stop · OpenAI ↗
How to generate text: using different decoding methods · Hugging Face ↗

VÉRIFIER SES CONNAISSANCES

Valider cette étape

Répondez aux trois questions pour débloquer la suite. Vous pouvez réessayer autant de fois que nécessaire.

Chargement de la progression…

Mise en ligne le

ESPACE DE PRATIQUE

Le laboratoire

Réglez le tirage et regardez le texte s’écrire.

● EN DIRECT
01

Votre texte

MODIFIABLE
02

Les réglages du décodage

Les mêmes paramètres que dans les API des grands modèles. Le modèle utilisé est le modèle par comptage de la leçon 04.

Génération en cours…

À retenir

Le décodage choisit un token dans la distribution du modèle, puis la boucle recommence. La température déforme la distribution, top-k et top-p coupent la longue traîne, la seed rend le tirage reproductible, et une séquence d’arrêt ou max_tokens termine la génération.

Ce laboratoire tire ses tokens dans le modèle par comptage de la leçon 04, sur Jules Verne. Le texte n’a pas de sens, mais les réglages agissent exactement comme dans un vrai LLM.

05

Pour aller plus loin

Les stratégies de décodage sont des réglages du quotidien pour les développeurs. Ces ressources officielles les détaillent et les comparent.