Introduzione agli autoencoder

Autore: Nathan Hubens

Linkedind: https://www.linkedin.com/in/nathan-hubens

Traduttrice: Sabrina Sala

 

Gli autoencoder sono reti neurali con lo scopo di generare nuovi dati dapprima comprimendo l’input in uno spazio di variabili latenti e, successivamente, ricostruendo l’output sulla base delle informazioni acquisite. Questa tipologia di network è composta da due parti:

  1. Encoder: la parte della rete che comprime l’input in uno spazio di variabili latenti e che può essere rappresentato dalla funzione di codifica h=f(x).
  2. Decoder: la parte che si occupa di ricostruire l’input sulla base delle informazioni precedentemente raccolte. È rappresentato dalla funzione di decodifica r=g(h).

1 3

Architettura di un autoencoder.

 

L’autoencoder nel suo complesso può quindi essere descritto dalla funzione d(f(x)) = r dove r è quanto più simile all’input originale x.

 

Perché copiare l’input in output?

Quello che speriamo è che, allenando l’autoencoder a copiare l’input, lo spazio di variabili latenti h possa assumere delle caratteristiche a noi utili.

Questo può essere ottenuto imponendo dei limiti all’azione di codifica, costringendo lo spazio h a dimensioni minori di quelle di x. In questo caso l’autoencoder viene chiamato undercomplete. Allenando lo spazio undercomplete, portiamo l’autoencoder a cogliere le caratteristiche più rilevanti dei dati di allenamento. Se non le diamo sufficienti vincoli, la rete si limita al compito di copiare l’input in output, senza estrapolare alcuna informazione utile sulla distribuzione dei dati. Ciò può accadere anche quando la dimensione del sottospazio latente ha la stessa grandezza dello spazio di partenza; nel caso di autoencoder overcomplete, quando le dimensioni dello spazio di variabili latenti è maggiore degli input. In questi casi anche con semplici encoder e docoder lineari possiamo copiare l’input in output senza imparare nulla del dato.

Idealmente è possibile, quindi, allenare con successo una qualsiasi architettura basata su autoencoder scegliendo opportunamente i parametri e la capacità di ciascun encoder-decoder in base alla complessità del dato da modellare.

 

L’utilizzo degli autoencoder

Ad oggi, riduzione del rumore e riduzione della dimensionalità per la visualizzazione dei dati sono considerati le applicazioni più interessanti degli autoencoder. Con l’appropriato settaggio della dimensionalità e dei relativi vincoli sulla dispersione del dato, attraverso gli autoencoder si possono ottenere proiezioni in sottospazi di interesse maggiore rispetto a metodi lineari come le PCA.

Gli autoencoder si allenano automaticamente attraverso dati di esempio. Ciò significa che è facile allenare la rete in modo da performare bene su simili tipologie di input, senza la necessità di generalizzare. Ossia, solo la compressione effettuata su dati simili a quelli utilizzati nel training set avrà dei buoni risultati, ma se eseguita su dati diversi sarà poco efficace. Altre tecniche di compressione come la JPEG riusciranno in modo migliore a svolgere questa funzione.

Queste reti neurali sono allenate a preservare quante più informazioni possibili quando queste sono inserite nell’encoder e successivamente nell’decoder, ma anche a far sì che le nuove rappresentazioni acquisiscano differenti tipi di proprietà. Si delineano quattro tipologie di autoencoder e, allo scopo di illustrarli, creeremo un esempio per ognuna di queste utilizzando il framework Keras e il dataset MNIST.

 

Tipologie di autoencoder

In questo articolo ne elenchiamo quattro:

  1. Vanilla autoencoder
  2. Autoencoder Multistrato
  3. Autoencoder Convoluzionale
  4. Autoencoder Regolarizzato

 

Vanilla autoencoder

È la forma più semplice, caratterizzata da una rete a tre strati, ovvero, una rete neurale con un solo strato nascosto. L’input e l’output sono uguali e, nel nostro caso, impariamo come ricostruire l’input attraverso l’utilizzo dell’ottimizzatore Adam e, come funzione di perdita, lo Scarto dei Minimi Quadrati.

In questa tipologia siamo nel caso di encoder undercomplete dove lo strato nascosto, con dimensione pari a 64, è più piccolo di quella dell’input (784), ottenuta dalla seguente formula 28x28x1. Questa vincolo impone alla rete neurale di imparare da una rappresentazione di dati compressa.

input_size = 784
hidden_size = 64
output_size = 784

x = Input(shape=(input_size,))

# Encoder
h = Dense(hidden_size, activation='relu')(x)

