NETWORKS
NETWORKS
NETWORKS
Neurone artificiale
- Un neurone artificiale può
essere immaginato come un
elemento che prende in
input dei valori e restituisce
un output.
perceptron
- I uesto aso spe ifi o u perceptron” prende in input 3 valori: x1, x2, x3
E ne calcola il rispettivo output
-Il perceptron è uno dei primi neuroni artificiali concepiti e che può dare in output
solo un valore binario: 1 o 0.
-L’output osì o epito dipe de dal odo i ui i fluis o o i alo i degli i put e i alo i
dei pesi di ias u a o he ollega ias u i put al eu o e i uestio e
-L’output dipe de dalla ∑wjxj dove wj sono in questo caso i 3 pesi degli archi di x1 x2 e x3 e xj
I valori degli input x1 x2 x3. solitamente se una tale sommatoria superava una certa soglia
de isa a it a ia e te allo a l’output e i a o e tito i alt i e ti i :
0 if ∑wjxj < soglia
Output:
1 otherwise
Neurone artificiale
-I neuroni tuttavia possiedono anche w2
b
quello che viene definito bias.
σ z ≡ / +e^ -z))
La funzione sigmoide tramite gli input che il neurone riceve oltre che ai pesi di ciascun arco
e al suo bias è intrinsicamente legata ad essi in modo tale che se z aumenta la funzione
Sigmoide si avvicina allo 0. se z invece è basso la funzione sigmoide si avvicina ad 1.
Neurone artificiale
- Più avanti verranno presentate altri tipi di funzioni f(w⋅x +b) utilizzate
al posto della funzione sigmoide.
-Immaginiamo di avere un neural network del genere tra le mani. Alla sua analisi
possiamo notare che ci sono un totale di 8 neuroni distribuiti su 3 livelli.
-La particolarità di questo tipo di architettura è che, come si può notare dalle immagini,
ciascun neurone di ogni livello, tranne quelli di input, è collegato a TUTTI i neuroni
del livello precedente.
Nel suo tutorial Nielsen fa uso di un MLP network per il riconoscimento di cifre numeriche
tramite un dataset di immagini di grandezza ciascuna 28x28 pixels. Quindi è un problema
di classificazione.
-Ora dobbiamo solo decidere quanti hidden layer la nostra rete neurale vogliamo che
possieda. E lo facciamo attenendoci fedelmente al tutorial di Nielsen, il quale ha deciso
di scegliere un unico hidden layer con 15 hidden neurons.
Utilizzare un MLP network
Bhè nelle slide precedenti abbiamo presentato delle variabili che non abbiamo più menzionato:
I pesi e i biases, cosa dobbiamo farne e come si utilizzano? Ed oltretutto: come diavolo fa
la nostra rete neurale ad apprendere???
-Come abbiamo già detto ogni neurone possiede quello che viene definito bias TUTTI TRANNE
QUELLI DI INPUT, quindi nella nostra rete neurale, visto che abbiamo un totale d 15 neuroni al
secondo livello e 10 al terzo avremmo un totale di 25 biases. Uno per ogni neurone del
nostro neural network, eccetto quelli di input.
Utilizzare un MLP network
Per quanto riguarda il nostro neural network invece gli archi saranno:
15x784 + 10x15 = 11.910 archi, ognuno con un proprio peso.
Ogni bias e ogni peso assume un valore numerico preciso e che possiamo inizialmente
assegnare in maniera randomica tramite una distribuzione gaussiana con deviazione standard
pari ad 1 ed incentrata in 0.
Utilizzare un MLP network
Inizializzazione dei pesi e biases in python tramite distribuzione normale:
Utilizzare un MLP network
Distribuzione normale in C:
srand(time(NULL));
Quello che viene poi ritornato da random_normal deve essere assegnato a ciascun peso
E bias della rete neurale (includere le rispettive librerie time.h e math.h)
Utilizzare un MLP network
Ora che abbiamo assegnato un peso a ciascun arco e un bias a ciascun neurone
ci manca solo di capire come fa il nostro nn ad apprendere.
In queste slide illustrerò i passi che dovremmo implementare per eseguire il gradient
descent, ma per avere una visione più ampia e più chiara di come esso funzioni rimando
A questi due video:
[Link]
[Link]
Vi basti sapere che il Gradiend Descent è una tecnica utilizzata per trovare il minimo globale
di una funzione. Il nostro Neural network può essere visto infatti come una
rappresentazione di una funzione, il cui scopo è di far in modo che
dato ciascun input x la nostra rete neurale associ a tale x la corretta y, ovvero che
Dato x, f(x) = y. Adesso, a noi f(x) è sconosciuta, ma abbiamo tante x e tante y con le quali
possiamo, tramite il gradiedt descent, modificare adeguatamente tutti i biases e i pesi della
nostra rete neurale affinchè cerchi di comportarsi come f(x).
Utilizzare un MLP network
Ad esempio: mettiamo che al nostro neural network diamo in pasto in input un matrice
28x28 di valori e che una tale input rappresenti figurativamente un 5 come immagine.
Il nostro neural network esegue i suoi calcoli e da in output un vettore del tipo:
Y = (0.01,0.05,0.1,0.1,0.0000,0.1,0.78,0.02,0.01,0.1)
Secondo questo vettore la probabilità più alta è rappresentata dal settimo elemento: 0.78
Ovvero il nostro neural et o k i sta di e do he ’è il % di possi ilità he uell’i put he
Gli abbiamo dato (che rappresenta un cinque) sia in realtà un 6!
Il vero output sarebbe dovuto essere:
Y = (0,0,0,0,0,1,0,0,0,0)
Utilizzare un MLP network
La funzione ti dirà quanto il tuo neural network si è sbagliato ed è fondamentale saperlo
per attuare successivamente il Gradient descent.
Esistono diverse funzioni di costo che possiamo applicare e più avanti le tratterremo una
per una. Per ora utilizzeremo come funzione di costo la MSE anche conosciuta come
Mean squared Error che corrisponde alla media dei quadrati degli errori:
: è la derivata parziale della funzione di costo rispetto alla k-esima matrice dei pesi.
: è la de i ata pa ziale della fu zio e di osto ispetto all’ l-esimo vettore dei biases.
Utilizzare un MLP network
Da o e l’ho essa se a he η, il learning rate, più sia grande e più il nostro neural
network apprenderà velocemente. Non è così, o almeno non sempre.
Ora che abbiamo capito come funziona il gradient descent dobbiamo capire come
ottenere le derivate parziali dei pesi e dei biases del nostro network rispetto alla
funzione di costo. Per farlo sfrutteremo la backpropagation
Utilizzare un MLP network
P i a di adde t a i ell’e uazio i della backpropagation bisogna avere in mente il quadro
della situazione e le notazioni che utilizzeremo da ora in poi.
A questa si aggiunge il dot product della derivata della funzione sigmoide rispetto a z
Una volta ottenuto Pe l’output layer possiamo calcolarci le derivate parziali dei
Biases e dei pesi dell’output layer tramite BP3 e BP4. successivamente propaghiamo
A he ai li elli a te ede ti l’output layer tramite la BP2 e per ciascuno di questi livelli
possiamo ottenere i rispettivi errori Da cui otterremo le derivate parziali dei
Rispettivi biases e pesi. Il p o edi e to si ite a fi o a aggiu ge e l’i put layer.
Utilizzare un MLP network
Il problema del gradient descent non stocastico:
Per ovviare a questo problema spesso viene utilizzato quello che viene chiamato
Stochastic gradient descent.
Utilizzare un MLP network
Lo stochastic gradient descent sfrutta dei mini-batch, per raggiungere lo stesso scopo
che si impone il gradient descent non stocastico.
Dato un dataset, un mini-batch è una porzione di quel dataset che raggruppa un numero
Di ista ze di uell’i sie e o le uali appli a lo stochastic gradient descent.
neural_network = initialize()
epochs_number = k
minibatchSize = m
v = [Link]%minibatchSize
For i = 0 to epochs_number do
shuffle(dataset)
for j = 0 to v-1 do
gradient_descent(neural_network,dataset[j*minibatchSize:(j+1)*minibatchSize])
end
end
Utilizzare un MLP network
La particolarità dello stochastic gradient descent:
-Con learning rate costante non può mai raggiungere perfettamente il minimo globale,
ma può avvicinarsi.
- procedendo a zigzag cerca di saltare fuori dai minimi locali
Utilizzare un MLP network
Ora che abbiamo tutto chiaro un esempio in codice in python:
[Link]
Scavando nei deep neural network
La funzione di attivazione così definita per ciascun neurone è strettamente legata anche
Alle funzioni di attivazioni di tutti gli altri neuroni dello stesso livello, e ne risulta che
La sommatoria di tutte le funzioni di attivazioni di uno stesso livello sia pari a 1.
Mettiamo caso che si decida di eseguire il nostro piccolo programma di deep learning
facendo in modo che il nostro neural network runni un numero spaventosamente grande
di epoche in modo tale da imparare dettagliatamente dal nostro dataset il riconoscimento
delle cifre numeriche. In quale problema ci si potrebbe mai imbattere?
- regularization.
- validation set.
Scavando nei deep neural network
Nielsen imposta prima lambda = 0.1 e non ottiene un grand risultato, successivamente la
Imposta a 5.0 e ottiene una precisione di oltre il 98%.
Scavando nei deep neural network
Nielsen però allena il suo neural network utilizzando anche il validation set.
Bisogna fare una distizione tra 3 tipo di set:
-Training set
- Test set
- Validation set
Il training set è il set che utilizziamo per allenare il nostro neural network, di solito si divide
il set totale he a ia o i set: t ai i g set, he app ese ta l’ % del set totale i ge e e
e il test set che ne rappresenta il 20%.
possiamo aggiungere anche un validation set, che come il test set possiamo impostarlo
come il 20% di tutto il set originario che avevamo, in questo modo riduciamo il training set
fino al 60%.
Il validation set dovrebbe essere usato, finita ciascuna epoca, per analizzare la precisione
del proprio neural network. Se nel corso del tempo vediamo che la precisione sul
validation set non aumenta più, significa che probabilmente stiamo overfittando e ci conviene
te i a e l’alle a e to. L’alte ati a è o ti ua lo e di i ui e il learning rate
Scavando nei deep neural network
Perché non è mai buona cosa creare deep neural network troppo profondi?
più è profono il nostro deep neural network più i gradienti dei livelli più vicini
ai livelli di input imparano lentamente a dispetto di quelli più vicini ai livelli di output.
Generalmente per quanto riguarda il test set se il tuo set totale è abbastanza grande, le
istanze del test set possono venir prese in maniera random, tuttavia spesso bisogna
affidarsi ad un campionamento stratificato facendo in modo di prendere campioni
app ese tati i pe tutta la popolazio e dell’i sie e. Ad ese pio ettia o he t a
gli att i uti di og i ista za del tuo set e ’è u o he app ese ta il eddito edio e ti
Viene detto che il reddito medio è fondamentale.
Visto che il reddito è un numero, puoi decidere di dividerlo in strati, in modo tale che in ogni
strato vi cadano un tot di elementi della popolazione, ad esempio nel reddito tra 300 euro e 400
ci sono 10000 istanze. In tal caso potrebbe essere conveniente dividere tutti i redditi per un
certo numero e arrotondarlo a certi valori, così da ottenere valori discreti, e successivamente
campionare la popolazione in base a quei valori. Potrebbe sembrare un ragionamento astruso,
Ma il concetto fondamentale è che visto che il risultato che tiri fuori da una tecnica di learning
dipende molto dal tipo di training set e test set utilizzato è importante conoscere alcuni trick
per il loro utilizzo. Ok questa era una piccola parentesi che volevo fare, andiamo avanti!
Convolutional Network
I concetti fondamentali che riguardano le CNN sono pochi e semplici:
-Lo stride
- Il padding
- Il pooling
Prima di addentrarci in questi 3 concetti spieghiamo cosa differenzia sostanzialmente
una convolutional neural network da un multilayer perceptron network.
In un MLPs abbiamo detto che ciascun neurone di ciascun livello, eccetto quello di input
è collegato a tutti i neuroni del livello precedente.
Bhè in una CNN invece ciascun neurone di ciascun livello eccetto quelli di input, è collegato
ad un numero di neuroni del livello precedente senza che questo numero rappresenti tutti
I neuroni del livello precedente. Quindi ciascun neurone di un livello l è collegato solo ad
alcuni neuroni del livello l-1. inoltre il collegamento tra il neurone di livello l e i neuroni di
livello l- a ie e t a ite a hi he ha o u peso, esatta e te o e ell’ MLPs, solo che
questi archi con i propri pesi sono condivisi da tutti i neuroni del livello l con i rispettivi
neuroni del livello l-1.
Convolutional Network
Qui un esempio:
In questo esempio vengono mostrati 2
Livelli. Nel primo (che assumiamo sia quello
degli input) abbiamo un totale di 9 valori
disposti in una matrice 3x3. nel nostro caso
Li avremmo dovuti disporre in una matrice
28x28. il secondo livello, che assumiamo
come hidden layer, ed è rappresentato dalla
matrice più a destra di ciascuna immagine, ha
solo 4 neuroni. Il primo neurone come possiamo
vedere dalla prima figura è collegato solo
a x11, x12, x21, x22. Il secondo a
x12, x13,x22,23 e così ia…
La matrice in mezzo invece, rappresenta i pesi
he ias u eu o e dell’hidden layer condivide
con quello precedente. E come possiamo notare
ciascun neurone condivide gli stessi pesi w11 w12 w21 w22 con i neuroni dello stesso livello.
Convolutional Network
U ’alt a diffe e za o i MLPs è che ogni neurone di ogni livello tranne i neuroni di input
(visto che non lo possiedono) condividono anche lo stesso bias. In modo tale che z del
(x,y)-esi o eu o e dell’ l+ -esimo livello è dato da :
Notare i colori degli archi, che si rifanno a quelli della matrice dei pesi!
Il prodotto convoluzionale fa ruotare di 180° la matrice dei pesi e da li si calcola la z.
Convolutional Network
Questo è tutto molto bello, a… come applico il gradient descent? Cambia qualcosa?
La isposta è si! Ca ia il al olo dell’e o e pe ias u li ello ella backpropagation:
Convolutional Network
O a il al olo dell’e o e è se p e defi ito i uesta a ie a:
Dove f’ è la de i ata della fu zio e di attvazione utilizzata dai eu o i dell’ l-esimo livello
Il p odotto t a W e l’e o e dell’ l+ -esimo livello è diventato un prodotto convoluzionale
E la slide precedente ha mostrato come si effettua. Il prodotto tra f’ e il p i o te i e
Invece rimane un dot product.
I uesto odo a ia o otte uto l’e o e pe il li ello l-esimo
N.B. la convoluzione fa ruotare di 180° ma alcune volte sono anche ruotati di 180° le matrici
Con le quali si applica la convoluzione, è come ruotarle di 360°, stanno ferme!
Convolutional Network
Cos’è il padding?
Il padding può essere visto come un rivestimento extra che decidiamo di aggiungere
Per facilitarci i calcoli. Ad esempio mettiamo che in realtà noi vogliamo classificare
future immagini 30x30, ma abbiamo un set di immagini28x28. decidiamo dunque
di aggiungere uno strato in modo tale da avere delle immagini 30x30. questo strato
di e ta lo st ato este o della ost a at i e di i put aggiu ge do u a olo a all’i izio
e alla fi e della at i e, e a he u a iga all’i izio e alla fi e della at i e.
Questi alo i aggiu ti i all’i put posso o esse e teo i a e te i izializzati o e si uole
ma in un caso come questo io li inizializzerei a 0.
Convolutional Network
Cos’è lo st ide?
Abbiamo visto nelle slide precedenti come ogni neurone di un livello l va ad interessarsi
dei neuroni del livello l-1 esattamente di tanti neuroni quanti sono i pesi del livello l.
Se ci spostiamo come nel caso precedente di riga in riga e di colonna in colonna con la
matrice dei pesi allora avremmo uno stride = 1. se decidiamo di spostarci rispetto ai
neuroni del livello l-1 invece di 2 righe in 2 righe e 2 colonne in 2 colonne avremmo uno
stride uguale a 2, e così ia…
Convolutional Network
Cos’è il pooling?
Una volta calcolata la funzione di attivazione per ciascun neurone di un certo livello l,
possia o de ide e di filt a e tali fu zio i att a e so u ’alt a fu zio e, he è la fu zio e
di pooling.
Famose sono ad esempio il Max-Pooling in cui da ciascuna di queste matrici prende il valore
Massimo delle funzioni di attivazione.
O l’avarage-pooling in cui prende la media dei valori delle funzioni di attivazioni.
Convolutional Network
La domanda che ci poniamo è: ma se il pooling a ia l’output del li ello l-esimo
come ci dovremmo comportare tramite la backpropagation?
Mettiamo caso che hai effettuato il maxpooling su 2 matrici 3x3 tramite stride 3 (quindi la
matrice originale Era una 6x3), durante la backpropagation i e o i dell’l+ -esimo livello
si propagano solo pe i eu o i dell’l-esimo livello che sono stati scelti come massimi di
ciascuna matrice.
Nel aso dell’avarage pooling invece i 2 errori, visto che si è fatta la media tra i valori di
ciascuna matrice, si dividono equamente nei 9 neuroni di ciascuna matrice.
Il pooling elle CNN è fo da e tale ad ese pio ell’ image recognition perché fa in modo
Che una certa feature, come ad esempio il riconoscimento di una faccia, possa essere
Cattu ata ualsiasi sia la sua posizio e all’i te o dell’i agi e.
Inoltre il pooling attua lo stesso lavoro della regularization che ha il compito di generalizzare.
In definitiva il pooling è molto importante e un approfondimento può essere trovato qua:
[Link]
Normalization
Potrebbe capitarci che gli input che diamo in pasto ad un neural network spesso debbano
Essere normalizzati per necessità.
Ad esempio ci possono essere alcuni tipi di input che non hanno un range definito
e questo potrebbe essere un problema per il tuo neural network.
In casi come questi si tende a normalizzare il proprio set.
Regularization 2.0
Le tecniche di regulatization che sono spesso utilizzate per il riconoscimento di immagini
oi olgo o etodi uali ad ese pio l’augmentation che corrisponde ad un aumento dei
dati. Un esempio specifico nel nostro caso per il riconoscimento di dati numerici viene
presentato da questo paper:
[Link]
[Link]
learning/blob/master/data/[Link]
In questo caso si prendono quindi 2 random values (da una distribuzione gaussiana), per
ciascun pixel, il vettore risultante lo si divide per la sua norma per normalizzarlo e
successivamente si moltiplica per un fattore a.
Successivamente si trasla ciascun pixel. il paper mostra come per una standard deviation = 20 e
un fattore a = 1.2 le immagini sono ancora riconoscibili. Mentre per un fattore a>=8 le
immagini schizzano fuori dall’i uad atu a o si rendono illegibili
Momentum
Esistono diversi metodi per fare in modo che usando il gradient descent non ci si incagli in un
i i o lo ale. Ed olt e all’utilizzo dello stochastic gradient descent ci si può affidare anche al
momentum.
Il dropout si basa su una tecnica che va a modificare il network in se. Quello che viene fatto
è, per ogni minibatch, di eseguire la fase di feedforward e di backpropagation aggiornando
i pesi e i biases come già sappiamo, tuttavia lo si fa cancellando di volta in volta set random
di eu o i all’i te o degl’hidden layers:
Regularization 3.0
Il procedimento è semplice:
Durante la fase di testing, usando tutto il neural network, dimezziamo i pesi in uscita
dei neuroni degli hidden layer.
Il dropout può essere effettuato non levando per forza metà dei neuroni durante la
fase di training, ma si può decidere arbitrariamente la quantità in percentuale p alla
quale si vuole che venga applicato il dropout, in tal caso nella fase di testing i pesi (nel
predente caso sono stai moltiplicati per un fattore p = 0.5) vanno moltiplicati per la
probabilità p precedentemente scelta, qui un approfondimento:
[Link]
OTTENERE L'EQUAZIONI DELLA
BACKPROPAGATION
Come si ottengono le funzioni della backpropagation?
Dobbiamo immaginare il nostro network come una composizione di funzioni.
Definiamo le funzioni di attivazione utilizzate dal network come g_i.
Definiamo le varie sommatorie delle moltiplicazioni tra gli input di un livello e i
pesi dello stesso come funzioni f_i.
Il nostro network sarà pertanto un susseguirsi di composizioni di diverse funzioni
tale che l'output y_i sarà dato da:
Y_i = g_n(f_n(g_n-1(f_n-1(...(...(g_1(f_1(x)))…)…)))
DL/Db = Sum((DL/Dz)*(Dz/Db))
Mentre
Lo stesso procedimento lo
DL/Dz = Sum((DL/Da)*(Da/Dz)) si può fare per i pesi
Mentre
DL/Da = DLoss
CNN: un altro sguardo
Ora che abbiamo visto anche come si ottengono le equazioni della
backpropagation tramite la chain rule bisogna fare una
considerazione maggiore sulle convolutional neural network.
Negli esempi precedenti abbiamo considerato gli input dei livelli
convoluzionali come input bi-dimensionali ovvero come matrici, e
lo stesso abbiamo fatto per i pesi e abbiamo mostrato le equazioni
della backpropagation che ne uscivano fuori senza dimostrarle.
Tuttavia spesso quando si trattano livelli convoluzionali non si
trattano matrici, ma tensori e non si lavora in 2 dimensioni ma in 3
dimensioni.
Per mantenere la tridimensionalità anche rispetto all'output inoltre si possono aggiungere più tensori di
pesi rispetto al livello convoluzionale. In modo tale da creare più matrici di output una per ogni tensore di
pesi che si vuole aggiungere.
In questo caso il bias è condiviso tra le matrici di output e non tra tutto il tensore di output. Ovvero ogni
matrice di output ha un bias.
Per la backpropagation si può infine applicare la regola della catena per ottenere le funzioni necessarie a
calcolare le derivate parziali di tutti i pesi e i bias dei layer del neural network.
Spesso i channels vengono chiamati anche feature map, per non fare confusione è bene distinguere le
feature maps di input da quelle di output chiamando le prime channels.
Al lettore è lasciato il compito di trovare ora le formule per ottenere le derivate parziali dei pesi e dei bias
aggiungendo anche il pooling e il padding utilizzando la chain rule e la formula prima mostrata per calcolare
il i,j-esimo neurone per una feature map di output.
CASO DI STUDIO 1: IMAGENET
Questa parte sarà dedicata all'analisi di uno dei più utilizzati neural network per il riconoscimento di
immagini, stiamo parlando di imagenet. La documentazione è disponibile online qua:
[Link]
Per prima cosa viene presentato un neural network diviso in 8 livelli, di cui 5 convoluzionali e 3 fully
connected del tipo mlps.
Per i livelli convoluzionali si è deciso di prendere in considerazione come funzione di attivazione non la
sigmnoide, bensì un'altra funzione non lineare che presenta una velocità di apprendimento molto
maggiore. Questa funzione di attivazione è la ReLU, definita come:
Per i livelli convoluzionali inoltre si è deciso di aggiungere un processo di normalizzazione definito come local
response normalization. Questo è stato aggiunto subito dopo la funzione di attivazione dei livelli convoluzionali.
In termini concettuali si può immaginare la local response normalization come l'inibizione laterale presente nelle reti
neurali biologiche, che vanno ad inficiare sulla dipendenza di un output rispetto ai propri vicini. Ad esempio una
feature map dipende meno dalle altre feature map dello stesso livello.
• Il paper va ad analizzare il
vanishing gradient problem che
avevamo già citato nelle slide
iniziali.
Più si utilizzano funzioni di attivazione che hanno un range tra 0 e 1 come appunto la sigmoide o la tanh, più a causa
della regola della catena, per calcolare i gradienti, ci si deve affidare alla moltiplicazione di questi valori, o per essere più
precisi alla moltiplicazione delle derivate di queste funzioni che hanno comunque un range sempre tra 0 e 1. Quindi
andando a ritroso con la regola della catena, dovendo moltiplicare man mano gli errori backpropagati per valori
compresi tra 0 e 1 sarà ovvio che gli errori saranno sempre più piccoli, così come anche il calcolo dei gradienti fino ad
ottenere dei valori talmente piccoli che tramite l'aggiornamento dei gradienti non ci sarà alcun miglioramento, ed anzi
la rete neurale potrebbe addirittura smettere di apprendere.
Per risolvere questo problema ci si affida a funzioni non lineari come appunto la ReLU precedentemente definita. Che
hanno un range definito tra 0 e x.
Una volta utilizzata la ReLU ci si può affidare, dice il paper sulla batch normalization, a tecniche di normalizzazione che
hanno lo scopo di velocizzare l'apprendimento e contemporaneamente comportarsi come una tecnica di regularization
che può benissimo sostituire il dropout.
CASO DI STUDIO 1: IMAGENET
A causa della ReLU tuttavia i valori dati poi in input ai layers successivi possono essere affetti dalla covariance
shift. Lo scopo della batch normalization è infatti quello di ridurre la covariance shift all'interno del network:
CASO DI STUDIO 1: IMAGENET
Vediamo prima il tipo di batch normalization utilizzata nel paper di imagenet, local response Normalization:
CASO DI STUDIO 1: IMAGENET
Cerchiamo di dare un senso a quanto detto nella slide precedente, immaginiamo un layer che ha come input un tensore
YxZxC dove Y e Z sono le dimensioni matriciali del tensore e C i canali o channels. Immaginiamo che i canali di input
siano 1 C = 1 e che ci siano 5 feature map di output e quindi 5 kernel in forma di tensori di dimensioni Y_2xZ_2xC_2
dove C_2 = C in quanto come già avevamo precedentemente detto la profondità dei kernel, ovvero di tensori dei pesi
deve essere uguale alla profondità del tensore di input. Qui un immagine semplificativa:
essendo n = 5 noi immaginiamo che n/2 sia una divisione intera e quindi n/2 = 2
CASO DI STUDIO 1: IMAGENET
Continuando con la descrizione dell'architettura di imagnet invece, ora ci addentriamo più nello specifico
nella funzione di costo utilizzata, il numero di layers, di neurons, il numero di kernel il padding e così via.
In alcuni layers viene utilizzato un max-pooling, con matrici di pooling di dimensione 3x3.
Tuttavia viene utilizzato un overlapping pooling ovvero le matrici di input da poollare non vengono divise in sotto-
matrici 3x3 bensì la funzione di pooling viene applicata spaziando di 2 valori a destra e verso il basso rispettivamente,
anziché spaziare di 3 a destra e in basso.
CASO DI STUDIO 1: IMAGENET
Il tensore di Input è un tensore di dimensione:
224x224x3
11x11x3
Poi
ReLU
E il
Pooling
CASO DI STUDIO 1: IMAGENET
All'output così generato vengono applicati 256 kernel di dimensione:
5x5x48
Ora, se i kernel erano 96 com'è possibile che adesso nel secondo layer si vanno a trattare kernel di dimensione 48 e non
96? La risposta è semplice, nel primo livello è stato utilizzata la convoluzione di gruppo o grouped convolution, ovvero i
96 filtri generati dal primo livello convoluzionale vengono divisi in 2 per semplificare i calcoli, in modo che ci siano 2
strade differenti che alla fine si sommano. Qui un immagine presa direttamente dal paper:
CASO DI STUDIO 1: IMAGENET
ReLU
Pooling
3x3x256
Da qui ricordiamo che abbiamo 2 strade in cui ciascuna ha appena generato 384 feature maps.
Delle 384 feature maps di ciascuna strada queste generano 4 gruppi da 192 feature maps, 2 per ciascuna
strada. 192 feature maps di una strada vengono sommate alle 192 dell'altra questo per 2 coppie differenti
di 192 feature maps.
ReLU
CASO DI STUDIO 1: IMAGENET
Il quarto layer applica 384 kernel di dimensione:
3x3x192
ReLU
ReLU
Pooling
Infine ci saranno 3 fully connected layer con applicata la ReLU come activation function per le prime 2, 2 per ogni
strada, connessi con entrambe le strade e di dimensione 1024 neuroni. L'ultimo fully connected layer applica però
non la ReLU ma la funzione di attivazione softmax definita come:
F(x) =
La funzione softmax deve essere vista come una distribuzione di probabilità dell'output. Infatti la somma di tutti gli
output derivanti da un layer che applica la funzione softmax è uguale ad 1. all'aumentare di uno degli output
generati dalla neural network gli altri diminuiscono per far si che la somma totale rimanga 1. viene spesso quindi
utilizzata come distribuzione di probabilità per etichettare le classi di output di una rete neurale così da dare una
probabilità quantitativa che possa rispondere alla domanda: dato un certo input qual'è la probabilità che appartiene
ad una certa classe invece che alle altre?
Inoltre la funzione softmax viene spesso utilizzata con la forma precedentemente presentata della cross-entropy
perché nel calcolarne la derivata ne risulta una funzione molto semplice e simile alla derivata dell'MSE.
(al lettore è lasciato il compito di trovarne la derivata, online si può trovare).
Batch Normalization
Nelle slide precedenti abbiamo visto la local response normalization, una normalizzazione dei parametri di input dei
layer utilizzata in imagnet. In questa sezione analizzeremo un altro tipo di normalizzazione definita Batch
Normalization.
La batch normalization consiste anziché nel normalizzare gli input di un layer rispetto ad una singola istanza data in
pasto al network come nella local response normalization, normalizza rispetto alle istanze di batch date in pasto al
nostro network.
Il primo passo da fare è generare dei layer ulteriori la dove si vuole applicare la batch normalization.
Mettiamo caso che abbiamo 2 hidden layer definiti rispettivamente l1 e l2. Al layer l1 vogliamo applicare la batch
normalization, quindi i livelli diventeranno 3: l1, batch_normalization_for_l1, l2.
Come funziona:
Mettiamo che stiamo allenando la nostra rete con lo sthocastic gradient descent e stiamo utilizzando dei mini batch
di dimensione N. ovvero ogni mini batch contiene N istanze da dare in pasto al network per volta.
Ora mettiamo che il livello l1 genera in output D = 5 valori che corrispondono ai 5 neuroni di input per il layer l2.
Definiamo x come un vettore di dimensione (N,D). Il livello l2 possiede H = 6 neuroni e definiamo i pesi w come un
vettore (D,H) e i bias come un vettore di dimensione (H)
Batch Normalization
Ci calcoleremo h = xw + b
E h sarà di dimensione (N,H). Ora ci calcoliamo la media e la varianza rispetto ai valori per tutto il mini batch.
La media sarà data dalla sommatoria di ciascuna riga N di dimensione H delle varie h calcolate, tutto fratto N.
La varianza sarà data dalla sommatoria di ciascuna riga N di dimensione H delle varie h calcolate meno la media
precedentemente calcolata, tutto al quadrato e fratto N.
dove epsilon è un valore piccolo semplicemente messo per evitare divisioni per 0. epsilon = 10^-8 solitamente.
Batch Normalization
Da qui ci possiamo poi calcolare l'output generato dal nostro nuovo livello per poi applicare la ReLU:
Dove gamma e beta sono quelli che possiamo definire i pesi e i biases del livello aggiunto e che vengono
solitamente inizializzati con 1 e 0 rispettivamente. Entrambi hanno dimensione H e sono parametri che devono
essere trainati tramite il gradient descent come fossero veri pesi e biases.
Qui il paper della batch normalization:
[Link]
Batch Normalization
Qui lo pseudocodice della procedura direttamente dalla
documentazione precedentemente linkata:
La media si calcola con la media dei vari u_b calcolati ciascuno per
ogni mini batch e la varianza fa la stessa cosa tramite le varie
varianze calcolate durante i mini_batch.
Nelle slide precedenti, trattando di imagenet abbiamo parlato in generale di grouped convolution, ma non è
stata spiegata nel dettaglio. Qui il paper che ne parla: [Link]
Il procedimento è semplice, si fa una normale convoluzione, ma le strade vengono splittate per poi venir
sommate alla fine, questo processo permette di ridurre la complessità computazionale ed evitare che gli
iperparametri del network e quindi i pesi e i biases si adattino troppo al dataset, una sorta di processo di
regularization. Spesso poi il kernel cui è stata applicata la grouped convolution viene sommato alla fine, questo
metodo permette di contrastare il vanishing gradient problem e quindi fa in modo che si possano creare neural
network anche molto profondi. Spesso si applica solo questo secondo processo e si parla allora di residual
layers.
RESIDUAL LAYERS
I residual layers servono proprio allo scopo prima spiegato:
Qual è nella pratica la differenza sotanziale nei 2 algoritmi? La differenza è rintracciabile in una semplice immagine:
La necessità di introdurre il nesterov momentum è dovuta al fatto che il momentum classico sembra che fallisca nel
trovare il minimo globale di alcune tipo di funzioni convesse. Il nesterov momentum risolve questo problema. Il
momentum sfrutta la direzionalità data dal precedente parametro rispetto a quello attuale e calcola il gradiente
prima di aggiungere questa direzionalità, il nesterov momentum fa l'opposto. Qui un paper con la dimostrazione
matematica di come il nesterov momentum riesca a trovare il minimo in una classe di funzioni convesse più
generale rispetto al momentum classico: [Link]
An overview on gradient descent
problem
L'altro algoritmo che il paper tratta è l'Adagard che ha un semplice scopo: adattare il learning rate in base ai
parametri e bilanciare l'aggiornamento di quest'ultimi in modo tale da aggiornare continuativamente allo
stesso "livello" tutti i parametri del network.
Spesso quando si lavora coi neural network ci si imbatte in problemi di affidabilità delle reti neurali. Sebbene si
siano allenate con un grande dataset, ci si sia attenuti a tecniche utilizzate e considerate abbastanza affidabili, il
nostro network potrebbe ancora non performare come vorremmo. Anziché cambiare la struttura aggiungere
livelli aggiungere altre forme di regularization, insomma fare il classico casino pur di ottenere una rete affidabile,
toccherebbe focalizzarsi sui parametri che sono stati settati per la nostra rete. Il primo passo è focalizzarsi sul
settaggio di quei parametri tipo ad esempio il momentum, il learning rate ecc.. Che potrebbero far migliorare la
performance della nostra rete, senza stravolgerla.
In questo video molto semplice e corto viene spiegato un tipo di metodologia che si dovrebbe attuare per cercare
di trovare i valori che più potrebbero essere adatti per la nostra rete:
[Link]
Il settaggio dei parametri è fondamentale, spesso ci si affida sempre a quelli forniti dalle librerie ad esempio di
python come tensorflow, keras ecc.. Tuttavia questa è una parte fondamentale che non andrebbe mai
trascurata
Queste slide tutorial finiscono qua, per continuare a studiare il campo del deep learning consiglio alcuni
argomenti: Recurrent neural network, long short term memory cells, Generative Adversarial Network, Deep Q
learning e le sue varianti (circa 8/9 varianti).