Salta ai contenuti

Hessiana, curvatura, condizionamento

Il gradiente dice in che direzione una funzione scende. Non dice quanto velocemente la pendenza stessa stia cambiando: se la valle si stringe, se il terreno si appiattisce, se quel punto piatto è un fondo o un valico. Questa è informazione di derivata seconda, e in più dimensioni si raccoglie in una matrice, l’Hessiana. Questo capitolo costruisce l’Hessiana come misura di curvatura locale, mostra come classifica i punti critici, e arriva al bersaglio operativo: il numero di condizionamento spiega perché la discesa del gradiente è lenta, e perché il loss landscape di una rete è dominato da punti di sella, non da minimi.

Il capitolo precedente di questa Parte, Derivate parziali, gradienti, Jacobiani, si è fermato alla derivata prima: il gradiente, il vettore che impila le pendenze lungo ogni variabile e indica la direzione di massima salita. Con il solo gradiente si può addestrare un modello — la discesa del gradiente non chiede altro — ma non si può capire perché l’addestramento si comporti come si comporta.

Considera tre situazioni che il gradiente da solo non distingue. Un learning rate appena troppo grande e la loss esplode; appena più piccolo e la loss scende con una lentezza esasperante: la finestra utile è strettissima. Un optimizer che zigzaga avanti e indietro invece di scendere dritto verso il fondo. Un training che sembra essersi bloccato su un plateau, dove il gradiente è quasi nullo per migliaia di iterazioni, e poi improvvisamente riparte. Tutte e tre hanno una sola spiegazione, e quella spiegazione non è nel gradiente. È nella derivata seconda: in come la pendenza cambia.

La derivata seconda di una funzione di più variabili è una matrice, la matrice Hessiana. Descrive la curvatura locale della superficie della funzione — quanto e in che modo si incurva attorno al punto in cui ci si trova. Da questa matrice cadono fuori, una dopo l’altra, le risposte: il test che dice se un punto critico è minimo, massimo o sella; il numero che misura quanto è “storta” la valle e quindi quanto sarà lenta la discesa; e l’argomento, oggi accettato, per cui le reti profonde non si bloccano in minimi locali cattivi ma rallentano attorno a punti di sella.

Chi salta questo capitolo può comunque addestrare modelli. Chi lo legge smette di trattare il learning rate come una manopola da girare a caso e comincia a vederlo per quello che è: un numero vincolato dalla curvatura.

Questo capitolo poggia direttamente sui due precedenti di questa Parte. Da Analisi matematica: limiti, continuità, derivate arriva la derivata seconda in una variabile, f''(x), e la sua lettura come curvatura: positiva dove la curva è concava verso l’alto, negativa dove è concava verso il basso, nulla in un punto di flesso.

Da Derivate parziali, gradienti, Jacobiani arrivano tre cose: le derivate parziali, il gradiente come vettore che le raccoglie, e — alla fine di quel capitolo — le derivate parziali seconde con il teorema di Schwarz. L’Hessiana è esattamente quel materiale, organizzato in una matrice. Non c’è un concetto nuovo da imparare: c’è una struttura nuova in cui mettere concetti già noti.

Serviranno anche due nozioni della Parte IV. Gli autovalori e autovettori, visti a intuito in Autovalori e autovettori a intuizione, sono lo strumento con cui si legge l’Hessiana: gli autovettori dicono in quali direzioni la superficie ha le sue curvature più semplici, gli autovalori dicono quanto curva in ciascuna.

E la discesa del gradiente, con le sue varianti momentum e Adam viste in Discesa del gradiente: SGD, momentum, Adam, è l’algoritmo le cui difficoltà questo capitolo spiega: il cattivo condizionamento dell’Hessiana è la ragione per cui quelle varianti esistono.

Sul versante storico, una sola figura va nominata, e di sfuggita. La matrice prende il nome da Ludwig Otto Hesse (1811-1874, matematico tedesco, allievo di Jacobi), che la introdusse a metà Ottocento studiando le curve algebriche e i loro punti singolari. Come per la Jacobiana del capitolo precedente, il calcolo differenziale di più variabili non nasce da un singolo nome o da una singola data: è la generalizzazione, distesa lungo l’Ottocento, del calcolo a una variabile. Il nome “Hessiana” per la matrice delle derivate parziali seconde è poi diventato standard nel Novecento.

La storia rilevante per questo capitolo è invece recente, ed è la storia dell’ottimizzazione del deep learning. Per un lungo periodo si è creduto che la difficoltà dell’addestrare reti profonde fosse l’intrappolamento in minimi locali cattivi — punti in cui la loss è bassa rispetto ai dintorni ma alta rispetto al minimo globale. Un paper del 2014 di Yann Dauphin e colleghi, che incontreremo in dettaglio più avanti, ha riorientato questa convinzione: il vero ostacolo, in alta dimensione, non sono i minimi locali ma i punti di sella. E i punti di sella si riconoscono solo guardando l’Hessiana.

L’ordine del capitolo segue la dipendenza dei concetti. Prima la matrice Hessiana e cosa raccoglie. Poi due intuizioni di cosa significhi geometricamente — la curvatura del paesaggio, la ciotola che approssima la funzione. Poi il test che classifica i punti critici. Poi gli autovalori come curvature principali, e da lì il numero di condizionamento e il suo effetto sulla discesa del gradiente. Infine i metodi del secondo ordine, il motivo per cui in deep learning l’Hessiana non si calcola mai, e il problema dei punti di sella.

Parti da una funzione scalare di più variabili: n numeri entrano, un numero esce. Si scrive f: R^n -> R. La loss di un modello è esattamente questo: tutti i pesi della rete entrano, un singolo numero — l’errore — esce.

Il gradiente di f, scritto f\nabla f, è il vettore delle n derivate parziali prime: una pendenza per ogni variabile. Ora deriva di nuovo. Ogni componente del gradiente è essa stessa una funzione di tutte le n variabili, e si può derivare rispetto a ciascuna. Il risultato è una griglia n × n di derivate parziali seconde. Quella griglia è la matrice Hessiana, scritta H (o talvolta 2f\nabla^2 f):

Hij=2fxixjH_{ij} = \frac{\partial^2 f}{\partial x_i \, \partial x_j}

L’elemento HijH_{ij} in riga i e colonna j è la derivata parziale seconda ottenuta derivando prima rispetto a xjx_j e poi rispetto a xix_i. Vale la pena leggerla per tipo.

L’elemento sulla diagonale, Hii=2fxi2H_{ii} = \frac{\partial^2 f}{\partial x_i^2}, è la derivata seconda “pura” lungo l’asse i: si ottiene derivando due volte rispetto alla stessa variabile, tenendo ferme tutte le altre. È la curvatura ordinaria — quella del capitolo sull’analisi a una variabile — del profilo che si vede tagliando la superficie lungo l’asse i.

L’elemento fuori diagonale, HijH_{ij} con iji \neq j, è una derivata parziale mista: dice come la pendenza lungo xix_i cambia quando ci si muove lungo xjx_j. È informazione di accoppiamento fra due variabili. Se HijH_{ij} è zero, muoversi lungo xjx_j non altera la pendenza lungo xix_i: le due direzioni sono, localmente, indipendenti.

Per la funzione f(x, y) = x² + 3xy + y² — due variabili, quindi Hessiana 2 × 2 — il conto è breve. Il gradiente è f=(2x+3y,  3x+2y)\nabla f = (2x + 3y,\; 3x + 2y). Derivando la prima componente: rispetto a x2, rispetto a y3. Derivando la seconda: rispetto a x3, rispetto a y2. La matrice è

H=[2332]H = \begin{bmatrix} 2 & 3 \\ 3 & 2 \end{bmatrix}

In questo caso H è costante, non dipende dal punto. È una particolarità delle funzioni polinomiali di secondo grado: lì la curvatura è la stessa ovunque. Per una funzione generale l’Hessiana, come il gradiente, è un oggetto per punto: cambia da posizione a posizione.