# Decoder
r = Dense(output_size, activation='sigmoid')(h)

autoencoder = Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')

Autoencoder Multistrato

Se un solo strato nascosto non è sufficiente, possiamo estendere l’autoencoder lungo la dimensione della profondità. La nostra implementazione sfrutta ora tre strati nascosti, per una migliore generalizzazione, ma dovremo anche rendere la rete simmetrica utilizzando lo strato intermedio.

input_size = 784
hidden_size = 128
code_size = 64

x = Input(shape=(input_size,))

# Encoder
hidden_1 = Dense(hidden_size, activation='relu')(x)
h = Dense(code_size, activation='relu')(hidden_1)

# Decoder
hidden_2 = Dense(hidden_size, activation='relu')(h)
r = Dense(input_size, activation='sigmoid')(hidden_2)

autoencoder = Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')

Autoencoder Convoluzionale

Sorge una domanda: potrebbero gli autoencoder essere usati con convoluzioni, piuttosto che strati interamente connessi?

E la risposta è sì. Il principio è lo stesso ma, al posto di vettori unidimensionali, vengono utilizzati vettori tridimensionali. L’immagine input viene campionata per ottenere una rappresentazione latente, ossia una riduzione dimensionale, costringendo così l’autoencoder a imparare da una versione compressa dell’immagine.

x = Input(shape=(28, 28,1)) 

# Encoder
conv1_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1)
conv1_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool1)
pool2 = MaxPooling2D((2, 2), padding='same')(conv1_2)
conv1_3 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool2)
h = MaxPooling2D((2, 2), padding='same')(conv1_3)


# Decoder
conv2_1 = Conv2D(8, (3, 3), activation='relu', padding='same')(h)
up1 = UpSampling2D((2, 2))(conv2_1)
conv2_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(up1)
up2 = UpSampling2D((2, 2))(conv2_2)
conv2_3 = Conv2D(16, (3, 3), activation='relu')(up2)
up3 = UpSampling2D((2, 2))(conv2_3)
r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up3)

autoencoder = Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')

Autoencoder Regolarizzato

Ci sono altri metodi con il quale possiamo vincolare la ricostruzione dell’autoencoder in alternativa all’imposizione di una minore dimensionalità degli strati nascosti. Piuttosto che limitare la capacità del modello mantenendo una architettura poco profonda di encoder e decoder, così come una riduzione forzata, gli autoencoder regolarizzati utilizzano una funzione di perdita incoraggi il modello ad assumere proprietà che vadano oltre alla semplice abilità di copiare l’input in output. Nella pratica troviamo due tipologie differenti: Sparse autoencoder e Denoising autoencoder.

  1. Sparse autoencoder: sono solitamente utilizzati per la classificazione. Allenando un autoencoder, le unità nascoste nello strato centrale vengono attivate troppo frequentemente. Per evitare ciò, dobbiamo abbassare il loro tasso di attivazione limitandola ad una frazione dei dati di training. Questo vincolo è chiamato vincolo di sparsità, poiché ciascuna unità viene attivata solo da un tipo prestabilito di input.
input_size = 784
hidden_size = 64
output_size = 784

x = Input(shape=(input_size,))

# Encoder
h = Dense(hidden_size, activation='relu', activity_regularizer=regularizers.l1(10e-5))(x)

# Decoder
r = Dense(output_size, activation='sigmoid')(h)

autoencoder = Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')

Un’altra modifica che possiamo fare durante la fase di ricostruzione è di aggiungere un termine di regolarizzazione alla nostra funzione di perdita: ad esempio un regolarizzatore di tipologia l1 introduce una penalità nella funzione di perdita, agendo durante la fase di ottimizzazione. Come risultato avremo un minor numero di attivazioni rispetto a quelle di un Vanilla autoencoder.

  1. Denoising autoencoder: Piuttosto che aggiungere penalità alla funzione di perdita, possiamo far cambiarne l’oggetto, aggiungendo rumore all’immagine di input e facendo in modo che l’autoencoder impari autonomamente a rimuoverlo. Ciò significa che la rete estrarrà unicamente le informazioni più rilevanti, e imparerà da una rappresentazione robusta dei dati.
x = Input(shape=(28, 28, 1))

# Encoder
conv1_1 = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1)
conv1_2 = Conv2D(32, (3, 3), activation='relu', padding='same')(pool1)
h = MaxPooling2D((2, 2), padding='same')(conv1_2)


