Articoli

DeepLearningItalia Meetup – 27 maggio 2019 – Milano

Il Meetup #AperiTech di maggio di Deep Learning Italia!
*** Presto maggiori dettagli ***

– Cosa faremo

1) Matteo Alberti – Docente at Deep Learning Italia

“Introduzione alla piattaforma Deep Learning Italia”
Abstract: Illustrazione della community Deep Learning Italia e degli strumenti oggi sviluppati e a disposizione della community. Introduzione alle features del sito www.deeplearningitalia.com: i tutorials, il question & answer, le references, gli sviluppi futuri.

2) Elena Gagliardoni, Cristiano De Nobili, Daniele D’armiento at HARMAN International & Deep Learning Italia

“Text Classification con VDCNN, analisi e confronto”

Nella comunità AI è quasi un paradigma l’uso di modelli specifici per determinati campi: per il linguaggio naturale (NLP) si usano reti ricorrenti per poter gestire la natura sequenziale dei dati, nella computer vision (CV) si usano reti convoluzionali data la loro capacità di processare input statici e a dimensione fissa come le immagini. Recentemente è partito un nuovo trend che rovescia questo paradigma, grazie anche alle ricerca di uno dei padri dell’AI moderna. In questo talk analizzeremo in dettaglio un modello di CNN preso ad esempio proprio da una famosa pubblicazione di Y. LeCun, la VDCNN, per fare text classification di alcuni testi di vario tipo e lunghezza, e lo confronteremo con uno dei più famosi framework open source come fastText per valutarne pregi e difetti.
#AperiTech è un’iniziativa di Codemotion in collaborazione a Milano con LVenture Group e LUISS EnLabs

 

ALGEBRA LINEARE PER TUTTI [Parte 2]

 

Autore: Paolo Caressa

 

 

Punti, vettori e loro algebra

Abbiamo fin qui parlato di punti come la totalità dei punti del piano che si identificano in modo biunivoco con la totalità di tutte le coppie possibili di numeri reali.

Per quanto riguarda il machine Learning, siamo interessati a insiemi finiti di punti, in quanto vogliamo rappresentare particolari oggetti da classificare o fenomeni da correlare come punti in uno spazio cartesiano. Per trovare una regolarità o un “pattern” in questi punti, spesso ci interessa considerare rette, piani oltre che di figure geometriche più complesse come le coniche nel piano o le quadriche nello spazio.

Abbiamo visto prima, con un esempio, che alcune figure geometriche possono essere rappresentate da singole o da sistemi di equazioni.

Limitiamoci al caso delle rette e dei piani per capire in generale come li si rappresenta, dato che spesso queste rappresentazioni sono utilizzate nel machine learning.

 

Una retta è intuitivamente un insieme allineato di punti: uno degli assiomi di Euclide afferma che per due punti passa una sola retta, cioè che per determinare univocamente una retta basta indicarne due punti distinti.

Per capire come questo si possa fare nel piano cartesiano, consideriamo due punti distinti P e Q, di coordinate P=(x1,y1) e Q=(x2,y2).

Definiamo il vettore che va da P a Q come la coppia di numeri

Cattura 6

Cioè un vettore è per definizione una differenza di punti, dove con il termine differenza intendiamo la differenza fra le componenti che hanno lo stesso indice.

Dal punto di vista informatico possiamo pensarla in questo modo: un punto è un array (o lista) con due elementi che sono numeri. Normalmente un array A = [x,y] si indicizza a partire da 0, cioè A[0] = x e A[1] = y. Allora, se A e B sono array, il vettore \overline{AB}  si può rappresentare con l’array [B[0] – A[0], B[1] – A[1]].

Resta da capire perché chiamiamo “vettore” una differenza di punti: perché è un oggetto dotato di direzione, verso e intensità, come i vettori della fisica.

La direzione è semplicemente la retta che passa per P e Q; il verso è quello che va da P verso Q (il vettore opposto sarebbe \overline{PQ}  che va da Q verso P: quali sono le sue componenti?)

 