L’Hessiana dell’esempio è simmetrica: l’elemento in posizione (1,2) e quello in posizione (2,1) valgono entrambi 3. Non è un caso fortunato. È il teorema di Schwarz (chiamato anche teorema di Clairaut), già incontrato alla fine del capitolo precedente: per le funzioni con derivate seconde continue — e sono praticamente tutte quelle che si incontrano nel machine learning — l’ordine di derivazione non conta. Derivare prima rispetto a x e poi rispetto a y dà lo stesso risultato che derivare nell’ordine opposto:

2fxy=2fyx\frac{\partial^2 f}{\partial x \, \partial y} = \frac{\partial^2 f}{\partial y \, \partial x}

Quindi Hij=HjiH_{ij} = H_{ji} per ogni coppia di indici: l’Hessiana è una matrice simmetrica.

Questo non è un dettaglio cosmetico, ed è bene fermarsi sul perché conta. Una matrice simmetrica reale gode di una proprietà forte, il teorema spettrale: ha sempre n autovalori reali (mai numeri complessi) e un set completo di n autovettori mutuamente ortogonali. È esattamente questa proprietà che, fra poche sezioni, permetterà di parlare di “curvature principali” e “direzioni principali” senza ambiguità. Se l’Hessiana non fosse simmetrica, gran parte di ciò che segue non starebbe in piedi. La simmetria, regalata gratis dal teorema di Schwarz, è la fondamenta su cui poggia tutto il capitolo.

C’è anche un modo compatto di dire cos’è l’Hessiana, che collega al capitolo precedente. L’Hessiana è la Jacobiana del gradiente. Il gradiente f\nabla f è una funzione che prende n numeri e ne restituisce n (le pendenze); la sua Jacobiana — la matrice delle derivate prime di quella funzione vettoriale — è proprio la matrice delle derivate seconde di f. La derivata seconda di una funzione scalare è la derivata prima del suo gradiente.

Riprendi la metafora che ha attraversato i due capitoli precedenti: il grafico di f è un paesaggio. Per ogni punto (x, y) sul pavimento, l’altezza del terreno è z = f(x, y).

Il gradiente, in quella metafora, è la bussola: in ogni punto indica la direzione di salita più ripida e, con la sua lunghezza, dice quanto è ripida. L’Hessiana risponde a una domanda diversa, di secondo livello: non quanto sono in pendenza adesso, ma come sta cambiando la pendenza mentre cammino.

In una sola dimensione la risposta è un numero, f''(x). Se f''(x) > 0, la curva è concava verso l’alto, a forma di ciotola: muovendoti, la pendenza aumenta. Se f''(x) < 0, è concava verso il basso, a forma di cupola: la pendenza diminuisce. Se f''(x) = 0, localmente non c’è curvatura — un punto di flesso, o un tratto rettilineo. La derivata seconda è la curvatura.

In più dimensioni la curvatura non è più un numero solo, perché dipende dalla direzione in cui cammini. L’immagine giusta è una sella di montagna: il valico fra due cime. Se ti muovi lungo la cresta che collega le due cime, il terreno curva verso l’alto — sei nel punto più basso di quella cresta. Se ti muovi nella direzione perpendicolare, scendendo verso una delle due valli, il terreno curva verso il basso — sei nel punto più alto di quella discesa. Stesso punto, due curvature di segno opposto, a seconda della direzione.

L’Hessiana è l’oggetto che impacchetta tutte queste curvature direzionali in un’unica matrice. E c’è una formula precisa che le estrae. Data una direzione, rappresentata da un vettore unitario u (lunghezza esattamente 1), la curvatura della superficie lungo quella direzione è

curvatura lungo u=uHu\text{curvatura lungo } u = u^\top H \, u

Questa espressione — un vettore, per una matrice, per lo stesso vettore — si chiama forma quadratica. In parole povere, dice questo: prendi la direzione u, falla passare attraverso l’Hessiana, e proietta il risultato sulla direzione u stessa. Il numero che esce è la curvatura. Se è positivo, la superficie lungo u curva verso l’alto, come il fondo di una ciotola: la valle si chiude. Se è negativo, curva verso il basso, come una cupola. Se è zero, lungo u la superficie è piatta in seconda approssimazione.

L’Hessiana, vista da questo angolo, è una macchina: le dai una direzione, ti restituisce la curvatura in quella direzione. Una sola matrice contiene la curvatura per tutte le infinite direzioni possibili.

Vale la pena fare il conto su un caso concreto, per vedere la formula al lavoro. Riprendi l’Hessiana H=[2332]H = \begin{bmatrix} 2 & 3 \\ 3 & 2 \end{bmatrix}. Lungo l’asse x, cioè u=(1,0)u = (1, 0), la curvatura è uHu=2u^\top H u = 2: positiva, la superficie sale. Lungo l’asse y, u=(0,1)u = (0, 1), è di nuovo 22.

Ma lungo la diagonale a 45 gradi, u=(1,1)/2u = (1, 1)/\sqrt{2}, il conto dà uHu=(1/2)(2+3+3+2)=5u^\top H u = (1/2)(2 + 3 + 3 + 2) = 5: curvatura molto più forte. E lungo l’antidiagonale, u=(1,1)/2u = (1, -1)/\sqrt{2}, si ottiene (1/2)(233+2)=1(1/2)(2 - 3 - 3 + 2) = -1: curvatura negativa, la superficie scende. Lo stesso punto curva verso l’alto lungo certe direzioni e verso il basso lungo altre. La curvatura non è un numero solo, e l’Hessiana è ciò che la rende calcolabile in ogni direzione.

L’intuizione: l’Hessiana come ciotola che approssima

Sezione intitolata “L’intuizione: l’Hessiana come ciotola che approssima”

C’è un secondo angolo, meno geometrico e più legato all’ottimizzazione, che conviene tenere accanto al primo.

Il capitolo sull’analisi a una variabile ha insegnato l’idea dello zoom: una funzione liscia, vista abbastanza da vicino, è indistinguibile da una retta — la sua retta tangente. Questa è l’approssimazione del primo ordine. Ma se zoomi un po’ meno, la funzione non sembra una retta: sembra una parabola. L’approssimazione del secondo ordine di una funzione, vicino a un punto x0x_0, è un polinomio di secondo grado. Per una funzione di più variabili si scrive così:

f(x0+d)    f(x0)  +  f(x0)d  +  12dHdf(x_0 + d) \;\approx\; f(x_0) \;+\; \nabla f(x_0)^\top d \;+\; \tfrac{1}{2}\, d^\top H \, d

dove d è un piccolo spostamento dal punto x0x_0. Questa è l’approssimazione di Taylor al secondo ordine, ed è il tema centrale del prossimo capitolo di questa Parte, serie-taylor (in preparazione); qui serve solo riconoscerne i tre pezzi.

Il primo termine, f(x0)f(x_0), è il valore della funzione nel punto: l’altezza di partenza. Il secondo, f(x0)d\nabla f(x_0)^\top d, è il termine lineare: il gradiente moltiplicato per lo spostamento, cioè quanto cambia l’altezza se la superficie fosse un piano inclinato. Il terzo, 12dHd\tfrac{1}{2}\, d^\top H \, d, è il termine quadratico: la correzione che tiene conto della curvatura. È una forma quadratica nell’Hessiana — la stessa struttura della sezione precedente.

Il punto da portare via è questo: il termine quadratico 12dHd\tfrac{1}{2}\, d^\top H \, d è, geometricamente, una ciotola (più precisamente un paraboloide), e la sua forma è dettata interamente dall’Hessiana. Vicino a un punto, ogni funzione liscia assomiglia a una ciotola, e l’Hessiana è quella ciotola. Tutto quello che resta del capitolo si può leggere come domande sulla forma della ciotola.

Se la ciotola è rivolta verso l’alto in ogni direzione, sei vicino a un minimo. Se è rivolta verso il basso, vicino a un massimo. Se si comporta da ciotola in alcune direzioni e da cupola in altre, sei su una sella. Se la ciotola è perfettamente rotonda, scendere verso il fondo è facile. Se è una grondaia lunga e stretta, scendere è un problema. Le prossime sezioni sono, una a una, queste domande.

