(Come fare colazione nel sud dell’Italia e capire il modo in cui le reti neurali classificano)

premessa: questo articolo prosegue il discorso iniziato con le reti neurali: parte 1 parte 2. Inoltre potrebbe risultare un po’ più impegnativo, nel caso non vi tornasse qualcosa, scrivetemi.

Sono nato in una regione del sud Italia (la Puglia), dove il caffè è una religione. Ma non semplicemente “il caffè”. Il caffè fatto in un certo modo e soprattutto caldo. In realtà neanche caldo. Bollente.

Il caffè deve essere bollente e fin da piccolo ho assistito all’estenuante lotta di mio nonno con il tempo. Soprattutto in inverno mio nonno doveva lottare con il tempo. Il tempo passava e il caffè si raffreddava, non c’era soluzione. Un attimo di troppo a guardare la televisione e il caffè era rovinato.

Anni dopo avrei voluto consolare mio nonno spiegandogli che non esiste una forza fondamentale che vieti esplicitamente il fatto che il caffè si possa scaldare spontaneamente dal tavolino. Le leggi microscopiche della fisica lo consentono in linea di principio. Tuttavia per un sistema macroscopico come una tazzina di caffè caldo, sarebbe necessaria una fluttuazione statistica di entropia estremamente improbabile. Detto in modo più semplice: la probabilità è così piccola da rendere il fenomeno altamente improbabile.

Le leggi della fisica a livello microscopico sono reversibili: se filmassi gli urti di ogni singola molecola e mandassi il filmato al contrario, ogni singolo urto resterebbe perfettamente valido secondo le leggi di Newton. È solo a livello macroscopico, dove contano le probabilità aggregate su miliardi di miliardi di molecole, che una direzione diventa predominante e di conseguenza più probabile dell’altra. Non è una legge nel senso di un divieto. È una fluttuazione che il sistema non compie mai, per ragioni di probabilità, non di principio.

L’idea che la certezza che osserviamo sia il prodotto di un’enorme quantità di eventi probabilistici ci riporta dove abbiamo concluso gli articoli sulle reti neurali.

Quando una rete neurale deve scegliere una categoria, non restituisce una risposta certa, ma una distribuzione di tutte le risposte possibili. E non è molto diverso dalla tazza di caffè di mio nonno. Questa “restituisce” una direzione del flusso di calore senza che nessuna legge gliela imponga esplicitamente.

Ci sono molte rappresentazioni didattiche per introdurre i modi in cui una rete neurale “classifica” e per lo più fanno riferimento a come noi osserviamo e classifichiamo (tutte estremamente valide, sia chiaro). Tuttavia, l’ho già detto, vorrei introdurre le questioni relative all’AI da un punto di vista abbastanza strano da far venire il sospetto che sia qualcosa di molto più complesso e profondo di un’imitazione.

O per lo meno quando scriverò di Large Language Model e televisori a tubo catodico, sicuro avrò preparato il terreno in modo che la cosa non risulti troppo strana.

Assolutamente forse

La comunità scientifica di fine Ottocento era dominata dal determinismo assoluto, secondo cui le leggi della natura dovevano essere certe e precise, non probabilistiche. Poi arrivò lui: Ludwig Boltzmann. Introdusse per la prima volta il concetto che la certezza osservata è il prodotto di un’enorme quantità di eventi probabilistici. Purtroppo fece arrabbiare tutti, ma oggi sappiamo che aveva ragione lui.

Boltzmann formalizzò esattamente l’intuizione della tazza di caffè (nel suo esempio credo fosse di tè), spiegando come un sistema fisico non occupi un solo stato microscopico ma andrebbe visto come una distribuzione su tutti gli stati compatibili con l’energia totale.

Il numero di questi stati si chiama $W$ ed è il numero di modi in cui il sistema può essere arrangiato mantenendo le stesse proprietà macroscopiche osservabili (temperatura, pressione, volume).

Sostanzialmente mio nonno si è dovuto rassegnare al fatto che il calore fluisce in una direzione. E lo fa perché allo stato macroscopico del caffè che va raffreddandosi, corrispondono enormemente più stati microscopici di quanti ne corrispondano allo stato opposto.

Ora, per quanto possa sembrare complicato, passare alla matematica di quanto detto è tanto semplice quanto utile, vedrete.