L’intensità è la distanza fra i punti P e Q. Pertanto un vettore determina una retta, e su di essa una direzione: naturalmente esistono infiniti vettori che determinano la stessa retta.

Per esempio la retta che passa per i punti  P= (0,1)  e Q= (0,-2)  è individuata dal vettore \overline{PQ}= (-2,2)   , ma anche dal vettore (-1,1)  che ha stessa direzione e verso ma intensità diversa.

In generale, per ogni numero  (-a,a) a non nullo  rappresenta questa retta. Diciamo che due vettori sono paralleli se sono l’uno multiplo dell’altro per un fattore di scala non nullo.

In effetti, un altro modo di determinare una retta è individuarne un punto P  e un vettore \overline{v}  in modo da esprimere tutti i punti della retta come traslati per i vettori paralleli a \overline{v}

 X= P+ \overline{av}

Questa si chiama l’equazione parametrica della retta, perché esprime il generico punto  della retta per mezzo di un parametro  che varia in tutti i numeri reali.

Si noti che abbiamo usato l’operazione di somma fra un punto e un vettore, definita in modo ovvio: se  P= (X,Y)  e  v= \overline{RS} allora   P + \overline{RS} \left ( x+w-a,y+z -b\right )  , supponendo che le coordinate dei punti R e  S siano  R=(a,b)  e S=(w,z) . Cioè sommiamo le coordinate del punto e le componenti del vettore per ottenere un nuovo punto.

Quando sommiamo un vettore a un punto diciamo anche che applichiamo il vettore in quel punto.

 

I vettori, oltre a consentire di definire le rette ed in dimensioni più alte piani ed iperpiani possiamo notare che:

  1. I vettori possono essere sommati e fra loro ottenendo altri vettori:

\overline{PQ} + \overline{RS}= Q-P+S-R

Notiamo che allora  \overline{PQ} + \overline{QP}=0  (il vettore nullo) e  \overline{QP} è il vettore opposto  \overline{PQ}.

Inoltre, questa operazione di somma soddisfa le usuali proprietà commutativa e associativa

2. I vettori possono essere moltiplicati per un numero ottenendo altri vettori: Inoltre questa operazione di prodotto soddisfa le usuali proprietà commutativa, associativa e distributiva.In particolare il vettore nullo  \overline{0} è ottenuto moltiplicando per zero ed il vettore  opposto di un vettore dato  \overline{v}, cioè quel vettore  \overline{w} tale che  \overline{v} + \overline{w}=0  , è ottenuto   \overline{v}  moltiplicando per  -1.

Inoltre questa operazione di prodotto soddisfa le usuali proprietà commutativa, associativa e distributiva.

 

Con il termine spazio vettoriale si intende un insieme di elementi con due operazioni, di somma fra gli elementi e di moltiplicazione di un elemento per un numero, che soddisfi le stesse proprietà delle operazioni fra i vettori del piano.

vettore in un piano

Figura 3. Il vettore ottenuto come somma  di due vettori del piano si costruisce prendendo la diagonale del  parallelogramma individuato dai due vettori se applicati in uno stesso punto.

In realtà, nel machine learning si utilizzano invariabilmente spazi vettoriali di dimensione finita i cui vettori sono espressi in coordinate, e in questo caso i vettori sono differenze di punti proprio come nell’esempio che stiamo discutendo.

In effetti un elemento di confusione per i principianti è che sia i punti che i vettori dello spazio cartesiano sono rappresentati come coppie di numeri.

Vogliamo ricordare che, anche se si rappresentano allo stesso modo, sono oggetti concettualmente distinti. Un punto individua un singolo punto dello spazio, un vettore individua uno spostamento lungo una direzione, verso e di una certa lunghezza dove si può far corrispondere un punto a un vettore e viceversa nel modo seguente:

al punto P possiamo far corrispondere il vettore   \overline{OP}  che va dall’origine del piano cartesiano al punto P; se invece  \overline{v}   è un vettore, possiamo associargli il punto   0+\overline{v} .

 