Un punto critico è un punto dove il gradiente si annulla: f=0\nabla f = 0. Geometricamente, è terreno piatto al primo ordine — nessuna direzione di salita o discesa immediata. Ma “piatto al primo ordine” non dice di che tipo di punto si tratti. Il fondo di una valle è piatto. La cima di una collina è piatta. Il valico di una sella è piatto. Sono tre cose diverse, e il gradiente, che vale zero in tutti e tre, non le distingue.

A distinguerle è l’Hessiana. In un punto critico, l’approssimazione di Taylor si semplifica: il termine lineare f(x0)d\nabla f(x_0)^\top d sparisce perché il gradiente è zero. Resta

f(x0+d)f(x0)    12dHdf(x_0 + d) - f(x_0) \;\approx\; \tfrac{1}{2}\, d^\top H \, d

Cioè: la variazione della funzione, per un piccolo spostamento d da un punto critico, ha lo stesso segno della forma quadratica dHdd^\top H d. Se quella forma è positiva per ogni d, qualunque spostamento alza la funzione: sei in un minimo. Se è negativa per ogni d, qualunque spostamento la abbassa: sei in un massimo. Se cambia segno a seconda di d, alcuni spostamenti alzano e altri abbassano: sei su una sella.

Resta da capire come si stabilisce, senza provare tutte le infinite direzioni d, il segno della forma quadratica. È qui che entrano gli autovalori. Il teorema spettrale dice che, scrivendo d nella base degli autovettori dell’Hessiana, la forma quadratica diventa una semplice somma:

dHd=iλici2d^\top H \, d = \sum_{i} \lambda_i \, c_i^2

dove i λi\lambda_i sono gli autovalori dell’Hessiana e i cic_i sono le componenti di d lungo i corrispondenti autovettori. I termini ci2c_i^2 sono quadrati, quindi sempre non negativi. Il segno della somma dipende quindi solo dal segno degli autovalori λi\lambda_i. Da qui il test della derivata seconda per funzioni di più variabili:

  • Tutti gli autovalori positivi (λi>0\lambda_i > 0 per ogni i): l’Hessiana si dice definita positiva. La forma quadratica è positiva per ogni d0d \neq 0. Il punto critico è un minimo locale. La ciotola curva verso l’alto in ogni direzione.
  • Tutti gli autovalori negativi: l’Hessiana è definita negativa. La forma quadratica è negativa per ogni d0d \neq 0. Il punto critico è un massimo locale. La cupola curva verso il basso in ogni direzione.
  • Autovalori di segni misti (almeno uno positivo e almeno uno negativo): l’Hessiana è indefinita. Il punto critico è un punto di sella. Curva verso l’alto lungo gli autovettori con autovalore positivo, verso il basso lungo quelli con autovalore negativo.
  • Almeno un autovalore nullo, gli altri tutti dello stesso segno: l’Hessiana è semidefinita. Il test è inconcludente. Lungo l’autovettore con autovalore zero la curvatura del secondo ordine si annulla, e per decidere serve guardare derivate di ordine superiore — la funzione potrebbe avere lì un minimo, un massimo o un flesso.

Conviene capire perché il caso dell’autovalore nullo è davvero indecidibile, e non solo “difficile”. L’analogia a una variabile lo chiarisce. La funzione f(x)=x4f(x) = x^4 ha derivata prima e seconda entrambe nulle in x = 0: il test della derivata seconda non decide. Eppure 0 è un minimo, perché x4x^4 è positiva ovunque tranne nell’origine. La funzione g(x)=x3g(x) = x^3 ha anch’essa derivata prima e seconda nulle in 0, ma lì non c’è né minimo né massimo: è un flesso.

Stessa derivata seconda — zero — due comportamenti opposti. La derivata seconda, quando si annulla, ha esaurito la sua informazione, e decide la prima derivata non nulla di ordine superiore. In più dimensioni vale lo stesso lungo l’autovettore con autovalore zero: l’Hessiana, lì, ha detto tutto quello che poteva, e non basta.

Per le funzioni di due variabili — Hessiana 2 × 2 — c’è una scorciatoia che molti ricordano dai corsi di analisi, e vale la pena collegarla agli autovalori per non lasciarla come una regola misteriosa.

Una matrice 2 × 2 ha due autovalori, λ1\lambda_1 e λ2\lambda_2. Due quantità della matrice si calcolano senza trovarli esplicitamente: il determinante, che vale det(H)=λ1λ2\det(H) = \lambda_1 \lambda_2, e la traccia (la somma degli elementi diagonali), che vale λ1+λ2\lambda_1 + \lambda_2.

Il determinante è il prodotto dei due autovalori, quindi il suo segno racconta i loro segni relativi. Se det(H)>0\det(H) > 0, i due autovalori hanno lo stesso segno: il punto è un estremo (minimo o massimo), e quale dei due lo dice la traccia, o equivalentemente il segno di H11H_{11}. Se det(H)<0\det(H) < 0, gli autovalori hanno segni opposti: il punto è una sella. Se det(H)=0\det(H) = 0, almeno un autovalore è nullo e il test è inconcludente. Questo è il “discriminante” della derivata seconda insegnato in analisi 2: non una regola a sé, ma il test degli autovalori riscritto con le quantità comode di una matrice 2 × 2.

Attenzione, però: questa scorciatoia funziona solo in due dimensioni. In dimensione superiore il determinante non basta. Con quattro autovalori, due negativi e due positivi danno comunque un determinante positivo — eppure il punto è una sella. Più avanti, nella sezione sui fraintendimenti, questo errore tornerà come una trappola da evitare.

Decidere la definitezza senza calcolare gli autovalori

Sezione intitolata “Decidere la definitezza senza calcolare gli autovalori”

Resta una domanda pratica. Il test parla di segni degli autovalori, ma trovare gli autovalori di una matrice grande è esso stesso un calcolo non banale. Esiste una scorciatoia, valida in qualunque dimensione, che evita di calcolarli: il criterio dei minori principali di Sylvester, dal matematico inglese James Joseph Sylvester (1814-1897).

Un minore principale di testa di ordine k è il determinante della sottomatrice k × k che si ottiene tenendo le prime k righe e le prime k colonne dell’Hessiana. Per un’Hessiana n × n ci sono n di questi minori, uno per ogni k da 1 a n. Il criterio dice: l’Hessiana è definita positiva (tutti gli autovalori positivi, quindi minimo) se e solo se tutti i minori principali di testa sono positivi. È definita negativa (massimo) se i minori si alternano di segno, partendo da negativo: il primo minore negativo, il secondo positivo, il terzo negativo, e così via. Qualunque altro pattern di segni — purché nessun minore sia nullo — significa Hessiana indefinita, cioè sella.

Il vantaggio operativo è concreto: calcolare n determinanti annidati è più diretto che risolvere il problema agli autovalori, e per un controllo a mano su una 3 × 3 è la via più rapida.

Resta vero, però, che per un’Hessiana grande nessuna di queste strade è praticabile — né i minori né gli autovalori — per le ragioni di dimensione discusse più avanti. Il criterio di Sylvester è uno strumento per la matematica su carta e per le matrici piccole, non per il loss di una rete.

Curvatura: autovalori e autovettori dell’Hessiana

Sezione intitolata “Curvatura: autovalori e autovettori dell’Hessiana”

Il test usa il segno degli autovalori. Ma gli autovalori, e gli autovettori che li accompagnano, dicono molto di più: dicono la forma della ciotola.

Il teorema spettrale, applicato all’Hessiana simmetrica, dice che esiste una base speciale dello spazio: n autovettori v1,,vnv_1, \dots, v_n mutuamente ortogonali, ciascuno con il suo autovalore reale λi\lambda_i. In quella base, l’Hessiana agisce nel modo più semplice possibile. Lungo un autovettore viv_i, applicare l’Hessiana è solo moltiplicare per un numero:

Hvi=λiviH \, v_i = \lambda_i \, v_i

La traduzione geometrica è netta. Gli autovettori dell’Hessiana sono le direzioni principali di curvatura: gli assi naturali della ciotola. Gli autovalori sono le curvature principali: quanto la superficie si incurva lungo ciascuno di quegli assi. La curvatura massima della superficie si ha lungo l’autovettore con l’autovalore più grande; la minima lungo quello con l’autovalore più piccolo.

Conviene visualizzarlo con le curve di livello dell’approssimazione quadratica. Vicino a un minimo, le curve di livello — gli insiemi di punti alla stessa altezza — sono ellissi. Gli assi di quelle ellissi puntano lungo gli autovettori. La lunghezza di ciascun semiasse è inversamente proporzionale alla radice del corrispondente autovalore: un autovalore grande significa curvatura forte, quindi le curve di livello si stringono rapidamente in quella direzione — l’ellisse è corta lungo quell’asse. Un autovalore piccolo significa curvatura debole: le curve di livello sono distese, l’ellisse è lunga in quella direzione.

Se tutti gli autovalori sono uguali, le ellissi diventano cerchi: la ciotola è perfettamente rotonda, isotropa — curva allo stesso modo in ogni direzione. Se gli autovalori sono molto diversi fra loro, la ciotola è una grondaia ellittica fortemente allungata. È proprio questa differenza fra gli autovalori che la prossima sezione misura con un singolo numero, e che decide se la discesa del gradiente sarà veloce o agonizzante.

Vicino a un minimo l’Hessiana è definita positiva: tutti gli autovalori sono positivi. Il numero di condizionamento di quell’Hessiana è il rapporto fra il più grande e il più piccolo:

κ=λmaxλmin\kappa = \frac{\lambda_{\max}}{\lambda_{\min}}

Per costruzione κ1\kappa \geq 1. Il valore κ=1\kappa = 1 si ha quando tutti gli autovalori sono uguali: ciotola rotonda. Più κ\kappa è grande, più la ciotola è allungata, fino al caso estremo di una valle lunga e strettissima. Il numero di condizionamento misura, con un solo numero, quanto è anisotropa la curvatura — quanto la direzione più curva e quella meno curva differiscono.

Il termine “condizionamento” non è inventato per questo capitolo. Viene dall’algebra lineare numerica, dove il numero di condizionamento di una matrice misura quanto un piccolo errore nei dati di un problema lineare possa amplificarsi nella soluzione. Una matrice “mal condizionata” è una matrice vicina a essere singolare, e risolvere sistemi con essa è numericamente fragile.

L’Hessiana ne eredita il nome e l’intuizione: un Hessiano mal condizionato rende l’ottimizzazione fragile e lenta, esattamente come una matrice mal condizionata rende la soluzione di un sistema lineare fragile e imprecisa. È lo stesso concetto, applicato alla geometria di una ciotola invece che alla risoluzione di un’equazione.

Da solo, κ\kappa sembra un dettaglio tecnico. Diventa centrale appena lo si collega alla discesa del gradiente, ed è qui che il capitolo ripaga.

Perché un Hessiano mal condizionato rende lenta la discesa del gradiente

Sezione intitolata “Perché un Hessiano mal condizionato rende lenta la discesa del gradiente”

La discesa del gradiente aggiorna i parametri facendo, a ogni passo, un piccolo spostamento nella direzione opposta al gradiente:

x    xηf(x)x \;\leftarrow\; x - \eta \, \nabla f(x)

dove η\eta è il learning rate, la lunghezza del passo. La regola è semplice e ha un difetto preciso, ed è un difetto di geometria.

Immagina di essere su una valle lunga e stretta — un Hessiano con un autovalore grande (i fianchi ripidi della valle) e uno piccolo (il fondovalle quasi piatto che corre verso il minimo). In quasi ogni punto di quella valle, il gradiente — la direzione di massima pendenza — punta soprattutto verso il fianco ripido, non lungo il fondovalle. La direzione di massima pendenza e la direzione verso il minimo non coincidono affatto.

La discesa del gradiente segue il gradiente, quindi a ogni passo si butta verso il fianco. Supera il fondovalle, risale il fianco opposto, il gradiente lì la rimanda indietro, e così via: la traiettoria zigzaga rapidamente da una parete all’altra, avanzando solo di pochissimo verso il minimo a ogni rimbalzo.

Si può rendere quantitativo. Il learning rate deve rispettare un vincolo di stabilità: se è troppo grande, lungo la direzione più curva i passi superano il fondo e crescono invece di calare — la loss diverge. Il limite è grosso modo

η<2λmax\eta < \frac{2}{\lambda_{\max}}

L’autovalore massimo fissa quanto si può essere aggressivi: la direzione più curva è quella che impone il tetto al passo.

Ma con un learning rate vincolato da λmax\lambda_{\max}, guarda cosa succede nella direzione meno curva, quella di autovalore λmin\lambda_{\min}. Il progresso a ogni passo lungo quell’asse è proporzionale a ηλmin\eta \cdot \lambda_{\min}. Poiché η\eta è circa 1/λmax1/\lambda_{\max}, il progresso lungo il fondovalle è proporzionale a

λminλmax=1κ\frac{\lambda_{\min}}{\lambda_{\max}} = \frac{1}{\kappa}

Ecco il punto. La direzione più curva impone un learning rate piccolo; quel learning rate piccolo rende lentissimo il progresso lungo la direzione meno curva — proprio la direzione che porta al minimo. Il numero di iterazioni necessarie per convergere a una precisione fissata cresce linearmente con κ\kappa: il tasso di convergenza per passo è circa (κ1)/(κ+1)(\kappa - 1)/(\kappa + 1), che è vicino a 1 (cioè progresso quasi nullo) quando κ\kappa è grande.

In numeri: con κ=1\kappa = 1 la discesa del gradiente con learning rate ottimale raggiunge il minimo di una ciotola quadratica in un solo passo. Con κ=1000\kappa = 1000, servono dell’ordine di mille passi per il solo effetto del cattivo condizionamento — prima ancora di contare ogni altra difficoltà. Nelle reti neurali profonde il numero di condizionamento della loss può essere enorme, molti ordini di grandezza, e questo è una delle ragioni concrete per cui l’addestramento è lento e il learning rate va calibrato con cura chirurgica.

Da qui si capisce, finalmente, perché esistono le varianti della discesa del gradiente viste in Discesa del gradiente: SGD, momentum, Adam. Non sono trucchi arbitrari: sono risposte mirate al cattivo condizionamento.

Il momentum accumula velocità lungo il fondovalle, dove i passi successivi si sommano nella stessa direzione, e smorza lo zigzag trasversale, dove i passi si alternano e si cancellano. Adam e RMSProp scalano il passo separatamente per ogni coordinata, una forma economica di precondizionamento diagonale: imitano l’effetto di dividere per la curvatura locale, accorciando il passo dove la curvatura è alta e allungandolo dove è bassa.

La normalizzazione degli input (whitening) e la batch normalization agiscono ancora prima, rendendo la curvatura più uniforme — abbassando κ\kappa alla radice. Tutte queste tecniche si capiscono solo guardando lo spettro dell’Hessiana, e per questo il prossimo capitolo di questa Parte, sulla convessità, e i capitoli di ottimizzazione della wiki tornano ripetutamente sul condizionamento.

Metodi del secondo ordine: Newton contro il primo ordine

Sezione intitolata “Metodi del secondo ordine: Newton contro il primo ordine”

La discesa del gradiente e le sue varianti sono metodi del primo ordine: usano solo il gradiente. Se la lentezza nasce dal cattivo condizionamento dell’Hessiana, viene naturale chiedersi: perché non usare direttamente l’Hessiana?

È esattamente ciò che fa il metodo di Newton per l’ottimizzazione. L’idea: invece di fare un passetto nella direzione del gradiente, approssima la funzione con la ciotola quadratica di Taylor e salta direttamente al fondo di quella ciotola. Minimizzando l’approssimazione del secondo ordine si ricava il passo di Newton:

