Una manopola familiare, una promessa spesso fraintesa
Configuriamo un modello linguistico e scegliamo top-p=0,9. È facile interpretarlo come “mantieni esattamente il 90% delle possibilità” oppure “scarta il 10% delle risposte peggiori”. Nessuna delle due frasi descrive correttamente la regola. Il parametro riguarda la massa di probabilità assegnata ai candidati per il prossimo token, non una percentuale di frasi né un giudizio su quali risposte siano vere. La differenza conta quando confrontiamo configurazioni o tentiamo di rendere riproducibile una generazione.
La domanda che svisceriamo è che cosa venga effettivamente conservato e quanto cambi la distribuzione dopo il taglio. Useremo cinque token sintetici, A–E, senza attribuire loro parole o qualità. Calcoleremo tutto con frazioni esatte e analizzeremo soglie al confine, pareggi e temperatura. Nessun modello viene interrogato: l’esperimento controlla un meccanismo matematico. I risultati di ricerca discussi più avanti appartengono ai rispettivi autori e non sono riproduzioni eseguite qui.
Probabilità, token e supporto
Un token è un’unità del vocabolario del modello: può essere una parola, una sua parte o altro frammento. Dato il testo precedente, il modello assegna a ogni candidato una probabilità per il passo successivo. La somma vale uno. Indichiamo questa distribuzione con P; il supporto è l’insieme dei candidati con probabilità non nulla. Un campionatore sceglie secondo la distribuzione che gli forniamo, che può essere P oppure una sua trasformazione Q. Ridurre il supporto e ridistribuire la massa sono due operazioni da descrivere entrambe.
Ordiniamo i candidati per probabilità decrescente e conserviamo il più corto prefisso che raggiunge almeno p. Questo prefisso è il nucleo. Chiamiamo k la sua dimensione e q la massa effettivamente conservata, cioè la somma delle probabilità dei k token. Il valore p è una soglia, q il risultato. Per evitare ambiguità fissiamo qui la convenzione maggiore o uguale; per i pareggi usiamo un ordine deterministico degli identificativi.
V è il numero di candidati, S il nucleo e Q la distribuzione usata dopo il taglio. Dividere per q serve a far tornare la somma a uno. Dentro S i rapporti fra probabilità restano gli stessi, ma ciascuna probabilità assoluta aumenta se q è minore di uno. I candidati esterni diventano impossibili in quel passo. Nessuna parte della formula assegna un’etichetta “corretto” a un token.
Il caso di cinque candidati
Assegniamo P=(0,52; 0,18; 0,15; 0,10; 0,05). Le somme cumulative sono 0,52; 0,70; 0,85; 0,95; 1. Con p=0,9 i primi tre non bastano, il quarto fa superare la soglia. Conserviamo quattro token su cinque, cioè l’80% dei candidati, e il 95% della massa. Scartiamo il 5%, non il 10%. La distinzione nasce dalla discrezione dei token: non possiamo conservare soltanto metà del quarto candidato nella regola standard.
Dopo la divisione per 0,95, Q è (52/95; 18/95; 3/19; 2/19; 0). La probabilità di A passa da 0,52 a circa 0,54737; quella di E diventa zero. La somma resta uno. Non abbiamo ancora estratto alcun token: queste sono probabilità calcolate esattamente, non frequenze osservate da campioni casuali. Il risultato JSON conserva tutte le frazioni e il codice verifica somma e identità senza una tolleranza floating point.
| p | k | q | Massa scartata |
|---|---|---|---|
| 0.50 | 1 | 0.52 | 0.48 |
| 0.70 | 2 | 0.70 | 0.30 |
| 0.80 | 3 | 0.85 | 0.15 |
| 0.90 | 4 | 0.95 | 0.05 |
| 0.95 | 4 | 0.95 | 0.05 |
| 1.00 | 5 | 1.00 | 0.00 |
Quanto cambia la distribuzione: una derivazione completa
Per dare un significato quantitativo al taglio usiamo la distanza di variazione totale, TV. Per distribuzioni discrete è metà della somma delle differenze assolute fra probabilità corrispondenti. Vale zero per distribuzioni uguali e al massimo uno. Misura una differenza probabilistica, non la distanza semantica fra testi. Dentro S abbiamo Q_i≥P_i, fuori S abbiamo Q_i=0. Possiamo quindi separare i due contributi senza un’approssimazione.
Nel nucleo la massa totale passa da q a uno, quindi il suo aumento è 1−q. Fuori dal nucleo perdiamo la stessa quantità. La divisione per due evita di contarla due volte. Nel nostro p=0,9 la TV è 0,05, non 0,10. È un limite e una identità per questo singolo passo e la specifica trasformazione Q: non significa che una frase sia corretta con probabilità almeno 90%, né che due lunghe generazioni differiscano al massimo nel 10% delle parole.
La generazione è autoregressiva: il token scelto entra nel contesto e cambia la distribuzione del passo seguente. Dopo una scelta diversa non stiamo più confrontando necessariamente lo stesso P. Trasformare una proprietà locale in una promessa globale richiederebbe un’analisi separata della distribuzione delle sequenze e delle dipendenze fra passi. Non la sostituiamo con l’analogia di un rubinetto che elimina sempre la stessa percentuale di testo.
Confini e pareggi: i dettagli che cambiano il risultato
Con p=0,70, la somma dei primi due è esattamente 0,70. La nostra regola ≥ conserva due candidati. Una regola che richieda strettamente > conserva anche il terzo e arriva a 0,85. I due risultati sono entrambi comprensibili se dichiariamo la convenzione, ma non sono la stessa distribuzione. Usiamo Fraction proprio per separare questa differenza logica dagli arrotondamenti della rappresentazione decimale binaria. Prima di riprodurre un risultato bisogna verificare il codice effettivo del campionatore, non soltanto il nome top-p.
Con tre candidati equiprobabili, ciascuno con probabilità 1/3, e p=1/2, servono due token e la massa è 2/3. Decidere quali due richiede una regola per i pareggi. L’esperimento prova due ordini di identificativi: ottiene gli stessi k e q ma supporti diversi. Non attribuiamo questo a un bug: stiamo mostrando un’informazione che deve accompagnare la configurazione. Il caso p=1, nella nostra convenzione, conserva tutti i candidati con massa positiva necessari a raggiungere uno.

