ELAI S.r.l.

Il migliore di cento modelli può essere soltanto il più fortunato

Una derivazione binomiale e una simulazione mostrano come la selezione gonfi il risultato vincente e perché serve una verifica indipendente.

Il migliore di cento modelli può essere soltanto il più fortunato

Il risultato che cresce senza apprendimento

Un gruppo confronta cento varianti di un modello AI sullo stesso piccolo insieme di esempi. Cambia un prompt, una configurazione o una scelta di addestramento e conserva il punteggio migliore. Alla fine il vincitore raggiunge un risultato convincente. Ma quel valore misura la qualità del modello oppure anche la fortuna di essere stato scelto fra molti? È una domanda importante per chi deve decidere quale sistema portare in azienda: un confronto può essere eseguito senza errori di codice e produrre comunque aspettative sbagliate.

Per isolare il meccanismo immaginiamo cento candidati che non sanno nulla: ciascuno indovina una risposta binaria con probabilità 50%. Li valutiamo su venti casi e scegliamo chi ne indovina di più. Dimostreremo che il vincitore ottiene in media circa il 77,32% sul campione usato per sceglierlo, pur restando al 50% su dati nuovi. Calcoleremo anche quanto sia probabile vedere un 75% apparentemente promettente. Non è un benchmark di reti reali: è un esperimento probabilistico con assunzioni dichiarate.

Prima delle formule: che cosa viene scelto

L’accuratezza è il numero di risposte corrette diviso il numero di casi valutati. Se scegliessimo un candidato prima di vedere i risultati, la sua accuratezza media su molte ripetizioni sarebbe 50%. Noi però osserviamo tutti i punteggi e scegliamo dopo. Questa operazione favorisce per costruzione gli errori di misura positivi: le oscillazioni fortunate entrano nel risultato vincente, quelle sfortunate restano nei risultati scartati. Non serve che qualcuno falsifichi i numeri.

Chiameremo insieme di selezione i venti casi utilizzati per scegliere. Potremmo chiamarli validation set, ma il nome conta meno dell’uso: se un insieme influenza quale modello preferiamo, partecipa allo sviluppo. Un test indipendente deve invece misurare una scelta già fissata. Questa distinzione riguarda anche varianti di prompt, soglie, ricette di preprocessing e selezione di esempi; il meccanismo non è limitato ai pesi di una rete neurale.

Il modello probabilistico e le sue ipotesi

Indichiamo con n = 20 il numero di casi e con M = 100 il numero di candidati. Xⱼ è il numero di risposte corrette del candidato j. Ogni correttezza è una variabile di Bernoulli: vale uno con probabilità p = 0,5, zero altrimenti. Assumiamo indipendenza fra casi e fra candidati, e candidati fissati prima dell’osservazione dei punteggi. Sono ipotesi forti: due configurazioni quasi identiche di uno stesso modello reale avranno spesso errori correlati.

Xⱼ ~ Binomial(n=20, p=0.5) P(Xⱼ = k) = C(20,k) / 2²⁰; k = 0,…,20

C(20,k) è il coefficiente binomiale: conta in quanti modi possiamo collocare k successi in venti posizioni. Ogni sequenza di successi e insuccessi ha probabilità 1/2²⁰, quindi il prodotto fra numero di sequenze e probabilità di ciascuna dà la probabilità del conteggio. I risultati sono senza unità fisiche; l’accuratezza è una frazione o una percentuale. Non assumiamo un particolare algoritmo di apprendimento, perché nell’esperimento nessun candidato apprende.

Un risultato raro diventa frequente quando cerchiamo il massimo

Un candidato scelto in anticipo supera o raggiunge il 75% se indovina almeno quindici casi. Per ottenere la probabilità dobbiamo sommare tutti i conteggi da quindici a venti, non soltanto il caso esattamente quindici. Il calcolo finito dà α = 0,0206947, circa il 2,07%. È abbastanza raro per un solo candidato. Ma noi non chiediamo che uno specifico candidato riesca: chiediamo che almeno uno fra cento riesca.

