Il 0% ha trovato utile questo documento (0 voti)
4 visualizzazioni86 pagine

NETWORKS

nah

Caricato da

hacisi9166
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
4 visualizzazioni86 pagine

NETWORKS

nah

Caricato da

hacisi9166
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

DEEP LEARNING AND NEURAL

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.

I biases o t i uis o o al al olo dell’output i uesta a ie a:

0 if w⋅x +b < soglia


Output:
1 otherwise

Dove w⋅x ≡ ∑j wjxj


Neurone artificiale

-Il neurone sigmoide è u tipo di eu o e a tifi iale he o puta l’output t a ite u a


Funzione sigmoide definita come:

σ z ≡ / +e^ -z))

-Do e e” è il numero di Nepero


-E z è la fu zio e p i a defi ita o e + ∑wjxj

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

- La funzione sigmoide ha una forma del tipo:

- Più avanti verranno presentate altri tipi di funzioni f(w⋅x +b) utilizzate
al posto della funzione sigmoide.

-Questo ge e e di fu zio i he a o a al ola e l’output del eu o e e go o


chiamate: funzioni di attivazione (activation functions)
Architettura del Neural Network

-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.

-Al p i o li ello a ia o uelli he e go o defi iti input neurons” e che costituiscono


l’i put layer e sono un totale di 3.
-Poi a ia o u li ello i te edio ostituito da 4 eu o i e he ie e defi ito hidden layer”
-Infine abbiamo un ultimo livello costituito da un unico neurone anche chiamato
output neuron” e he a a fo a e l’output layer.
I eu o i di i put da o i p op i alo i i pasto ai eu o i dell’hidden layer, che a loro volta
prendono questi valori e vi applicano la funzione sigmoide generando degli output che
e a o dati i pasto all’ulti o li ello. A uesto pu to il eu o e di output p e de uesti
valori vi applica a sua volta la funzione sigmoide e produce il suo output.
Architettura del Neural Network
Architettura del Neural Network

-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.

Un network del genere è spesso chiamato (per ragioni storiche)


multilayer perceptrons network o MLPs network, sebbene vengano utilizzati neuroni
Sigmoidi.
Utilizzare un MLP network
Le slide di questo corso seguono passo passo la dettagliata descrizione sui neural network
che viene spiegata da Michael Nielsen qui:
[Link]

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.

-Il procedimento utilizzato è un tipo di procedimento che viene definito di apprendimento


supervisionato. In cui, dato un insieme di valori di input x (dove x nel nostro caso è un
vettore di grandezza 28x28 = 784) e sapendo in origine per ciascun vettore x il relativo
output y (dove nel nostro caso y sarà un vettore di 10 valori, poiché esistono in totale 10
cifre) si cerca di allenare la rete neurale per fare in modo che riesca in un futuro da solo
a riconoscere le cifre giuste da altre immagini fuori da quel dataset che abbiamo utilizzato
per allenarlo.
Utilizzare un MLP network
La prima cosa da fare per utilizzare un MLP network è decidere la tipologia di input che deve
prendere e che tipo di output vogliamo che computi.

Per il riconoscimento di cifre numeriche di immagini di grandezza 28x28 pixel possiamo


decidere di dare in pasto al nostro neural network degli input che corrispondono ai pixel delle
immagini e in output possiamo decidere che venga prodotto un vettore di valori
Nel quale il nostro neural network ci esponga la probabilità che data un immagine essa
Corrisponda ad uno 0 un 1 un 2 un 3 un 4 un 5 un 6 un 7 un 8 o un 9.

- Pe fa e iò de idia o he i eu o i dell’i put layer siano in tutto 28x28 = 784 mentre


I eu o i dell’output layer siano in tutto 10.

-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

L’i put i uesto aso è ostituito da 4 alo i he o ispo do o ad se il pixel è e o e


altrimenti
se l’i agi e ostituita dall’i put è u o allo a il p i o ele e to dell’output he è ostituito da
alo i è e gli alt i , se l’i agi e è u , il se o do ele e to dell’output è e gli alt i e
così ia…
Utilizzare un MLP network
Ora abbiamo tutto quello che ci serve: un dataset di immagini e
un neural network con input layer output layer ed hidden layer. Ma cosa ci manca per poter
testare il nostro primo neural 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???

Dove sono i numeri e le equazioni?

Partiamo dal primo dubbio: i biases e i pesi degli archi.

-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.

Ma perché così tanti?

Come precedentemente abbiamo menzionato un MLP network è un network in cui ogni


neurone di ciascun livello eccetto quelli di input, è collegato tramite archi a tutti i neuroni
del livello precedente, quindi: il secondo livello ha 15 neuroni, ciascuno collegato ai 784
neuroni del primo livello. E il terzo livello ne ha 10 ognuno collegato ai 15 del secondo.

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:

#define M_PI 3.14159265358979323846

srand(time(NULL));

double drand(){ return (rand()+1.0)/(RAND_MAX+1.0);}

double random_normal(){return sqrt(-2*log(drand())) * cos(2*M_PI*drand());}

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.

Possono essere utilizzate diverse tecniche ma quella più utilizzata al momento


È il gradient descent.

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

Il nostro goal quindi, è quello di modificare adeguatamente i biases e i pesi


della rete neurale affinchè uest’ulti a si o po ti o e f x e il gradient descent è
una tecnica che permette di fare questo. Per fare ciò ci servirà:

-Un ampio dataset (cosa che abbiamo).


- una funzione di costo che applicheremo al nostro neural network.
- e 4 equazioni fondamentali.
Utilizzare un MLP network
La funzione di Costo:

La fu zio e di osto è u a fu zio e he ie e appli ata all’output he ge e a il ost o


Neural network e serve a dirti quanto il tuo neural et o k si s aglia ispetto all’i put he
gli è stato assegnato.

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:

Nel nostro caso E =

Dove a è la predizione del nostro algoritmo e y(x) è la corretta soluzione


Utilizzare un MLP network
Ora che abbiamo definito una funzione di costo, dovremmo capire come si applica
Il gradient descent per allenare la nostra rete neurale:
Il gradient descent sfrutta le derivate parziali dei pesi e dei biases del nostro neural
Network rispetto alla funzione costo dello stesso, per aggiornare proprio i suoi
Biases e pesi:

Wk: indica la matrice di pesi del k-esimo livello.


Bl: indica invece il vettore dei pesi del l-esimo livello.
η: è il learning ate ed i di a la lu ghezza del passo o il uale a ie e l’aggio a e to.

: è 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.

Dobbiamo immaginarci il gradient descent come una


tecnica finalizzata a raggiungere il minimo globale
di una funzione. Questa tecnica ci permette di saltare
da una posizione in cui ci troviamo nella funzione ad un
altra in direzione del minimo con un passo pari a η.
il problema che può insorgere nel caso che il
Learning rate sia troppo grande è che, se ci troviamo
ad esempio nei pressi del minimo globale, il salto
successivo che faremmo in direzione dello stesso
potrebbe essere troppo grande e rischieremmo di
oltrepassare il minimo che volevamo raggiungere e magari risalire la funzione dalla parte
Opposta, finendo così solo per allontanarci dal nostro obiettivo.
Utilizzare un MLP network
D’alt a pa te u learning rate troppo basso potrebbe notevolmente rallentare
Il raggiungimento del minimo globale stesso.

La miglior soluzione è testare diversi learning rate e trovare il più adatto.

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.

Ci riferiremmo al o e al alo e del peso dell’a o he ollega il Neu o e dell’


Livello, al Neu o e dell’ Livello.
Utilizzare un MLP network
Mentre Sarà la funzione di attivazione del Neu o e dell’ Livello e
Sarà il valore del bias del Neu o e dell’ Livello.
Utilizzare un MLP network
Utilizzare un MLP network
La p i a osa da fa e è al ola e l’e o e ispetto l’output e lo si fa t a ite la de i ata
Parziale della funzione di costo derivata rispetto (nel nostro caso) non ad y(x) ma ad a:

La derivata parziale di È: a-y(x)

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:

Il gradient descent va a calcolare quello che è


definito minimo globale di una funzione, ma il
problema principale nel quale ci si può ritrovare è
che nel cercare di raggiungere il minimo globale
ci si possa incagliare in un minimo locale finendo
così nel non raggiungere il nostro scopo e la rete
neurale in questione termina di apprendere quando invece ancora dovrebbe poter
Apprendere.

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.

Ovvero data m la grandezza di un mini-batch dove m<N con N = [Link]()


La formula del gradient descent cambia in questo modo:
Utilizzare un MLP network
Quando tutti i mini-batch in cui è stato suddiviso il dataset hanno finito di allenare la
neural network si dice che si è raggiunti un epoca. Al fine di un epoca si può
de ide e di a ia e u ’alt a i es ola do le ista ze del dataset e riallenando la funzione
continuando con minibatch della grandezza precedentemente stabilita. Qui uno
Pseudocodice di come dovrebbe funzionare:

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

Esistono funzioni di costo che ci permettono di imparare più velocemente?


Di particolare importanza può assumere la funzione di costo definita come
CROSS-ENTROPY:

La cross-entropy a diffe e za dell’ mse permette di apprendere più velocemente in


certi casi, consiglierei di utilizzare l mse ua do l’output dei eu o i dell’ulti o li ello è
dato da una funzione lineare (non è il caso della funzione sigmoide).
Scavando nei deep neural network

Esistono altri tipi di funzioni di attivazione?

Un altro tipo di funzione utilizzata al posto della sigmoide è softmax:

Dove z è dato da:

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.

L’output del li ello può esse e pe sato ui di o e u a dist i uzio e di p o a ilità.


Scavando nei deep neural network
Cos’è l’overfitting?

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?

U p o le a o u e i uesti asi è uello dell’overfitting. Un problema secondo il quale


la nostra rete neurale ha appreso talmente bene dal nostro dataset che non riesce più
a generalizzare il riconoscimento delle immagini ad immagini fuori dallo stesso dataset che gli
abbiamo dato per allenarsi. Per ovviare a questo problema si può ricorrere a due metodi:

- regularization.
- validation set.
Scavando nei deep neural network

Tra le tecniche di regularization Nielsen mostra la L2 regularization, come funziona?

L’idea di ase è uella di aggiu ge e u te i e ext a alla fu zio e di osto, e o due


Esempi con valori extra aggiunti nel caso della cross-entropy e dell’mse:

Dove È la somma dei quadrati di tutti i pesi del network.


Mentre lambda è un numero scelto > 0 e definito come regularization parameter
Scavando nei deep neural network

Dall’ele e to ext a aggiu to e isulte à he:

Usando lo stochastic gradient descent:

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.

Questo problema è conosciuto come vanishing gradient problem,


Tuttavia possono essere attuate contromisure adeguate per renderlo meno problematico
come vedremo con la tecnica utilizzata dalla microsoft per le convolutional neural
Network.
Premesse sui set
Prima di addentrarci nel fantastico mondo delle convolutional network è bene avere
chiaro il metodo che bisognerebbe applicare nella realizzazione di un training set e test
set per la nostra rete.
Solitamente viene preso un 80% del tuo set totale come training set e il 20% come test set,
questo a meno che non vogliamo utilizzare anche un validation set.

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 :

Dove È definito come prodotto convoluzionale.


Convolutional Network
Vediamone un esempio:

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

Ecco come infine aggiorniamo i pesi e i biases:


Convolutional Network
Formulario finale:

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.

Il pooling prende la matrice che hai generato tramite il feedforward e la suddivide in


tante matrici grandi tanto quanto la grandezza della matrice di pooling.
Da ciascuna matrice così ottenuta può applicare la propria funzione di pooling, di cui
Ce ne sono delle più svariate.

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?

Se pli e e te si fa uello he è defi ito l’upsample della funzione ovvero:

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

Come vanno trattati gli input?

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]

Il download del dataset può essere fatto qua:

[Link]
learning/blob/master/data/[Link]

Lo stesso Nielse effettua u au e to dei dati t a ite l’augmentation creando ulteriori


immagini che sono la copia di quelle precedenti e i cui pixel sono spostati di 1 posizione più a
destra, a sinistra in alto o in basso, ma noi utilizzeremo il metodo usato nel paper in questione.
Regularization 2.0
L’augmentation in space:

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 momentum è u te i e he ie e aggiu to pe fa ilita e l’app e di e to e he t asfo a


la formula del gradient descent in questa maniera:

Dove alpha è il momentum ed è definito come 0<α<1.


Solitamente ad un elevato momentum si associa un basso learning rate.

Qui un approfondimento: [Link]


Regularization 3.0
U ’alt a te i a di regularization spesso usata è il dropout

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:

-Eseguiamo il feedforward per gli input x_i di un minibatch e lo facciamo cancellando


una metà random di neuroni di ciascun hidden layer.
- Eseguiamo la backpropagation e aggiorniamo i pesi e i biases.
- riaggiungiamo i neuroni temporaneamente cancellati
- ripetiamo il procedimento scegliendo un nuovo random set di eu o i dell’hidden
layers che saranno temporaneamente cancellati

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)))…)…)))

Dove x è l'input dato in pasto al nostro network.

Ora introduciamo la regola della Chain Rule o Regola della Catena:


[Link]
OTTENERE L'EQUAZIONI DELLA
BACKPROPAGATION
OTTENERE L'EQUAZIONI DELLA
BACKPROPAGATION

Secondo la regola della catena per calcolare le derivate


parziali dei biases e dei pesi tocca andare a ritroso con questo
procedimento:

Ad esempio indicando Db come la derivata parziale di un


determinato bias avremmo:

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.

In questa immagine infatti ad ogni matrice di input si effettua la


moltiplicazione con una matrice dei pesi.
Per ogni matrice di input c'è una matrice dei pesi. L'insieme delle
matrici dei pesi formano quello che viene definito tensore e lo
stesso vale per l'insieme delle matrici di input.
La profondita del tensore, ovvero il numero di matrici di input
viene definito spesso channels o canali e l'equazione per ottenere i
il neurone i,j-esimo è data dalla figura qua accanto.
CNN: un altro sguardo

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]

Partiremo dall'analisi dell'architettura.

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:

F(x) = max(0,x) ReLU activation function.


