Se un palloncino è mezzo sgonfio è floscio e non tiene alcuna forma. Proviamo a giocarci ma nessuna sollecitazione riesce a fargli assumere quella forma che ci servirebbe. Un palloncino troppo gonfio invece ha il problema opposto. La forma ce l’ha, ma è talmente teso da renderlo “instabile” al punto che la minima sollecitazione rischia di farlo scoppiare.
Sono i due eccessi da cui siamo partiti nella prima parte, underfitting e overfitting, guardati dal lato di quanto un sistema riesce ad assestarsi. Il modello “sgonfio” non ha raggiunto alcuna “forma” vicina a quella descritta dai dati. Il modello che ha “riempito” perfettamente la forma dei dati, rumore compreso, adesso non ha più gioco per accogliere un dato nuovo.
Sapere quanto gonfiare non si decide a occhio. Serve uno strumento, e nella prima parte lo strumento era un manometro. Ci ha permesso di leggere l’errore e di scomporlo in tre pezzi che si sommano, ovvero varianza, bias e rumore. Abbiamo visto qualche trucco di magia matematica e abbiamo osservato come alla fine un modo per misurare l’errore c’è. Tuttavia resta impossibile raggiungere ciò che potremmo definire uno “stato ideale”.
Ora però abbiamo un problema. La funzione ideale $\mathcal{I}(x)$ rappresenta la media dell’output sul rumore, mentre la previsione tipica $f_{\mu}(x)$ è la media della previsione sui dataset. Ogni centro era un baricentro, e il trucco di magia matematica funzionava proprio perché il ragionamento ruotava intorno alla media.
Ma in un modello di classificazione tutto questo non basta più. Dovendo prevedere delle categorie, non possiamo liberamente sommare e dividere i valori dell’uscita. Va da sé che non ha molto senso calcolare “la media tra scarpe e stivali” né “scarpa diviso tre”.
Dal punto di vista di un gas, finora abbiamo letto la posizione media di una molecola, che è una grandezza continua. Ora leggiamo un’etichetta discreta del tipo “La pressione del palloncino è dentro la soglia critica?”. Non c’è un punto medio in questa misura, ma solo le etichette “dentro la soglia” e “fuori la soglia”.
Dobbiamo cambiare qualcosa, e questo cambiamento è il passaggio dalla media alla moda. Se nel primo caso ciò che ci interessa è il baricentro dei valori, adesso ci interessa il valore che ricorre più spesso.
Le chimere non vanno di moda
Una soluzione potrebbe essere quella di assegnare la coppia $(0,1)$ al confronto tra due categorie. Ma il risultato non sarebbe una categoria. Ad esempio: se un modello metà delle volte seleziona leone e metà capra, la media varrà $0.5$. Praticamente otteniamo una chimera.
Abbiamo parlato di baricentro e di come il suo spostamento al di fuori dell’insieme delle risposte possibili faccia crollare l’impalcatura su cui si reggeva la decomposizione.
Usando il manometro leggevamo la posizione media di una molecola che, come sappiamo, è una grandezza continua. Adesso ci serve una spia che resta spenta se gonfiando il palloncino siamo dentro la soglia critica o si accende se la sorpassiamo.
A sinistra il quadrante graduato, dove l'ago indica un valore lungo una scala continua. A destra lo stesso strumento privo di graduazione, con la sola tacca della soglia in rosso e la spia sopra. Quest'ultima è spenta perché la pressione è ancora al di sotto della soglia di guardia. Stessa pressione, due letture diverse, una continua e una a due sole etichette.
Dato un certo numero di misurazioni, la moda individua il valore che ricorre più spesso, ed è esattamente lo strumento matematico che ci serve. La sua utilità sta proprio nel mantenere integro l’insieme di definizione delle categorie da classificare. Il che rappresenta anche il suo più grande limite, proprio perché si tratta di un’operazione non conciliabile con l’additività.
Pedro Domingos, nel suo paper del 2000 (“A Unified Bias-Variance Decomposition”), ha descritto proprio il tentativo di estendere la scomposizione bias-varianza al caso della classificazione. Il punto di partenza è la scelta della 0-1 loss: se la classe predetta è giusta restituisce $0$, altrimenti $1$.
A dispetto del nome, la 0-1 loss non va confusa con le funzioni di costo usate in addestramento. Tra i vari aspetti prevale sicuramente il fatto che non sia differenziabile, e che sia quindi sostanzialmente inapplicabile alla fase di backpropagation. Al contrario, in fase di validazione e test fornisce in modo semplice e diretto la percentuale di errori commessi dal modello. Esattamente quello che dovrebbe fare una spia.
Le funzioni di loss in base al loro ruolo:
fase di addestramento: sono funzioni differenziabili (es. Cross-Entropy) che permettono il calcolo dei gradienti durante la fase di backpropagation.
fase di validazione: ad ogni epoca monitorano l’accuratezza reale per fare tuning degli iperparametri.
fase di test: misurano l’errore effettivo del modello addestrato, dopo la fase di training.
Ripartiamo dal fatto che, variando il dataset $\mathcal{D}$, otteniamo un nuovo modello. Riprendiamo quindi i nostri tre attori e ridefiniamoli rispetto alla moda.
-
$\mathcal{I}(x)$: resta l’ideale da raggiungere. La differenza è che adesso non restituisce un valore ma una categoria.
-
$f_m(x)$: rappresenta la previsione dominante, la classe che il modello produce più spesso al variare del dataset. Prende il posto di $f_{\mu}(x)$ come centro delle previsioni.
$$ f_m(x)=\arg\max_y P_{\mathcal D}\left(f(x,\phi_{\mathcal D})=y\right) $$ -
Il bias viene misurato tramite la 0-1 loss, che segnala se la previsione coincide oppure no con il valore ideale. Usando la notazione delle funzioni indicatrici:
$$ \text{bias} = \mathbb{1}\big(f_m(x) \ne \mathcal{I}(x)\big) $$O scritto in altro modo:
$$ \text{bias} = \begin{cases} 0 \quad \ : f_m(x) = \mathcal{I}(x) \\ \\ 1 \quad \ : f_m(x) \neq \mathcal{I}(x) \end{cases} $$
La varianza ora descrive quanto è probabile che un modello addestrato produca una previsione diversa rispetto alla previsione dominante, ottenuta considerando tutti i possibili dataset:
$$ \text{varianza} = P_\mathcal{D}\big(f(x,\phi_\mathcal{D}) \ne f_m(x)\big) $$Da questa definizione segue una proprietà importante che utilizzeremo più avanti.
Per costruzione, $f_m(x)$ è la classe più frequentemente predetta dai modelli addestrati su tutti i possibili dataset. Nel caso di una classificazione binaria, di conseguenza, un modello addestrato su un dataset casuale coincide con $f_m(x)$ almeno nel 50% dei casi.
Questo implica che la probabilità di ottenere una previsione diversa da $f_m(x)$, cioè la varianza, non può superare $0.5$:
$$ \text{varianza} = P_{\mathcal{D}}\big(f(x,\phi_{\mathcal{D}})\neq f_m(x)\big) \leq 0.5. $$L’errore che vogliamo scomporre è invece la probabilità che il modello assegni a $x$ una classe diversa da quella ideale:
$$ \text{Err}(x) = P_{\mathcal{D}}\big(f(x,\phi_{\mathcal{D}})\neq \mathcal{I}(x)\big). $$A partire da questa quantità mostreremo come l’errore possa essere espresso in funzione del bias e della varianza.
Abbiamo già parlato di come, a livello microscopico, ogni molecola di un gas abbia una velocità diversa e cambi continuamente direzione a causa degli urti. Sarebbe impossibile descrivere il moto di ogni singola particella.
La meccanica statistica aggira il problema introducendo due concetti:
- una quantità media, ad esempio la velocità media delle molecole;
- le fluttuazioni attorno a tale media, che misurano quanto le velocità delle singole particelle si discostano dal valore medio.
In regressione, la varianza misura quanto le predizioni dei diversi modelli oscillano attorno alla previsione media. In classificazione, poiché non esiste una media tra categorie, il ruolo della “velocità media” è assunto dalla previsione dominante $f_m(x)$, mentre la varianza misura con quale probabilità un modello addestrato su un dataset diverso produce una classe differente rispetto a quella dominante.
Quindi la varianza non misura quanto un modello sbaglia, ma quanto le sue predizioni fluttuano quando cambia il dataset di addestramento, proprio come in fisica la varianza delle velocità non misura se una molecola è “giusta” o “sbagliata”, ma quanto si discosta dal comportamento medio.
Tertium non datur
Prendiamo il caso più semplice, con due sole classi e nessun rumore. In questo caso tutto ruota attorno a un’osservazione elementare: se una previsione non coincide con una classe, allora coincide con l’altra. Si tratta di una classificazione binaria e pertanto non ci sono terze possibilità.
L’errore del modello è determinato dall’interazione tra due aspetti: la correttezza della previsione dominante e l’eventuale scostamento del singolo modello da tale previsione. A seconda che $f_m(x)$ coincida oppure no con la classe ideale, si ottengono due situazioni distinte.
Per brevità scriviamo $f$, $f_m$ e $\mathcal{I}$ senza argomento.
Caso A: previsione dominante giusta ($f_m = \mathcal{I}$)
Analogamente a un gas in equilibrio, la configurazione più probabile coincide con quella osservata a livello macroscopico. Le deviazioni dei singoli modelli rappresentano semplici fluttuazioni attorno a questo stato. L’unica fonte di errore rimane la fluttuazione delle singole realizzazioni attorno allo stato più probabile del sistema, cioè la varianza.
Sostanzialmente questo vuol dire che essere in disaccordo con il valore ideale equivale esattamente ad essere in disaccordo con la previsione dominante:
$$ f \ne \mathcal{I} \iff f \ne f_m $$Di conseguenza, l’unico modo in cui il modello può sbagliare è attraverso una fluttuazione rispetto alla previsione dominante:
$$ \text{Err} = P_\mathcal{D}(f \ne f_m) = \text{varianza} $$Caso B: previsione dominante errata ($f_m \neq \mathcal{I}$)
La configurazione più probabile del sistema non coincide con quella corretta. In analogia con un gas, è come se lo stato macroscopico più frequente osservato non rappresentasse il valore che vogliamo descrivere. Le singole realizzazioni possono però ancora discostarsi da questa configurazione dominante.
Poiché consideriamo un problema a due classi, se la maggioranza si trova sulla classe errata, l’unica alternativa possibile è la classe corretta $\mathcal{I}$. Quindi una fluttuazione rispetto alla configurazione dominante porta necessariamente alla previsione giusta:
$$ f = \mathcal{I} \iff f \neq f_m $$In termini statistici, la probabilità che una realizzazione individuale si discosti dalla configurazione dominante coincide con la probabilità di ottenere la classe corretta:
$$ P_\mathcal{D}(f = \mathcal{I}) = P_\mathcal{D}(f \ne f_m) = \text{varianza} $$L’errore di classificazione è quindi il complemento di questa probabilità:
$$ \text{Err} = P_\mathcal{D}(f \ne \mathcal{I}) = 1 - P_\mathcal{D}(f \ne f_m) = 1 - \text{varianza} $$In questo caso otteniamo:
$$ \text{bias} = 1 $$Segue pertanto:
$$ \text{Err} = \text{bias} - \text{varianza} $$Se lo stato più probabile del sistema è lontano dallo stato corretto, le fluttuazioni delle singole particelle possono portare alcuni risultati nella direzione giusta. Qui la variabilità del modello, invece di aumentare l’errore, permette di compensare un errore sistematico della configurazione dominante.
Come si distribuiscono le previsioni dei modelli sulle due classi. La parte verde è la classe corretta, indicata da $I$, la parte rossa è quella sbagliata. Sotto ciascuna barra, $f_m$ segnala il segmento più grande, cioè la classe che il modello predice più spesso. Nel Caso A, in alto, i due simboli sono allineati sulla stessa parte. Nel Caso B, in basso, cadono su parti opposte, ed è tutta qui la differenza tra i due casi.
A + B
I due casi appena analizzati possono essere riuniti in un’unica espressione. Per farlo abbiamo bisogno di un coefficiente che assuma valori diversi a seconda del bias.
Il termine:
$$ 1 - 2 \text{ bias} $$ha esattamente questa proprietà. Quando la previsione dominante coincide con la classe ideale e $\text{bias} = 0$, vale $+1$. Quando invece la previsione dominante è errata e $\text{bias} = 1$, vale $-1$.
Possiamo quindi scrivere la decomposizione dell’errore come segue:
$$ \text{Err}(x) = \text{bias} + (1 - 2 \text{ bias}) \cdot \text{varianza} $$| caso | bias | errore | effetto della varianza |
|---|---|---|---|
| A, previsione dominante giusta | $0$ | varianza | peggiora |
| B, previsione dominante sbagliata | $1$ | $1 -$ varianza | migliora |
L’aspetto interessante è che il segno della varianza dipende dal bias. Se la previsione dominante è corretta, la varianza rappresenta semplicemente una fluttuazione che allontana alcuni modelli dalla risposta giusta, aumentando l’errore. Se invece la previsione dominante è errata, le stesse fluttuazioni permettono ad alcuni modelli di raggiungere la classe corretta, riducendo l’errore.
Riprendendo l’analogia con la meccanica statistica, la varianza descrive sempre le fluttuazioni attorno allo stato più probabile del sistema. Quando quello stato coincide con la configurazione corretta, le fluttuazioni sono indesiderate. Quando invece lo stato dominante è quello sbagliato, le fluttuazioni diventano l’unico meccanismo che permette a un modello addestrato di avvicinarsi alla configurazione corretta.
Questa è la principale differenza rispetto al caso della regressione visto nella Parte 1. In quel caso bias e varianza contribuivano sempre con segno positivo e potevano essere analizzati separatamente. Nella classificazione, invece, bias e varianza sono accoppiati. Il contributo della varianza dipende dal valore del bias e non può più essere studiato indipendentemente da esso.
L'altezza di ogni barra è l'errore, il numero scritto in basso è la varianza. Nel gruppo di sinistra il bias è nullo e le barre si alzano al crescere della varianza, quindi l'errore aumenta. Nel gruppo di destra il bias vale uno e le stesse varianze danno barre sempre più basse, quindi l'errore diminuisce. Nell'ultima colonna entrambi i gruppi arrivano a 0.5, valore che nessuno dei due può oltrepassare.
Vale la pena ricordare che per semplicità siamo partiti dall’ipotesi di assenza di rumore, quindi tutto quello che abbiamo scritto finora descrive un sistema in cui l’unica incertezza è quella introdotta dal dataset. Quando il rumore c’è, e nella pratica c’è sempre, anche l’etichetta corretta diventa incerta e la sua incertezza entra a far parte della decomposizione. Anche in quel caso non si aggiunge come un termine a sé, ma interagisce con gli altri due allo stesso modo in cui abbiamo appena visto interagire bias e varianza.
Talvolta l’instabilità conviene
Il Caso B racconta qualcosa che, con la loss quadratica della regressione, sembrerebbe assurdo. Se il modello è sistematicamente sbagliato, la sua instabilità può addirittura ridurre l’errore.
Un palloncino lo mostra meglio dell’algebra.
Lo stesso palloncino con la stessa pressione media, appena al di sotto della soglia. A sinistra il gas è fermo, l'ago non si muove e la spia resta sempre spenta. A destra il gas è agitato, l'ago giallo oscilla e alcune rilevazioni superano la tacca della soglia, quindi la spia ogni tanto si accende. La media non è cambiata, sono cambiate le fluttuazioni.
Torniamo al nostro palloncino pieno di gas e alla spia che deve rilevare quando la pressione supera una certa soglia. A causa di una taratura errata, la pressione media del palloncino si trova appena sotto quella soglia. Se il gas fosse perfettamente fermo, la misura sarebbe sempre la stessa e la spia rimarrebbe costantemente spenta, quindi il sistema sarebbe stabile ma sempre in errore.
Ora agitiamo il palloncino. Le molecole del gas urtano con maggiore intensità e la pressione comincia a oscillare attorno al suo valore medio. Alcune oscillazioni superano la soglia e la spia si accende per qualche istante. Sono le fluttuazioni del gas che, occasionalmente, portano la misura dalla parte giusta, anche se la pressione media non è cambiata.
Se la previsione dominante $f_m$ è sbagliata, un modello perfettamente stabile continuerebbe a ripetere sempre lo stesso errore. La varianza introduce invece delle fluttuazioni nelle predizioni. Alcuni modelli si allontanano dalla previsione dominante e, proprio per questo, finiscono sulla classe corretta.
In altre parole, un modello instabile ma affetto da un forte bias può commettere meno errori di un modello stabile con lo stesso bias. La varianza non elimina il bias, ma in questo caso ne attenua gli effetti, proprio come le fluttuazioni del gas permettono alla pressione di oltrepassare, di tanto in tanto, una soglia che il valore medio non raggiungerebbe mai.
Proviamo a fare un esempio in modo da rendere il fenomeno più chiaro. Consideriamo un’istanza $x$ per cui la previsione dominante è sbagliata ($\text{bias}=1$) e supponiamo che la classe corretta sia $C$, mentre la classe dominante sia $S$, cioè quella sbagliata.
Per capire perché l’aumento della varianza possa ridurre l’errore, immaginiamo inizialmente che le predizioni siano fortemente concentrate sulla classe $S$.
Potremmo avere, ad esempio:
$$ P(S)=0.95,\qquad P(C)=0.05 $$In questo caso il modello predice la classe sbagliata nel $95\%$ dei casi e indovina soltanto nel $5\%$. Se però aumenta la dispersione delle predizioni, queste diventano meno concentrate attorno alla configurazione dominante e una parte maggiore della probabilità può spostarsi verso la classe corretta.
Per esempio:
$$ P(S)=0.70,\qquad P(C)=0.30 $$Continuando ad aumentare la dispersione, possiamo avvicinarci addirittura al caso limite in cui le due classi diventano equiprobabili:
$$ P(S)=0.50,\qquad P(C)=0.50 $$In questa situazione il modello non è più sistematicamente orientato verso la classe sbagliata, arrivando a comportarsi, nel caso limite, come un lancio di moneta e l’errore si riduce al $50\%$.
I tre casi appena visti. La parte in rosso è la quota di predizioni che cade sulla classe dominante $S$, cioè quella sbagliata. Mentre la parte verde è quella che cade sulla classe corretta $C$. Al crescere della dispersione la parte rossa si accorcia e la verde si allunga. Il tratteggio segna il valore 0.5, sotto il quale la parte rossa non può scendere, perché $S$ resta comunque la classe più frequente.
Vale anche il ragionamento opposto. Nel Caso A, in cui la previsione dominante coincide con la classe corretta, abbiamo
$$ \text{Err}=\text{varianza}\le 0.5. $$Qui le fluttuazioni possono solo peggiorare le prestazioni, ma nemmeno nel caso più estremo riescono a portare l’errore oltre il $50\%$. Anche un modello estremamente instabile continua infatti a concordare con la previsione dominante almeno metà delle volte.
I due casi si incontrano proprio in questo punto: il $50\%$. È il limite imposto dalla classificazione binaria. Da un lato rappresenta il miglior risultato ottenibile quando la maggioranza è sbagliata, dall’altro il peggior risultato quando la maggioranza è corretta. Come già detto si arriva ad uno stato equivalente ad un testa o croce, dove il modello non contiene più alcuna informazione utile sulla classe corretta.
La morale, quindi, è questa: la decomposizione dell’errore in varianza, bias e rumore esiste sempre, ma non sempre assume la stessa forma. E soprattutto, in casi come questo, non assume certamente una forma additiva.
L’additività è un privilegio della loss quadratica e non dipende né dal modello né dai dati, ma soltanto dalla geometria del quadrato, cioè dal fatto che il termine misto dopo l’espansione si annulla.
Quando cambiamo misura dell’errore, cambia anche il modo in cui questi tre contributi si combinano tra loro.
La probabilità è il buon senso ridotto a calcolo
Credo che il buon vecchio Laplace (uno dei più importanti scienziati francesi dell’età illuminista) abbia raccolto in una frase uno degli aspetti che personalmente trovo più curiosi dell’attuale discussione sull’AI. Da un lato cerchiamo continuamente di “catturare” all’interno di un modello linguistico similitudini con il cervello umano, dall’altro cerchiamo di rendere l’inferenza sempre più corretta. Ma se alla fine quello che cerchiamo è che un modello raggiunga il “buon senso”, faccio notare che di intelligenze in grado di dire se un evento è più o meno plausibile ne è già pieno il mondo.
Ma torniamo al nostro problema. Di sicuro, ciò che adesso è di “sicuro buon senso” consiste nel cambiare modo di valutare l’output. Non conviene più chiedersi “leone o capra?”, ma “quanto sei sicuro che sia un leone?”.
Il punteggio di Brier fa esattamente questo.
Il modello produce una probabilità:
$$ \hat{p} \in [0,1] $$L’etichetta vera per il confronto sarà:
$$ y \in \{0,1\} $$Il punteggio verrà infine così calcolato:
$$ \mathcal{L}(x) = (\hat{p} - y)^2 $$Non ricorda nulla di già visto? Il punteggio di Brier è praticamente una loss quadratica, solo calcolata sulle probabilità. Ed essendo quadratica si scompone esattamente come già visto: varianza, bias e rumore.
L’additività ritorna, e con lei il trucco visto nella prima parte.
Ecco perché, quando si vuole capire davvero il comportamento di un classificatore e ragionare in modo rigoroso su bias e varianza, l’accuratezza da sola non è sufficiente. Una misura che restituisce soltanto un risultato corretto o sbagliato rischia infatti di perdere molte informazioni importanti. Spesso è più utile utilizzare metriche che tengano conto anche di quanto il modello sia sicuro delle proprie previsioni, come il punteggio di Brier e la cross-entropy (introdotta nell’articolo sul caffè).
Il vantaggio pratico di quella somma sta proprio nel fatto che ogni termine può essere modificato senza alterare gli altri, quindi possiamo intervenire su una componente alla volta. Sono le tre grandezze che governano il comportamento del nostro sistema, ciascuna associata a un diverso limite dell’apprendimento.
La temperatura non si può abbassare. È il rumore $\sigma^2$, l’agitazione termica intrinseca del dato. Lo stesso ingresso può corrispondere a uscite diverse, e nessun modello, per quanto perfetto, può prevederle tutte. È il muro invalicabile dell’apprendimento, quello contro cui ci siamo già scontrati nella Parte 1.
Le molecole osservate in un istante sono i dati. La varianza nasce dal fatto che il modello viene addestrato su un campione finito e inevitabilmente rumoroso, perciò cambia ogni volta che cambia il campione. Il motivo per cui avere più dati aiuta è esattamente quello del manometro. In presenza di poche molecole l’ago oscilla, con molte molecole si stabilizza perché gli urti si compensano. Ogni punto anomalo pesa sempre meno e i modelli addestrati su dataset diversi finiscono per assomigliarsi sempre di più. Il termine $\mathbb{E}_{\mathcal{D}}[(f-f_\mu)^2]$ misura proprio questa differenza tra modelli e tende a contrarsi.
Il volume rappresenta la capacità del modello. Il bias nasce dalla rigidità della famiglia di modelli scelta. La “forma ideale” che il modello vuole raggiungere potrebbe semplicemente non essere tra quelle che il modello stesso è in grado di assumere. Un gas confinato in un volume non tanto grande può esplorare poche configurazioni, mentre se consideriamo un volume più grande allora il numero di configurazioni possibili aumenta e la previsione media $f_\mu(x)$ può avvicinarsi sempre di più all’ideale $\mathcal{I}(x)$.
Un colpo al cerchio e uno alla botte
Il detto nasce dall’antico mestiere dei maestri bottai che, durante la fabbricazione delle botti di legno, dovevano saper assestare nel modo giusto i colpi di mazza. Un colpo al cerchio di metallo per farlo scorrere e posizionarlo, un colpo alle doghe della botte per assestarle ed evitare che il legno si rompesse.
Avere a che fare con bias e varianza non è molto diverso. Possiamo aumentare la capacità del modello in modo da abbassare il bias, ma di contro otterremmo una varianza più alta. Questo perché un modello non ha modo di distinguere tra segnale e rumore. Pertanto la stessa libertà che permette al modello di seguire la “forma ideale” corretta finisce per permettergli di adattarsi in modo altrettanto efficace alle fluttuazioni casuali presenti nei campioni che ha “osservato”.
Possiamo descrivere questo rapporto guardando l’errore riducibile in funzione della capacità del modello:
$$ \text{errore riducibile} = \underbrace{ \mathbb{E}_\mathcal{D}\big[(f-f_\mu)^2\big] }_{\text{cresce con la capacità}} + \underbrace{ \big(f_\mu(x) - \mathcal{I}(x)\big)^2 }_{\text{decresce con la capacità}} $$All’inizio, quando il modello ha poca capacità, è troppo semplice per rappresentare bene il segnale. Segue quindi che il problema principale è rappresentato dal bias. Aumentarne la capacità permette di avvicinarsi progressivamente alla funzione corretta e l’errore diminuisce.
Superata una certa soglia, però, entra in gioco la varianza. Il modello è ormai abbastanza flessibile da rappresentare il segnale, ma proprio per questo può iniziare a seguire anche le fluttuazioni accidentali del campione. L’errore torna quindi a crescere.
Il risultato è la classica curva a U:
- bassa capacità $\Rightarrow$ bias alto, varianza bassa $\Rightarrow$ aumentare la capacità migliora il modello
- capacità intermedia $\Rightarrow$ bias e varianza raggiungono un compromesso $\Rightarrow$ si trova il punto ottimale
- alta capacità $\Rightarrow$ bias basso, varianza alta $\Rightarrow$ aumentare ulteriormente la capacità peggiora la generalizzazione.
Da sinistra a destra cresce la capacità del modello. Le due curve tratteggiate sono le componenti dell'errore riducibile, il bias al quadrato che diminuisce e la varianza che aumenta. La curva a tratto pieno è la loro somma e il punto segnato è il suo minimo, cioè la capacità che rende l'errore più basso possibile.
Se non ti aspetti l’inatteso non lo scoprirai
Il filosofo greco Eraclito concluse questa frase con “…introvabile com’è, e inaccessibile”, il che potrebbe renderla adatta più che mai anche a questi tempi di AI.
Di sicuro possiamo dire che qualcosa di simile è accaduto nel caso del fenomeno che vedremo di seguito.
Secondo la teoria classica, quindi, esiste una capacità ottimale oltre la quale un modello sempre più potente dovrebbe generalizzare sempre peggio.
Ad un certo punto però, probabilmente durante un evento quasi serendipico, si è cominciato ad osservare che questa curva a U non sempre continua a comportarsi come previsto. In alcuni casi, dopo che il modello ha raggiunto un picco, che si trova proprio attorno alla soglia di interpolazione (il punto in cui il modello diventa abbastanza potente da “memorizzare” perfettamente tutti i dati di addestramento), l’errore torna a scendere, arrivando anche al di sotto del minimo osservato nella curva classica.
Questo fenomeno è stato formalizzato per la prima volta nell’articolo del 2019 Reconciling Modern Machine Learning Practice and the Classical Bias-Variance Trade-off (Mikhail Belkin, Daniel Hsu, Siyuan Ma, Soumik Mandal). Pochi mesi dopo, un gruppo di ricercatori di OpenAI ha ampliato la scoperta dimostrando che il fenomeno non avviene solo in base alla grandezza del modello, ma può manifestarsi anche durante l’addestramento, al variare del numero di epoche. Quest’ultimo studio, intitolato Deep Double Descent: Where Bigger Models and More Data Hurt (Preetum Nakkiran, Gal Kaplun, Yamini Bansal, Tristan Yang, Boaz Barak, Ilya Sutskever), ha contribuito a diffondere il termine double descent.
Possiamo descrivere intuitivamente il double descent osservando come varia l’errore al crescere della capacità del modello:
-
Modello piccolo: underfitting $\Rightarrow$ errore alto
-
Modello medio: buona generalizzazione $\Rightarrow$ errore basso
-
Modello grande: siamo vicini alla soglia di interpolazione $\Rightarrow$ errore alto
-
Modello ancora più grande: double descent $\Rightarrow$ l’errore torna a scendere
In altre parole, aumentando la capacità del modello, l’errore può prima diminuire, poi aumentare nella zona di interpolazione e infine diminuire nuovamente quando il modello diventa ancora più grande.
Conviene però guardare con attenzione a quale dei quattro passaggi sia davvero anomalo. I primi tre non lo sono affatto, perché descrivono esattamente la curva a U che abbiamo appena ricavato dal compromesso tra bias e varianza. Nel quarto, superata la soglia di interpolazione, la varianza dovrebbe continuare a crescere insieme alla capacità. E invece no, smette di farlo. Sorpresa!
La curva prosegue oltre la soglia di interpolazione rappresentata dalla linea verticale in rosso. Il tratteggio grigio mostra come dovrebbe comportarsi la curva secondo la teoria classica, cioè continuare a mantenere un andamento strettamente crescente. Questa invece, raggiunto un punto massimo, torna immediatamente a scendere raggiungendo un nuovo minimo rispetto a quello che aveva toccato prima della soglia.
A questo punto, però, è importante chiarire cosa significhi realmente memorizzare i dati e perché questo non implichi necessariamente un cattivo comportamento sul test.
Riprendendo quanto scritto nell’articolo sulle reti neurali, il fatto che la training loss si avvicini a zero significa che il modello riesce a passare praticamente attraverso tutti i punti osservati. Tuttavia, esistono infinite funzioni capaci di passare per gli stessi punti. Queste funzioni sono indistinguibili sui dati di addestramento, ma possono comportarsi in modo molto diverso negli spazi tra un punto e l’altro. È proprio questo comportamento sui dati non osservati a determinare se il modello generalizzerà bene o male.
Gli stessi punti osservati, attraversati da tre funzioni diverse. Tutte passano per ogni punto osservato, ma si comportano in modo molto diverso negli spazi intermedi. La curva verde è regolare, le altre due oscillano. Con i dati di addestramento risultano indistinguibili, mentre su dati nuovi no.
Quindi, dire che un modello ha memorizzato i dati non è sufficiente per capire quale funzione abbia effettivamente imparato. Il punto cruciale è capire quale delle infinite soluzioni possibili viene scelta dal modello.
Qui entra in gioco il concetto di bias induttivo. In questo caso non si fa riferimento alla decomposizione bias-varianza, ma a un tipo di bias che indica una tendenza del modello a preferire alcune soluzioni rispetto ad altre. Ad esempio, un modello può avere una preferenza per funzioni più semplici o più regolari, anche quando esistono moltissime funzioni altrettanto capaci di ottenere una training loss vicina allo zero.
Questo aiuta anche a comprendere il double descent visto in precedenza, dal momento che superare la soglia di interpolazione e raggiungere una loss di training ottimale non significa necessariamente che il modello generalizzerà peggio. Anche tra i modelli che memorizzano perfettamente i dati, alcuni possono trovare soluzioni che generalizzano molto bene.
In un gas, contare le funzioni compatibili con i dati è lo stesso che contare i microstati compatibili con i vincoli (anche questo argomento è stato visto nell’articolo sul caffè). Il modello sovra-parametrizzato è un gas con troppo volume a disposizione. Cosa lo fa assestare su una configurazione ottimale piuttosto che erratica?
A questa domanda si cercherà di rispondere nella terza parte.
Parole chiave
- Moda: il valore che ricorre più spesso in un insieme di osservazioni. Nella classificazione sostituisce la media come centro di riferimento delle previsioni.
- 0-1 loss: funzione che restituisce $0$ se la classe predetta è corretta e $1$ altrimenti. Non è differenziabile e non si usa in addestramento, ma è diretta da interpretare in validazione e test.
- Previsione dominante $f_m(x)$: la classe che il modello produce più spesso al variare del dataset di addestramento. Corrisponde alla moda delle previsioni.
- Bias (classificazione): vale $0$ se la previsione dominante coincide con la classe ideale, $1$ altrimenti.
- Varianza (classificazione): probabilità che un modello addestrato su un dataset diverso produca una previsione diversa dalla previsione dominante. Non può superare $0.5$.
- Punteggio di Brier: loss quadratica calcolata sulle probabilità predette anziché sui valori continui. Riporta l’additività della scomposizione bias-varianza al caso della classificazione.
- Curva a U: andamento dell’errore riducibile in funzione della capacità del modello. Cala con il bias quando la capacità è bassa, risale con la varianza quando la capacità è troppo alta.
- Soglia di interpolazione: punto in cui la capacità del modello diventa sufficiente a passare attraverso tutti i punti del training set con loss nulla.
- Double descent: fenomeno per cui l’errore, dopo aver raggiunto un picco in prossimità della soglia di interpolazione, torna a scendere nei modelli sovraparametrizzati.
- Bias induttivo: tendenza del modello a preferire alcune soluzioni rispetto ad altre tra le infinite funzioni compatibili con i dati di addestramento.