Indice |
Le reti neurali
Una rete neurale è un interpolatore universale di funzioni non lineari.
Da un insieme di dati ingresso/uscita, una rete neurale è in grado di apprendere come calcolare i dati di uscita a partire dai dati in ingresso.
Una rete neurale è costituita da un insieme di neuroni interconnessi tra loro mediante dei collegamenti detti sinapsi e da diversi strati,ciascuno costituito da un certo numero di neuroni.
In una rete possiamo distinguere:
- Uno strato di ingresso.
- Uno strato di uscita.
- Uno o più strati nascosti.
In Figura 1 è mostrata una semplice rete neurale con tre strati.
Un Neurone
Ogni neurone è costituito da più ingressi e un'uscita, come in Figura 2:
.Per ogni neurone viene calcolato un valore di attivazione, calcolato come:
con n pari al numero di ingressi. Il valore di attivazione è dato in ingresso a una funzione di attivazione.Esistono diverse funzioni di attivazione (Figura 3):
Il risultato della funzione di attivazione è ingresso per i neuroni dello strato successivo.
Fasi di learning e di test
Perché la rete funzioni in modo corretto è sempre necessaria una fase di learning e una fase di test. La fase di learning è il processo con cui vengono calcolati i pesi di ogni singolo ramo.La fase di test è il processo per cui, a partire dai dati in ingresso, vengono ricavati i dati in uscita. Esistono diversi algoritmi per fare il learning, uno di questi è l'algoritmo di backpropagation, cui obiettivo è minimizzare una funzione di errore.
Un esempio in Matlab
In questo esempio mi sono proposto di allenare una rete, in modo che sia in grado di fare la somma di due numeri compresi tra 0 e 100. La rete in questione è una rete con due ingressi, tre neuroni nello strato nascosto e un neurone di output. In ingresso vanno i due numeri da sommare a e b, mentre in uscita abbiamo il risultato della somma. Di seguito lo script in matlab:
Lo script genera una matrice di tre colonne usata per l'apprendimento della rete neurale.Due colonne rappresentano gli ingressi, mentre la terza colonna l'uscita(gli ingressi sono generati casualmente).
In modo analogo è stata generata la matrice per il testing.
Ecco il codice:
dati_learning=zeros([900 3]); dati_test=zeros([900 3]); %Genero i dati di learning for i=1:1:900 a=rand()*100; b=rand()*100; c=a+b; dati_learning(i,1)=a; dati_learning(i,2)=b; dati_learning(i,3)=c; end
%Genero i dati di test for i=1:1:900 a=rand()*100; b=rand()*100; c=a+b; dati_test(i,1)=a; dati_test(i,2)=b; dati_test(i,3)=c; end
%Creo la rete neurale nnetwork=newff([min(dati_learning(:,1:2))' max(dati_learning(:,1:2))'], [4 1], {'tansig','purelin'},'trainlm');
%Setto alcuni parametri nnetwork.trainParam.show=50; nnetwork.trainParam.lr=0.05; nnetwork.trainParam.epochs=300;
%Fase di learning inlearn=dati_learning(:,1:2)'; outlearn=dati_learning(:,3)'; nnetwork=train(nnetwork,inlearn,outlearn); simlearn=sim(nnetwork,inlearn); errore1=simlearn-outlearn; plot(errore1);
%Fase di test intest=dati_test(:,1:2)'; outtest=dati_test(:,3)'; simtest=sim(nnetwork,intest); errore2=simtest-outtest; figure plot(errore2);
Questi sono i grafici dell'errore:
Simulazione con i dati di learning: Simulazione con i dati di test:L'errore è un po' alto, solitamente è accettabile un errore intorno a 10 − 4.Si può tentare di diminuire l'errore aumentando il numero di neuroni nello strato nascosto, aumentando il numero di epoche o aumentando il numero di dati per il learning.