In breve, senza formule
A luglio ho raccontato come e' caduta la congettura di Jacobi: una formula, tre punti che finiscono nello stesso posto, e un controllo che chiunque rifa' in dieci righe di codice. Solo che, se riguardi quel controllo, al momento decisivo non c'era nessuna genialata. C'era una griglia di numeri e un conto meccanico fatto su quella griglia.
Questo pezzo parte da li'. Perche' quella griglia non e' un attrezzo da specialisti della congettura di Jacobi: e' lo stesso identico oggetto che c'e' sotto i numeri immaginari, sotto i sistemi di equazioni, sotto le rotazioni di un videogioco, sotto le derivate in piu' variabili e sotto ogni singolo livello di una rete neurale. Sono problemi che a scuola ti hanno raccontato in cinque momenti diversi come se fossero cinque materie. Non lo sono.
La cosa che mi interessa e' un'altra: tantissima matematica sembra difficile solo perche' e' scritta male. Cambia rappresentazione e la stessa cosa diventa meccanica. E "meccanica" e' esattamente la parola che serve nel momento in cui vuoi che a fare i conti sia una macchina, e che a controllarli possa essere chiunque.
// Quella Griglia Che Abbiamo Dato Per Scontata
Sezione 00. Torniamo un attimo indietroUn mese fa, nel pezzo su Alpoge e la congettura di Jacobi, ho buttato li' parole grosse come se niente fosse. Jacobiano. Determinante. "Viene \( -2 \), costante, mai zero". E siamo andati avanti tranquilli, perche' il punto della storia era un altro.
Adesso pero' fermati un secondo su cosa abbiamo fatto, materialmente, per far cadere una congettura in piedi dal 1939. Abbiamo preso una formula in tre variabili, abbiamo costruito una tabella tre per tre di derivate, e da quella tabella abbiamo tirato fuori un singolo numero. Fine. Il pezzo piu' delicato di tutta la faccenda, quello su cui si regge la parola "controesempio", e' una griglia di nove caselle e un conto sopra.
E allora mi e' rimasta una domanda: perche' salta fuori sempre una griglia di numeri? Perche' 'sta roba compare nei sistemi di equazioni, nelle rotazioni, nella grafica 3D, nella statistica, nelle reti neurali e in una congettura di geometria algebrica del 1939? O e' una coincidenza sospetta, o dietro c'e' qualcosa.
Dietro c'e' qualcosa. E non e' complicato.
// MCMXLVIII per XXIII
Sezione 01. Il problema non e' sempre il problemaPrima di parlare di matrici ti chiedo un favore: moltiplica questi due numeri.
Prenditi tutto il tempo che ti serve. Anzi, non prendertelo.
Non ci provare nemmeno, e' orribile. Non c'e' una procedura, non c'e' un incolonnamento, non c'e' niente da mandare a memoria: devi ragionare da capo ogni volta, e a meta' strada ti sei perso. Adesso rifallo cosi':
Stessi identici numeri. Stesso identico problema.
Questo lo sai fare. Lo sai fare da quando avevi otto anni, e soprattutto lo sai fare senza pensare: incolonni, moltiplichi cifra per cifra, tieni i riporti, sommi. E' una procedura stupida, ripetibile, che funziona uguale con numeri di tre cifre o di trenta. La puoi insegnare a un bambino. La puoi insegnare a una macchina.
Ora, la cosa da mettere a fuoco: i due problemi sono lo stesso problema. Stessi numeri, stesso risultato. L'unica cosa cambiata e' come li abbiamo scritti. I Romani non erano piu' stupidi di noi. Avevano solo una notazione che rendeva la moltiplicazione una rogna. La notazione posizionale, quella con lo zero, arrivata in Europa via mondo arabo intorno al 1200, non ha reso i numeri piu' semplici. Ha reso semplice lavorarci.
Ecco, le matrici fanno una cosa molto simile con un mucchio di altra matematica. Vediamo il caso piu' bello, che secondo me e' anche quello che a scuola ci hanno raccontato peggio.
// I Numeri Immaginari Erano Rotazioni
Sezione 02. Quattro caselle e il mistero finisceAl liceo qualcuno ti ha detto: esiste un numero \( i \) tale che \( i^2 = -1 \). E tu, giustamente, hai pensato: e certo, e io mi invento un numero che fa quello che mi pare. Poi te l'hanno chiamato "immaginario", che come nome e' un disastro, e per il resto della vita ti e' rimasta l'idea che i numeri complessi siano una furbata inventata dai matematici per non ammettere che certe equazioni non hanno soluzione.
Adesso guardali cosi'. Prendi due griglie due per due, una per il numero \( 1 \) e una per \( i \):
Due tabelle di quattro numeri. Nessun numero inventato.
La prima e' la griglia che non fa niente: la moltiplichi per qualcosa e ti restituisce quel qualcosa. E' l'uno, in versione tabella. La seconda invece fa una cosa precisa: presa una freccia sul piano, la ruota di novanta gradi in senso antiorario. Provala a mano sulla freccia che punta a destra, quella verso il punto \( (1,0) \): esce la freccia che punta in su, verso \( (0,1) \). Ruotata di novanta gradi. Nient'altro.
Bene. Adesso moltiplica quella seconda griglia per se stessa, cioe' ruota due volte di novanta gradi:
Riga per colonna: due moltiplicazioni e una somma per casella, otto prodotti in tutto. E' scritto tutto.
E il risultato e' la griglia di \( -1 \):
Ruota di 90 gradi, poi ancora di 90. Sei a 180: punti esattamente all'indietro.
Guarda cosa e' appena successo. La griglia di \( i \), moltiplicata per se stessa, ti da' meno la griglia di \( 1 \). E non e' piu' una regola calata dall'alto da mandare a memoria: e' un conto di quattro caselle e un fatto geometrico. Ecco cosa vuol dire \( i^2 = -1 \).
E non funziona solo per \( i \). Funziona per tutti. Un numero complesso qualsiasi \( a + bi \) diventa questa griglia:
Il dizionario completo. Da qui in poi puoi buttare via la lettera i.
E la corrispondenza non e' un'analogia carina, e' esatta: se sommi due di quelle griglie ottieni la griglia della somma, se le moltiplichi ottieni la griglia del prodotto. Tutto torna, casella per casella. In gergo si dice che le due strutture sono isomorfe, che tradotto vuol dire: sono la stessa cosa scritta in due alfabeti diversi, e puoi passare da uno all'altro senza perdere niente. Non "si assomigliano". Sono.
E qui arriva il regalo. Ti ricordi il modulo al quadrato di un numero complesso, quella cosa \( |a+bi|^2 = a^2 + b^2 \) che sembrava una definizione a caso? Calcola il determinante di quella griglia:
Il modulo al quadrato e il determinante sono lo stesso numero. Sempre.
A scuola te le hanno insegnate come due cose diverse. Qui scopri che sono lo stesso conto.
// Tre Equazioni Diventano Un Oggetto Solo
Sezione 03. Ax = b, e la domanda si accorciaPassiamo alla roba che tutti abbiamo odiato: i sistemi di equazioni. Due incognite, due equazioni, e quel casino di sostituzioni con cui ricavi \( y \) dalla prima, lo infili nella seconda, sbagli un segno e ricominci.
A sinistra due equazioni. A destra tre oggetti e un uguale.
A destra abbiamo scritto \( Ax = b \): la griglia dei coefficienti moltiplicata per la colonna delle incognite fa la colonna dei risultati. Sembra solo un modo diverso di impaginare la stessa roba, e in un certo senso lo e'. Ma guarda cosa ti compra.
Primo: la scrittura non cambia mai piu'. Due equazioni: \( Ax = b \). Tre equazioni in tre incognite: \( Ax = b \). Diecimila equazioni in diecimila incognite, tipo quelle che risolve un simulatore di fluidi o un modello meteo: \( Ax = b \). Cambia solo quanto e' grande la griglia. Il problema, come problema, e' sempre lo stesso, e questo vuol dire che ti basta un pezzo di codice solo per tutti i casi.
Secondo, e qui viene il bello: hai una domanda vecchia che diventa nuova. "Questo sistema ha una sola soluzione, oppure ne ha infinite, oppure nessuna?" Nel formato a equazioni e' una rogna: devi metterti li' e provare. Nel formato a griglia e' una domanda sola, con una risposta sola:
Nel nostro caso det A = -3. Diverso da zero. Soluzione unica: x = 2, y = 1.
Hai gia' visto questo determinante. E' lo stesso identico attrezzo del pezzo sulla congettura di Jacobi, dove \( \det J_F = -2 \), mai zero, voleva dire "la macchina non schiaccia mai niente". Qui, in un contesto che sembra completamente diverso, \( \det A \neq 0 \) vuol dire "il sistema non e' degenere, la soluzione c'e' ed e' unica".
E' la stessa domanda: questa trasformazione butta via informazione? Se il determinante e' zero, si': due ingressi diversi possono finire nello stesso posto, e indietro non torni. Se non e' zero, no. Che tu stia risolvendo i compiti di terza liceo o abbattendo una congettura del 1939, stai chiedendo la stessa cosa alla stessa macchina.
Cosa e' davvero il determinante. La formuletta con le diagonali e' solo il modo di calcolarlo. Il determinante, preso in valore assoluto, e' di quanto la trasformazione gonfia o sgonfia i volumi. Prendi un cubetto di lato 1, dagli in pasto alla trasformazione, guarda il volume che esce: quello e' il determinante, a meno del segno. Se viene \( 3 \), i volumi triplicano. Se viene \( 0 \) il cubetto e' stato appiattito: schiacciato su un piano, o su una retta. Ha perso una dimensione, e da li' indietro non ci torni. Il segno dice se la trasformazione ha anche ribaltato l'orientamento, cioe' se ha fatto l'effetto specchio. Ecco perche' in quel pezzo il numero era \( -2 \) e non \( 2 \): quella mappa raddoppia i volumi e li specchia. Il meno non era decorativo.
Una precisazione onesta, che poi e' il tipo di cosa che separa la matematica dalla divulgazione allegra: dal punto di vista teorico, se \( \det A \neq 0 \) la soluzione e' \( x = A^{-1}b \), con \( A^{-1} \) la matrice inversa. E' vero ed e' elegante. Nella pratica pero' nessuno risolve i sistemi cosi': calcolare l'inversa costa piu' fatica che risolvere direttamente, e con i numeri a virgola mobile del computer accumula errori peggio. Si usa l'eliminazione di Gauss o una fattorizzazione. La forma \( A^{-1}b \) serve a capire, non a calcolare. Sono due mestieri diversi e vale la pena non confonderli.
// Le Formule Di Trigonometria Che Non Devi Ricordare
Sezione 04. Ruotare e' moltiplicareTorniamo alle rotazioni, che nella sezione 02 avevamo lasciato a meta'. Ruotare il piano di un angolo \( \theta \) qualsiasi si scrive cosi':
Con theta = 90 gradi (cos 0, sin 1) ritrovi esattamente la griglia di i. Non e' una coincidenza.
Guardala bene e confrontala col dizionario di prima, quello dei numeri complessi: \( a+bi \leftrightarrow \left(\begin{smallmatrix} a & -b \\ b & a\end{smallmatrix}\right) \). E' identica, con \( a = \cos\theta \) e \( b = \sin\theta \). Quindi "una rotazione" e "un numero complesso di modulo 1" non sono due cose imparentate: sono due nomi per la stessa griglia. E infatti il determinante lo conferma da solo, senza che nessuno debba metterci del suo:
Uno. Cioe': ruotare non cambia le aree. Grazie al cazzo, verrebbe da dire.
E' quasi comico: la formula piu' famosa della trigonometria, quella che ti hanno fatto imparare come un dogma, qui esce fuori come effetto collaterale del fatto ovvio che se giri un oggetto l'oggetto non diventa piu' grande. Ma il regalo vero e' un altro, ed e' questo. Ruotare di \( \alpha \) e poi ruotare di \( \beta \) e' come ruotare di \( \alpha + \beta \), no? Ovvio. Allora moltiplica le due griglie e guarda cosa ti esce nelle caselle:
Il prodotto di due rotazioni. Ha di nuovo la forma di una rotazione, con C e S al posto di cos e sin. Guarda cosa sono C e S.
Ma ruotare di \( \alpha \) e poi di \( \beta \) e' ruotare di \( \alpha+\beta \), quindi quella griglia e' \( R(\alpha+\beta) \): \( C \) dev'essere \( \cos(\alpha+\beta) \) e \( S \) dev'essere \( \sin(\alpha+\beta) \). Le formule di addizione. Quelle. \( \cos(\alpha+\beta) = \cos\alpha\cos\beta - \sin\alpha\sin\beta \) e \( \sin(\alpha+\beta) = \sin\alpha\cos\beta + \cos\alpha\sin\beta \), i due mostri che tutti abbiamo mandato a memoria maledicendo, e che tutti abbiamo dimenticato entro l'estate successiva. Non devi per forza ricordarle come formule isolate. Sono quello che c'e' scritto nelle caselle quando moltiplichi due rotazioni, e la moltiplicazione fra griglie e' una procedura stupida che puoi rifare in trenta secondi su un foglio.
Non hai memorizzato una formula: hai memorizzato il risultato di un conto che potevi rifare quando volevi. E' esattamente il tipo di fatica che una buona rappresentazione ti risparmia.
Da qui, tra l'altro, viene tutta la grafica al computer. Ruotare, ridimensionare, specchiare, spostare: ognuna e' una griglia. E siccome comporre trasformazioni e' moltiplicare griglie, venti trasformazioni di fila le schiacci in una griglia sola, calcolata una volta, e poi la applichi a duecentomila vertici. Non e' un'ottimizzazione furba trovata da qualche programmatore: e' che la rappresentazione ti da' la scorciatoia gratis.
// Adesso Lo Jacobiano Ha Senso
Sezione 05. La derivata, quando i numeri sono tantiTorniamo a quel pezzo di luglio, adesso che abbiamo gli attrezzi.
Quando hai una funzione di una variabile sola, la derivata in un punto e' un numero: la pendenza. Il senso e' semplice, e' la retta che assomiglia di piu' alla curva li' intorno. Zoomi abbastanza su una curva liscia e vedi una retta: la derivata e' quella retta.
E se la funzione prende tre numeri e ne restituisce tre? Un numero solo non basta piu', perche' ci sono tre ingressi che possono muoversi e tre uscite che possono reagire. Ti servono tutte le combinazioni: quanto si muove la prima uscita se muovo il primo ingresso, quanto se muovo il secondo, e cosi' via. Nove numeri. E nove numeri con due indici, uno per l'uscita e uno per l'ingresso, si scrivono in una griglia:
Riga i, colonna j: quanto reagisce l'uscita i se sposti di un pelo l'ingresso j.
Quel simbolo storto vuol dire solo "derivo rispetto a questa variabile e tratto le altre come numeri fermi". Niente di piu'. E la griglia intera, tutta insieme, e' la trasformazione lineare che assomiglia di piu' alla funzione, in quel punto. E' esattamente la stessa idea della retta tangente, solo che in piu' dimensioni la cosa che assomiglia alla funzione non e' una retta: e' una matrice. Scritta per esteso, l'approssimazione e' questa:
Sposto l'ingresso di un pelo h: l'uscita si sposta di quel pelo passato dentro la griglia.
Guarda che roba familiare. \( J_F(x) \) qui sta esattamente dove nella retta tangente ci sarebbe la pendenza, e fa esattamente il suo mestiere: moltiplica lo spostamento. Solo che non e' un numero, e' una matrice, e moltiplicare vuol dire trasformare un vettore. Ecco perche' lo Jacobiano sta nella stessa famiglia delle rotazioni e delle altre griglie viste finora: e' la trasformazione lineare che la funzione somiglia di piu' a fare, li'.
E adesso ricomponi il puzzle di quel pezzo, che a questo punto si monta da solo. Il determinante dice di quanto la trasformazione gonfia i volumi. Lo Jacobiano e' la trasformazione che approssima la funzione in un punto. Quindi \( \det J_F \) in un punto dice di quanto quella funzione gonfia i volumi li' intorno. Se viene zero, li' la funzione appiattisce: schiaccia una dimensione, incolla insieme direzioni diverse, butta via informazione. Se viene \( -2 \) ovunque, come nella mappa di Alpoge, allora ovunque raddoppia i volumi e li specchia, e non schiaccia mai niente da nessuna parte.
Quel "foglio di gomma che non fa mai una grinza" di cui parlavo li', e che allora era un'analogia per farti capire, adesso non e' piu' un'analogia. E' una griglia di nove derivate e un conto sopra, che ti restituisce un numero, e quel numero o e' zero o non lo e'.
Riguarda lo script SymPy di quel pezzo, quello che chiunque poteva incollare in un terminale per verificare la caduta della congettura. Costruisce la griglia delle derivate parziali. Chiama .det(). Stampa. La ragione per cui un problema aperto dal 1939 si verifica in dieci righe non e' che il problema fosse facile: e' che qualcuno, molto prima, aveva trovato la rappresentazione in cui la domanda "questa macchina schiaccia?" diventa "questo numero e' zero?". Il lavoro duro era gia' stato fatto, ed era stato fatto sulla notazione.
// Le Direzioni Che Non Girano
Sezione 06. Autovalori, senza pauraC'e' un problema con le matrici, ed e' che mescolano tutto. Guardi una griglia di numeri e non hai la minima idea di cosa faccia: prende ogni ingresso, lo spalma su tutte le uscite, e da fuori sembra solo un frullatore.
Pero' quasi sempre c'e' un modo per capirla. Cerchi le direzioni speciali: quelle in cui la matrice non gira niente, si limita ad allungare o accorciare. Una freccia che punta li', dopo la trasformazione punta ancora esattamente li', solo piu' lunga o piu' corta. La freccia si chiama autovettore, il numero che la allunga autovalore, i nomi fanno paura e il concetto no. Si scrive cosi':
"La matrice A applicata alla freccia v fa la stessa freccia v, moltiplicata per un numero."
Un esempio con numeri veri. Prendi questa griglia, che a occhio non dice niente a nessuno:
Quattro numeri. Cosa fa questa cosa? Boh.
Adesso prova a darle in pasto due frecce scelte bene, la diagonale \( (1,1) \) e l'antidiagonale \( (1,-1) \). Sono due conti da dieci secondi ciascuno, falli:
Nessuna delle due frecce ha cambiato direzione. Una si e' allungata per 3, l'altra e' rimasta com'era.
Ecco cosa fa quella matrice, detto in italiano: allunga per tre lungo la diagonale, e lascia stare tutto il resto lungo l'antidiagonale. Tutto qui. Non e' un frullatore, e' uno stiramento in due direzioni fisse. Sembrava un mescolone perche' lo stavamo guardando negli assi sbagliati: nel sistema di riferimento fatto da quelle due frecce, quella matrice e' solo "moltiplica per 3" e "moltiplica per 1", due numeri indipendenti.
E' di nuovo il trucco del vestito, ma stavolta applicato dentro l'algebra lineare: cambio il sistema di coordinate e l'operazione che mescolava tutto diventa un paio di moltiplicazioni separate. E' il motivo per cui gli autovalori sono ovunque: in statistica sono dietro la PCA, dove gli autovettori danno le direzioni in cui i dati variano di piu', e in Google erano il PageRank.
E qui si chiude il cerchio col determinante. Per questa matrice il determinante, \( 2\cdot2 - 1\cdot1 = 3 \), e' il prodotto dei due fattori di stiramento, \( 3 \times 1 \). Non e' un caso, ma non e' nemmeno la spiegazione generale: quella non passa dagli autovalori. Per qualunque matrice quadrata, il determinante fa zero esattamente quando esiste un vettore non nullo che viene mandato a zero. Ecco perche' determinante zero vuol dire schiacciare: basta una direzione annientata e il conto se ne accorge.
Una precisazione, perche' ho scritto "quasi sempre" e non era per prudenza retorica. Non tutte le matrici hanno un set completo di direzioni fisse. Le rotazioni, per dirne una, non ne hanno nessuna: e' ovvio, se giri il piano nessuna freccia resta dove stava. E infatti se ti ostini a cercare gli autovalori di una rotazione ti escono numeri complessi. Che, se hai letto la sezione 02, e' esattamente il posto da cui eravamo partiti.
// Un Livello Di Rete Neurale, Smontato
Sezione 07. Sorpresa: e' la stessa macchinaAdesso il salto che sembra grosso e non lo e'. Una forma tipica di un livello di rete neurale, quella cosa di cui si parla tutti i giorni come se fosse magia nera, si scrive cosi':
Un livello, nella sua forma piu' comune. Tutto qui.
Ok, questa sembra una roba infernale. Guardiamola un secondo, pezzo per pezzo. \( x \) e' la colonna dei numeri che entrano. \( W \) e' una griglia di numeri, i famosi "pesi", quelli che il modello impara. \( b \) e' un'altra colonna, uno spostamento fisso. E \( \sigma \) e' una funzioncina che si applica a ogni numero uno per volta, tipo "se e' negativo mettilo a zero" (questa si chiama ReLU ed e' proprio cosi' stupida come sembra).
Quindi \( Wx + b \) e'... esattamente la roba della sezione 03. Griglia per colonna, piu' uno spostamento. Il pezzo affine di un livello di rete neurale e' \( Wx + b \): la stessa moltiplicazione matrice-vettore che abbiamo visto nei sistemi, con uno spostamento aggiunto. Aprilo per un caso minuscolo con due ingressi e vedi che non c'e' niente di nuovo sotto il sole:
Moltiplica, sposta, schiaccia. In un modello vero la griglia ha migliaia di righe, non due. Il conto e' quello.
Adesso la domanda giusta: se di ogni livello tieni solo la parte affine, quella senza \( \sigma \), e ne impili cento, cosa ottieni? Sembra che ottieni una cosa molto potente. E invece ottieni niente. Guarda, senza la funzioncina \( \sigma \) in mezzo:
Due livelli senza non-linearita' collassano in uno. E cosi' cento, e cosi' mille.
Il prodotto di due matrici e' una matrice. Il prodotto di cento matrici e' ancora una matrice. Una composizione di mille trasformazioni lineari, senza quella funzioncina stupida in mezzo, sarebbe equivalente a una sola trasformazione lineare: un'unica griglia, che sa fare solo cose lineari, e che non imparerebbe mai niente di interessante.
Il trucco che permette al deep learning di essere profondo e' quella \( \sigma \). Senza una non linearita' in mezzo, impilare trasformazioni non aggiunge niente a quello che la rete sa esprimere: e' la ragione per cui impilare i livelli serve a qualcosa. Il pezzo affine, cioe' le matrici piu' lo spostamento, e' quello che fa il lavoro pesante e che le GPU sanno macinare a velocita' oscena. Il pezzo non lineare e' quello che impedisce a cento livelli di diventare uno.
E l'addestramento? Addestrare vuol dire capire come cambiare quei pesi per sbagliare un po' meno. Cioe' calcolare come reagisce l'errore quando muovi ciascun peso, che e' la derivata di una funzione con milioni di ingressi. Cioe', l'hai letto tre sezioni fa, uno Jacobiano. La backpropagation e' la regola della catena applicata a una pila di livelli, e la regola della catena, in piu' variabili e in forma matriciale, si esprime come prodotto di Jacobiani, uno per livello, dall'ultimo al primo.
Con una furbizia che vale la pena dire, perche' e' il motivo per cui la cosa e' praticabile: quei Jacobiani, per intero, non li scrive mai nessuno. Quello che serve davvero non e' la matrice, e' il suo effetto su un vettore: un prodotto vettore-Jacobiano. E quello si calcola direttamente, livello per livello, senza mai materializzare la griglia completa. E' esattamente il lavoro che fanno i framework di differenziazione automatica, PyTorch e soci: la struttura e' un prodotto di Jacobiani, quello che gira in memoria e' una sequenza di prodotti con un vettore.
Le GPU sono nate per fare grafica in parallelo, e nella grafica le trasformazioni matriciali sono dappertutto. Le reti neurali hanno bisogno di fare moltiplicazioni matriciali a raffica. Quindi la stessa architettura hardware che era perfetta per far girare i mostri di Quake si e' rivelata perfetta anche per questo.
IL PROBLEMA LA RAPPRESENTAZIONE LA DOMANDA DIVENTA ───────────────────────────────────────────────────────────────────────────── "i al quadrato fa -1"? ──▶ [ 0 -1 ] ruota di 90, poi ancora [ 1 0 ] di 90: guardi indietro n equazioni, n incognite ──▶ A x = b soluzione unica? (A e' invertibile?) ruotare di un angolo ──▶ [ cos -sin ] moltiplicare due griglie [ sin cos ] (e le formule escono da sole) derivare in piu' variabili ──▶ J (griglia di det J = 0 ? derivate parziali) "ma cosa fa 'sta matrice?" ──▶ A v = λ v quali direzioni restano ferme, e di quanto un livello di rete neurale ──▶ σ(W x + b) moltiplica, sposta, schiaccia. E ripeti.
sei problemi che sembrano di sei materie diverse. una colonna in mezzo.
un numero complesso
se si torna indietro
4×4 mod 2, contro i 49 di Strassen
// Dove Il Trucco Si Rompe
Sezione 08. Onesta', che non guasta maiQui pero' c'e' un limite. Se ti stai formando l'idea che basti scrivere tutto con le matrici e la matematica diventa facile, no. Il trucco ha un tetto, e vale la pena sapere dov'e'.
Una matrice rappresenta una trasformazione lineare. Puoi sommare vettori, moltiplicarli per numeri, combinarli. Ma se ti serve una curva, una soglia, una saturazione, da sola non basta. E attenzione che gia' \( Wx + b \), quello dei livelli di rete neurale, a rigore non e' lineare ma affine: c'e' quello spostamento in fondo che rompe la linearita' stretta. La mossa che si fa allora e' sempre la stessa: prendi la roba non lineare e la linearizzi in un punto, e la matrice con cui la linearizzi e' lo Jacobiano. Funziona benissimo, finche' resti vicino a quel punto.
E indovina qual e' l'esempio piu' fresco del limite. La congettura di Jacobi diceva: se lo Jacobiano non e' mai zero in nessun punto, allora la mappa si inverte globalmente. Cioe' diceva: la matrice locale, in tutti i punti, basta a dirti cosa fa la funzione presa tutta intera. Era falso. Il controesempio di Alpoge e' letteralmente una funzione il cui Jacobiano e' invertibile in ogni punto e che, ciononostante, da lontano incolla tre punti nello stesso posto. Quel pezzo, visto da qui, e' proprio la storia di una linearizzazione che non basta. Le matrici sono uno strumento formidabile per rendere meccanico cio' che e' locale; convincersi che il locale determini il globale e' costato ottantasette anni a un mucchio di gente molto piu' brava di me.
E poi cambiare rappresentazione non e' gratis. Trovare gli autovalori di una matrice grossa e' un conto serio, non un'occhiata. Con i numeri a virgola mobile ci sono matrici in cui un errore microscopico nei dati diventa un errore enorme nel risultato, e c'e' un intero mestiere, l'analisi numerica, che esiste per gestire questa roba. La forma pulita ti dice cosa vuoi calcolare, non ti regala il calcolo.
La versione corretta della tesi, quindi, non e' "le matrici risolvono i problemi". E': quando riesci a portare un problema in forma di matrice, una grossa fetta del lavoro diventa meccanica. E quello che resta difficile lo vedi meglio. E' un guadagno enorme, ma e' un guadagno, non una vittoria.
// Perche' Adesso Conta Il Doppio
Sezione 09. Genera, traduci, verificaNel pezzo di luglio il punto vero non era il controesempio, era l'asimmetria: trovare una formula che rompe la congettura e' un oceano, verificarla sono dieci righe. E dicevo che quella asimmetria e' il terreno perfetto per un modello che sforna candidati appoggiato a un verificatore che non perdona.
Bene: adesso possiamo dire una cosa in piu' su chi paga quell'asimmetria. La verifica costa poco perche' qualcuno, prima, ha portato la domanda in una forma in cui verificare e' meccanico. Se la condizione "questa macchina non schiaccia mai niente" non avesse una traduzione in griglie e determinanti, non sarebbe una verifica: sarebbe una discussione. Con opinioni, sfumature, gente che non e' d'accordo. Invece e' J.det(), e stampa \( -2 \), e non c'e' altro da aggiungere.
Quindi la pipeline di cui si parla in continuazione in questi mesi, quando la guardi da vicino, ha tre pezzi e non due. C'e' il modello che propone candidati, ed e' la parte che costa: quello e' l'oceano. C'e' la verifica in fondo, che esegue il conto, e costa quasi niente. E in mezzo c'e' il passaggio che porta la domanda in una forma calcolabile, quello che si fa una volta sola e spesso decenni prima.
Ed e' proprio il pezzo in mezzo che spesso manca: tradurre la domanda in qualcosa che una macchina possa controllare. AlphaTensor, che li' avevo citato di sfuggita, e' l'esempio piu' pulito che conosca: cercava algoritmi piu' veloci per moltiplicare matrici, e la mossa vincente e' stata riscrivere "un algoritmo di moltiplicazione" come un oggetto matematico da scomporre (un tensore, che e' grosso modo una griglia con un indice in piu'). Riscritto cosi', "trova un algoritmo migliore" diventa "trova una scomposizione piu' corta", che e' una cosa in cui puoi mandare una macchina a cercare. Il risultato l'hanno pubblicato su Nature nel 2022 (Fawzi et al., Nature 610, 47–53): per moltiplicare due matrici \( 4\times4 \) in aritmetica modulo 2 bastano 47 moltiplicazioni invece di 49. E qui serve dire cosa si sta contando, perche' "moltiplicazioni" e' una parola scivolosa: si contano solo i prodotti fra elementi, le somme no, e le 49 sono quelle dell'algoritmo di Strassen del 1969 applicato due volte di fila (sette moltiplicazioni per un \( 2\times2 \), e \( 7\times7=49 \) per un \( 4\times4 \) spezzato in blocchi). Due prodotti in meno, in un caso particolare, con una regola di conteggio precisa. Fa sorridere detto cosi', ma il punto e' che una macchina ha battuto sessant'anni di ingegno umano su un problema su cui l'ingegno umano si era accanito, e ci e' riuscita perche' qualcuno le aveva dato lo spazio giusto in cui cercare.
Ed e' esattamente lo stesso movimento degli assistenti di dimostrazione tipo Lean, di cui si parla sempre di piu': tradurre un teorema in una forma che una macchina puo' controllare passo per passo. Non "capire" la dimostrazione. Renderla verificabile senza opinioni. Cambia la rappresentazione finche' la verifica smette di essere un giudizio e diventa un'esecuzione.
Se vuoi vedere con i tuoi occhi la parte di questo pezzo che si puo' controllare, sono poche righe. Aritmetica esatta, niente approssimazioni, gira offline.
import sympy as sp
a, b, c, d = sp.symbols('a b c d')
M = lambda p, q: sp.Matrix([[p, -q], [q, p]]) # il "numero" p + qi
print(M(0, 1)**2) # [[-1,0],[0,-1]] -> i^2 = -1
print(sp.simplify(M(a,b)*M(c,d) - M(a*c-b*d, a*d+b*c))) # matrice nulla: il prodotto torna
print(sp.factor(M(a, b).det())) # a**2 + b**2 -> il modulo al quadrato
A = sp.Matrix([[2, 1], [1, 2]])
print(A.eigenvects()) # 1 lungo (-1,1), 3 lungo (1,1)
print(A.det()) # 3 = 1*3, il prodotto degli autovalori
La seconda riga stampata e' quella che mi diverte di piu': una matrice di zeri. Vuol dire che moltiplicare due numeri complessi e moltiplicare le due griglie corrispondenti danno lo stesso risultato, per qualsiasi valore di \( a, b, c, d \), perche' SymPy sta facendo il conto con le lettere e non con dei numeri di prova. Non e' un test su qualche caso: e' la verifica dell'identita'. E anche qui, come allora, non devi fidarti di me. Incolla, esegui, guarda.
Una matrice non risolve niente.
Mette il problema in una forma dove la soluzione si puo' controllare.
Quindi, tirando le somme. I numeri complessi sono griglie \( 2\times2 \) di una certa forma. I sistemi di equazioni sono \( Ax=b \). Le rotazioni sono griglie \( 2\times2 \) di una certa forma, che poi sono le stesse di prima. Le formule di trigonometria sono cosa esce quando ne moltiplichi due. Le derivate in piu' variabili sono griglie. Il "questa macchina torna indietro?" e' un numero calcolato da una griglia. Il "cosa fa questa trasformazione" sono le direzioni ferme di una griglia. Un livello di rete neurale e' una griglia, uno spostamento e una funzioncina. L'addestramento e' una moltiplicazione di griglie di derivate.
Non e' che la matematica sia poca cosa. E' che una quantita' impressionante di roba che ci hanno raccontato come materie separate, in capitoli separati, con nomi che sembravano apposta per intimidire, e' la stessa macchina guardata da angolazioni diverse. Il giorno in cui te ne accorgi non impari una cosa nuova: smetti di ricordarne otto.
E la prossima volta che un pezzo di matematica ti sembra impossibile, prima di darti del cretino vale la pena farsi la domanda che si sarebbe fatta un romano davanti a MCMXLVIII per XXIII: e se fosse solo scritto male?
Fonti e verifiche. Questo pezzo riprende Tre Ingressi, Una Sola Uscita, pubblicato qui il 20 luglio 2026, sul controesempio di Levent Alpoge alla congettura di Jacobi, che, al momento della stesura di questo pezzo, non risultava ancora sottoposto a revisione tra pari formale. Tutti i conti di questo pezzo li ho rifatti in aritmetica esatta con SymPy prima di scrivere, compreso il \( \det J_F = -2 \) di quel pezzo. Su AlphaTensor: Fawzi et al., Nature 610, 47–53 (2022) e la copertura di Quanta; le 47 moltiplicazioni valgono per matrici \( 4\times4 \) in aritmetica modulo 2, non nel caso generale. Panna, come al solito, non ha letto una riga e sta benissimo.