Icone color1 05

Guida alle architetture di reti profonde

Autrice: Joyce Xu

Traduttrice: Sabrina Sala

 

 

1

GoogLeNet, 2014

Negli ultimi anni, molto del progresso ottenuto nell’utilizzo del deep learning per la visione artificiale può essere ricondotto a un gruppo ristretto di architetture di reti neurali. Lasciando da parte la matematica, i codici e i dettagli dell’implementazione, in questo articolo intendiamo analizzare come questi modelli funzionino.

Al momento, Keras domina con sei di questi modelli pre-addestrati già inseriti all’interno della libreria.

  • VGG16
  • VGG19
  • ResNet50
  • Inception v3
  • Xception
  • MobileNet

Le reti VGG, insieme alla precedente AlexNet del 2012, segue lo schema archetipico delle reti convoluzionali classiche: una serie di convoluzioni, max-pooling, strati di attivazione e infine alcuni strati di classificazione completamente connessi. MobileNet è, essenzialmente, una versione semplificata dell’achitettura di Xception, ottimizzata per le applicazioni mobile. Tuttavia, sono stati i rimanenti tre modelli a ridefinire davvero il modo in cui attualmente guardiamo alle reti neurali. Questo articolo si focalizzerà quindi sull’intuizione avuta con le architetture di ResNet, Inception e Xception, e sul perché esse sino diventate il punto di riferimento per i successivi studi di visione artificiale.

ResNet

ResNet è nata da una semplice osservazione: “perché aggiungendo ulteriori strati a reti neurali profonde l’accuratezza non migliora ma, addirittura, peggiora?”

Intuitivamente, reti neurali più profonde non dovrebbero performare peggio di quelle poco profonde, o almeno non durante l’allenamento quando non vi è alcun rischio di overfitting. Prendiamo una rete di esempio con n strati che raggiungono una certa accuratezza. Come minimo, una rete con n+1 strati dovrebbe essere in grado di raggiungere lo stesso grado di accuratezza, copiando i primi n strati ed eseguendo un identity mapping per l’ultimo strato. Allo stesso modo, reti di n+2, n+3 e n+4 strati possono, con lo stesso metodo, ottenere la medesima accuratezza. Tuttavia, al crescere della profondità della rete questo non è sempre vero.

Gli sviluppatori di ResNet hanno ricondotto questo problema all’ipotesi che le mappature dirette sono difficili da allenare. Hanno così proposto un rimedio: a posto che cercare di apprendere da mappature sottostanti da x di H(x), è possibile invece apprendere la differenza tra i due, ovvero il “residuale” e, successivamente, aggiustare quest’ultimo all’input.

Poniamo che il residuale sia F(x)=H(x)-x. Ora la nostra rete cerca di apprendere da F(x)+x.

Ciò ha dato vita a ai famosi blocchi di ResNet (rete residuale):

 

2.jpg

ResNet block

 

Ogni “blocco” di ResNet consiste in una serie di strati e una identity mapping che aggiunge l’input del blocco al su output. Questa operazione di “addizione” viene fatta elemento per elemento. E nel caso in cui l’input e l’output siano di dimensioni differenti, possono essere utilizzate le tecniche di zero-padding o di proiezioni (attraverso convoluzioni 1×1) per creare dimensioni corrispondenti.

Ritornando alla nostra rete esempio, questo metodo può semplificare notevolmente la costruzione di strati di identità di cui è composta. È infatti molto più semplice imparare a spingere F(x) verso 0 e lasciare l’output come x. ResNet fornisce, quindi, agli strati un punto di riferimento x da cui apprendere, piuttosto che partire da zero da una trasformazione di identità.

Questa idea è davvero efficace nella pratica. Prima di questa, nelle reti neurali profonde si riscontrava un problema di annullamento del gradiente, la cui discesa, data dalla minimizzazione della funzione di errore, si riduce esponenzialmente attraverso la retropropagazione degli strati precedenti. In sostanza, la lunga strada attraverso gli strati precedenti rendeva i segni degli errori talmente piccoli da non permettere alla rete di apprendere. Ciò nonostante, grazie all’innovazione introdotta da ResNet, descritta sopra, possiamo ora costruire reti di innumerevoli strati (potenzialmente anche più di mille) che abbiano un elevato grado di accuratezza. Questo è stato un grande passo in avanti, considerato che il modello più profondo creato fino ad allora, era di 22 strati (vincitore della competizione ILSVRC del 2014).