# Decoder
conv2_1 = Conv2D(32, (3, 3), activation='relu', padding='same')(h)
up1 = UpSampling2D((2, 2))(conv2_1)
conv2_2 = Conv2D(32, (3, 3), activation='relu', padding='same')(up1)
up2 = UpSampling2D((2, 2))(conv2_2)
r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up2)

autoencoder = Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')

Utilizzo del Deep Learning per migliorare la grafica di FIFA 18

Autore: Chintan Trivedi

Linkedin: https://www.linkedin.com/in/chintan-trivedi-78665774/

Traduttrice: Sabrina Sala

 

1

 

Comparazione tra i due volti di Ronaldo: a sinistra quello di FIFA 18, a destra quello generato da una rete neurale profonda.

La Game Studios ha speso milioni di dollari e centinaia di ore di ricerca e sviluppo nel progettare la grafica del gioco, nel tentativo di renderla quanto più veritiera e naturale possibile. Nonostante i volti dei calciatori siano decisamente realistici, è ancora possibile distinguerli dal reale. Tuttavia, i profondi sviluppi avuti nell’elaborazione di immagini con l’utilizzo delle reti neurali profonde possono essere sfruttati per migliorare la grafica e, allo stesso tempo, ridurre lo sforzo necessario per farlo?

Proviamo quindi a rispondere utilizzando FIFA 18

Per capire se i recenti sviluppi possano aiutarci a rispondere a questa domanda, cerchiamo di focalizzarci sul miglioramento della grafica facciale dei giocatori utilizzando l’algoritmo DeepFakes, una rete neurale profonda che può essere allenata ad apprendere e generare visi umani in modo estremamente realistico. Questo articolo si occuperà, quindi, di ricreare i volti dei giocatori, riprendendoli dal gioco, per poi migliorarli in modo da renderli quanto più identici al reale.

Nota: qui troverete una buona spiegazione su come funzioni l’algoritmo deepfake, il quale può sostituire un volto con quello di qualsiasi altra persona utilizzando autoencoder e reti neurali convoluzionali.

Raccogliere dati di allenamento

A differenza degli sviluppatori del gioco, possiamo ottenere i dati necessari da una ricerca con Google, senza dover scomodare Ronaldo affinché indossi tute in grado di registrare i movimenti.

Cominciamo osservando il suo volto digitale, uno dei meglio riusciti nel gioco. Al fine di raccogliere informazioni per l’algoritmo deepfakes, dobbiamo semplicemente registrare il viso del giocatore attraverso la funzione di instant replay del gioco. Ora possiamo sostituirla con il vero volto di Ronaldo e, a tale scopo, scarichiamo alcune sue immagini dalla ricerca di Google che lo mostrino da angolazioni differenti. Questi pochi elementi sono tutto ciò che ci serve per cominciare il processo di allenamento del modello.

Architettura del modello e allenamento

L’algoritmo deepfakes riguarda l’allenamento di reti neurali profonde chiamate autoencoder. Queste reti per l’allenamento non supervisionato sono composte da un encoder in grado di comprime l’input in uno spazio di variabili latenti chiamato “encoding”, e da un decoder che utilizza questo spazio per ricostruire l’input. Tale architettura costringe la rete a estrapolare informazioni sulla distribuzione dei dati di input, piuttosto che lasciare che essa si limiti al semplice compito di copiare l’input in output. Utilizzeremo qui una rete convoluzionale come encoder e una rete neurale deconvoluzionale come decoder. Questa architettura è allenata a minimizzare l’errore di ricostruzione nell’apprendimento non supervisionato.

Nel nostro caso, inoltre, alleneremo simultaneamente due autoencoder: il primo imparerà a ricreare il viso di Ronaldo dalla grafica di FIFA 18, mentre la seconda lo farà utilizzando le immagini reali precedentemente scaricate. Nel deepfakes entrambe le reti condividono lo stesso encoder ma sono allenati con differenti decoder.

2.jpg 5

2.jpg 5

  1. Funzionamento del primo autoencoder che impara dalla grafica del gioco

3 2

2. Funzionamento del secondo autoencoder che impara attraverso immagini reali

Utilizzando un modello precedentemente allenato su altri volti, la perdita totale passa da 0.06 a 0.02, circa, in quattro ore di allenamento sfruttando una GTX 1070. In questo caso, l’allenamento è continuato sullo stesso modello, CageNet, utilizzato in precedenza per generare il volto di Nicolas Cage.

Utilizzare il modello allenato per scambiare i volti