Questa distinzione fra punti e vettori è spesso trascurata ma è importante intanto per distinguere concetti apparentemente identici, e poi perché aiuta a interpretare le applicazioni della teoria: per esempio nella seguente figura sono rappresentate, secondo un certo algoritmo di machine learning, alcune parole di un corpus di documenti in inglese con i punti del piano cartesiano:

 

italy

 

Come si vede i punti rappresentano parole.

I vettori cosa rappresentano in questo caso?

Prendiamo il vettore che va da “pizza” a “italy” e applichiamolo a “sushi”: otteniamo indicativamente “japan”. Ne deduciamo che quel vettore rappresenta la risposta a una domanda, cioè “dato un piatto tipico qual è la sua nazione?”.

In questo caso è chiaro che punti e vettori rappresentano concetti distinti.

 

Lunghezza e angolo fra vettori, similarità del coseno

Per definire la lunghezza di un vettore introduciamo una notazione molto usata: il prodotto scalare (o dot-product).

Sia  \overline{v} =(v_1,v_2) e  \overline{v} = (v_1,w_2) diciamo che la il prodotto scalare di   \overline{v}  e  \overline{w}  è il numero:

ecuacion 1

 

ottenuto come somma dei prodotti delle componenti di pari indice dei due vettori.

In particolare, il prodotto scalare di un vettore per se stesso è, per definizione, il quadrato della sua lunghezza:

ecuacion 2

La lunghezza di un vettore si chiama anche norma: si noti che la formula mostra chiaramente come la norma che abbiamo considerato sia “euclidea”, e il motivo è dato dal fatto che, se scriviamo  come differenza di punti troviamo che

nueva ecuacion 3

La lunghezza di un vettore che abbiamo qui definito è quella che in fisica si chiama la sua intensità: oltre alla lunghezza, possiamo anche definire l’angolo  \theta = \overline{V} \overline{W}  fra due vettori, implicitamente per mezzo della formula :

ecuacion 4

Usando la funzione arcocoseno è possibile calcolare questo angolo a partire dal prodotto scalare dei due vettori e dalle loro lunghezze: il motivo per cui questa formula definisce effettivamente l’angolo fra i vettori è legato alla trigonometria.

Notiamo che   \theta  è un numero compreso fra -1 e 1  tale che:

imagen 3

Dunque, mentre la distanza confronta la similarità fra due punti, che sono tanto più simili quanto più la loro distanza è prossima a zero, il coseno misura la similarità fra due vettori, nel senso che più è prossimo a 1 in valore assoluto e più i vettori determinano la stessa retta.

Questa misura è spesso usata in machine learning per classificare oggetti mappati su spazi vettoriali.

Lo spazio cartesiano a N dimensioni

Nel tour de force di geometria cartesiana e vettoriale che abbiamo fin qui seguito, ci siamo limitati al caso della dimensione N = 2 per aiutarci con i disegni e sviluppare i concetti in un ambiente familiare: ma nelle applicazioni abbiamo a che fare con spazi di dimensione anche molto alta.

In questo caso dobbiamo rinunciare all’intuizione, ma in realtà tutte le formule che abbiamo dato e tutti i concetti che abbiamo definito si trasportano “pari pari” al caso di dimensione qualsiasi.

Infatti tutte le formule dipendono da somme e sottrazioni delle coordinate dei punti e delle componenti dei vettori: se queste componenti sono 2 oppure 20.000 non fa una reale differenza. Ancora meglio, tutto questo si implementa in modo molto efficiente su un computer, cui possiamo far digerire punti e vettori in spazi di dimensione altissima senza problemi!

Un concetto dobbiamo tuttavia spiegarlo, quello di iperpiano: nel caso del piano coincide col concetto di retta e nel caso dello spazio ordinario col concetto di piano.

Fissata una dimensione N consideriamo lo spazio cartesiano R^n.

 

Una retta di questo spazio è, come nel caso di dimensione 2, determinata da una coppia di punti o da un punto e da un vettore: l’equazione parametrica è la stessa che nel caso bidimensionale.

Se N > 2 possiamo anche considerare equazioni parametriche del tipo:

