Perplexity
La perplexity è l'esponenziale della cross-entropy di un modello sul testo. Come calcolarla, confrontare i modelli in modo equo e dove si usa questa metrica oltre alla valutazione.
La perplessità è una metrica che misura quanto bene un modello probabilistico predice una sequenza; si calcola come esponenziale della media della log-verosimiglianza negativa che il modello assegna a ciascun token effettivo successivo. Valori più bassi sono migliori. Una perplessità pari a 10 significa che, in media, il modello è incerto come se a ogni passaggio scegliesse uniformemente tra 10 opzioni: ecco perché il numero viene spesso interpretato come un fattore di ramificazione effettivo. Frederick Jelinek, Robert Mercer, Lalit Bahl e James Baker l'hanno introdotta in IBM nel 1977 per misurare la difficoltà dei compiti di riconoscimento vocale; resta la metrica intrinseca standard per la modellazione linguistica. Per esempio, nel 2019 GPT-2 di OpenAI, con 1,5 miliardi di parametri, ha raggiunto una perplessità di 17,48 sul benchmark WikiText-103 senza essere addestrato su di esso.
Il termine indica anche due cose non correlate. Perplexity AI è un'azienda che sviluppa un motore di ricerca basato sull'AI, mentre t-SNE ha un iperparametro di perplessità che imposta approssimativamente quanti vicini considera ogni punto quando t-SNE crea una mappa 2D di dati ad alta dimensionalità.
Calcolo della perplessità#
Per una sequenza di N token, perplessità = exp(-(1/N) x somma del log p(token_i | tutti i token precedenti)). La quantità all'interno dell'esponenziale è l'entropia incrociata tra il testo e le previsioni del modello, la stessa funzione di perdita usata per addestrare i modelli linguistici di grandi dimensioni (LLM). Con i logaritmi naturali la base è e; con i logaritmi in base 2 è 2: entrambi producono la stessa perplessità. La perdita di entropia incrociata di PyTorch usa i logaritmi naturali e, per impostazione predefinita, calcola la media sui token; quindi la perplessità di un modello linguistico è semplicemente exp(loss).
import math
# Probability the model assigned to each correct next token
token_probs = [0.50, 0.25, 0.80, 0.40]
# Cross-entropy is the average negative log-likelihood, in nats
cross_entropy = -sum(math.log(p) for p in token_probs) / len(token_probs)
print(f"Cross-entropy: {cross_entropy:.3f}, perplexity: {math.exp(cross_entropy):.2f}")
# A model that spreads probability evenly over 10 tokens has perplexity 10
uniform = -sum(math.log(0.1) for _ in token_probs) / len(token_probs)
print(f"Uniform perplexity: {math.exp(uniform):.2f}")Le quattro probabilità producono una cross-entropia di 0.805 nat e una perplessità di 2.24: il modello si comporta quindi come se a ogni passo scegliesse tra circa due token equiprobabili. Il caso uniforme conferma questa interpretazione come fattore di diramazione: una probabilità di 0.1 per ogni token corretto dà esattamente 10.
I documenti lunghi richiedono attenzione. Un modello con una finestra di contesto fissa valuta il testo a blocchi e i token all'inizio di un blocco non sovrapposto hanno pochissimo contesto, il che aumenta la perplessità. Una valutazione con finestra scorrevole fa sovrapporre i blocchi, così ogni token riceve quanto più contesto precedente possibile, secondo i limiti del modello, a costo di maggiori calcoli.
Confrontare correttamente i modelli#
La perplessità è confrontabile solo tra modelli valutati sullo stesso testo con la stessa tokenizzazione. Un modello con un vocabolario più ampio suddivide il testo in un numero minore di token, più difficili da predire, quindi la sua perplessità per token non è direttamente confrontabile con quella di un modello che usa token più piccoli. Normalizzare la log-verosimiglianza totale per numero di byte o caratteri, riportandola come bit per byte o bit per carattere, elimina questa dipendenza.
Anche i dati di test devono essere assenti dai dati di addestramento. Un modello che ha già visto un passaggio gli assegna una probabilità insolitamente alta, quindi questa forma di data leakage fa apparire la perplessità migliore delle prestazioni reali. Lo stesso effetto è alla base degli attacchi di inferenza di appartenenza, che segnalano come probabili dati di addestramento i testi con perplessità insolitamente bassa.
La perplessità valuta la previsione del token successivo su un testo fisso. I modelli conversazionali vengono sottoposti a ottimizzazione delle istruzioni e ad apprendimento per rinforzo da feedback umano (RLHF) per seguire le richieste e soddisfare le preferenze umane; per questo vengono confrontati usando benchmark di compiti e valutazioni delle preferenze umane.
Altre applicazioni oltre al confronto tra modelli#
La curatela dei dati è un'applicazione importante. La pipeline CCNet, pubblicata nel 2019 dai ricercatori di Facebook AI, ha assegnato un punteggio alle pagine di Common Crawl utilizzando un modello linguistico addestrato su Wikipedia e le ha suddivise in base alla perplessità in tre gruppi di pari dimensione, corrispondenti al terzo iniziale, a quello centrale e a quello finale, considerando il gruppo iniziale a bassa perplessità come il testo di qualità più elevata. Molte pipeline di preaddestramento filtrano i dati web in modo simile, un passaggio di pulizia dei dati su scala web. Anche i rilevatori di testi generati dall'AI, come GPTZero, calcolano la perplessità, poiché il testo campionato da un modello linguistico tende a essere più prevedibile della scrittura umana.
La formula si applica a qualsiasi modello addestrato con la cross-entropia. I modelli di classificazione Ultralytics YOLO26 vengono addestrati con la perdita di cross-entropia media, quindi exp(validation loss) è la perplessità calcolata sulle etichette delle classi effettive. Una perdita di validazione pari a 0.35 corrisponde a una perplessità di circa 1.42: in media, il modello distribuisce la propria sicurezza su un'immagine come se fosse indeciso tra circa 1.4 classi.