Ora arriviamo alla parte più interessante. L’algoritmo è in grado di scambiare i volti adottando un trucco intelligente: nel secondo autoencoder viene, di fatto, inserito l’input del primo. In questo modo, l’encoder condiviso riesce ad utilizzare l’encoding ottenuto dai volti digitali di FIFA 18 e lascia che il decoder B ricostruisca, sulla base dell’immagine digitale, il volto reale. Così facendo i volti di FIFA vengono direttamente convertiti nell’immagine realistica di Ronaldo.

4 2

Il secondo encoder converte il volto di FIFA in quello reale di Ronaldo

Risultati

La GIF mostra un’anteprima veloce dei risultati ottenuti lasciando operare l’algoritmo sui volti di altri giocatori. Il miglioramento è notevole.

 

5 1

5 1

6

6

Confronto prima e dopo deepfakes, dei volti di Ronaldo, Morate e Ozil

Ulteriori risultati possono essere trovati in questo video.

Possiamo utilizzare l’algoritmo per mettere noi stessi nel gioco?

La risposta è si: tutto ciò che serve è un video della durata di un minuto di noi stessi e scaricar(ne?) il modello allenato in poche ore. Possiamo, in questo modo, trovare noi stessi nel gioco in modalità “Il viaggio”.

Punti di forza e di debolezza

Il miglior vantaggio che abbiamo ottenuto da questo approccio è certamente l’iperrealismo dei volti e della grafica, difficilmente distinguibili dalla realtà.  Questo risultato può essere raggiunto in poche ore di allenamento, a differenza di quanto avviene per gli sviluppatori del gioco che, con l’approccio odierno, impiegano invece anni. Ciò significa quindi che i produttori potrebbero potenzialmente realizzare nuovi titoli in tempi molto più ridotti e che le case di produzione potrebbero risparmiare molto denaro.

La limitazione più evidente finora è, invece, che questi volti sono stati generati a posteriori, come le CGI (immagini generate a computer) nei film, mentre il gioco ne richiede una realizzazione in tempo reale.  Ciò nonostante, una grossa differenza sta nel fatto che questo approccio non richiede nessun intervento umano per generare risultati efficaci dopo che il modello è stato allenato. E inoltre, l’unico limite è il tempo impiegato dalla rete neurale per generare l’immagine di output. Probabilmente non sarà necessario molto tempo prima di riuscire ad avere modelli generativi non troppo profondi e pesanti, che possano lavorare molto velocemente senza compromettere la qualità dell’output. Proprio come succede per YOLO, SSD e MobileNets per la rilevazione di oggetti in tempo reale, cosa che invece non era possibile in precedenza con modelli come i RCNN.

 

implementare una rete neurale profonda per giocare a fifa 18

Autore: Chintan Trivedi

Linkedin: https://www.linkedin.com/in/chintan-trivedi-78665774/

Traduttrice: Sabrina Sala

 

Gli A.I. bots, ossia di programmi in grado d’agire, sono solitamente programmati con una serie di regole a priori che comunicano con il gioco. Nella maggior parte dei casi, questo approccio è sufficientemente efficace per far sì che il bot imiti i comportamenti umani. Tuttavia, in molti contesti è ancora molto semplice distinguere un bot da un vero essere umano. Prenderemo quindi in considerazione questo  quesito: cosa succederebbe nel caso in cui lasciassimo che il bot comprenda autonomamente dall’osservazione del gioco umano, senza l’utilizzo di regole empiriche?

Ciò richiede un gioco dove sia possibile raccogliere questo genere di dati sul comportamento dei giocatori e FIFA 18 fa al caso nostro. Poter registrare le nostre azioni e decisioni durante la fase di gioco ci permette di implementare un bot basato sulla deep learning, senza che si renda necessaria la programmazione di una singola regola di gioco.

Il codice per questo progetto ed il modello già allenato possono essere trovati qui.

 

Meccanismi di gioco

Il meccanismo alla base per implementare un tale bot non necessita di accesso ad alcun codice interno. È sufficiente un semplice screenshot della finestra di gioco per dare avvio al nostro engine. Quest’ultimo, processa le informazioni visive e realizza sulla base di esse un’azione che viene comunicata al gioco attraverso una simulazione della pressione dei tasti. Quindi, la procedura viene ripetuta per ogni step.

 

4 1

Ora che abbiamo l’input, l’insieme di screenshot che permettono al bot di agire, giungiamo alla parte interessante: la costituzione di un’intelligenza artificiale che apprenda dal gioco. Ciò viene fatto dapprima 1) utilizzando una rete neurale convoluzionale (CNN) per elaborare le schermate e, secondariamente, 2) sfruttando le reti di memoria a breve e lungo termine (LSTM) per decidere in merito all’azione più appropriata.

 