α = P(X ≥ 15) = Σₖ₌₁₅²⁰ C(20,k)/2²⁰ ≈ 0.0206947 P(maxⱼ Xⱼ ≥ 15) = 1 − (1 − α)ᴹ ≈ 0.8764596

La seconda formula usa l’evento contrario: nessuno raggiunge quindici. Per un candidato la probabilità è 1 − α; per cento candidati indipendenti moltiplichiamo cento volte e otteniamo (1 − α)¹⁰⁰. Togliendo da uno risulta circa l’87,65%. Dunque osservare almeno un 75% è il risultato più comune in questo esperimento, anche se tutte le prestazioni vere sono al livello del caso. L’evento raro era quello relativo a un candidato fissato, non al vincitore della ricerca.

Questa probabilità non è la probabilità che un modello reale sia inutile dopo aver visto il suo punteggio. Abbiamo calcolato la distribuzione dei risultati sotto un’ipotesi precisa di assenza di segnale. Invertire quel condizionamento richiederebbe altre ipotesi. Inoltre il 50% di riferimento vale per il nostro gioco binario equo: con classi sbilanciate, metriche differenti o esempi dipendenti, la distribuzione nulla va costruita in modo coerente con il problema.

Quanto vale in media il migliore?

Definiamo Z = maxⱼ Xⱼ, il conteggio vincente. Per calcolarne la media non serve simulare. Un intero non negativo Z può essere scritto come somma di indicatori: uno se supera zero, un altro se supera uno, e così via. Prendendo l’attesa, la media diventa la somma delle probabilità di superare ciascuna soglia. Indichiamo con F(k) la probabilità che un singolo candidato faccia al massimo k risposte corrette.

P(Z ≤ k) = F(k)ᴹ E[Z/n] = (1/n) Σₖ₌₁ⁿ [1 − F(k−1)ᴹ] ≈ 0.7731971

Il risultato è 77,3197% con cento candidati. La formula rende evidente anche la direzione del fenomeno: fra zero e uno, elevare F a una potenza maggiore non lo aumenta. Di conseguenza ogni termine 1 − Fᴹ non diminuisce quando aggiungiamo candidati. Il massimo osservato migliora per costruzione, benché la probabilità di successo di ciascun candidato rimanga invariata. Con un solo candidato ritroviamo esattamente il 50%, un controllo utile del calcolo.

Candidati MAccuratezza selezionata attesaP(massimo ≥ 75%)
150.00%2.07%
562.91%9.93%
1067.03%18.87%
5074.63%64.85%
10077.32%87.65%
Valori attesi ottenuti dalle somme binomiali, non da benchmark di modelli. L’asse orizzontale è logaritmico. La curva crescente riguarda gli stessi dati usati per scegliere; la linea al 50% riguarda un test indipendente del vincitore. I segmenti collegano i valori calcolati.
Valori attesi ottenuti dalle somme binomiali, non da benchmark di modelli. L’asse orizzontale è logaritmico. La curva crescente riguarda gli stessi dati usati per scegliere; la linea al 50% riguarda un test indipendente del vincitore. I segmenti collegano i valori calcolati.

Perché il test nuovo torna al 50%

Indichiamo con J l’indice del candidato scelto e con Aⱼ la sua accuratezza su un test nuovo. J dipende soltanto dai risultati di selezione. Per ipotesi, gli esiti del test sono indipendenti da quei risultati e ogni candidato ha accuratezza attesa 0,5. Quindi sapere chi ha vinto non fornisce informazioni favorevoli sui suoi nuovi esiti. Possiamo scriverlo separando tutti i possibili vincitori e pesando ciascuno per la probabilità che venga scelto.

E[Aⱼ | J=j] = 0.5 E[A_J] = Σⱼ P(J=j) · E[Aⱼ | J=j] = 0.5

L’indipendenza è il passaggio decisivo, non la parola “test” nel nome di un file. Se usiamo i nuovi risultati per cambiare il vincitore, scegliere una soglia o decidere quali casi mostrare, la condizione non descrive più il protocollo. Al contrario, un singolo test del vincitore già fissato non deve replicare la gara fra cento sul nuovo insieme. Può stimare quel candidato; non elimina però l’incertezza dovuta al numero finito di esempi o a un campione poco rappresentativo.