Per dare forma alle sue idee, Boltzmann aveva bisogno di una misura, relativa al numero di questi stati $W$, che si comporti in modo prevedibile quando due sistemi indipendenti si combinano. Se prendo ad esempio due tazzine di caffè identiche e le considero come un unico sistema, il numero di stati microscopici totali deve essere:

$$ W_1 \cdot W_2 $$

dove la moltiplicazione sta ad indicare che ogni stato della prima tazzina può combinarsi con ogni configurazione della seconda.

E qui arriva un problema, la grandezza che si sta costruendo, per avere senso deve essere additiva: la misura delle due tazzine insieme deve essere il doppio della misura di una tazzina sola. Quindi il risultato non deve dipendere dal modo complicato in cui si combinano le configurazioni.

Detto matematicamente serve una funzione $f$ in grado di fare questo:

$$ f(W_1 \cdot W_2) = f(W_1) + f(W_2) $$

Ma una funzione continua con queste proprietà esiste, e si chiama logaritmo. Il quale ha anche una seconda proprietà molto interessante: il logaritmo riporta valori molto piccoli su una scala maneggevole ($\log(10^{-300})$ è semplicemente $-300 \cdot \log(10)$, un numero ordinario). E in questo caso ci sarà bisogno perché le probabilità di eventi indipendenti si moltiplicano, e il prodotto di molti numeri piccoli diventa rapidamente un numero così piccolo da essere ingestibile.

Quindi Boltzmann definisce:

$$ S = k_B \ln(W) $$

e chiama questa grandezza $S$ entropia.

due parole su $k_B$: la costante $k_B$ non viene dalla deduzione appena fatta. Il vincolo di additività ci dice solo che la funzione deve essere un logaritmo, non con quale fattore moltiplicarlo. Quel fattore è una pura scelta di unità di misura.

Quante informazioni si leggono in una tazzina di caffè?

Andando più avanti nella storia e più precisamente nel 1948, Claude Elwood Shannon (il padre della moderna teoria dell’informazione), senza far arrabbiare nessuno questa volta, si pose un problema diverso: quanta incertezza contiene una distribuzione di probabilità $\{p_1, \ldots, p_K\}$ su $K$ eventi possibili?

Partiamo dalla singola occorrenza. Chiamiamo sorpresa la quantità di informazione che ricaviamo nel vedere accadere un evento di probabilità $p$: un evento quasi certo non ci dice quasi nulla (sorpresa bassa), un evento rarissimo ci dice molto (sorpresa alta). E qui torna esattamente il vincolo di Boltzmann. Se osservo due eventi indipendenti, le loro probabilità si moltiplicano ($p_1 \cdot p_2$), ma la sorpresa che ne ricavo deve sommarsi: vedere due cose indipendenti mi informa quanto la prima più la seconda. Serve quindi una funzione $s$ tale che

$$ s(p_1 \cdot p_2) = s(p_1) + s(p_2) $$

È la stessa identica equazione funzionale di prima, e la sua unica soluzione continua è di nuovo il logaritmo. Poiché le probabilità stanno tra 0 e 1 (e il loro logaritmo è negativo), per avere una sorpresa positiva si mette un segno meno: $s(p) = -\log(p)$.

A questo punto l’incertezza di un’intera distribuzione è semplicemente la sorpresa attesa, cioè la media delle sorprese pesata sulle probabilità con cui ciascun evento si verifica:

$$ H = \sum_{k=1}^{K} p_k \cdot s(p_k) = - \sum_{k=1}^{K} p_k \log(p_k) $$

Questa è l’Entropia di Shannon. Non misura il “disordine” fisico, ma la quantità attesa di sorpresa in una distribuzione. Stessa deduzione di Boltzmann, stesso logaritmo, applicato però alla sorpresa invece che al numero di stati.

Torniamo alla tazzina di caffè di mio nonno e immaginiamo un modellino semplificato a due scomparti di pari capacità: la tazza e l’ambiente immediatamente intorno (il tavolo, l’aria). Poniamoci una domanda: se scegliessi a caso un’unità di calore, in quale dei due scomparti la troverei?