Step 1) allenare una rete neurale convoluzionale (CNN)

Le CNN sono spesso conosciute per la loro capacità di individuare oggetti in un’immagine con elevata accuratezza. Associando ad essa potenti GPU e architetture di reti intelligenti, possiamo ottenere un modello di CNN che opera in tempo reale.

5 2

5 2

Per far sì che il nostro bot processi l’immagine che gli è stata data come input, utilizziamo una CNN veloce ed estremamente leggera chiamata MobileNet. La mappa delle caratteristiche, estrapolate dalla rete, rappresenta una comprensione profonda dell’immagine, riuscendo ad individuare dati quali la posizione dei giocatori e di altri oggetti di interesse nello spazio dello schermo. Questa mappatura è quindi usata con un single-shot multi-box per individuare i giocatori nell’area di gioco, insieme al pallone e alla porta.

6

 

Step 2) allenare reti di memoria a breve e lungo termine (LSTM)

7

Ora che abbiamo una comprensione dell’immagine, possiamo procedere con il passaggio successivo, l’azione. Tuttavia, non possiamo limitarci allo studio di una sola schermata per decide come agire ma, piuttosto, dovremmo guardare a una breve sequenza di queste. È qui che entrano in gioco le LSTM poiché sono conosciute per modellare una sequenza temporale di dati. Ciascun frame consecutivo è utilizzato come passo temporale nella nostra sequenza, e per ognuno di essi viene estrapolata una feature map utilizzando il modello delle CNN. Queste ultime sono poi introdotte simultaneamente in due reti LSTM.

La prima rete LSTM ha la funzione di capire quali movimenti il giocatore necessita di fare ed è, quindi, un modello di classificazione “multi-classe”. La seconda LSTM riceve lo stesso input ma deve, invece, decidere quale azione scegliere tra passaggio corto, cross, passaggio filtrante e tiro. È quindi anch’essa un modello multiclasse. Gli output prodotti da queste due classificazioni sono poi convertiti nella pressione dei tasti che controllano le azioni di gioco.

Le reti sono state allenate sulla base di dati collezionati attraverso il gioco manuale, la raccolta delle immagini e la pressione del tasto corretto.

 

Valutazione della prestazione del bot

Non potremmo valutare la performance del bot, se non lasciando che giochi. Dopo soli 400 minuti di allenamento, il bot ha imparato a correre verso la porta avversaria, a fare passaggi frontali e scattare una fotografia dello schermo ogni qualvolta rilevi un goal. Nella modalità principiante di FIFA 18, ha già conseguito 4 goal in sei partite, uno in più di quanti ne abbia fatti Paul Pogba durante la stagione 17/18.

Video del bot in azione possono essere trovati qui.

 

Conclusioni

Le impressioni iniziali a questi approccio di implementazione di bot in grado di giocare sono certamente positive. Con un allenamento piuttosto limitato, il bot è riuscito a cogliere le regole basi del gioco: muoversi verso la porta avversaria e spingere la palla nella rete. Sarebbe sicuramente in grado di avvicinarsi al livello di performance umano se sottoposto a molte più ore di allenamento, le quali potrebbero essere facilmente raccolte dallo sviluppatore del gioco. In aggiunta, estendere il modello di allenamento a riprese reali di partite, permetterebbe di rendere il comportamento del bot molto più naturale e realistico.

 

 

Reti Neurali Capsulari

Autore: Matteo Alberti

 

Le reti neurali convoluzionali ottengono grandi performance quando i dati in fase di test risultano esser molto simili a quelli utilizzati in fase di apprendimento ma, in caso di rotazioni, traslazioni o traasformazioni esse risultano soggette a scarsa capacità di generalizzazione. É commune prassi dunque andare a fornire al nostro training set attraverso data augmentation degli esempi di queste possibili variant ottenendo però l’effetto di far imparar mnemonicamente alla nostra rete (con la crescita computazionale legata alla maggior quantità di dati) piuttosto che aver un modello in grado di ben generalizzare una data situazione.

Negl’ultimi anni la ricerca nel campo della computer vision (per quanto riguarda il deep learning) si è focalizzato sul come aumentare la profondità di una rete aggiungendo più strati (layers) al fine di reaggiungere un maggior grado di astrazione (partendo dai primi strati convoluzionali in grado di estrarre piccolo forme, angoli o intensità di colore andiamo mano a mano a ricombinare semplici feauter in disegni sempre più complessi)

