Rete Neurale feed-forward e back propagation (quarta parte)
Finalmente! cominciamo ad entrare nel vivo del deep neural network iniziando a parlare un pò più in dettaglio delle reti neurali feed-forward e, per fare ciò, cercherò di semplificare quanto più possibile tutti i passaggi matematici necessari per costruire una rete neurale di questo tipo che, come avevo già anticipato nell’articolo precedente, è caratterizzata dal fatto che l’output di uno strato è utilizzato come input per lo strato successivo. Voglio chiarire che le reti neurali feed-forward sono molto importanti perché, in generale, possono essere usate per risolvere problemi in cui si ha la necessità di qualificare/classificare il dato di ingresso. Esse, infatti, costituiscono la base per creare modelli di reti neurali molto complesse, tra cui, inizio a citare
per esempio, le CNN (convolutional neural network) usate molto spesso nella classificazione, tracciamento e confronto di immagini; queste ultime implementano differenti livelli di specializzazione e la loro caratteristica è che sono in grado di estrarre delle “features” che costituiscono, di fatto, la firma per poter distinguere un contenuto da un altro … ma di questo ne parleremo in altri articoli.
Giusto per fornire qualche definizione in più, aggiungo che le reti neurali feed-forward a più strati o multistrato, sono anche chiamate multilayer perceptron (MLP) e sono tra i modelli di rete neurale probabilmente più studiati e più utilizzati.
Proviamo ad organizzare i prossimi passi, spero non troppo noiosi.
In questo articolo approccerò alla spiegazione delle reti feed-forward cercando di semplificare la componente matematica e, per raggiungere l’obiettivo, utilizzerò esclusivamente dei neuroni sigmoidali, la cui scelta, infatti, tornerà utile successivamente, quando entreremo nel vivo del funzionamento del meccanismo di correzione dell’errore attraverso il metodo della back propagation che sarà indispensabile affrontare ai fine di comprendere, nel dettaglio, il funzionamento della fase di training di una rete supervisionata (addestramento).
Utilizzare una rete neurale supervisionata significa dividere il problema in due fasi:
- Fase di Training
- Fase di Prediction
nella prima fase dobbiamo preoccuparci di creare un modello/classificatore addestrando la rete
mentre la seconda fase ci consente di utilizzare il modello costruito per effettuare delle predizioni o classificazioni.
A questo punto proviamo a capire come costruire una rete neurale utile allo scopo.
Ripartiamo dall’inizio fissando, ancora una volta, semplici concetti già ampiamente introdotti anche negli articoli precedenti.
Definiamo attivazione interna (A) del neurone la somma pesata di tutti i segnali in ingresso.
Nel caso specifico di un neurone a 4 ingressi ed una uscita si ha, ad esempio:
A = x1*w1 + x2*w2 + x3*w3 +x4*w4 + b
ove b è una costante chiamata bias (impulso) che serve per far adattare meglio la rete e lo si può immaginare come un ulteriore neurone che non accetta valori in ingresso, mentre l’uscita Y del neurone in tal caso è
Proviamo a capire cosa significa tutto ciò facendo qualche esempio pratico e, per semplificare ulteriormente, riduciamo ancora di più la complessità del problema utilizzando come esempio un neurone con un ingresso ed una uscita.
In tal caso, la funzione di attivazione interna (A) è:
A = x*w + b
mentre la Y
A questo punto, diventa abbastanza chiaro che, a seconda dei valori di w e b che si andranno a scegliere durante la fase di training (che è il nostro obiettivo) il comportamento della rete neurale tenderà a cambiare. Per capire il concetto facciamo qualche piccolo esperimento andando a scegliere randomicamente dei valori di w e b, applicandoli poi al modello del neurone. Operando per via sperimentale, possiamo apprezzare come varia la funzione di uscita del neurone e, dunque, il comportamento della rete. Per fare ciò possiamo utilizzare qualche tool e, in questo caso, mi sono affidato a Youmath.
Test #1
w=7
b=-3
Test #2
w=-2
b=0,4
Test #3
w=-20
b=2
Guardando i tre grafici, risulta evidente come sia diverso il comportamento del neurone al variare dei parametri w e b, la cui ricerca dei valori ottimali è “lo scopo” della fase di addestramento; in altri termini, trovare i giusti valori di w e b, significa trovare la rete neurale che si comporta meglio in fase di predizione.
Complichiamoci un pò di più la vita è facciamo altri tre test, aumentando, però, la complessità del nostro neurone che, questa volta, avrà due ingressi ed una sola uscita.
A = x1*w1 + x2*w2 + b
In tal caso, la nostra Y sarà:
Facciamo dei test anche in questo caso scegliendo valori casuali di w e b:
Test #4
w1=3
w2=10
b=-5
Test #5
w1=-3
w2=-10
b=-25
Test #6
w1=-13
w2=10
b=-0.3
anche in questo caso è facile capire dalle figure come cambia sensibilmente il comportamento del neurone al variare dei pesi.
Ovviamente, utilizzare un singolo neurone non è sempre possibile e non è, al contempo, la soluzione ottimale. L’utilizzo di un singolo neurone è possibile, infatti, solo quando si devono risolvere problemi linearmente separabili, in tal caso, l’algoritmo di apprendimento tenderà a trovare una soluzione in un numero finito di passi, altrimenti, esso ciclicherà alla ricerca dei pesi senza arrivare mai ad una soluzione ottimale.
Ma questo cosa significa?
che è possibile usare un singolo neurone solo quando i valori attesi possono essere descritti attraverso un piano, o comunque, curve non chiuse.
E se ciò non fosse possibile?
in tal caso ci viene in aiuto la deep neural network, ovvero una rete neurale a più strati, con cui è possibile modellare curve più complesse.
Facciamo un esempio utilizzando una tra le più semplici deep neural network e cioè una rete neurale a due ingressi ed una sola uscita con un hidden layer a 3 neuroni.
Giusto per dare un senso alla nostra attesa, scriviamo il modello matematico della rete neurale per la cui implementazione dobbiamo ricordarci che lo strato di input non entra nella somma pesata in quanto l’output dei neuroni dell’input layer è esattamente il vettore dei dati di ingresso.
Dunque, facendo qualche calcolo:
h1= F(x1*w11+x2*w12 + b1)
h2 = F(x1*w21 + x2*w22+b2)
h3 = F(x1*w31 + x2*w32+b3)
Y = F(h1*w1 + h2 * w2 + h3*w3 +b )
ove F è sempre la funzione Sigmoidale, per cui, si ha che la nostra Y sarà:
di seguito una delle possibili rappresentazione di Y al variare dei pesi:
Tutto ciò per capire quanto complessa può diventare la rete neurale all’aumentare del numero dei neuroni e dei livelli. Per chi si volesse divertire, potrà cimentarsi a scrivere il modello matematico riferito alla rete rappresentata nella figura successiva, che è comunque piccolissima a confronto con quelle che normalmente si utilizzano in pratica:
A questo punto manca solo un ultimo passo, ovvero, come scegliere i pesi e con quale principio? Anche questa volta esiste uno strumento matematico in nostro aiuto che si chiama back propagation dell’errore grazie al quale la rete è in grado di imparare e modificare in automatico i pesi confrontando, in fase di training della rete, il risultato ottenuto con il risultato atteso (quello reale).
Facciamo appello ancora una volta al nostro modello semplificato di neurone ad un solo ingresso ed una sola uscita:
A = x*w + b
In tal caso, l’algoritmo di back propagation dell’errore lavorerà secondo il seguente approccio:
In pratica, partendo da valori casuali di w e b si fa un test utilizzando dati di ingresso il cui valore di uscita è noto; si calcola il valore dell’errore come differenza tra il valore di uscita noto e quello ottenuto, ed il delta y come moltiplicazione tra il valore dell’errore e la derivata di Y, che, nel nostro caso, essendo una sigmoide, è proprio Y*(1-Y) (come ricorderete, avevo anticipato che sarebbe ritornata utile la sigmoide per semplificare). A questo punto, si calcolano, semplicemente, w e b applicando la formula di cui sopra.
Il valore di epsilon, chiamato fattore di apprendimento, è a nostra scelta, ma sarà opportuno non assegnare ad esso valori troppo piccoli perché, altrimenti, si rischierebbe di non raggiungere la convergenza ottimale della rete; assegnando, altrimenti, valori troppo grandi aumenterebbe la velocità della fase di addestramento, come anche la possibilità di errori e di forti oscillazioni. I valori di epsilon dovranno essere, comunque, sempre compresi tra 0 e 1.
Per concludere, poiché sui livelli intermedi della rete non può essere fatto lo stesso ragionamento del livello di uscita, se non altro perché non si ha un valore di riferimento atteso noto, in tal caso, per calcolare i vari pesi sui neuroni interni, si procede propagando indietro l’errore dell’uscita (back propagation). Tutto ciò si ridurrà alle seguenti semplici formule:
In conclusione, per il momento, accettiamolo la procedura senza porsi troppe domande e, nei prossimi articoli, approfondiremo il tema della back propagation cercando di comprenderla con qualche esperimento pratico, descrivendo anche l’algoritmo utilizzabile.
Articolo precedente (terza parte)
Sono amante della tecnologia e delle tante sfumature del mondo IT, ho partecipato, sin dai primi anni di università ad importanti progetti in ambito Internet proseguendo, negli anni, allo startup, sviluppo e direzione di diverse aziende; Nei primi anni di carriera ho lavorato come consulente nel mondo dell’IT italiano, partecipando attivamente a progetti nazionali ed internazionali per realtà quali Ericsson, Telecom, Tin.it, Accenture, Tiscali, CNR. Dal 2010 mi occupo di startup mediante una delle mie società techintouch S.r.l che grazie alla collaborazione con la Digital Magics SpA, di cui sono Partner la Campania, mi occupo di supportare ed accelerare aziende del territorio .
Attualmente ricopro le cariche di :
– CTO MareGroup
– CTO Innoida
– Co-CEO in Techintouch s.r.l.
– Board member in StepFund GP SA
Manager ed imprenditore dal 2000 sono stato,
CEO e founder di Eclettica S.r.l. , Società specializzata in sviluppo software e System Integration
Partner per la Campania di Digital Magics S.p.A.
CTO e co-founder di Nexsoft S.p.A, società specializzata nella Consulenza di Servizi in ambito Informatico e sviluppo di soluzioni di System Integration, CTO della ITsys S.r.l. Società specializzata nella gestione di sistemi IT per la quale ho partecipato attivamente alla fase di startup.
Sognatore da sempre, curioso di novità ed alla ricerca di “nuovi mondi da esplorare“.
Comments