d=H1fxx+dd = - H^{-1} \, \nabla f \qquad\qquad x \leftarrow x + d

Il gradiente viene moltiplicato non per uno scalare η\eta, ma per l’inverso dell’Hessiana, H1H^{-1}. Vale la pena capire cosa fa quella moltiplicazione. Moltiplicare per H1H^{-1} riscala lo spazio in modo che la ciotola ellittica diventi rotonda: lungo ogni autovettore, dividere per l’autovalore compensa esattamente la curvatura in quella direzione. La direzione più curva e quella meno curva vengono riportate alla stessa scala.

La conseguenza è notevole. Il metodo di Newton è invariante al condizionamento: il suo progresso non dipende da κ\kappa. La valle storta, per Newton, è rotonda come ogni altra. Tecnicamente questa proprietà si chiama invarianza affine. E vicino a un minimo con Hessiana definita positiva, Newton ha convergenza quadratica: il numero di cifre corrette grosso modo raddoppia a ogni passo. Contro la convergenza lineare, governata da κ\kappa, della discesa del gradiente, è un salto di categoria.

Conviene vederlo su un caso minimo. Prendi la valle stretta dell’esempio numerico, h(x, y) = x² + 100y². Il gradiente è h=(2x,  200y)\nabla h = (2x,\; 200y) e l’Hessiana è costante, [200200]\begin{bmatrix} 2 & 0 \\ 0 & 200 \end{bmatrix}. Parti dal punto (1,1)(1, 1).

La discesa del gradiente, in quel punto, legge un gradiente (2,200)(2, 200): la componente lungo y è cento volte quella lungo x, quindi il passo si butta quasi tutto verso il fianco, e per non divergere il learning rate deve restare sotto 2/200=0.012/200 = 0.01. Servono molti passi zigzaganti per arrivare al minimo.

Il metodo di Newton, invece, calcola il passo d=H1hd = -H^{-1}\nabla h. L’inverso dell’Hessiana è [1/2001/200]\begin{bmatrix} 1/2 & 0 \\ 0 & 1/200 \end{bmatrix}, e moltiplicato per il gradiente (2,200)(2, 200)d=(1,  1)d = -(1,\; 1). Il nuovo punto è (1,1)+(1,1)=(0,0)(1,1) + (-1,-1) = (0,0): il minimo, raggiunto in un solo passo. Per una funzione esattamente quadratica Newton va a fondo in un colpo, qualunque sia κ\kappa, perché la “ciotola approssimata” coincide con la funzione vera. È l’invarianza al condizionamento resa visibile.

Detto così, sembra che Newton debba sempre battere il primo ordine. Non è così, e i motivi sono due, uno geometrico e uno computazionale.

Il motivo geometrico. Il passo di Newton H1f-H^{-1}\nabla f punta verso il punto critico più vicino dell’approssimazione quadratica — qualunque tipo di punto critico sia. Se l’Hessiana è definita positiva, quel punto critico è il fondo di una ciotola e Newton ci salta dentro, bene.

Ma se l’Hessiana è indefinita — autovalori di segni misti, cioè sei vicino a una sella — il passo di Newton può puntare verso la sella, o verso un massimo, invece di scappare. Lungo le direzioni di curvatura negativa, l’inversione dell’Hessiana inverte anche il segno e il metodo “sale” dove dovrebbe scendere. Su una loss non convessa, costellata di selle, il metodo di Newton puro è inaffidabile. Le sue varianti — il saddle-free Newton che incontreremo fra poco, le trust region, il damping di Levenberg-Marquardt — esistono per correggere proprio questo.

Il motivo computazionale è il soggetto della prossima sezione, ed è quello che, in pratica, chiude la porta a Newton nel deep learning.

Perché l’Hessiana non si calcola, in deep learning

Sezione intitolata “Perché l’Hessiana non si calcola, in deep learning”

Il passo di Newton richiede l’Hessiana, e richiede di invertirla. Per un modello reale, entrambe le cose sono fuori discussione, e conviene vedere i numeri.

Un modello ha n parametri. L’Hessiana è n × n, quindi ha n2n^2 elementi. Per un modello con un miliardo di parametri — n=109n = 10^9, e i modelli oggi vanno ben oltre — la matrice avrebbe 101810^{18} numeri. Memorizzarla è semplicemente impossibile: nessuna memoria, oggi o in un futuro prevedibile, contiene 101810^{18} numeri in virgola mobile. Anche per un modello modesto con un milione di parametri, n=106n = 10^6, l’Hessiana ha 101210^{12} elementi — un terabyte abbondante solo per tenerla in memoria. E memorizzarla sarebbe solo l’inizio: invertirla, come chiede il passo di Newton, costa dell’ordine di n3n^3 operazioni, un costo che esplode ancora più in fretta.

La conclusione è netta: per qualunque rete neurale reale, l’Hessiana piena non si forma e non si inverte. Mai. Ma l’informazione di curvatura è utile, e la comunità ha sviluppato modi di usarla senza costruire la matrice. Tutti condividono un’idea: non serve l’Hessiana, serve solo il suo effetto.

Il primo strumento è il prodotto Hessiano-vettore. Quasi nessun metodo del secondo ordine ha bisogno della matrice H in sé: ha bisogno del prodotto HvH v, l’azione dell’Hessiana su un vettore v. E il prodotto HvHv si può calcolare senza mai formare H. Il trucco di Pearlmutter, introdotto da Barak Pearlmutter nel paper “Fast Exact Multiplication by the Hessian” (Neural Computation, 1994), osserva che HvHv è il gradiente del prodotto scalare fv\nabla f \cdot v:

Hv=(fv)H v = \nabla \big( \nabla f \cdot v \big)

Questa quantità si ottiene con la differenziazione automatica — la stessa macchina che calcola i gradienti — al costo di circa una valutazione del gradiente. Costo O(n)O(n), non O(n2)O(n^2), e zero memoria extra per matrici. Il prodotto HvHv è il mattone dei metodi Hessian-free: risolvono il sistema lineare del passo di Newton con il metodo del gradiente coniugato, che richiede solo prodotti Hessiano-vettore, senza mai invertire né scrivere H. È anche lo strumento con cui si stima l’autovalore massimo dell’Hessiana, applicando ripetutamente HvHv (la power iteration).

Il secondo strumento è la famiglia dei metodi quasi-Newton, di cui il rappresentante usato in machine learning è L-BFGS (limited-memory BFGS). Invece di calcolare l’Hessiana, L-BFGS ne costruisce un’approssimazione dell’inverso, osservando come il gradiente cambia da un’iterazione all’altra.

La versione “limited-memory” tiene in memoria solo le differenze di gradiente delle ultime iterazioni — tipicamente da cinque a venti vettori — e da quelle ricostruisce implicitamente l’azione dell’inverso dell’Hessiana. Memoria lineare in n. L-BFGS funziona bene per l’ottimizzazione full-batch e per problemi medio-piccoli; mal si sposa, invece, con il rumore dei minibatch del deep learning su larga scala, dove il gradiente cambia anche solo perché è cambiato il campione.

Il terzo strumento è l’approssimazione Gauss-Newton e la sua generalizzazione. Per le loss con una struttura particolare — l’errore quadratico della regressione, la cross-entropy della classificazione — l’Hessiana si può approssimare con un’espressione fatta di soli prodotti di derivate prime. Questa matrice, detta di Gauss-Newton, ha un pregio: è sempre semidefinita positiva, quindi non ha autovalori negativi e non introduce le direzioni di sella spurie che mettono in crisi Newton puro. K-FAC (Kronecker-Factored Approximate Curvature) è un’approssimazione fattorizzata di questa matrice, usata per addestrare reti con informazione di curvatura a costo gestibile.

Il quadro, in una frase: nessun ottimizzatore di deep learning su larga scala calcola l’Hessiana. Si usa o solo il gradiente con un precondizionamento diagonale a basso costo (Adam), o informazione di curvatura implicita, raggiunta via prodotti Hessiano-vettore e approssimazioni strutturate. L’Hessiana è onnipresente come concetto per capire cosa succede, e quasi sempre assente come oggetto effettivamente costruito.