La simulazione eseguita e ciò che misura

Lo script esegue 5.000 ripetizioni con seed 20261004 in Python 3.14.0. In ciascuna genera cento conteggi su venti prove, sceglie il massimo e, in caso di parità, il candidato con indice minore. Poi genera cento nuove correttezze per il vincitore. Poiché tutti i candidati hanno la stessa legge e il test è indipendente, non occorre generare i test dei novantanove scartati. Nessuna etichetta reale, rete addestrata o chiamata a un servizio AI entra nel calcolo.

L’accuratezza media selezionata risulta 77,286%; quella sul test nuovo 50,0476%. Sono vicine rispettivamente al 77,3197% e al 50% previsti dalle formule. La differenza residua è variabilità Monte Carlo: ripetiamo un esperimento casuale un numero finito di volte. Il JSON conserva ogni indice vincente e i due conteggi per ripetizione, oltre a seed, versione e risultati teorici; il codice ricostruisce anche le estrazioni dei candidati. Non abbiamo scelto il seed per ottenere un risultato più favorevole.

Lo script riporta anche gli errori standard delle medie simulate, circa 0,064 e 0,070 punti percentuali. Derivano dalla deviazione standard fra ripetizioni divisa per √5000. Quantificano la precisione della nostra simulazione sotto il modello di monete indipendenti, non l’incertezza sulle prestazioni di un prodotto reale. È importante separare i due livelli: una simulazione molto precisa può descrivere con grande precisione un modello probabilistico che non rappresenta il proprio problema applicativo.

Due alternative: controllare la ricerca o separare la verifica

Se vogliamo giudicare il massimo sullo stesso insieme, dobbiamo includere la ricerca nella distribuzione di riferimento. Con candidati indipendenti abbiamo già la formula esatta. Senza indipendenza fra candidati, ma mantenendo corretta la probabilità marginale di ogni evento, possiamo usare il limite dell’unione: la probabilità che almeno uno superi una soglia non supera la somma delle probabilità individuali. È la base del controllo di Bonferroni, semplice ma spesso conservativo.

P(∪ⱼ {Xⱼ ≥ k}) ≤ Σⱼ P(Xⱼ ≥ k) = M · P(X ≥ k)

Per richiedere un limite complessivo non superiore al 5%, nel nostro caso la prima soglia intera utile è 18 su 20, cioè il 90%. Il limite vale circa 2,0123%; la probabilità esatta con indipendenza è circa 1,9923%. La discrepanza rispetto al 5% dipende anche dalla granularità: non possiamo chiedere 17,4 risposte corrette. Questo non rende automaticamente valido qualunque esperimento con cento tentativi: la legge binomiale e la famiglia di confronti devono corrispondere al protocollo realmente usato.

L’altra strada è riservare un test finale alla procedura già fissata. Se i dati sono pochi, una validazione incrociata annidata può separare scelta e valutazione: nei cicli interni si scelgono le varianti, nel ciclo esterno si valuta l’intera procedura su dati esclusi dalla scelta. Non eseguiamo qui questo algoritmo e non ne inventiamo risultati. La distinzione concettuale è che si valuta il processo completo di selezione, non un vincitore già ottimizzato su tutti i dati disponibili.

Quando l’indipendenza non regge

Consideriamo l’estremo opposto: cento candidati restituiscono esattamente le stesse risposte. I conteggi sono identici, quindi il massimo coincide con un singolo conteggio. L’accuratezza attesa torna al 50% e la probabilità di raggiungere quindici resta 2,07%, non 87,65%. Avere cento nomi nel foglio di calcolo non equivale dunque a cento tentativi indipendenti. Fra i due estremi esistono molte strutture di dipendenza; non basta dividere il numero dei candidati per una correlazione scelta intuitivamente.