Appena versato il caffè, la risposta è facile. Il calore è quasi tutto ancora nella tazzina, perché non ha ancora avuto tempo di diffondersi. La distribuzione di probabilità sui due scomparti è quasi tutta concentrata su un’opzione: $p_{\text{tazza}} \approx 1$, $p_{\text{tavolo}} \approx 0$. La mia incertezza è bassissima, sono quasi certo della risposta, quindi $H$ è quasi zero.

Se mio nonno si distrae per un tempo sufficientemente lungo, i due scomparti si portano alla stessa temperatura. La stessa domanda diventa molto più difficile, dato che il calore ormai si è ripartito tra i due. A questo punto le due probabilità si avvicinano, $p_{\text{tazza}} \approx p_{\text{tavolo}} \approx 0.5$, e non ho più alcun indizio per scegliere tra le due opzioni. Ora la mia incertezza è massima, quindi $H$ è massima.

Questa domanda a due esiti, tazza o tavolo, ha esattamente la stessa struttura della domanda che porrà la rete neurale più avanti: gatto o cane, classe 1, classe 2 o classe 3. In entrambi i casi $H$ misura quanto il sistema è in bilico tra le opzioni disponibili.

Il caffè fa bene ai neuroni

Non so se sia vero, ma mio nonno me lo ripeteva spesso prima di un esame “bevi un caffè prima di cominciare, che fa bene al cervello”. Ma visto che me lo ha detto lui e dato che a me il caffè piace lungo e tiepido, mi farò perdonare dimostrandolo matematicamente.

Quindi, dove eravamo rimasti con le reti neurali? Avevamo un modello $\boldsymbol{f(x, \theta)}$ e un ultimo livello della rete che produce $K$ numeri arbitrari:

$$ \boldsymbol{f(x, \theta)} = \{f_1, f_2, \ldots, f_K\} \in \mathbb{R}^K $$

come la tazzina di caffè, prima che si osservi la direzione del flusso di calore, il modello non ha ancora scelto. Vive in uno spazio di valori di qualsiasi tipo. La probabilità non è descritta in alcun modo.

Per trasformarli in una distribuzione di probabilità valida su $K$ classi servono due condizioni, entrambe dettate dal significato stesso di probabilità:

  • nessun valore può essere negativo, perché non ha senso dire che un evento ha il “meno 20%” di probabilità di accadere

  • i valori devono sommare esattamente a 1, perché sono certo che può verificarsi solo uno dei $K$ esiti possibili, non di più e non di meno.

Una funzione che soddisfa entrambe le condizioni è la softmax, applicata agli output grezzi $z_k = f_k$ della rete:

$$ \lambda_k = \text{softmax}_k(\mathbf{z}) = \frac{e^{z_k}}{\sum_{k'=1}^{K} e^{z_{k'}}} $$

Dove:

  • l’esponenziale $e^{z_k}$ è sempre positivo, qualunque sia $z_k$, il che garantisce la prima condizione

  • dividendo per la somma di tutti gli esponenziali, si ottiene $\sum_k \lambda_k = 1$ e anche la seconda condizione è soddisfatta.

E qui “esattamente come” non è un modo di dire. È il punto su cui vorrei fermarmi un attimo, perché secondo me è la cosa più bella di tutta questa storia.

Oltre all’entropia, c’è un’altra formula che porta il nome di Boltzmann: la distribuzione di Boltzmann, che dà la probabilità di trovare un sistema fisico nello stato $k$, con energia $E_k$, alla temperatura $T$:

$$ p_k = \frac{e^{-E_k / k_B T}}{\sum_{k'} e^{-E_{k'} / k_B T}} $$

Mettiamola sotto la softmax e guardiamole insieme. È la stessa identica forma. L’unica differenza è cosa sta all’esponente: dove Boltzmann ha $-E_k / k_B T$, la rete ha $z_k$. Per il resto, non è un’analogia, è la stessa equazione.

Detto altrimenti: l’output grezzo della rete è un’energia, cambiata di segno e scala. Un valore alto corrisponde a un’energia bassa, e in fisica gli stati a bassa energia sono i più probabili. La rete, senza saperlo, assegna a ogni classe un livello energetico e poi lascia che sia la statistica di Boltzmann a decidere quanto è probabile. Anche il denominatore ( la somma su tutti gli stati) in termodinamica ha un nome, funzione di partizione, e la ritroveremo tra poco travestita da $\log \sum_{k'} e^{f_{k'}}$ .