Resta un’ultima domanda, ed è quella che riorienta tutto il capitolo verso il training reale. Quando la discesa del gradiente sembra bloccarsi su un plateau, dove finisce? In un minimo locale cattivo, o altrove?

Per molto tempo la risposta diffusa è stata: minimi locali. L’immagine era quella di un paesaggio pieno di buche, e dell’optimizer che finisce intrappolato in una buca poco profonda lontana dal vero minimo. Un paper del 2014 ha riorientato questa convinzione. Si intitola “Identifying and attacking the saddle point problem in high-dimensional non-convex optimization”, è di Yann Dauphin, Razvan Pascanu, Çağlar Gülçehre, Kyunghyun Cho, Surya Ganguli e Yoshua Bengio, ed è stato presentato a NeurIPS 2014. La sua tesi: in alta dimensione il vero ostacolo non sono i minimi locali, ma i punti di sella.

L’argomento, nella sua forma intuitiva, si appoggia interamente sull’Hessiana. In un punto critico, l’Hessiana ha n autovalori, ciascuno positivo o negativo. Perché quel punto sia un minimo, devono essere positivi tutti e n. Basta un solo autovalore negativo e il punto è una sella.

Ora, in alta dimensione n è enorme — milioni o miliardi. Se si pensa al segno di ciascun autovalore come a un evento grosso modo indipendente, la probabilità che tutti gli n autovalori abbiano lo stesso segno crolla esponenzialmente al crescere di n. Statisticamente, quasi ogni punto critico di una funzione in alta dimensione è una sella: un mix di direzioni che salgono e direzioni che scendono. I minimi puri sono rari; le selle sono la regola.

Un conto giocattolo rende tangibile il “crolla esponenzialmente”. Immagina, come modello semplificato, che ogni autovalore sia positivo con probabilità 1/2, indipendentemente dagli altri. In una dimensione, un punto critico è un minimo con probabilità 1/2 — metà delle volte. In dieci dimensioni, perché sia un minimo servono dieci autovalori positivi di fila: probabilità (1/2)10(1/2)^{10}, circa una su mille. In cento dimensioni, (1/2)100(1/2)^{100}, un numero così piccolo da non avere un nome utile.

Già a poche centinaia di dimensioni — e una rete ne ha milioni — trovare un punto critico che sia davvero un minimo, e non una sella, è statisticamente quasi impossibile. La metafora del “paesaggio pieno di buche” è un’intuizione presa in prestito dalle due o tre dimensioni in cui vive l’immaginazione umana, e non sopravvive al passaggio in alta dimensione. Il modello con segni indipendenti è una semplificazione — gli autovalori di un’Hessiana vera sono correlati, ed è proprio qui che entrano la random matrix theory e i campi gaussiani — ma la conclusione qualitativa regge: le selle dominano.

Il paper, usando strumenti della random matrix theory e della teoria dei campi gaussiani, va oltre l’argomento di probabilità e mostra una struttura più fine. L’indice di un punto critico — la frazione dei suoi autovalori che sono negativi — è strettamente legato al valore della loss in quel punto. I punti critici a errore alto tendono ad avere molti autovalori negativi: sono “selle ripide”, con tante direzioni di fuga verso il basso. I punti critici a errore basso hanno pochi o nessun autovalore negativo: assomigliano a minimi veri.

La conseguenza è quasi rassicurante: i minimi locali genuini si concentrano vicino al minimo globale, hanno tutti errore basso e simile fra loro. Non esiste, in pratica, una folla di minimi locali “cattivi” in cui restare bloccati per sempre. Il problema sono le selle — e il problema delle selle non è che intrappolano, ma che rallentano.

Una sella è circondata da un plateau: una regione ampia dove il gradiente è quasi nullo perché alcune direzioni di curvatura sono vicine a zero. La discesa del gradiente, in quel plateau, fa passi minuscoli — il passo è proporzionale al gradiente, e il gradiente è quasi zero. L’optimizer non resta intrappolato per sempre (il rumore di SGD prima o poi lo spinge fuori, e basta una direzione di curvatura negativa per scendere), ma può passare migliaia di iterazioni a strisciare attraverso il plateau. È esattamente il fenomeno del training che sembra fermo e poi riparte, citato all’inizio del capitolo.

Per attaccare il problema, Dauphin e colleghi propongono il saddle-free Newton. L’idea è chirurgica: si prende l’Hessiana, e si sostituiscono i suoi autovalori con il loro valore assoluto. Un autovalore negativo, quello che rende la sella attrattiva per Newton puro, diventa positivo. Il risultato è un metodo che lungo le direzioni di curvatura negativa si comporta da fuga invece che da attrazione: scappa dalle selle rapidamente, là dove Newton puro le scambierebbe per destinazioni. È un metodo del secondo ordine costruito attorno a un’idea sull’Hessiana — la stessa Hessiana che, in pratica, non si calcola mai per intero, e che qui si maneggia con le approssimazioni della sezione precedente.

Il ponte verso l’ottimizzazione, e verso il resto della wiki, è questo. La forma del loss landscape — minimi, massimi, selle, plateau — è interamente codificata negli autovalori dell’Hessiana, punto per punto. Capire il training di una rete non significa pensare a un paesaggio di buche, ma a un paesaggio di selle. E il numero di condizionamento e lo spettro dell’Hessiana, lungi dall’essere curiosità matematiche, sono il vocabolario con cui si descrive perché un addestramento va veloce, va lento, o sembra fermarsi.

Esempio 1 — numerico: classificare tre punti critici

Sezione intitolata “Esempio 1 — numerico: classificare tre punti critici”

Prendi f(x, y) = x² + 3xy + y². Il gradiente è f=(2x+3y,  3x+2y)\nabla f = (2x + 3y,\; 3x + 2y). Il punto critico si trova ponendo entrambe le componenti a zero: 2x+3y=02x + 3y = 0 e 3x+2y=03x + 2y = 0. L’unica soluzione è x=y=0x = y = 0. L’Hessiana, già calcolata sopra, è costante:

H=[2332]H = \begin{bmatrix} 2 & 3 \\ 3 & 2 \end{bmatrix}

Il determinante vale det(H)=2233=49=5\det(H) = 2 \cdot 2 - 3 \cdot 3 = 4 - 9 = -5. È negativo, quindi i due autovalori hanno segni opposti: il punto (0,0) è una sella. Calcolando esplicitamente gli autovalori si trova λ=2±3\lambda = 2 \pm 3, cioè λ1=5\lambda_1 = 5 e λ2=1\lambda_2 = -1. La superficie curva verso l’alto lungo l’autovettore (1,1)/2(1, 1)/\sqrt{2} (autovalore positivo) e verso il basso lungo (1,1)/2(1, -1)/\sqrt{2} (autovalore negativo): è una sella vera, esattamente come il valico di montagna.

Confronta con due varianti. La funzione g(x, y) = x² + y² ha Hessiana [2002]\begin{bmatrix} 2 & 0 \\ 0 & 2 \end{bmatrix}: autovalori 2 e 2, entrambi positivi, è un minimo, e il numero di condizionamento è κ=2/2=1\kappa = 2/2 = 1 — ciotola perfettamente rotonda. La funzione h(x, y) = x² + 100y² ha Hessiana [200200]\begin{bmatrix} 2 & 0 \\ 0 & 200 \end{bmatrix}: autovalori 2 e 200, anch’essi positivi, ancora un minimo, ma con κ=200/2=100\kappa = 200/2 = 100. È la valle stretta: su h, la discesa del gradiente zigzaga e arranca; su g, scende dritta al fondo. Stessa famiglia di funzioni, due numeri di condizionamento, due comportamenti opposti dell’optimizer.

Esempio 2 — codice: prodotto Hessiano-vettore senza la matrice