Per far ciò, al fine di tener sotto controllo il numero di parametri (ed i relativi tempi computazionali) utilizziamo un operatore, commune in tutte le reti profonde, ossia il pooling ( per la precisione la sua versione max-pooling) che ci permette di andar a ridurre il numero di parametri riducendo progressivamente la componente spaziale selezionando I valori più alti andando però a perdere le informazioni spaziali legate alle features estratte.

1

 

Dunque la ricerca sulle architetture di reti neurali si sta progressivamente focalizzando sull’obiettivo di apprendere come generalizzare meglio piuttosto che sul fornire dati sempre più processati. Un primo passo è stato fatto con le reti neurali capsulari dove, il nostro obiettivo risulta esser quello di ottenere un’Equivarianza (invarianza a rototraslazioni) andando a sostituire quell’operatore di pooling con una nuova struttura: il Dynamic Routing

 

 

Introduzione

Una capsula è un gruppo di neuroni. L’attività di un vettore di una capsula rappresenta i parametri di istanziazione quando un oggetto (o parte di esso) viene rilevato dalla rete. La lunghezza di tale vettore rappresenta la probabilità di esistenza della data classe mentre l’orientamento del vettore codifica informazioni spaziali (per esempio rotazioni e traslazioni) all’interno di una matrice di Posa.

 

Matrice di Posa: Una matrice di posa è uno strumento utilizzato nel rendering grafico dove la costruzione di un’immagine parte da una rappresentazione gerarchica di forme geometriche. Nel nostro caso l’obiettivo risulta esser un po’ l’obiettivo opposto; decostruire un’immagine nelle sue componenti di base di cui andremo a salvare la relativa posizione in riferimento alle altre features.

 

2.jpg

Quando una capsula al livello inferiore si attiva produce una predizione al possibile nodo di appartenenza alle capsule di livello superiore attraverso una matrice di trasformazione. Se una capsula di alto livello riceve sufficienti predizioni di appartenenza diviene attiva. Questo processo, chiamato dynamic routing, permette di sostituire il max pooling attraverso una selezione “intelligente” delle features da mantenere durante la fase di allenamento.

 

3

Classificato come viso unicamente la figura a sinistra

 

 

Archiettura

 

La principale differenza nelle reti capsulari dunque consiste in un’architettura non profonda

4

Andiamo ad analizzare i principali strati:

  • Il primo layer convoluzionale (256 kernels, 9×9, stride uguale ad uno, attivazione ReLu)

Nel primo strato convoluzionale andiamo a convertire le intensità dei pixels in features di basso livello di cui non ci importa di mantener la relativa posizione spaziale, anzi vogliamo utilizzare tutte quelle importanti proprietà di condivisione dei parametri utili per ridurre i tempi computazionali.

Il secondo strato dunque riceve in input le features estratte tramite convoluzione:

  • PrimaryCaps consiste in due strati nascosti

Il primo strato corrisponde al processo di rendering inverso prima descritto

Il secondo strato contrariamente è convoluzionale (32 capsule 8 dimensionali) dove ogni capsula rappresenta una features estratta dunque tramite una convoluzione con 9×9 kernels e stride uguale a due.

L’output della PrimaryCaps consiste dunque in 32x6x6 capsule 8 dimensionali.

  • DigitCaps

L’ultimo strato va a riprodurre in forma vettoriale quello che nelle reti convoluzionali faceva FC-Layer ossia andiamo a ridurre il numero di neuroni (in questo caso di capsule) fino ad ottenerne uno per ogni classe del target

 

Riassumendo le principali innovazioni:

  • Rimpiazzare i neuroni con le capsule
  • Sostituzione del max-pooling con il dynamic routing
  • Nuova funzione di attivazione
  • Architettura non profonda

 

 

Funzione di attivazione

 

Come introdotto precedentemente vogliamo che l’activity vector prodotto da una capsula rappresenti la probabilità di esistenza della data feature. Necessitiamo quindi di una nuova funzione di attivazione che non vada più a lavorare con scalari ma con vettori:

.

La seguente funzione, definita “squashing” non fa altro che normalizzare in nostro vettore fra zero ed uno mantenendo invariato l’orientamento del vettore stesso.

Questo ci permette non solo l’Equivarianza ma, nel caso di face-detection, per esempio, possiamo saper se e di quanti gradi il viso risulti ruotato.

5

Dynamic Routing

 

Dynamic Routing non è solo un max-pooling che seleziona il numero di connessioni in maniera più intelligente, esso ci permette di preservare, come descritto in precedenza, la “gerarchia fra le parti”

 

Il Dynamic Routing quindi è un processo iterativo, nella fase di forward, che connette capsule con attività simili

 

2.jpg 1