CASO DI STUDIO 1: IMAGENET

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.

Dal punto di vista pratico questo velocizza il processo di apprendimento.

Possiamo riscontrare un punto di vista un po più formale in questo paper:


[Link]
CASO DI STUDIO 1: IMAGENET

• Il paper va ad analizzare il
vanishing gradient problem che
avevamo già citato nelle slide
iniziali.

• In particolare mostra come per


funzioni come la sigmoide, ma vale
anche per la funzione tanh il
vanishing gradient problem può
causare un rallentamento
dell'allenamento del neural
network tanto più è profondo il
neural network stesso.
CASO DI STUDIO 1: IMAGENET

Il vanishing gradient problem dice le cose in maniera molto semplice:

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

Per maggior dettagli consiglio personalmente di visitare questo


link [Link]
E il link del paper precedentemente messo a disposizione.

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

Al quale vengono applicati 96 kernel di dimensione

11x11x3

Tramite uno stride di

Poi

ReLU

Successivamente all'output generato viene applicato il

local response normalization

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​​

Anche qui poi si applica:

ReLU

Local response normalization

Pooling

Il terzo livello ha 384 kernels di dimensione:

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

Il quinto applica 256 kernel di 3x3x192

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 di costo è una variante della cross-entropy definita come


SoftMax e Cross-Entropy
Spesso nell'analizzare le diverse reti neurali, soprattutto quelle che trattano algoritmi di supervised
learning, noterete che viene spesso utilizzata una funzione di attivazione particolare nel layer finale, la softmax-
function, associata ad una funzione di costo che è la Cross-entropy.

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.

Sia la varianza che la media hanno dimensione H


Successivamente di ciascuna riga N di dimensione H delle varie h calcolate ci calcoliamo la forma normalizzata
come

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:

Il primo ciclo for va a piazzare il layer aggiuntivi la dove si vuole


applicare la batch normalization.

Successivamente si allena la rete neurale normalmente.

Il secondo ciclo for va a calcolare la y dei livelli aggiuntivi


aggiungendo dei parametri quali la media e la varianza alle varie
gamma e beta.

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.

Per la backpropagation ci sono link online, tuttavia visto che


bisogna fare propria la regola della catena, invito a calcolarsi da soli
le derivate parziali dei pesi e biases passando attraverso i nuovi
layer.
Grouped convolution & Residual Layers

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:

Qui il paper e un video illustrativo che ne parlano


[Link]
[Link]
yw2P_sXD11-_Ak_&v=1PGLj-uKT1w
An overview on gradient descent
problem

Nelle slide precedenti abbiamo trattato il


gradient descent non stocastico, il
gradient descent stocastico il gradient
descent con l'aggiunta del momentum,
tuttavia ci sono altre tipologie che
possono addirittura migliorare
l'apprendimento del nostro neural
network, che usano la stessa tecnica del
gradient descent, ma così come il
momentum, hanno termini aggiuntivi.
Uno di questi, uno dei più utilizzati ed
efficaci, è l'adam optimization algorithm.

L'aloritmo si comporta come lo stochastic


gradient descent, solo con l'aggiunta di
altri parametri:
An overview on gradient descent
problem
L'algoritmo si può prendere così, i parametri sono quelli descritti nell'immagine precedente e quello è
l'algoritmo, tuttavia noi cercheremo di capire come ci si è arrivati, ma soprattutto quali sono i vantaggi.
Il paper dell'algoritmo in se è reperibile qua: [Link]
Tuttavia noi ci soffermeremo più su quest'altro paper: [Link] che da una
panoramica generale delle diverse tecniche simili al gradient descent e cercheremo di capire come si è
arrivati all'adam algorithm.

Abbiamo già trattato


lo stochastic gradient descent con
il momentum spiegando che tramite
quest'ultimo termine aggiuntivo si aiuta
lo stochastic gradient descent a direzionarsi più
verso il minimo globale, senza di esso invece
l'sgd rischia di ingolfarsi se si trova in un minimo
locale nei pressi del minimo globale. È stato
proposto tuttavia un algoritmo che utilizza
il momentum, che è migliore di quello classico,
ecco la differenza:
An overview on gradient descent
problem

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.

La debolezza maggiore di questo algoritmo è il fatto di


accumulare i quadrati dei gradienti al denominatore,
poiché la somma dei gradienti si accumula durante la
fase di training.
An overview on gradient descent
problem
Successivamente il paper tratta di Adelta eRMsprop che cercano di risolvere il problema dato dall'Adagard
algorithm. Infine si giunge all'Adam optimization algorithm che unisce le tecniche di Adelta e RMsprop, che
hanno lo scopo spiegato per l'Adagard e lo uniscono al momentum.

Portando con se i benefici spiegati per il momentum e per


l'adagard.
Settare 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).

Potrebbero piacerti anche