Atto 3 · Pagina 10

La risposta nasce

Il modello non "ha" la risposta pronta: la costruisce una parola alla volta. Ma come sceglie ogni parola? Lo decidono tre comandi.

📖 Livello di lettura
🥾 Come un sentiero che si fa camminando: a ogni passo il modello guarda tutte le parole possibili, ognuna con la sua probabilità, e ne sceglie una. Tre manopole decidono quanto osare e tra quante parole pescare.
🌡️ La parola «temperatura» non è una metafora inventata per l'occasione: è presa di peso dalla meccanica statistica. Nella distribuzione di Boltzmann, un sistema freddo precipita nel suo stato di energia minima, uno caldo vaga fra tutti gli stati possibili. La formula che regola la scelta della parola successiva ha esattamente la stessa forma. Il prestito però va restituito con onestà: qui non c'è energia, non c'è equilibrio termodinamico e non c'è tempo fisico. C'è una funzione con lo stesso profilo, e un parametro a cui hanno lasciato il nome di casa sua.
I comandi Le tre manopole della scelta

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.

🌡️ Temperatura quanto osa

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.

0.2 = prevedibile1.5 = azzardato
🔢 Top-k quante parole

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.

1 = solo la migliore64 = molte scelte
🎯 Top-p nucleus, quanta probabilità

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%.

0.3 = nucleo stretto1.0 = tieni tutto

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.

Provalo Le parole dopo "Il caffè è ___"
Il caffè è ___
🌡️ Temperatura0.70
🔢 Top-k40
🎯 Top-p0.95
La lista dei candidati in attesa…

⚡ Prova con probabilità vere

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.

💡 La sorpresa: il modello non sa come finirà la frase quando la inizia. "Creatività" e "allucinazione" nascono dallo stesso meccanismo: alzando la temperatura o allargando top-p/top-k, pesca parole meno probabili, a volte geniali e a volte inventate di sana pianta. Il bottone ×100 lo rende visibile: a temperatura bassa escono due o tre parole sempre uguali, a temperatura alta il ventaglio si apre.

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.

Il mito: «temperatura zero vuol dire che il modello dice la verità». È l'idea per cui, se lo si vuole affidabile, basta azzerare la temperatura. Ma T→0 non produce verità: produce determinismo. Il modello prende ogni volta la parola con il logit più alto, e se quella parola è sbagliata la sbaglierà in modo perfettamente riproducibile, per sempre. Anzi, è proprio la decodifica greedy quella che nella tabella 1 di Holtzman et al. finisce in un ciclo ripetitivo nel 73,66% delle generazioni: T=0 non è l'impostazione «seria», è l'impostazione che rompe il testo lungo. E anche la riproducibilità è meno solida di quanto sembri: su GPU la stessa richiesta a temperatura 0 può dare risposte diverse, perché il risultato dipende da come le operazioni in virgola mobile vengono raggruppate insieme alle altre richieste in coda — lo racconta bene il Thinking Machines Lab in «Defeating Nondeterminism in LLM Inference» (2025). Dove la temperatura bassa serve davvero è nei compiti con una risposta sola: estrazione di dati, classificazione, codice. Non nella prosa.

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à.

Fonti Per approfondire

Complessità della fonte: divulgativa approfondimento tecnica o accademica

  • Paper A. Holtzman, J. Buys, L. Du, M. Forbes, Y. Choi, «The Curious Case of Neural Text Degeneration», ICLR 2020 (arXiv 2019) — introduce il nucleus sampling e misura la degenerazione: greedy ripetitivo nel 73,66% dei casi contro lo 0,28% del testo umano. arxiv.org
  • Paper A. Fan, M. Lewis, Y. Dauphin, «Hierarchical Neural Story Generation», ACL 2018 — il top-k sampling nasce qui, con k=10, per generare racconti dove il beam search produceva frasi fatte. arxiv.org · aclanthology.org
  • Paper S. Welleck, I. Kulikov, S. Roller et al., «Neural Text Generation with Unlikelihood Training», ICLR 2020 — attacca la ripetizione dal lato dell'addestramento invece che da quello del campionamento: il problema è nell'obiettivo di massima verosimiglianza. arxiv.org
  • Paper G. Hinton, O. Vinyals, J. Dean, «Distilling the Knowledge in a Neural Network», 2015 — la temperatura come parametro che ammorbidisce una softmax: la definizione usata ovunque da allora. arxiv.org
  • Saggio S. Raschka, «Understanding and Coding the KV Cache in LLMs from Scratch» — perché la generazione token per token sarebbe insostenibile senza cache, con il codice per costruirla. magazine.sebastianraschka.com
  • Lezione P. von Platen, «How to generate text: using different decoding methods», Hugging Face — greedy, beam, top-k e top-p messi a confronto con esempi eseguibili. huggingface.co
  • Gioco Transformer Explainer (Georgia Tech) — un GPT-2 vero nel browser, con lo slider della temperatura: si vede la distribuzione appiattirsi mentre la si alza. poloclub.github.io
  • Wiki «Funzione softmax», Wikipedia in italiano — la formula, il legame con la distribuzione di Boltzmann e il ruolo della temperatura, in una pagina sola. it.wikipedia.org