Il modello non "ha" la risposta pronta: la costruisce una parola alla volta. Ma come sceglie ogni parola? Lo decidono tre comandi.
Prima il modello assegna una probabilità a ogni parola possibile. Poi questi tre comandi modellano e restringono quella lista, e infine se ne pesca una.
L'ultimo strato della rete non produce probabilità: produce un logit per ogni voce del vocabolario, cioè un punteggio grezzo, positivo o negativo, senza vincoli di somma. Sono tanti quanto il vocabolario del modello: 50 257 per GPT-2, oltre 250 000 per i modelli recenti. È la softmax a trasformarli in una distribuzione di probabilità, ed è dentro la softmax che agisce la temperatura. Top-k e top-p arrivano dopo, e non toccano i punteggi: tagliano la lista.
Rimodella le probabilità prima della scelta. Bassa: la parola più probabile domina → risposte sicure, prevedibili (a volte ripetitive). Alta: appiattisce le differenze → dà una chance anche a parole improbabili → creativo, ma può sbandare in incoerenze e allucinazioni.
Un tetto sul numero di candidati: tiene solo le k parole più probabili e scarta tutte le altre, comunque vada. k=1 → sempre la prima (deterministico). k grande → più varietà possibile.
Un tetto sulla probabilità cumulata: tiene le parole più probabili finché la loro somma raggiunge p, poi taglia tutta la coda. Si adatta: poche parole se una domina, molte se sono equilibrate. Con p=0.9 tieni il "nucleo" che copre il 90%.
L'ordine: la temperatura rimodella, poi top-k e top-p tagliano la lista, infine si pesca a caso tra le superstiti.
L'ordine conta, ed è quello che la demo qui sotto esegue davvero: (1) softmax con temperatura sui logit; (2) top-k sulla distribuzione così rimodellata; (3) top-p sulla lista che resta, sommando le probabilità in ordine decrescente finché il cumulato raggiunge p; (4) rinormalizzazione sulle superstiti e (5) estrazione. Invertire i primi due passi cambia il risultato: la temperatura decide chi sono le prime k.
Fin qui i numeri di partenza sono un esempio scritto da me. Scrivi l'inizio di una frase e chiedo a un modello vero le sue prime otto parole candidate, con le probabilità che assegna davvero: gli slider qui sopra continueranno a funzionare, ma su una distribuzione autentica.
Le probabilità di partenza sono un esempio scritto a mano, e servono a far vedere come i tre comandi filtrano la lista: il chip sopra la lista dice sempre se stai guardando quelle o numeri veri. Col bottone ⚡ puoi sostituirle con le probabilità di un modello vero, ma anche allora vedi soltanto le prime otto parole di decine di migliaia, e le percentuali sono ricalcolate su quelle otto.
Metto giù la formula, perché è più semplice di quanto sembri. Chiamo zi il logit della parola i, cioè il punteggio grezzo che l'ultimo strato della rete le assegna, e T la temperatura. La probabilità che quella parola venga scelta è
pi =exp(zi / T)Σj exp(zj / T)La temperatura, insomma, divide i logit prima dell'esponenziale. Non è una scelta arbitraria: è la sola operazione che comprime o dilata tutte le differenze fra i punteggi nella stessa proporzione, lasciando intatto l'ordine di classifica. Guarda i due limiti. Con T→0 il rapporto fra il logit più alto e tutti gli altri esplode, l'esponenziale amplifica senza pietà e la probabilità collassa su un solo valore: il modello prende sempre la parola in testa, cioè fa un argmax. È la decodifica greedy, ed è perfettamente deterministica. Con T molto grande, invece, ogni zi/T tende a zero, ogni esponenziale tende a 1 e la distribuzione diventa quasi uniforme: il modello pesca a caso fra decine di migliaia di pezzi di parola, e quello che esce è delirio letterale. Il parametro arriva dalla fisica statistica ed è lo stesso che Geoffrey Hinton, Oriol Vinyals e Jeff Dean usano per «ammorbidire» una distribuzione in «Distilling the Knowledge in a Neural Network» (2015). Una nota che mi piace: gli slider qui sopra non barano. Poiché il logaritmo di una probabilità funziona da logit, elevare le probabilità a 1/T e rinormalizzare è algebricamente identico ad applicare la softmax a log p diviso T. La demo esegue la formula vera, solo su undici parole invece di cinquantamila.
Resta la domanda più interessante: perché tagliare la coda aiuta? A rigore, campionare dalla distribuzione completa è la cosa statisticamente corretta: è la distribuzione che il modello ha imparato. Il problema è che nella coda le stime del modello sono inaffidabili — sono rumore addestrato male — e sommate insieme quelle decine di migliaia di briciole pesano abbastanza da uscire ogni tanto. Ari Holtzman, Jan Buys, Li Du, Maxwell Forbes e Yejin Choi lo hanno misurato in «The Curious Case of Neural Text Degeneration» (ICLR 2020): generando 5000 passaggi con GPT-2 Large (762 milioni di parametri), il campionamento puro produce testo con perplessità 22,73 contro il 12,38 del testo umano — troppo imprevedibile — mentre il nucleus sampling con p=0,95, cioè il top-p che hai sotto le dita, arriva a 13,13, il valore più vicino all'essere umano. Il loro contributo è proprio l'idea di un nucleo dinamico: dove una parola domina il nucleo si stringe a due o tre candidati, dove la frase è aperta si allarga a centinaia. Il top-k, arrivato prima con Angela Fan, Mike Lewis e Yann Dauphin in «Hierarchical Neural Story Generation» (ACL 2018, dove campionavano fra le prime k=10 parole per generare racconti), quella flessibilità non ce l'ha: dieci sono dieci sia quando il contesto è obbligato sia quando è libero.
E qui compare il paradosso che vale l'intera pagina, quello che chiamano maledizione della ripetizione. L'intuizione dice: se voglio il testo migliore, prendo la sequenza più probabile, quindi decodifica greedy o beam search. È falso, e in modo spettacolare. Sempre nella tabella 1 di Holtzman e colleghi, la decodifica greedy finisce in un ciclo ripetitivo nel 73,66% dei casi, il beam search con 16 fasci nel 28,94%, mentre il testo scritto da esseri umani si ripete nello 0,28%. Peggio ancora: la loro figura 4 mostra che la probabilità di una frase ripetuta cresce a ogni ripetizione, un anello di retroazione positiva da cui il modello, una volta entrato, non esce più. La ragione di fondo è che il testo umano non è la sequenza più probabile: chi scrive alterna tratti scontati e scarti inattesi, e infatti la probabilità che il modello assegna alle parole umane oscilla di continuo, mentre quella del testo prodotto da beam search resta uniformemente alta. Dire qualcosa di informativo significa, letteralmente, dire qualcosa che non era del tutto prevedibile. Il campionamento non è un difetto tollerato per fare scena: è il modo di rimettere in gioco quella varianza.
Un'ultima cosa, che spiega perché tutto questo pesa così tanto. La generazione è autoregressiva: per ogni singola parola il modello rilegge l'intera sequenza scritta fin lì, calcola i logit del pezzo successivo, ne estrae uno con le tre manopole, lo appende in fondo e ricomincia da capo. Fatto in modo ingenuo significherebbe ricalcolare a ogni passo le chiavi e i valori dell'attenzione di tutti i token precedenti, con un costo che cresce col quadrato della lunghezza. Per questo esiste la KV cache: le coppie chiave-valore già calcolate restano in memoria strato per strato, e ogni nuovo passo ne calcola soltanto una, quella del token appena nato. Si paga in RAM — la cache cresce linearmente con il contesto e con il numero di strati, ed è uno dei motivi per cui le finestre di contesto lunghe costano — e si guadagna un'enormità in tempo; Sebastian Raschka la implementa da zero, in un centinaio di righe leggibili, in «Understanding and Coding the KV Cache in LLMs from Scratch». Il corollario è severo: temperatura, top-k e top-p non agiscono una volta per risposta, ma centinaia di volte, a ogni singolo passo. Una pescata sfortunata alla dodicesima parola condiziona tutto ciò che viene dopo, e il modello non ha un tasto per tornare indietro.
Che cosa stai guardando, esattamente. Le undici
probabilità di partenza della demo le ho scritte io a mano: il chip sopra la lista lo dichiara, e
servono solo perché il meccanismo si veda su pochi numeri. Il bottone ⚡ chiede al
proxy del sito una sola generazione con responseLogprobs attivo e temperatura 1, e ne
tiene gli otto candidati più probabili del primo token. Otto è il massimo che il proxy espone, e
non sono un vocabolario: la loro somma è quasi sempre inferiore a 1, perché tutto il resto della
distribuzione è tagliato via prima ancora che gli slider entrino in azione. Applicare top-p a otto
probabilità rinormalizzate non è quindi identico a farlo sui 250 000 logit veri — il nucleo qui è
calcolato su una lista già mutilata. Vale come dimostrazione del meccanismo su numeri autentici,
non come replica esatta di ciò che accade dentro un server di inferenza. E c'è un secondo limite
onesto: i candidati sono token, pezzi di parola, non parole; qualcuno arriverà con uno
spazio davanti o troncato a metà.
Complessità della fonte: divulgativa approfondimento tecnica o accademica