In ogni iterazione ogni capsula produce una matrice di moltiplicazioni con l’output delle capsule precedenti andando a selezionare unicamente quelle con prodotto scalare maggiore ed orientamento simile, andando ad analizzare:

 

5 1

 

1) Capsule a livello l ed il loro output  , r numero di iterazioni del routing

2)  coefficiente temporaneo necessario per iterazione inizializzato a zero

4)  è peso per capsule di «basso livello», utilizzo del softmax per ottenere uno scalare non negativo con somma ad uno.  Prima iterazione  è uguale per tutte le capsule essendo inizializzato da

5) Per ogni capsula di «alto livello» calcoliamo una combinazione lineare dei dati di input pesati con i coefficienti  ossia andiamo a sommarli e ridimensionarli

6) Applichiamo la funzione di squash per «normalizzare» ad 1 e preservar l’orientamento del vettore

 

 

Allenamento di una rete capsulare

 

Una volta fissato il forward pass attraverso il dynamic routing andiamo ad allenare la nostra rete attraverso una doppia funzione di perdita.

  • La prima parte viene allenata attraverso backpropagation come nelle classiche CNN dunque alleniamo i pesi in modo da massimizzare la norma della capsula relativa alla classe di target (L^i _\mu)
  • Un’altra versione della rete utilizza un’MLP (come Autoencoding) al fine di ricostruire l’immagine di input (L^i _p)

La nostra funzione di perdita sarà dunque data da Loss Funcion =  L^i = L^i_\mu + \rho L^i_p

Dove il termine p non è altro che un termine di penalizzazione al fine di non far incidere eccessivamente la seconda parte.

 

2.jpg 2

 

Questo funzione di autoencoding risulta possibile in quanto all’interno di ogni capsula finale (una per ogni classe del target) sono codificate tutte le informazioni per ricostruire l’immagine. Dunque possiamo creare una sorta di funzione discriminativa che vada a comparare i dati di input con il terget ricostruito mediante le informazioni delle matrice di posa)

 

Accuratezze raggiunte

1 1

 

Oltre alla classica Accuratezza, risulta interessante andare a valutare le proprietà intrinseche di questo modello:

Parametri CNN : 35.4 M (Deep)

Parametri Capsnet (8.2 M)

 

Il numero di parametric risulta sensibilmente minore grazie alla minor quantità di dati. Esso però diverge molto con large-dataset in quant il meccanismo non risulta ancora ottimizzato

 

Robustezza alle Trasformazioni Affini:

CNN 66%

CapsuleNet 79%

 

Alta capacità discriminatoria su oggetti sovrapposti:

 

2.jpg 3

 

Grazie alla sua capacità di ricostruzione possiamo non solo classificare ma segmentare oggetti anche sovrapposti (uno dei grandi limiti delle reti neurali convoluzionali)

 

Long-term memory neural network 1 – Introduzione

Autore: Daniele D’armiento

Le abilità cognitive come il riconoscimento, la previsione, la scelta di risposte e azioni, implicano tutte il recupero di informazioni memorizzate precedentemente.
La sfida nello sviluppo di un’intelligenza artificiale consiste nel realizzare un modello in grado di memorizzare tante informazioni e in modo che siano velocemente recuperabili.
Ma non è una novità che i computer già siano in grado di memorizzare grandi quantità di dati (si stima che tutti i dati ad oggi memorizzati superino di molto il ZettaByte, ovvero 1021 byte), e non c’è alcuna sorpresa neanche nel fatto che questi dati siano indicizzati in database di vario tipo, disponibili e recuperabili con potenti linguaggi come SQL.

Peraltro il cervello umano ha una memoria che non è stabile come quella di silicio, ma in questa “lacuna” giace la potenzialità di processare i dati in modo come intuitivamente sappiamo, e di vincere la cosiddetta maledizione della dimensionalità.

Nessuna ricerca ha mai completamente svelato questi segreti del cervello umano, eppur non comprendendo appieno il funzionamento della nostra intelligenza, lo sviluppo di questi ultimi anni dovuto al Deep Learning (che ha comunque origini radicate nella biologia delle reti  neuronali) ci permette di avvicinarci a questo modello di intelligenza, che impara a riconoscere segnali codificati nelle immagini e nei suoni, classificarli, costruire rappresentazioni interne per organizzare queste moli di dati, recuperare velocemente le informazioni che sono immagazzinate in modo distribuito su tutti i nodi della rete (quindi in ogni neurone, e non in precisi indirizzi di memoria), il tutto in automatico, senza istruzioni algoritmiche sequenziali.

 