Sezione intitolata “Esempio 2 — codice: prodotto Hessiano-vettore senza la matrice”

Ecco il trucco di Pearlmutter in PyTorch. Calcola HvHv — l’azione dell’Hessiana su un vettore v — senza mai costruire l’Hessiana.

import torch
def hvp(loss, params, v):
# gradiente primo, con create_graph per poter derivare ancora
g = torch.autograd.grad(loss, params, create_graph=True)[0]
# prodotto scalare tra gradiente e v, poi se ne deriva: esce H @ v
gv = (g * v).sum()
Hv = torch.autograd.grad(gv, params)[0]
return Hv

Il punto chiave sta nelle dimensioni. Il risultato Hv ha la stessa dimensione di params: è un vettore di n numeri, non una matrice di n2n^2. In nessun momento si alloca una matrice n × n. Il costo è quello di due passaggi di differenziazione, O(n)O(n). Questa funzione è il mattone con cui si costruiscono i metodi Hessian-free, e con cui si stima l’autovalore massimo dell’Hessiana applicando hvp ripetutamente a partire da un vettore casuale (power iteration). Tutta l’informazione di curvatura utile passa di qui, senza che la matrice esista mai.

Esempio 3 — la trappola del determinante in tre dimensioni

Sezione intitolata “Esempio 3 — la trappola del determinante in tre dimensioni”

Questo esempio mostra, con numeri, perché il segno del determinante non basta oltre le due dimensioni. Considera una funzione di tre variabili la cui Hessiana, in un punto critico, è diagonale:

H=[400010002]H = \begin{bmatrix} 4 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & -2 \end{bmatrix}

Essendo diagonale, gli autovalori sono direttamente gli elementi sulla diagonale: λ1=4\lambda_1 = 4, λ2=1\lambda_2 = -1, λ3=2\lambda_3 = -2. Ci sono autovalori positivi e autovalori negativi: l’Hessiana è indefinita, e il punto critico è una sella. Lungo il primo asse la superficie curva verso l’alto, lungo gli altri due verso il basso.

Ora guarda il determinante: det(H)=4(1)(2)=8\det(H) = 4 \cdot (-1) \cdot (-2) = 8. È positivo. Chi applicasse meccanicamente la regola del caso 2D — “determinante positivo significa estremo” — concluderebbe, sbagliando, che si tratta di un minimo o di un massimo. L’errore nasce dal fatto che i due autovalori negativi, moltiplicandosi, danno un contributo positivo che maschera la loro presenza. Il determinante vede solo il prodotto dei segni; la sella ha bisogno che si guardino i segni uno per uno.

Il criterio di Sylvester, invece, coglie il problema. I minori principali di testa sono: 44 (positivo), poi il determinante della 2 × 2 in alto a sinistra 4(1)=44 \cdot (-1) = -4 (negativo), poi 88 (positivo). La sequenza è +, -, +: non è “tutti positivi” (servirebbe per un minimo) e non è l’alternanza -, +, - (servirebbe per un massimo). È un pattern qualunque, quindi: sella. Il criterio corretto e il determinante nudo, qui, danno risposte opposte — e quello giusto è il criterio corretto.

Esempio 4 — scenario reale: diagnosticare un learning rate impossibile

Sezione intitolata “Esempio 4 — scenario reale: diagnosticare un learning rate impossibile”

Un team addestra una rete e si trova in una situazione frustrante: con learning rate 0.01 la loss diverge dopo poche iterazioni; con learning rate 0.0001 la loss scende, ma così piano che il training richiederebbe settimane. La finestra utile sembra inesistente.

Letto attraverso l’Hessiana, il sintomo ha una diagnosi precisa: la loss ha un Hessiano mal condizionato, κ\kappa molto grande. Il learning rate deve stare sotto 2/λmax2/\lambda_{\max} per non divergere lungo la direzione di curvatura massima — ed è questo che impone il tetto basso. Ma con un learning rate così piccolo, il progresso lungo le direzioni piatte è proporzionale a 1/κ1/\kappa, ed è questo che rende il training lentissimo. Le due osservazioni sono la stessa, vista da due lati: λmax\lambda_{\max} grande e λmin\lambda_{\min} piccolo, cioè κ\kappa enorme.

La soluzione non è cercare un learning rate magico in mezzo — non esiste, la finestra è davvero stretta. La soluzione è cambiare la geometria del problema.

Normalizzare gli input (whitening) rende le curvature più uniformi e abbassa κ\kappa alla radice. La batch normalization fa lo stesso lavoro sulle attivazioni interne, strato per strato. Passare a un optimizer adattivo come Adam introduce un precondizionamento diagonale che accorcia il passo dove la curvatura è alta e lo allunga dove è bassa, attenuando l’effetto di κ\kappa. Il momentum accumula velocità lungo il fondovalle e smorza lo zigzag.

Nessuna di queste mosse “indovina” il learning rate: tutte riducono κ\kappa o lo aggirano. Senza il concetto di condizionamento dell’Hessiana, questo elenco sembra un sacchetto di trucchi; con esso, è una strategia unica vista da quattro angoli.

L’Hessiana, pur quasi mai calcolata per intero, è il concetto che organizza una quantità di pratiche quotidiane dell’addestramento di modelli.

Calibrazione del learning rate. Il tetto di stabilità η<2/λmax\eta < 2/\lambda_{\max} è una conseguenza diretta dell’autovalore massimo dell’Hessiana. Quando si fa un learning rate range test — aumentare progressivamente il learning rate e osservare dove la loss inizia a divergere — si sta, di fatto, sondando empiricamente λmax\lambda_{\max}.

Optimizer adattivi. Adam, RMSProp e AdaGrad sono, letti attraverso questo capitolo, precondizionatori diagonali a basso costo. Mantengono una stima della scala del gradiente per ciascuna coordinata e dividono il passo per quella scala, imitando l’effetto di dividere per la curvatura locale. Non calcolano l’Hessiana, ma ne approssimano grossolanamente l’azione lungo gli assi.

Normalizzazione. Batch normalization, layer normalization e il whitening degli input migliorano il condizionamento dell’Hessiana. È una delle spiegazioni accreditate del perché accelerano il training: non cambiano il minimo, cambiano la forma della valle che ci porta.

Diagnostica e sharpness. L’autovalore massimo dell’Hessiana, stimabile via power iteration con prodotti Hessiano-vettore, misura la sharpness di un minimo — quanto la ciotola è ripida.

C’è evidenza empirica che i minimi “piatti”, a bassa curvatura, tendano a generalizzare meglio dei minimi “aguzzi”: l’intuizione è che attorno a un minimo piatto piccole perturbazioni dei pesi cambiano poco la loss, e questo si traduce in una maggiore robustezza al passaggio dai dati di training a quelli di test. Su questa osservazione si fonda Sharpness-Aware Minimization (SAM) e i metodi correlati, che cercano esplicitamente minimi con autovalori dell’Hessiana piccoli. La relazione fra curvatura e generalizzazione è ancora dibattuta — esistono controesempi — ma resta una delle lenti più usate per ragionare su quali minimi del loss landscape sono “buoni”.

Fuori dal deep learning. La curvatura della log-verosimiglianza compare anche nella statistica classica. Nei metodi di stima come la maximum likelihood, l’Hessiana della log-verosimiglianza, cambiata di segno, è la matrice di informazione di Fisher, e governa la matrice di covarianza delle stime: una curvatura alta attorno al massimo significa una stima precisa, una curvatura bassa significa una stima incerta. È lo stesso oggetto matematico di questo capitolo, in un altro contesto.

L’Hessiana è uno strumento potente, ma proprio per questo è facile usarla male o aspettarsi da lei più di quanto possa dare. Alcuni punti dove l’intuizione scivola.

Il test della derivata seconda è muto quando un autovalore è zero. Se l’Hessiana è semidefinita — qualche autovalore esattamente nullo, gli altri dello stesso segno — il test non decide. Lungo l’autovettore con autovalore zero la curvatura del secondo ordine si annulla, e che cosa accade dipende da derivate di ordine superiore: potrebbe esserci un minimo, un massimo o un flesso.