Quindi affermare che il modello, come la tazzina di caffè, vive in una distribuzione definita su tutti i possibili stati prima che l’osservazione ne fissi uno, non vuol dire prendere a prestito un’immagine dalla fisica a caso, ma si sta descrivendo sostanzialmente la stessa equazione.

la temperatura del caffè: la somiglianza si può portare fino in fondo. Se nella softmax dividiamo l’esponente per un parametro $T$:

$$ \lambda_k = e^{z_k / T} / \sum_{k'} e^{z_{k'} / T} $$

ritroviamo letteralmente la temperatura di Boltzmann, e con essa la tazzina di mio nonno. Con $T$ alta gli esponenti si appiattiscono, le probabilità si avvicinano e la distribuzione tende all’uniforme: massima incertezza, $H$ massima, il caffè ormai all’equilibrio. Con $T \to 0$ un solo stato domina e la distribuzione collassa su una sola classe: è il caffè appena versato, ed è esattamente l’$\arg\max$ che useremo nell’inferenza. Raffreddare la softmax e raffreddare il caffè sono la stessa operazione.

Probabilmente questo è un errore

Boltzmann aveva trovato il modo di misurare il “disordine” di un sistema fisico. Shannon aveva trovato il modo di misurare l’incertezza di una distribuzione di probabilità. Resta un’ultima domanda: come si misura quanto è sbagliata la distribuzione predetta dal modello, rispetto al risultato atteso?

Partiamo da qualcosa che abbiamo fissato negli articoli sulle reti neurali: per ogni esempio di training $i$ abbiamo il risultato atteso $y_i$. Possiamo descrivere quest’ultimo come una distribuzione di probabilità anche se non c’è nulla di propriamente incerto. Nel senso che, dato l’insieme dei risultati attesi, possiamo direttamente assegnare $1$ al risultato corretto e $0$ al resto $y_i = \{0,1,0,\ldots, 0\}$. È questa una distribuzione concentrata tutta in un punto, che in statistica si chiama degenere.

Facciamo un esempio pratico: stiamo addestrando un modello di riconoscimento di animali, la distribuzione del nostro ground truth potrebbe essere rappresentata in questo modo:

$$ \begin{align*} \boldsymbol{y}_1 &= \{ 1, 0, 0, 0, \ldots \} = \text{gatto} \\ \boldsymbol{y}_2 &= \{ 0, 1, 0, 0, \ldots \} = \text{cane}\\ \boldsymbol{y}_3 &= \{ 0, 0, 1, 0, \ldots \} =\text{uccello}\\ \boldsymbol{y}_4 &= \{ 0, 0, 0, 1, \ldots \} =\text{pesce}\\ y_n &= \ldots \ \ \ = \ldots \end{align*} $$

Bene, ora possiamo avere due distribuzioni da confrontare sulle stesse $K$ classi: quella generata dal modello, $\{\lambda_k\}$, e questa distribuzione in cui ogni elemento è concentrato sulla classe giusta. Quanto sono diverse?

Shannon aveva misurato l’incertezza di un’unica distribuzione con $H = -\sum_k p_k \log p_k$. Per misurare la discrepanza tra due distribuzioni si usa la stessa idea. Calcoliamo il logaritmo della distribuzione del modello e confrontiamo il risultato con le probabilità della distribuzione ideale. Poiché la distribuzione ideale ha probabilità 1 solo sulla classe $y_i$ e 0 su tutte le altre, nella somma sopravvive un solo termine, ed è dato dal logaritmo della probabilità che il modello assegna proprio alla classe corretta.

Questa quantità si chiama cross-entropy, e nella sua forma generale si scrive:

$$ H(p, q) = -\sum_{k=1}^{K} p_k \log q_k $$

dove $p$ è la distribuzione ideale (il ground truth) e $q = \{\lambda_k\}$ quella predetta dal modello.

Certo, certissimo, anzi probabile

L’aforisma è di Ennio Flaiano, non era un matematico ma un giornalista e intellettuale la cui ironia oggi più che mai andrebbe coltivata.

Arrivati a questo punto c’è una questione importante che vorrei far notare, nell’articolo sulle reti neurali, abbiamo definito l’errore in termini di distanza, mentre nel paragrafo precedente abbiamo parlato di “discrepanza” tra distribuzioni di probabilità.