Anche i casi possono essere dipendenti: fotogrammi vicini dello stesso video o documenti quasi duplicati non offrono necessariamente venti osservazioni distinte. Nel nostro esempio il numero n entra direttamente nella varianza p(1 − p)/n dell’accuratezza di un candidato. Con n = 20 la deviazione standard è circa 11,18 punti percentuali. Se l’indipendenza manca, questa formula non rappresenta automaticamente la variabilità effettiva. Aumentare semplicemente il conteggio delle righe può dare una falsa sensazione di precisione.

Quanto aiuta avere più esempi?

Possiamo ripetere la somma esatta cambiando soltanto n e lasciando M = 100. Con cento casi per candidato il massimo atteso scende al 62,4762%; con cinquecento scende al 55,6017%. La capacità vera resta sempre 50%. Più osservazioni indipendenti restringono le oscillazioni di ogni stima e riducono il vantaggio della fortuna. Non lo annullano magicamente a una certa dimensione: nel nostro calcolo rimangono circa 12,48 punti di ottimismo con cento casi e 5,60 con cinquecento. Questi sono risultati del modello probabilistico, non una raccomandazione universale sulla dimensione del test.

Questo confronto aiuta a formulare la decisione corretta quando il budget di valutazione è limitato. Cercare più configurazioni e misurare meglio ciascuna configurazione sono due impieghi diversi delle risorse. Il primo aumenta le opportunità di trovare un candidato veramente migliore, se ne esistono, ma anche quelle di selezionare una fluttuazione; il secondo riduce l’incertezza della misura nelle ipotesi appropriate. Il nostro esempio non stima il beneficio del primo, perché tutti i candidati sono equivalenti. Quantifica invece perché non possiamo presentare il massimo osservato come se la ricerca non fosse mai avvenuta.

Nel codice, getrandbits(n) produce n bit pseudocasuali e bit_count ne conta gli uno: è un modo compatto per generare il numero di successi, non un modello di documenti. La funzione cdf somma coefficienti binomiali; mean_max usa la formula del massimo. Le asserzioni controllano il caso M = 1, la crescita del massimo atteso e l’accordo approssimato fra simulazione e teoria. I conteggi combinatori sono interi esatti, mentre probabilità e potenze finali usano numeri in virgola mobile. Le cifre mostrate sono arrotondate e non pretendono precisione sperimentale su dati reali.

Evidenza, limiti e conclusione

Cawley e Talbot, su JMLR nel 2010, documentano sperimentalmente il sovradattamento nella selezione e il bias di alcuni protocolli di valutazione. Abbiamo letto metodi e confronti dei protocolli. Il nostro esempio binomiale isola un meccanismo più semplice e non riproduce i loro classificatori.

Il vincitore non è necessariamente un cattivo modello. Se i candidati possiedono capacità vere diverse, cercare può trovare un sistema migliore: qui le abbiamo rese uguali per misurare soltanto la componente fortuita. Neppure una verifica indipendente garantisce il comportamento in qualunque azienda o nel futuro. La conclusione è più precisa: il punteggio che ha fatto vincere una ricerca non è, da solo, una stima imparziale del risultato che il vincitore avrà su nuovi casi.

Per interpretare un confronto chiediamo quindi quale insieme ha scelto il modello, quanti tentativi sono stati considerati e quali dati hanno verificato la scelta senza modificarla. Sono domande che collegano la statistica a una decisione concreta. Il 77% del nostro vincitore non era inventato: era misurato correttamente, ma rispondeva alla domanda sbagliata se presentato come capacità generale. Comprendere questa differenza evita di confondere una buona ricerca di configurazioni con una buona prova del loro valore.

Bibliografia e codice

Gavin C. Cawley, Nicola L. C. Talbot — On Over-fitting in Model Selection and Subsequent Selection Bias in Performance Evaluation, JMLR 11 (2010), 2079–2107.

from experiment import run
r = run()
print(round(r['exact']['expected_selected_accuracy'], 6))
print(round(r['exact']['family_tail_15'], 6))
print(r['simulation'])

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 4 ottobre 2026.