• Non ci sono risultati.

6.3 Reti neurali convoluzionali: CNN

6.3.1 Strato convoluzionale

La convoluzione `e l’operazione fondamentale delle CNN. Essa dispone un filtro in ogni possibile posizione dell’immagine, coprendola interamente e computa il prodot- to scalare tra il filtro stesso e la matrice corrispondente del volume di input, avente

Figura 6.3: Confronto tra due convoluzioni consecutive con dimensioni kernel di 3 × 3 (dallo strato 1 allo strato 2 in verde, e poi dallo strato 2 allo strato 3 in giallo) e una singola convoluzione con dimensione kernel di 5 × 5 (direttamente dallo strato 1 allo strato 3 in giallo). Si noti che il quadrato centrale del livello 3 ha lo stesso campo visivo nel livello 1 (tutti i 25 quadrati) indipendentemente da quale delle convoluzioni consideriamo.

eguale dimensioni. `E possibile visualizzare la convoluzione come una sovrapposizio- ne del kernel sull’immagine in input (o strato nascosto). Un filtro `e caratterizzato dai seguenti iperparametri (hyperparameters):

• Altezza; • Larghezza; • Profondit`a; • Numero.

Dimensione del kernel di convoluzione

La dimensione del kernel `e uno dei principali iperparametri, con la sua dimensione stiamo specificando anche la sua forma. Aumentare la dimensione del kernel in- fluenzer`a la complessit`a totale del modello, poich´e aumenteremo il numero di pesi che dovremo allenare. Nella pratica comune il kernel ha solitamente la forma di un quadrato/cubo e il lato `e un numero intero positivo dispari. La ragione di ci`o `e per evitare ambiguit`a in cui l’output pixel (quello al centro del quadrato/cubo, per i kernel di dimensioni dispari) corrisponder`a al pixel di input. Inoltre, nell’ultimo de- cennio abbiamo osservato un trend decrescente nella dimensione del kernel. Questo fatto pu`o essere spiegato confrontando due convoluzioni 3 × 3 consecutive con una singola convoluzione 5 × 5, come in figura 6.3 [17]. Chiamiamo campo ricettivo il numero di input da cui dipende il nostro valore di output centrale. Ovviamente `e

possibile definire il campo ricettivo dopo convoluzioni composte, con la conseguenza che dovremo tenere conto delle sovrapposizioni. Il motivo per cui confrontiamo que- sti due casi `e perch´e sono due modi diversi per ottenere lo stesso campo recettivo. Fondamentalmente, stiamo confrontando una struttura pi`u profonda (pi`u strati) con una struttura pi`u ”larga” (pi`u parametri). Il primo caso dovr`a addestrare 2 × (3 × 3) = 18 parametri, mentre il secondo dovr`a addestrare 5 × 5 = 25 parametri. Pertanto, anche avendo lo stesso campo ricettivo, `e preferibile l’utilizzo di due ker- nel pi`u piccoli in termini di complessit`a computazionale. Inoltre, la presenza di due strati andr`a a “stratificare” in un certo senso l’effetto degli input, dando maggiore importanza a quelli pi`u vicini al centro (rilevati e utilizzati dalla prima 3 × 3 con- voluzione). Oltre a questi due buoni effetti nell’utilizzo di strutture pi`u profonde ma pi`u strette, c’`e anche uno svantaggio negativo. L’iterazione di due circonvolu- zioni 3 × 3 consecutive non pu`o generare alcun kernel 5 × 5 possibile, e questo `e logicamente riflesso dal numero di parametri precedentemente confrontati. Anche date queste considerazioni precedenti, di solito dovrebbe essere preferibile usare 3 × 3 kernel, poich´e sono i kernel di dimensioni dispari pi`u piccoli che aumentano il campo recettivo. Ad ogni modo, `e comune vedere anche kernel 1 × 1 (il motivo sar`a discusso nella sezione dei filtri) e 5× 5 kernel, mentre `e sempre pi`u raro vedere kernel pi`u grandi di 7× 7 anche tra le reti pi`u performanti.

Numero dei filtri

Il termine filtro `e talvolta usato come sinonimo di kernel nella convoluzione delle immagini. Questo iperparametro viene utilizzato per eseguire pi`u convoluzioni nello stesso livello. Il numero di filtri pu`o anche essere pensato come il numero di canali nelle operazioni relative alle immagini, ad esempio, se vogliamo avere un’immagine colorata come output finale di uno strato convoluzionale, dobbiamo fissare il suo numero di filtri a 3, che pu`o essere interpretato come i canali RGB nell’ordine che preferiamo. Pi`u in generale, possiamo pensare al numero di filtri come al numero di neuroni che avr`a lo strato convoluzionale, ogni neurone eseguir`a una convoluzione possibilmente diversa cambiando i pesi del suo kernel e apprendendo quindi una caratteristica diversa che verr`a utilizzata dagli strati successivi. Per questo motivo, ogni volta che si ha a che fare con un kernel n dimensionale, l’output di uno strato convoluzionale sar`a (n + 1) dimensionale per la presenza dell’iperparametro del numero dei filtri.

Strides e padding

Consideriamo ora strides e padding insieme, perch´e sono entrambi legati al ”movi- mento” del kernel sull’input. Strides di un kernel n-dimensionale sono una sequenza n-dimensionale di numeri interi, che specifica quante posizioni sono necessarie per spostarsi lungo una data direzione prima di eseguire nuovamente l’operazione di convoluzione. Ricordando la definizione che abbiamo dato di convoluzione, fonda- mentalmente strides = 1 significa ”eseguire l’operazione di convoluzione per ogni possibile (x, y) nell’input”. Strides = 2 significher`a ”eseguire la convoluzione solo se (x, y) una volta ogni due posizioni consecutive”, quindi stiamo sostanzialmente saltando met`a delle possibili combinazioni ed eseguendo la convoluzione solo quando (x, y) sono entrambi dispari ((1,1) , (1,3), (3,1), (3,3), ...). Abbiamo detto che strides

hanno la stessa dimensionalit`a del suo kernel, perch´e `e possibile specificare differenti lunghezze di strides per ogni dimensione del kernel, quindi per una convoluzione 2D pu`o essere possibile specificare strides = (2,3), che significa: ”Eseguire nuovamen- te la convoluzione solo dopo essersi spostati di 2 posizioni sulla prima dimensione o di 3 posizioni sulla seconda dimensione”. L’iperparametro strides influenzer`a la dimensione e la forma dell’output, maggiore viene impostato e minore `e l’output. L’iperparametro padding `e quello usato per affrontare i problemi dei contorni delle matrici, a cui ci si riferisce quando il kernel sborda dai contorni dell’input. Le op- zioni pi`u popolari sono: valid and same. Il padding valid significa che ogni volta che il kernel sborda dall’input, quella singola operazione verr`a saltata, risultando in un output di dimensione inferiore rispetto all’input (se il kernel ha una dimensione maggiore di 1). Padding same significa idealmente ”mantenere la stessa dimensio- ne”. Anche se questa conclusione non `e garantita (poich´e altri parametri possono comunque ridurre la dimensione), lo scopo `e quello di evitare di saltare la posizione a causa di ambiguit`a su come trattare i bordi. Pertanto l’opzione padding = same andr`a ad aggiungere, in qualsiasi posizione richiesta ma non esistente nell’input, una posizione immaginaria con la minore interferenza possibile in termini di valori. Il valore all’interno della posizione immaginaria dipender`a dall’operazione, per le con- voluzioni vengono inseriti zeri, per il min o max pooling ± inf. Fondamentalmente si cercher`a di inserire il valore pi`u neutro.