Quindi prima di descrivere formalmente la probabilità che vogliamo massimizzare, vale la pena fermarsi un attimo su cosa significhi quella probabilità.

Qual è la probabilità che piova? La risposta cambia radicalmente se aggiungo un’informazione: qual è la probabilità che piova, sapendo che il cielo è già coperto di nuvole nere?

La probabilità non vive da sola. È sempre la probabilità di qualcosa, calcolata sapendo qualcos’altro. Questo “sapendo” è proprio quello che intendevamo con Boltzmann, anche se non lo si è esplicitato. Cambiare l’energia cambia il numero di stati accessibili, e quindi cambia l’intera distribuzione di probabilità su cui Boltzmann misurava il disordine.

Nel nostro caso invece quel “sapendo” è l’output della rete. Cambiando i parametri $\theta$ cambia ciò che la rete calcola e quindi cambia l’intera distribuzione sulle classi. Non stiamo chiedendo “quanto è probabile la classe giusta” in assoluto, ma “quanto è probabile la classe giusta, dato ciò che la rete ha calcolato a partire dall’input”.

Questa è la probabilità di cui stiamo parlando:

$$ P(y_i \mid f(x_i, \theta)) $$

Possiamo leggere la formula come: la probabilità (condizionata) della risposta corretta $y_i$, sapendo cosa ha calcolato il modello $f$ a partire dall’input $x_i$ con i parametri $\theta$. Nella seconda parte dell’articolo sulle reti neurali abbiamo parlato di un cambio di punto di vista tra input e parametri. Qui accade la stessa cosa, i parametri $\theta$ sono ciò che vogliamo “aggiustare” durante l’addestramento. La stessa rete, con gli stessi pesi, deve assegnare la probabilità corretta a ogni input diverso che le viene presentato.

Questa è la probabilità che otteniamo confrontando ogni risultato con la distribuzione degenere del ground truth.

Le pieghe dell’assolutamente forse

Siamo quindi arrivati ad una parte a cui tengo molto perché secondo me lascia intravedere le pieghe dove si nasconde la vera complessità del deep learning.

Immaginiamo un gas in una scatola chiusa e isolata, dove non entra né esce energia. Questo significa che l’energia totale del gas è fissata.

Le molecole però si muovono continuamente e si scambiano energia tra loro. In ogni istante, l’energia totale è la stessa, ma può essere distribuita in modi diversi tra le molecole.

La probabilità, quindi, non riguarda “qualsiasi stato possibile”, ma solo quelli in cui la somma delle energie delle molecole resta uguale a quella fissata. Tutti gli altri stati vengono esclusi perché violerebbero il vincolo.

In altre parole: il gas può essere in molti microstati diversi, ma solo quelli compatibili con l’energia totale contano davvero. La probabilità non è mai assoluta, è sempre condizionata a ciò che teniamo fissato (qui l’energia). È lo stesso “sapendo” della pioggia e delle nuvole nere, ed è lo stesso che abbiamo scritto poco fa nella $P(y_i \mid f(x_i, \theta))$: la distribuzione del modello non è “una qualsiasi”, è quella condizionata a ciò che la rete ha calcolato a partire dall’input. Il gas vincolato dall’energia e il modello vincolato dal suo output sono due distribuzioni condizionate, e questo è il punto di contatto vero.

Fissato questo, il passo successivo consiste nel massimizzare la probabilità che il modello assegna alla classe corretta per ciascun esempio del dataset:

$$ \hat{\theta} = \underset{\theta}{\arg\max} \prod_{i=1}^{I} P(y_i \mid f(x_i, \theta)) $$

La forma a prodotto deriva dall’ipotesi che gli esempi siano indipendenti e identicamente distribuiti (i.i.d.), il che consente di fattorizzare la probabilità congiunta come prodotto delle probabilità dei singoli campioni. Ma per le stesse ragioni di Boltzmann e Shannon, la misura deve essere additiva. Si applica quindi il logaritmo, e lo si può fare senza conseguenze perché è una funzione monotona crescente (non sposta la posizione dei punti di ottimo, ma trasforma il prodotto in una somma). Il punto che massimizza il prodotto è esattamente quello che massimizza la somma dei logaritmi. È una proprietà che tornerà utile con la discesa del gradiente.