Temperatura e top-k rispondono a domande diverse
Top-k fissa il numero di candidati; top-p fissa una soglia di massa e lascia variare quel numero. La temperatura T>0 modifica invece i pesi prima di un eventuale taglio: partendo da probabilità positive, P_T(i) è proporzionale a P(i)^(1/T). Il nostro codice separa questa parte, eseguita in floating point, dai calcoli esatti precedenti. Con soglia 0,9, T=0,5 conserva tre token, T=1 quattro e T=2 tutti e cinque. Cambiare temperatura cambia quindi anche l’insieme che una successiva regola top-p può conservare.
La trasformazione della temperatura conserva l’ordine per T positivo, ma non le somme cumulative. Perciò selezionare il nucleo prima e dopo la temperatura non è in generale la stessa operazione. Neppure “quattro candidati” implica una misura universale di diversità: le loro probabilità possono essere sbilanciate e molti token possono esprimere idee simili. Qui non deduciamo un miglioramento di verità, sicurezza, creatività o accuratezza da un semplice aumento del supporto.
Dalle origini alla ricerca recente: quali prove abbiamo
Il riferimento fondativo è The Curious Case of Neural Text Degeneration di Ari Holtzman, Jan Buys, Li Du, Maxwell Forbes e Yejin Choi: versione arXiv v2 del 14 febbraio 2020, pubblicata a ICLR 2020. Abbiamo letto definizione e rinormalizzazione nelle sezioni 3.1–3.3, impostazione sperimentale e analisi, inclusa la sezione HUSE. Gli esperimenti riguardano GPT-2 e continuazioni di testo, non costituiscono un benchmark di tutti i modelli attuali. HUSE combina valutazione statistica e giudizi umani degli autori; il protocollo usa anche una distribuzione interpolata per gestire il troncamento. Non attribuiamo quei giudizi a una nostra revisione.
Per lo stato recente abbiamo consultato Decoding as Optimisation on the Probability Simplex di Xiaotong Ji, Rasul Tutunov, Matthieu Zimmer e Haitham Bou-Ammar, arXiv:2602.18292v2 del 25 febbraio 2026, trattandolo come preprint. La sezione 3.4 interpreta top-p tramite supporto vincolato e rinormalizzazione; gli esperimenti di BoK nelle tabelle 1–3 usano due modelli Qwen da 7B, MATH500, GPQA-diamond e HumanEval, temperature variate e lunghezza massima 3072 con arresto EOS. Confrontano Base, Top-K e BoK: non dimostrano una superiorità sperimentale di top-p. Non riproduciamo quei benchmark e non trasformiamo risultati selezionati in una raccomandazione universale.
Riprodurre il meccanismo senza inventare un benchmark
L’archivio contiene experiment.py, plot.py, tutti i risultati e le istruzioni. Le probabilità e le soglie del calcolo principale sono Fraction; non c’è seed perché non estraiamo campioni. Il controllo della temperatura è separato e dichiarato floating point. Il codice verifica somma uno, massa conservata, identità TV=1−q, confine ≥ contro > e due regole di pareggio. Per un vocabolario di V elementi, ordinare completamente costa dell’ordine di V log V confronti e la scansione cumulativa V; implementazioni ottimizzate possono scegliere strategie diverse. Non abbiamo misurato latenza o memoria di un motore LLM.
Per valutare un’applicazione aziendale servirebbe un altro esperimento: stesso modello e tokenizer, prompt e criteri di qualità documentati, versioni del campionatore, ordine delle trasformazioni, ripetizioni e budget di generazione. Questi dati permetterebbero di confrontare qualità e variabilità, senza confonderle con la sola dimensione del nucleo. Non attribuiamo a EL-AI un nuovo decoder proprietario o risultati che non ha documentato. Questo articolo offre un’analisi tecnica del meccanismo, non una ricerca originale peer-reviewed.
Risposta: 0,9 è una soglia, non una garanzia di qualità
No: top-p=0,9 non elimina necessariamente il 10% della massa e non sceglie il 90% delle risposte migliori. Nel nostro esempio conserva quattro candidati, massa 0,95 e distanza TV 0,05 dalla distribuzione iniziale. La regola include il candidato che permette di raggiungere la soglia, poi rinormalizza. Sapere questo permette di leggere una configurazione con precisione e riconoscere ciò che resta da misurare: la qualità delle sequenze, sul problema reale, con un protocollo adeguato.
Bibliografia
Holtzman et al. — The Curious Case of Neural Text Degeneration, ICLR 2020, arXiv v2.
Ji et al. — Decoding as Optimisation on the Probability Simplex, 2026, preprint v2.
from fractions import Fraction as F
P=[F(52,100),F(18,100),F(15,100),F(10,100),F(5,100)]
p=F(9,10);mass=F(0);k=0
for value in P:
mass+=value;k+=1
if mass>=p:break
Q=[value/mass if j<k else F(0) for j,value in enumerate(P)]
tv=sum(abs(a-b) for a,b in zip(P,Q))/2
assert k==4 and mass==F(19,20) and tv==F(1,20)
print(k,mass,Q,tv)
Codice, dati e istruzioni · JSON. Calcoli didattici eseguiti con Python 3.14.0; figure con Matplotlib 3.11.2. Analisi con assistenza AI, senza dichiarare peer review o revisione umana. Copertina originale ImageGen, illustrativa: non documenta persone, sedi o installazioni EL-AI. Fonti consultate il 21 ottobre 2026.