Sono stati pubblicati molti articoli successivi sul deep learning ma senza grandi miglioramenti. ResNet rimane, fondamentalmente, il modello che ha cambiato la nostra comprensione delle reti neurali e di come esse apprendano.

La rete di 1000+ strati è open source! La potete travare qui.

Inception

Se ResNet si concentra sulla profondità, Inception Family™ è invece focalizzata sull’estensione. In particolare, gli sviluppatori di Inception erano interessati all’efficienza computazionale dell’allenamento di reti più larghe. In altre parole: come possiamo aumentare la larghezza delle reti neurali senza eccedere la capacità computazionale di un elaboratore?

Il lavoro originario riguardava una componente nota con il nome di “Inception model”. Il cuore di questo modello, racchiudeva due elementi innovativi.

  1. La prima intuizione riguarda operazioni sugli strati. In una tradizionale CNN, ogni strato estrae informazioni dallo strato precedente al fine di trasformare i dati di origine in un differente tipo di informazione. L’output di una convoluzione 5×5 estrae caratteristiche differenti da quelle di un 3×3 o di un max-pooling e così via. Per ogni strato, come possiamo quindi intuire quale kernel fornisca informazioni più rilevanti?

Perché non lasciare quindi che sia il modello a scegliere?

Un modulo Inception elabora molteplici e differenti trasformazioni sugli stessi dati di input, in contemporanea, concatenando i risultati in un singolo output. In altre parole, ogni strato “Inception module” consiste in una convoluzione 5×5, una 3×3 e un max-pool.  È lasciato allo strato successivo la selezione delle features più rilevanti.

3

3

La maggiore densità di informazione dell’architettura di questo modello ha un problema rilevante: il drastico aumento della capacità computazionale necessaria. Non solo i filtri convoluzionali più larghi (es 5×5) sono impegnativi e onerosi da calcolare, ma anche la sovrapposizione di differenti filtri incrementa il numero di mappe delle caratteristiche per ogni strato. Ciò risulta un vero impedimento per il nostro modello.

Vediamola in un altro modo: per ogni filtri che aggiungiamo, dobbiamo eseguire una convoluzione su tutte le mappe di input per calcolare un singolo output. Nell’immagine sottostante vediamo come la creazione di una mappa di output da un singolo filtro implichi la computazione su ogni singola mappa degli strati precedenti.

4

Poniamo che vi siano M mappe di input.  Per ogni filtro aggiuntivo, dobbiamo farlo convolvere lungo tutte le M mappe di input; allo stesso modo, se abbiamo ulteriori N filtri, dovremmo farli convolvere lungo tutte le N*M mappe. In altre parole, “ogni aumento uniforme nel numero di [filtri] risulta in una aumento al quadrato della computazione”. Il nostro modulo Inception ha così triplicato o quadruplicato il numero di filtri. Dal punto di vista computazionale, è un vero guaio.

Ciò porta alla seconda intuizione: usare convoluzioni 1×1 per una riduzione della dimensionalità. Al fine di risolvere la difficoltà computazionale sopra descritta, gli sviluppatori di Inception hanno usato le convoluzioni 1×1 per “filtrare” la profondità degli output. Queste convoluzioni prendo in considerazione un valore alla volta, ma attraverso molteplici canali, e possono inoltre Estrarre informazioni spaziali e comprimerle in una dimensione minore. Per esempio, usando 2° filtri 1×1, un input di dimensione 64x64x100 (con 100 mappe delle caratteristiche) può essere compresso a 64x64x20. Riducendo il numero di mappe di input, gli sviluppatori sono stati in grado di sovrapporre parallelamente differenti trasformazioni di strati, con il risultato di avere reti che erano, al tempo stesso, profonde (avendo numerosi strati) e larghe (con operazioni parallele).

5

5

a) modulo Inception, prima versione b) modulo Inception con riduzione della dimensionalità

la prima versione di Inception, chiamata “GoogLeNet” è quella citata in precedenza da 22 strati che ha vinto la competizione ILSVRC del 2014. Inception v2 e v3, sviluppate un anno dopo, sono migliori rispetto alla versione precedente per diversi fattori: il più rilevante è il refactoring di convoluzioni larghe in altre più piccole e consecutive, che siano quindi più semplici da apprendere. Ad esempio nella Inception v3, la convoluzione 5×5 è stata sostituita da due convoluzione consecutive 3×3.