ecuacion 5

In questo caso abbiamo due parametri che variano indipendentemente, quindi, a intuito, l’insieme dei punti X che soddisfano questa equazione al variare di a e b nei numeri reali corrisponde alle coppie (a,b) cioè al piano. In altri termini, è un oggetto bidimensionale.

In realtà questo non è sempre vero: per esempio se    \overline{v}= \overline{w} l’equazione parametrica precedente si riduce alla

ecuacion 6

quindi in realtà rappresenta una retta.

Quindi se scriviamo una equazione parametrica con più parametri, la dimensione dell’insieme dei punti descritti da questa equazione dipende dalle relazioni fra i vettori usati per scriverla: nel caso precedente, se i vettori sono paralleli l’equazione rappresenta una retta e non un piano.

Se in generale, in uno spazio di dimensione N, scriviamo una equazione parametrica in N – 1 parametri, abbiamo:

ecuacion 7

Se tutti i vettori che vi figurano sono paralleli, otteniamo ancora una retta! Per assicurarci di avere un oggetto di dimensione N – 1 dobbiamo trovare un analogo della condizione di parallelismo fra due vettori che sia esprimibile per più di due.

 

Diciamo che n vettori :

Cattura 1

sono linearmente indipendenti se l’unico modo per soddisfare l’equazione

ecuacion 8

È che tutti i coefficienti a_1, a_2,a_n   siano nulli! Cioè l’unica soluzione di questa equazione vettoriale deve essere

Cattura2

Ora possiamo definire un iperpiano di dimensione N – 1 in uno spazio cartesiano di dimensione N come l’insieme dei punti definiti dall’equazione parametrica

ecuacion 9

al variare in tutti i modi possibili dei numeri:

Cattura 3

e supponendo che i vettori rappresentanti qui sotto, siano linearmente indipendenti.

Cattura4

Un iperpiano può essere descritto anche da una equazione cartesiana, cioè da una relazione lineare fra le coordinate del generico punto che gli appartiene:

ecuacion 10

dove  b_i non tutti i  sono nulli.

Un modo per determinare questa equazione è notare che la somma di prodotti dei coefficienti e delle coordinate è il prodotto scalare fra il vettore   \overline{b} = (b_1, b_2,..,b_n) e il vettore   \overline{x} = (x_1, x_2,..,x_n) delle coordinate, di modo che possiamo scriverla

Cattura 5

Questo vuol dire che l’iperpiano è formato dai vettori che sono perpendicolari al vettore  che rappresenta la direzione perpendicolare all’iperpiano, quella mancante per colmare tutto lo spazio.

Un iperpiano di dimensione N – 1 in uno spazio di dimensione N separa in due parti lo spazio, esattamente come una retta separa in due il piano e un piano separa in due lo spazio tridimensionale: i punti che appartengono a una delle due parti in cui viene separato lo spazio dall’iperpiano hanno le coordinate che soddisfano la disequazione.

 

ecuacion 13

Mentre i punti le cui coordinate soddisfano la disequazione

ecuacion 14

costituiscono l’altra parte dello spazio delimitata dall’iperpiano.

Questa idea di usare un iperpiano per separare in due parti lo spazio è la separabilità lineare ed è utilizzata negli algoritmi classici di machine learning, come alberi decisionali o le support vector machines.

 

Matrici e loro algebra

Una delle caratteristiche dell’algebra lineare è la facilità e universalità dei suoi metodi numerici: in sostanza basta aver implementato un algoritmo (o una sua variante), cioè l’eliminazione di Gauss, per poter sostanzialmente fare qualsiasi cosa [una introduzione a questo algoritmo si trova per esempio in queste note]. Questi algoritmi sono tipicamente già implementati in tutte le librerie standard di calcolo numerico, per esempio numpy.linalg di Python.

Per chiudere questo tutorial (ormai fin troppo lungo) è opportuno introdurre la nozione chiave che coinvolge tutti questi algoritmi, e che è utile anche in tutti gli sviluppi concettuali dell’algebra lineare: il concetto di matrice.