$$ \hat{\theta} = \underset{\theta}{\arg\max} \sum_{i=1}^{I} \log P(y_i \mid f(x_i, \theta)) $$

Direi che ci siamo, abbiamo dato una risposta alla richiesta di formalizzare l’errore. Però il nostro è un problema di minimizzazione e nella formula c’è un $\arg\max$ che stona parecchio.

Nessun problema, cambiare il segno a una funzione non cambia dove si trovano i suoi punti estremi, li scambia soltanto. Quindi il punto che massimizza una somma è esattamente lo stesso punto che minimizza quella somma cambiata di segno. Segue la possibilità di scrivere lo stesso $\hat{\theta}$ di prima in un modo del tutto equivalente, come un problema di minimizzazione:

$$ \hat{\theta} = \underset{\theta}{\arg\min} \left[ -\sum_{i=1}^{I} \log P(y_i \mid f(x_i, \theta)) \right] $$

È ora di dare un nome all’espressione tra parentesi: cross-entropy loss. E dal nome si dovrebbe capire il suo ruolo all’interno di una rete neurale, trattandosi fondamentalmente di una funzione appartenente alla famiglia delle loss function.

$$ L(\theta) = -\sum_{i=1}^{I} \log P(y_i \mid f(x_i, \theta)) $$

Quindi potremmo riscrivere il nostro problema dei minimi come segue:

$$ \hat{\theta} = \underset{\theta}{\arg\min} \; L(\theta) $$

Anche in questo caso, la penalità è logaritmica per la stessa ragione strutturale di Boltzmann e Shannon. L’asimmetria è incorporata nella forma: se il modello assegnava probabilità alta alla classe giusta, $-\log P$ è piccolo. Se era molto sicuro e sbagliava, $-\log P$ esplode.

Essere certi e sbagliare costa molto più che essere incerti e sbagliare, non per scelta di design, ma per la geometria del logaritmo vicino agli estremi.

breve nota didattica:

Sostituendo esplicitamente la softmax nella loss si ottiene una forma computazionalmente più trattabile.

$$L(\theta) = -\sum_{i=1}^{I} \left( f_{y_i}(x_i, \theta) - \log \sum_{k'=1}^{K} e^{f_{k'}(x_i, \theta)} \right)$$

Il primo termine premia l’output corrispondente alla classe giusta. Il secondo penalizza tutti gli output. Questa forma è anche numericamente più stabile rispetto a calcolare esplicitamente la softmax e poi prenderne il logaritmo, ed è in genere la formula che si trova in vari libri di testo.

Un gradiente di probabilità

Cosa cambia nella backpropagation? La struttura è sostanzialmente identica. Cambia solo il segnale di errore all’output ($\delta^L$), che ora viene calcolato a partire dalla cross-entropy invece che dall’MSE. Tutto il resto (gradienti, aggiornamento dei pesi, discesa del gradiente) funziona esattamente come descritto nella Parte 2:

$$ (\theta - \eta \cdot \nabla_\theta \mathcal{L}) \rightarrow \theta $$

C’è però una particolarità che merita di essere descritta. Mettendo insieme softmax e cross-entropy, la derivata della loss rispetto agli output grezzi si semplifica fino a sparire in una sola riga.

$$ \delta_k^L = \lambda_k - y_k $$

Il segnale che torna indietro nella rete è semplicemente la differenza tra la probabilità assegnata dal modello e quella che avrebbe dovuto assegnare. Nient’altro. È una delle formule più eleganti dell’apprendimento profondo, e non è affatto un caso. Softmax e cross-entropy sono state scelte anche perché, insieme, producono esattamente questa semplificazione.

C’è poi un altro aspetto particolarmente interessante. La loss:

$$ L = -\log P $$

può crescere senza alcun limite quando il modello sbaglia con grande sicurezza. Se alla classe corretta viene assegnata una probabilità sempre più vicina a zero, la penalità diventa sempre più severa e tende all’infinito. Ci si potrebbe allora aspettare che anche il gradiente esploda a causa di gradienti troppo grandi (è uno dei vari effetti di un addestramento andato male, ne parleremo). In realtà accade il contrario.

