Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

6
voti

Un esempio di rete neurale a percettrone multistrato

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.

Figura 1 - wikipedia.org

Figura 1 - wikipedia.org


Un Neurone

Ogni neurone è costituito da più ingressi e un'uscita, come in Figura 2:

Figura 2 - Neurone artificiale

Figura 2 - Neurone artificiale

.

Per ogni neurone viene calcolato un valore di attivazione, calcolato come:

\sum_{i=1}^n(wi*Ii)

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

Figura 3

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:
Figura 4 - Errore learning

Figura 4 - Errore learning

Simulazione con i dati di test:
Figura 5 - Errore test

Figura 5 - Errore 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.

6

Commenti e note

Inserisci un commento

di ,

Ti riferisci all'immagine? Perché in quel caso, il disclamer è questo: Io, detentore del copyright su quest'opera, la rilascio nel pubblico dominio. Questa norma si applica in tutto il mondo. In alcuni paesi questo potrebbe non essere legalmente possibile. In tal caso: Garantisco a chiunque il diritto di utilizzare quest'opera per qualsiasi scopo, senza alcuna condizione, a meno che tali condizioni siano richieste dalla legge.

Rispondi

di ,

http://it.wikipedia.org/wiki/Rete_neurale

Rispondi

di ,

Puoi migliorare l'errore anche con una migliore distribuzione dei dati in ingresso, cercando di posizionarli coprendo quanto più possibile l'intervallo dove si opera, dei dati presi totalmente random fra 0 e 100 possono presentare una probabilità statistica maggiore fra 0 e 50 e minore fra 50 e 100 peggiorando le prestazioni nel secondo intervallo. Potresti provare a dividere i campioni di test in 4 gruppi per esempio: gruppo 1 input1 (<50) + input2 (<50) gruppo 2 input1 (<50) + input2 (>=50) gruppo 3 input1 (>=50) + input2 (<50) gruppo 4 input1 (>=50) + input2 (>=50) Secondo me noterai qualche miglioramento.

Rispondi

di ,

Per i neuroni dello strato di uscita ho usato una funzione di attivazione puramente lineare, mentre per i neuroni dello strato nascosto la funzione sigmoidale.

Rispondi

di ,

Ho appreso qualcosa, grazie. Nel tuo esempio, tutte le funzioni di attivazione sono lineari?

Rispondi

di ,

...o adottando un algoritmo di backpropagation elastico :)

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.