Negli anni precedenti all’avvento del Deep Learning la velocità di calcolo era molto limitata, e va da sé che, se i processi
sono lenti, ci vuole molto tempo per processare e memorizzare. Ovvio ma non banale, perché nessuno avrebbe tentato di sperimentare un modello di rete che per essere addestrata avrebbe richiesto anni, eppure la chiave per scoprire questo mondo c’era già. Poiché il modello di apprendimento ancora oggi usato è la Backpropagation, insieme al Gradient Descent per il raggiungimento del minimo di errore, sono richiesti molti step di aggiornamento dei pesi della rete, e molti dati di esempio da cui imparare. Tutto ciò rende il processo di apprendimento molto denso di calcoli.

Esempio di ipersuperficie dell’errore della rete nello spazio dei parametri di addestramento: lo SGD ricerca i valori dei parametri che minimizzano l’errore.

Di conseguenza i vecchi modelli dovevano essere leggeri, e non sfruttavano le enormi moli di dati necessarie, ci si limitava ad architetture “shallow”, cioè non profonde, con meno paramentri di addestramento, uno o due livelli di neuroni feed-forward. Ma per astrarre una rappresentazione valida della realtà osservata, cioè per memorizzare i dati in strutture complesse in grado di preservare il maggior numero di caratteristiche osservate, e al tempo stesso generalizzare, cioè riconoscere quelle caratteristiche anche in oggetti nuovi mai osservati prima, serve un modello più complesso. Serve memorizzare più dati quindi, memorizzare ma non “come una macchina”, (dicono tutti coloro nati prima dell’avvento della singolarità, (se mai avverrà…ma la realtà supera ogni science fiction!)), cioè non come quando impariamo una poesia a memoria, ma invece come quando si accende una lampadina e comprendiamo una struttura delle cose che unifica varie sfaccettature di una sola entità che prima sembravano non connesse da alcun legame.

A sinistra: modello di rete “Shallow”: con un livello di neuroni nascosto. A destra: un modello “Deep”, con più livelli nascosti.

Quando un modello di Deep Learning ci sorprende con la sua capacità di riconoscere oggetti nelle immagini, o di capire le parole che stiamo pronunciando, o di rispondere in modo quasi sensato a una domanda scritta, vuol dire che quel modello ha catturato le informazioni necessarie per risolvere quel particolare problema, a partire dai dati a cui è stato sottoposto. Non ha memorizzato tutti i dati in un classico database, ma li ha filtrati, sintetizzando un “concetto”, in un modo che si avvicina al nostro modo di pensare ai concetti.

Qusto è possibile grazie alla struttura “Deep” dei modelli attuali, che permette, in un modo non ancora compreso appieno, di memorizzare nella rete più informazioni e concetti, rispetto ai modelli precedenti.

Per quanto riguarda i modelli linguistici per le traduzioni, quelli conversazionali, e tutte le applicazioni all’ NLP e NLU, è avvenuto un netto incremento delle performance grazie al Deep Learning.

GoogLeNet: modello di rete neurale usata da Google per il riconoscimento di immagini.

Queste performance si possono misurare statisticamente ma è anche intuitivo capire quanto un certo modello riesca a realizzare un chatbot decente o una buona traduzione. Se ce la fa, vuol dire che la rete neurale ha una memoria capace di fare dei collegamenti semantici più complessi di una semplice tabella di riferimento. Ciò richiede appunto una memoria di lungo termine, per poter collegare parole o frasi o riferimenti semantici a distanza l’uno dall’altro, e generare così una rappresentazione interna di un contesto, piuttosto che realizzare una semplice statistica di parole a n-grammi come avveniva anni fa.

Modello di rete con memoria episodica: Dynamic Memory Network (DMN)

 

Nella successiva analisi vedremo un modello promettente, le reti DMN (Dynamic Memory Network), che sono addestrate su elementi composti da frasi di input, domande, e risposte, la cui potenzialità sta nella cosiddetta memoria Episodica, capace di effettuare una elaborazione a più passaggi delle frasi di input, dalle quali elabora un contesto e cerca di estrarre l’informazione richiesta.

 

Bibliografia

https://blogs.cisco.com/gov/internet-traffic-continues-to-explode-no-end-in-sight

https://thoughtsahead.com/2017/01/27/machine-learning-series-introduction-to-machine-learning-linear-regression-and-gradient-descent/

https://www.quora.com/What-is-the-difference-between-deep-and-shallow-neural-networks

https://research.googleblog.com/2017/05/using-machine-learning-to-explore.html

https://yerevann.github.io/2016/02/05/implementing-dynamic-memory-networks/