Inception è diventata rapidamente un riferimento per l’architettura dei modelli successivi. La sua ultima versione, la v4, aggiunge anche connessioni residuale tra ogni modulo, creando un ibrido tra Inception e ResNet. Ciò nonostane, il fattore più importante è che questo modello dimostra la forza di architetture “network-in-network” ben concepite, raggiungendo un nuovo livello nella legittimazione del potere delle reti neurali.

Da notare è che la ricerca sulle versioni successive v2 e v3 è stata pubblicata il giorno immediatamente successivo alla data di uscita della ricerca su ResNet.

Xception

Xception, “extreme inception”, a differenza delle precedenti architetture, ha mutato la nostra comprensione delle reti neurali, in particolare le reti convoluzionali. Come suggerisce il nome, porta il principio di Inception al suo estremo.

L’ipotesi è stata: “le correlazioni spaziali e quelle tra i canali (B/N, RGB) sono sufficientemente svincolati da rendere preferibile non mapparle insieme”

Ciò significa che in una CNN tradizionale, gli stati convoluzionali individuavano correlazioni tra spazio e profondità. Nell’immagine seguente possiamo rivederne il funzionamento.

4

Il filtro considera simultaneamente una dimensione spaziale (ogni quadrato colorato 2×2) e una cross-channel o dimensione di “profondità” (la pila di quattro quadrati). Allo strato di input di un’immagine, questo è l’equivalente di un filtro convoluzionale che esamina un gruppo di pixel 2×2 attraverso tutti i tre canali RGB. Quindi ci poniamo una domanda: che ragione abbiamo di considerare la regione di immagine e i canali simultaneamente?

 

6

Inception comincia a separare questi due elementi: grazie a convoluzioni 1×1 proietta l’input originale in molteplici spazi di input di dimensioni minori, e da ognuno di questi utilizza differenti filtri per trasformare quei piccoli blocchi tridimensionali di dati. Xception va anche oltre: piuttosto che dividere i dati di input in molteplici gruppi compressi, mappa separatamente per eseguire, successivamente, una convoluzione 1×1 in profondità per cogliere le correlazioni cross-channel. Questa operazione è conosciuta con il nome di “depthwise separable convolution” che consiste in una convoluzione spaziale (depthwise convolution) eseguita in modo indipendente per ogni canale, seguita da una convoluzione 1×1 (pointwise convolution) tra i canali. È quindi una ricerca di correlazioni dapprima in uno spazio bidimensionale e, successivamente, in uno spazio unidimensionale. Questa mappatura 2D+1D è più semplice da apprendere, rispetto a una completamente 3D.

 

Xception supera le prestazioni di Inception v3 sui dataset di ImageNet, e lo fa altrettanto bene con dataset per la classificazione di immagini di 17mila classi. In aggiunta, ha lo stesso numero di parametri di modello di Inception, permettendo così un’ottima efficienza. Nonostante Xception sia molto recente, la sua architettura è già entrata a far parte delle applicazioni di Google per la mobile vision, attraverso MobileNet.

Da notare è che lo sviluppatore di Xception, François Chollet, è anche l’autore di Keras.

Prospettive e applicazioni

La conoscenza di ResNet, Inception e Xception è diventata ormai sempre più importante, sia in ambito di ricerca che in quello aziendale. Un’applicazione interessante è il transfer learning, una tecnica del machine learning in cui vengono applicate conoscenze prese da una fonte (prendiamo in esempio un modello ResNet allenato) ad un dominio target . Ciò generalmente comprende due azioni: inizializzare un modello con pesi pre-istruiti da ResNet, Inception ecc, utilizzandolo sia per l’estrazione di caratteristiche, sia per l’ottimizzazione (fine-tuning) degli ultimi strati su un nuovo dataset. Attraverso il transfer learning questi modelli possono essere riutilizzati per qualsiasi operazione ad esso correlata, dal rilevamento di oggetti per veicoli a guida autonoma, alla creazione di didascalie e sottotitoli per registrazioni video.

Potete trovare una guida di Keras ai modelli di fine-tuning qui.

 

0 commenti

Lascia un Commento

Vuoi partecipare alla discussione?
Fornisci il tuo contributo!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *