Prendete una fotografia in bianco e nero e appoggiateci sopra un cartoncino con un forellino quadrato, largo tre pixel per tre. Attraverso il foro vedete solo un frammento minuscolo dell’immagine. Ora fate scorrere il cartoncino: un pixel a destra, poi ancora uno, riga dopo riga, fino a coprire tutta la foto. A ogni posizione vi fate una sola domanda — «in questo frammento c’è un bordo verticale?» — e annotate la risposta su un foglio a parte, nella stessa posizione. Alla fine il foglio contiene una mappa: dove, nell’immagine, ci sono bordi verticali. Avete appena eseguito, a mano, una convoluzione.
La convoluzione come filtro che scorre, i campi recettivi, i pesi condivisi e il pooling sono spiegati nel libro.
Gran parte della visione artificiale moderna — dal riconoscimento facciale del telefono alla lettura automatica delle targhe — è costruita sopra questa operazione. Vale la pena capirla davvero, perché è molto più semplice di quanto il nome lasci intendere.
Il kernel: nove numeri con un’opinione
Il «forellino» della metafora si chiama kernel (o filtro): una piccola griglia di numeri, tipicamente 3×3. La convoluzione funziona così: il kernel si sovrappone a una porzione dell’immagine, ogni suo numero viene moltiplicato per il pixel corrispondente, e i nove prodotti si sommano in un unico valore. Poi il kernel si sposta di un passo e si ricomincia.
La sostanza sta nei valori del kernel. Un kernel con numeri positivi sulla colonna sinistra e negativi sulla destra produce valori alti dove l’immagine passa da chiaro a scuro in orizzontale — cioè dove c’è un bordo verticale. Un kernel diverso risponde ai bordi orizzontali, un altro alle diagonali, un altro ancora a piccole macchie chiare su fondo scuro. Ogni kernel è un rilevatore specializzato: nove numeri che incarnano un’opinione su cosa sia interessante.
Questi filtri non sono un’invenzione del deep learning. Chi ritocca fotografie li usa da decenni: gli effetti «sharpen» e «blur» di qualsiasi editor di immagini sono convoluzioni con kernel fissi, scelti a mano. La novità delle reti convoluzionali è un’altra: i valori del kernel non li sceglie nessuno, li impara la rete. Sono parametri come tutti gli altri, ottimizzati dalla discesa del gradiente. La rete scopre da sola quali rilevatori le servono per il compito che ha davanti.
Il kernel 3×3 scorre sulla griglia dell’immagine: a ogni posizione moltiplica i suoi pesi per i pixel sottostanti e somma, scrivendo un valore nella feature map. Questo kernel di esempio risponde ai bordi verticali.
Perché non usare una rete normale
Una rete completamente connessa potrebbe in teoria fare lo stesso lavoro: collegare ogni pixel a ogni neurone e lasciare che l’ottimizzazione trovi i pesi giusti. In pratica è una pessima idea, per due ragioni.
La prima è il conteggio dei parametri. Un’immagine a colori di 224×224 pixel ha circa 150.000 valori in ingresso: un solo strato denso con mille neuroni richiederebbe 150 milioni di pesi. Un kernel convoluzionale 3×3, invece, ne ha nove (più un bias) — e li riusa identici su tutta l’immagine. Questo riuso si chiama condivisione dei pesi, ed è come avere un solo ispettore che perlustra tutto l’edificio invece di assumere un vigilante per ogni stanza: costa enormemente meno e applica ovunque lo stesso criterio.
La seconda ragione è più sottile: la convoluzione incorpora nella struttura stessa della rete un fatto vero sul mondo visivo. Un gatto è un gatto sia in alto a sinistra sia in basso a destra della foto. Un rilevatore di orecchie deve funzionare ovunque. Facendo scorrere lo stesso kernel su tutta l’immagine, la rete ottiene questa proprietà — la chiamano equivarianza per traslazione — gratis: non deve imparare a riconoscere il gatto in ogni posizione separatamente. È conoscenza a priori cablata nell’architettura, e riduce drasticamente i dati necessari per l’addestramento.
Feature map: l’immagine riscritta
L’output di una convoluzione si chiama feature map: una nuova griglia in cui ogni cella dice quanto fortemente il pattern del kernel è presente in quella zona dell’immagine originale. Non è più una fotografia, è una mappa tematica — come passare dalla foto satellitare di una città alla mappa che evidenzia solo le strade.
Uno strato convoluzionale reale non usa un solo kernel ma decine o centinaia, ciascuno con i propri pesi. Il risultato è una pila di feature map: una per i bordi verticali, una per gli orizzontali, una per certe texture, e così via. L’immagine viene riscritta in un nuovo linguaggio, dove ogni «canale» racconta un aspetto diverso della scena. Lo strato successivo applicherà le sue convoluzioni su questa pila, combinando i rilevatori semplici in rilevatori più complessi.
La convoluzione non guarda l’immagine: la interroga. Ogni kernel fa una domanda, ogni feature map è l’elenco delle risposte, posizione per posizione.
Stride, padding e le manopole di controllo
Due dettagli pratici completano il quadro. Lo stride è il passo con cui il kernel si sposta: con stride 1 avanza pixel per pixel, con stride 2 salta una posizione ogni due, producendo una feature map di lato dimezzato. È un modo per ridurre la risoluzione mentre si estraggono i pattern.
Il padding risolve invece un problema di bordi: un kernel 3×3 centrato sul pixel d’angolo sporgerebbe fuori dall’immagine. La soluzione standard è circondare l’immagine con una cornice di zeri, così che il kernel possa visitare anche i pixel di confine e l’output mantenga le stesse dimensioni dell’input. Senza padding, ogni strato convoluzionale «mangerebbe» un anello di pixel, e dopo molti strati l’immagine si ridurrebbe a un francobollo.
C’è poi il concetto di campo recettivo: la porzione dell’immagine originale che influenza un singolo valore in profondità nella rete. Un neurone del primo strato vede 3×3 pixel; uno del secondo strato vede 5×5, perché ogni suo input era a sua volta un riassunto di 3×3. Strato dopo strato il campo recettivo si allarga, finché i neuroni profondi «vedono» porzioni ampie della scena — pur essendo costruiti solo con operazioni locali minuscole.
Dai neuroni di Hubel e Wiesel a ImageNet
L’idea ha radici biologiche. Tra gli anni Cinquanta e Sessanta i neurofisiologi David Hubel e Torsten Wiesel scoprirono che nella corteccia visiva del gatto esistono neuroni che rispondono selettivamente a bordi con orientamenti specifici, ciascuno per una piccola porzione del campo visivo — un lavoro che contribuì al loro premio Nobel. Le reti convoluzionali, dal Neocognitron di Kunihiko Fukushima alla LeNet di Yann LeCun fino ad AlexNet, sono la traduzione ingegneristica di quell’intuizione: rilevatori locali, ripetuti ovunque, impilati in gerarchia.
Ed è AlexNet il punto di svolta storico: quando nel 2012 una rete convoluzionale vinse la competizione ImageNet con un margine molto ampio sui metodi tradizionali, il campo della visione artificiale cambiò direzione nel giro di pochi mesi. Da allora le convoluzioni sono state il motore di quasi tutto ciò che «vede» — anche se oggi i Vision Transformer le affiancano, e in alcuni ambiti le sostituiscono.
Perché ti riguarda
Se usate lo sblocco facciale, se la vostra auto legge i cartelli stradali, se un dermatologo si fa aiutare da un software per valutare un neo, state usando convoluzioni. Capire che sotto c’è un’operazione così semplice — nove numeri che scorrono e si moltiplicano — ha un valore pratico: smonta l’idea che questi sistemi «capiscano» le immagini come noi. Rilevano pattern statistici, con tutta la potenza e tutti i limiti del caso: un pattern mai visto in addestramento resta invisibile, e un pattern spurio può ingannare il sistema. Sapere come funziona il meccanismo è il primo passo per decidere quando fidarsi delle sue risposte — e quando no.

I commenti sono riservati agli iscritti.
Accedi per commentare