Una matrice è semplicemente una tabella di numeri: oppure anche definibile come un array bidimensionale. Diciamo quindi che una matrice n×m è una tabella di numeri che denotiamo con due indici, i e j, dove il primo indice individua la riga e il secondo la colonna: all’incrocio della riga i e della colonna j si trova il numero  individuato da questi indici (in matematica gli indici partono da 1 e non da 0 come in informatica)

Quando la scriviamo per esteso, una matrice si rappresenta nel modo tabellare seguente:

ecuacion15

Una matrice in cui n = m si dice matrice quadrata.

Dal punto di vista pratico, una matrice sembra semplicemente un vettore di lunghezza nm i cui elementi sono arrangiati in forma tabellare anziché scritti in sequenza.

Tuttavia questo cambio notazionale è fondamentale per poter usare questi oggetti.

In particolare, le matrici arricchiscono l’algebra dei vettori con una operazione di moltiplicazione vera e propria: prima notiamo che possiamo sommarle e moltiplicarle per un numero ottenendo ancora matrici dello stesso tipo

Catturab6

In altri termini le matrici n×m formano uno spazio vettoriale di dimensione nm.

Ricordiamo che abbiamo detto che un vettore si può moltiplicare per un numero e ottenere ancora un vettore. Ma non sappiamo come moltiplicare un vettore per se stesso e ottenere ancora un vettore: il prodotto scalare di due vettori produce un numero e non un vettore.

Per introdurre una moltiplicazione dobbiamo scrivere i vettori in due modi distinti: vettori riga e vettori colonna. Un vettore riga è una sequenza di numeri, come lo abbiamo scritto fin qui, per esempio (1,2,0).

Un vettore colonna è una sequenza di numeri scritti dall’alto verso il basso, come :

Cattura66

Apparentemente non c’è differenza sostanziale, ma in realtà se interpretiamo un vettore come un particolare tipo di matrice, il vettore riga è una matrice 1×3 mentre il vettore colonna è una matrice 3×1.

Quel che si può fare è in effetti, data una matrice A del tipo n×m e una matrice B del tipo n×r moltiplicare A per B ottenendo una matrice n×r. Il coefficiente di indici i e j della matrice AB è calcolato come la somma seguente:

Cattura 12

Si noti che questo è il prodotto scalare del vettore riga dato dalla riga i-esima di A per il vettore colonna dato dalla colonna j-esima di B: ecco perché il prodotto di matrici di chiama prodotto righe per colonne.

Esempio: moltiplichiamo una matrice 2×3 per una matrice 2×3:

image1

Torniamo ora ai nostri vettori: possiamo moltiplicare il vettore riga per il vettore colonna, e ne risulta una matrice 1×1 vale a dire un numero (il prodotto scalare). Ma possiamo anche moltiplicare il vettore colonna 3×1 per il vettore riga 1×3 ottenendo una matrice 3×3:

catura 12

 

Notiamo quindi che moltiplicando due vettori di uno spazio di dimensione N otteniamo un vettore di uno spazio di un’altra dimensione: 1 oppure N×N.

La matrice identità è la matrice quadrata che contiene zero dappertutto tranne che sulla diagonale dove contiene 1 (gli elementi diagonali di una matrice sono quelli il cui indice di riga è uguale all’indice di colonna: ). Per esempio in dimensione 3 la matrice identità è

ecuacion 16

Come suggerisce il nome, moltiplicando una matrice A per la matrice identità si ottiene ancora A. Inoltre il prodotto di matrici è distributivo rispetto alla somma.

Tuttavia l’algebra delle matrici ha una particolarità: il prodotto non è commutativo, il che vuol dire che AB è diversa da BA (in effetti BA potrebbe non avere senso, se per esempio n m).

Per esempio

ultima ecuacion

 

Un’altra operazione tipica che si effettua è la moltiplicazione di una matrice n×m per un vettore colonna di m componenti: ne risulta un vettore colonna di n componenti.

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 (apprendimento profondo) 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 (apprendimento profondo)  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.

 

Le reti neurali hanno bisogno di evolversi