Pourquoi la même question reçoit une autre réponse
L’échantillonnage est la façon dont un modèle de langage choisit son jeton suivant à partir de ses probabilités. La température et le top-k sont les réglages qui façonnent ce choix. C’est pourquoi la même consigne peut donner un texte différent à chaque fois.
Les nombres du modèle ne changent pas entre deux réponses. Seul le choix change.
À la fin de cette leçon
Remarque
Je peux choisir le jeton suivant par décodage glouton, température et top-k.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Décodage glouton | prendre toujours le jeton le plus probable | |
| Échantillonnage | tirer un jeton au hasard selon sa probabilité | |
| Température | un nombre qui divise les scores avant le softmax | 0.5 |
| Top-k | garder seulement les k jetons les plus probables | k = 2 |
| Graine | un nombre de départ qui fait se répéter les tirages | |
| Consigne | le texte que le modèle prolonge (prompt en anglais) |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le décodage glouton prend toujours le premier jeton
Après « le bus est », notre modèle inventé donne des scores à quatre mots suivants. Le softmax les change en probabilités.
Le décodage glouton prend toujours le jeton le plus probable, ici plein. Il donne le même texte à chaque fois. Sur un long texte, il finit souvent par se répéter, car l’étape la plus probable peut ramener au même endroit.
Exemple travaillé : des scores aux probabilités
| Mot suivant | Score | e puissance le score | Probabilité |
|---|---|---|---|
| plein | 3 | 20,09 | 0,644 |
| parti | 2 | 7,39 | 0,237 |
| ici | 1 | 2,72 | 0,087 |
| bleu | 0 | 1,00 | 0,032 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La température durcit ou aplatit le choix
L’échantillonnage tire un jeton au hasard, chacun selon sa probabilité. Plein sort donc environ 64 fois sur 100, et bleu environ 3 fois.
La température change d’abord ces chances. On divise chaque score par elle, puis on applique le softmax. Sous 1, le premier jeton devient encore plus probable. Au-dessus de 1, les chances s’égalisent et les mots rares sortent plus souvent.
Exemple travaillé : trois températures
| Mot suivant | Température 0,5 | Température 1 | Température 2 |
|---|---|---|---|
| plein | 0,865 | 0,644 | 0,455 |
| parti | 0,117 | 0,237 | 0,276 |
| ici | 0,016 | 0,087 | 0,167 |
| bleu | 0,002 | 0,032 | 0,102 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Mille tirages à deux températures
docker exec jupyter python3 -c "import numpy as np; s = np.array([3, 2, 1, 0]); print([np.bincount(np.random.default_rng(7).choice(4, size=1000, p=np.exp(s / t) / np.exp(s / t).sum()), minlength=4).tolist() for t in (1.0, 0.5)])"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le top-k et la graine
Le top-k garde seulement les k jetons les plus probables et répartit de nouveau leurs chances pour qu’elles fassent 1. Avec k = 2, ici et bleu ne peuvent jamais sortir.
Un tirage au hasard part d’une graine. La même graine donne les mêmes tirages, une nouvelle graine en donne d’autres. Voilà pourquoi une consigne peut donner des textes différents, et pourquoi une graine fixe rend un test répétable.
Exemple travaillé : top 2 à température 1
| Mot suivant | Probabilité | Gardé ? | Réparti de nouveau |
|---|---|---|---|
| plein | 0,644 | oui | 0,644 / 0,881 = 0,731 |
| parti | 0,237 | oui | 0,237 / 0,881 = 0,269 |
| ici | 0,087 | non | 0 |
| bleu | 0,032 | non | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Échantillonner avec une température et une graine
import math
import random
mots = ["plein", "parti", "ici", "bleu"]
scores = [3, 2, 1, 0] # les scores du modèle après « le bus est »
temperature = 1.0
graine = 1
puissances = []
for s in scores:
puissances.append(math.exp(s / temperature))
total = sum(puissances)
probas = []
for p in puissances:
probas.append(p / total)
print("probabilités :", [round(p, 3) for p in probas])
random.seed(graine)
tirages = random.choices(mots, weights=probas, k=8)
print("huit tirages :", tirages)
# Mettez graine à 2, puis cliquez sur Exécuter : autres tirages, mêmes probabilités.
# Puis mettez temperature à 0.3. Que deviennent les tirages ?
Une erreur fréquente
Attention
Beaucoup pensent qu’un modèle donne une nouvelle réponse parce qu’il a changé d’avis ou appris de vous. Ses nombres sont les mêmes. La différence vient du tirage au hasard, donc une graine fixe et les mêmes réglages donnent le même texte.