Grazie alla struttura matematica della softmax, i termini che tenderebbero a far divergere la derivata si compensano esattamente.

Il risultato finale resta quindi:

$$ \lambda_k - y_k, $$

un valore che non può mai uscire dall’intervallo compreso tra $-1$ e $1$.

Questa è una proprietà estremamente utile. La loss function (o funzione di costo) può distinguere in modo drastico tra un errore moderato e un errore commesso con assoluta sicurezza, aumentando indefinitamente la penalità. Al tempo stesso, il segnale di apprendimento rimane controllato e numericamente stabile.

In altre parole, il modello viene punito sempre più duramente per gli errori più gravi, ma senza che il processo di ottimizzazione venga travolto da gradienti fuori scala. È uno dei motivi per cui la coppia softmax e cross-entropy è diventata lo standard per i problemi di classificazione multiclasse.

Ambarabà ciccì coccò

Una volta addestrata la rete, l’inferenza è il momento in cui la distribuzione di probabilità $\{\lambda_k\}$ si traduce in una decisione.

Ora, occhio che può sembrare una filastrocca. Se durante la fase di minimizzazione dovevamo trovare l’errore minimo adesso è il contrario, dobbiamo prendere la classe con la probabilità massima:

$$ \hat{y} = \underset{k}{\arg\max} \; \lambda_k = \underset{k}{\arg\max} \; f_k(x, \hat{\theta}) $$

La softmax non cambia l’ordine relativo dei valori (l’esponenziale è monotono), quindi si può guardare direttamente l’output della rete senza applicarla. La distribuzione resta lì, intatta, con tutta la sua incertezza.

È solo nel momento in cui serve una risposta che ne viene estratta una sola. Esattamente come la tazza di caffè, non smette di obbedire alla statistica solo perché osserviamo una direzione del flusso di calore.

La distribuzione di probabilità sottostante non scompare, semplicemente non ci serve più nel momento della decisione.

La rete diventa un sistema in grado di dare un risultato con la giusta dose di “incertezza” e non di “sicurezza”. Si potrebbe dire che “impara a distribuire bene le sue scommesse”. Accettabile e trascurabile, siamo sempre lì.

classificazione binaria: abbiamo descritto come funziona la classificazione multiclasse ma per la classificazione binaria ($K = 2$) non cambia molto. La softmax si riduce ad una forma più semplice chiamata sigmoide logistica:

$$ \sigma(z) = \frac{1}{1 + e^{-z}} > $$

Questa funzione sostanzialmente schiaccia un singolo valore reale nell’intervallo $[0, 1]$, interpretabile direttamente come la probabilità che l’esempio appartenga alla classe 1. La sigmoide è il caso particolare, la softmax è il caso generale.

Parole chiave

  • Softmax: funzione che trasforma $K$ valori reali arbitrari in una distribuzione di probabilità valida. Garantisce valori positivi e somma uguale a 1.
  • Temperatura (nella softmax): parametro $T$ che controlla quanto è “piatta” la distribuzione. Alta temperatura: distribuzione uniforme, massima incertezza. Temperatura tendente a zero: distribuzione collassata su una sola classe.
  • Distribuzione degenere: distribuzione di probabilità concentrata interamente su un singolo evento. Usata per rappresentare il ground truth nella classificazione.
  • Probabilità condizionata: probabilità di un evento calcolata sapendo che un altro evento si è verificato. Notazione: $P(y_i \mid f(x_i, \theta))$.
  • Cross-entropy: misura la discrepanza tra due distribuzioni di probabilità. Nella classificazione confronta la distribuzione predetta dal modello con il ground truth.
  • Cross-entropy loss: funzione di costo per la classificazione, definita come $L(\theta) = -\sum_i \log P(y_i \mid f(x_i, \theta))$. Penalizza più duramente gli errori commessi con alta sicurezza.
  • Argmax: operazione che restituisce l’indice del valore massimo in un insieme. Usata nell’inferenza per selezionare la classe più probabile.
  • Inferenza: fase in cui la rete addestrata produce una previsione su nuovi dati, selezionando la classe con probabilità massima.
  • Sigmoide logistica: caso particolare della softmax per la classificazione binaria ($K=2$). Definita come $\sigma(z) = 1/(1+e^{-z})$, mappa un valore reale nell’intervallo $[0,1]$.