Il caso non è un’astrazione: nelle reti neurali profonde lo spettro dell’Hessiana ha tipicamente moltissimi autovalori vicinissimi a zero. Buona parte delle direzioni dello spazio dei parametri è quasi piatta. Questo rende il test della derivata seconda, preso alla lettera, raramente conclusivo per una rete vera, e rende l’inversione dell’Hessiana — già impossibile per dimensione — anche numericamente instabile, perché dividere per un autovalore quasi nullo amplifica enormemente gli errori.

Il determinante non basta oltre le due dimensioni. La scorciatoia det(H)>0\det(H) > 0 per gli estremi funziona solo per Hessiane 2 × 2. In dimensione superiore è una trappola. Con quattro autovalori, la coppia (1,1,+1,+1)(-1, -1, +1, +1) dà un determinante positivo — eppure il punto è una sella, perché ci sono autovalori negativi. Il determinante è il prodotto degli autovalori e perde l’informazione sui singoli segni non appena gli autovalori sono più di due. Il criterio corretto, in ogni dimensione, è il segno di tutti gli autovalori, oppure — equivalente e più calcolabile — il criterio dei minori principali di Sylvester. Mai il solo segno del determinante.

L’Hessiana è locale, e il loss landscape non è una ciotola. L’approssimazione di Taylor del secondo ordine vale vicino a un punto. L’Hessiana descrive la curvatura lì, non altrove. La loss di una rete profonda non è una singola ciotola: è una superficie con un numero astronomico di punti critici, in stragrande maggioranza selle, e con curvatura che cambia da regione a regione. Usare l’Hessiana di un punto per ragionare su un punto lontano è un errore.

Il metodo di Newton incarna questo limite: salta al fondo della ciotola quadratica locale, e se la funzione vera lì non è una ciotola, il salto può atterrare lontano e male. Per questo Newton, in pratica, si usa sempre con un raggio di fiducia (trust region) che limita quanto ci si può allontanare dal punto in cui l’Hessiana è stata valutata.

Newton non distingue minimo da sella. Vale la pena ribadirlo perché è il fraintendimento più costoso. Il passo H1f-H^{-1}\nabla f punta al punto critico più vicino, di qualunque tipo. Se l’Hessiana ha autovalori negativi, lungo quelle direzioni l’inversione cambia segno e il metodo sale verso la sella invece di scappare. “Metodo del secondo ordine” non è sinonimo di “metodo migliore”: Newton puro su una funzione non convessa è inaffidabile, ed è proprio questo che ha motivato il saddle-free Newton di Dauphin e colleghi.

L’Hessiana cambia durante il training. Un’ultima trappola, sottile. L’Hessiana non è una proprietà fissa del modello: è una proprietà del punto nello spazio dei parametri, e durante l’addestramento quel punto si muove a ogni passo. Lo spettro dell’Hessiana — i suoi autovalori, il suo numero di condizionamento — cambia lungo la traiettoria.

C’è evidenza empirica che, nelle prime fasi del training, lo spettro si sposti rapidamente, e che λmax\lambda_{\max} tenda a crescere e stabilizzarsi su un valore legato al learning rate scelto (un fenomeno noto come edge of stability). Ragionare sull’Hessiana come se fosse un dato immutabile del problema è quindi scorretto: la curvatura che la discesa del gradiente incontra all’inizio non è quella che incontra a metà o alla fine. Le diagnostiche basate sull’Hessiana vanno rifatte periodicamente, non calcolate una volta sola.

L’Hessiana piena è un oggetto teorico, non pratico. È il punto più importante da non dimenticare. Tutto questo capitolo parla dell’Hessiana come se la si potesse guardare; per un modello reale non la si guarda mai. Con n2n^2 elementi e un costo di inversione O(n3)O(n^3), l’Hessiana di una rete è impossibile da costruire. Chiunque proponga un metodo che “calcola l’Hessiana e la inverte” per il deep learning sta descrivendo qualcosa che non gira. Ciò che gira sono i prodotti Hessiano-vettore, le approssimazioni a bassa memoria come L-BFGS, le approssimazioni strutturate come Gauss-Newton e K-FAC. L’Hessiana è il concetto che spiega; gli oggetti che si maneggiano sono sempre sue ombre ridotte.

Il rumore dei minibatch contamina la curvatura. Nel deep learning su larga scala il gradiente si stima su un minibatch, non sull’intero dataset. Lo stesso vale per qualunque stima dell’Hessiana o dei suoi prodotti: è rumorosa. I metodi del secondo ordine sono in generale più sensibili di quelli del primo ordine a questo rumore — una stima sbagliata della curvatura può produrre un passo molto sbagliato. È una delle ragioni per cui L-BFGS, eccellente per l’ottimizzazione full-batch, fatica nel regime stocastico del deep learning, e per cui Adam — che usa solo medie mobili del gradiente, robuste al rumore — domina nella pratica nonostante sia “solo” del primo ordine.

  • Derivate parziali, gradienti, Jacobiani — il capitolo precedente di questa Parte: l’Hessiana è la Jacobiana del gradiente, e le derivate parziali seconde con il teorema di Schwarz vengono da lì.
  • Analisi matematica: limiti, continuità, derivate — la derivata seconda in una dimensione come curvatura, concavità e punto di flesso: l’Hessiana è la versione multivariata.
  • serie-taylor (in preparazione) — l’approssimazione di Taylor al secondo ordine, con il termine quadratico governato dall’Hessiana, è la base sia del test della derivata seconda sia del metodo di Newton.
  • convessita (in preparazione) — una funzione è convessa esattamente quando la sua Hessiana è semidefinita positiva ovunque: il ponte fra curvatura e minimi globali.
  • ottimizzazione-matriciale (in preparazione) — le derivate matriciali necessarie per maneggiare l’Hessiana in forma compatta nei conti di ML.
  • Autovalori e autovettori a intuizione — gli autovalori e autovettori dell’Hessiana sono le curvature principali e le direzioni principali: questo capitolo li applica a un caso concreto.
  • Discesa del gradiente: SGD, momentum, Adam — momentum, Adam e RMSProp si capiscono come risposte mirate al cattivo condizionamento dell’Hessiana.
  • Gradienti e derivate direzionali senza analisi — il gradiente come derivata prima, di cui l’Hessiana è il passo successivo.
  • ottimizzazione-non-convessa (in preparazione) — loss landscape, punti di sella e minimi locali nel deep learning: l’estensione applicata di ciò che qui si vede in forma matematica.
  • bias-varianza (in preparazione) — la relazione fra curvatura del minimo (sharpness) e capacità di generalizzazione di un modello.
  • Dauphin, Pascanu, Gulcehre, Cho, Ganguli, Bengio, Identifying and attacking the saddle point problem in high-dimensional non-convex optimization, NeurIPS 2014 (arXiv:1406.2572). Il paper che ha riorientato la comprensione del loss landscape: le selle, non i minimi locali, come ostacolo dominante; introduce il saddle-free Newton.
  • Pearlmutter, Fast Exact Multiplication by the Hessian, Neural Computation vol. 6, 1994. La fonte originale del prodotto Hessiano-vettore: come calcolare HvHv esattamente al costo di un gradiente, senza formare l’Hessiana.
  • Goodfellow, Bengio, Courville, Deep Learning, MIT Press 2016, capitoli 4 (Numerical Computation) e 8 (Optimization for Training Deep Models). Trattazione di riferimento di Hessiana, condizionamento, metodi del secondo ordine e punti di sella nel contesto delle reti.
  • Martens, Deep learning via Hessian-free optimization, ICML 2010. Come usare prodotti Hessiano-vettore e gradiente coniugato per addestrare reti profonde senza mai costruire l’Hessiana.
  • Nocedal, Wright, Numerical Optimization, Springer, 2a edizione 2006. Riferimento standard sul metodo di Newton, BFGS e L-BFGS, Gauss-Newton, e sul ruolo del condizionamento nella convergenza.