Reti neurali: esempi in Matlab ed appunti

Le reti neurali sono strumenti, progettati sulla base delle connessioni presenti all’interno del cervello umano, utilizzati come Approssimatori di Funzioni.
Sono costituite da n unità elementari (chiamati Neuroni Artificiali o Processing Elements) interconnesse tra di loro. Queste unità di elaborazione sono organizzate in strati, ogni rete neurale avrà quindi un numero variabile di neuroni in base al numero, anch’esso variabile di strati. Nella figura è rappresentata una semplice rete neurale:

Schema di rete neurale

N11 e N12 sono i neuroni di Input, a loro giungono gli stimoli in ingresso. I neuroni di input elaborano, secondo una determinata funzione (detta Funzione di Trasferimento) l’input in ingresso e distribuiscono il risultato ai neuroni del livello successivo. E’ interessante notare come in una rete neurale di questo tipo, tutti i neuroni siano connessi con tutti. Quindi i nostri neuroni di input inoltreranno le informazioni elaborate sulla ase della funzione di trasferimento a tutti i neuroni dello strato 2.
L’informazione non è semplicemente inoltrata ai neuroni intermedi, ma è pesata. Pesata significa che il risultato ottenuto da ogni neurone viene dimensionato in base al peso della connessione esistente tra 2 neuroni. Nello schema, il peso delle connessione è rappresentato da W11, W12, W13, W14,…

Ogni neurone è caratterizzato da una funzione di transizione e da un valore soglia. Il valore soglia è il valore minimo che deve essere presente in input affinché il neurone si attivi. La funzione di transizione è quella funzione che, presi i valori in input, fornisce il valore di output. Le funzioni più utilizzate sono la Hard Limit, la Linear e la Log Sigmoid.

Funzioni di transizione

I neuroni N21, N22, N23, N24, sono i neuroni che costituiscono il nostro strato intermedio. Ogni neurone di questo strato, somma gli input che si presentano alle sue connessioni in ingresso. In termini matematici, ogni neurone esegue la sommatoria degli input, che corrispondono al prodotto tra Output dei neuroni del primo strato e peso della connessione. Il risultato di tale sommatoria viene nuovamente elaborato sulla base della funzione di trasferimento di ogni neurone. Il risultato così ottenuto viene a sua volta inoltrato ai neuroni di strato successivo, moltiplicandolo per il peso esistente tra i neuroni

Funzionamento di un neurone in rete neurale artificiale

Nel caso raffigurato in figura, lo strato di output si limita a sommare i contributi provenienti dai singoli neuroni intermedi ed a fornire un unico valore di output. Non necessariamente una rete deve possedere un solo output, ad esempio l’applicazione in Matlab descritta di seguito ha 3 neuroni di output.

Le reti neurali, come ricordato all’inizio, possono essere considerate come approssimatori di funzioni. Presentando in input una o più variabili indipendenti, è possibile riprodurre in output il valore della variabile indipendente. Per permettere alla rete di approssimare al meglio la funzione in esame, è necessario sottoporla ad un processo di allenamento. Tale processo consiste nel controllare la risposta fornita dalla rete quando in input vengono inseriti valori di variabili indipendenti per cui si conosce l’esatto valore della variabile dipendente. (Training set)
In questo modo, modificando i pesi delle connessioni, è possibile ridurre al minimo la differenza tra output desiderato (il valore della funzione per determinati valori di input) ed output effettivo (il valore in uscita della rete neurale per gli stessi valori di input). Questo metodo è chiamato Metodo di apprendimento supervisionato.

In pratica, si determina l’architettura di rete, si assegna ai pesi un valore inizialmente casuale e si addestra la rete sottoponendola alla fase di training. Dopo la fase di apprendimento, l’efficacia della rete viene testata su un nuovo insieme di dati, il test set. Tale insieme di dati deve essere costituito da valori di input e di output mai visti dalla rete. Se i risultati offerti dalla rete si avvicinano a quelli effettivi, allora è possibile considerarla valida. In questi casi, si dice che la rete è efficace in generalizzazione.

Di seguito riporto un breve esercizio per Matlab. Consiste nell’analisi del Dataset Choles_all, lo scopo è di determinare il livello di colesterolo partendo dalle analisi di spettro di un campione di sangue. Campo applicativo a parte, quello che realmente ci interessa è capire quanto e come una rete neurale è in grado di imitare l’andamento di una funzione.
Per l’addestramento della rete ci siamo affidati ad una tecnica chiamata Early stopping; consiste nel dividere i dati in 3 insiemi: Training Set, Validation Set e Test Set. La rete viene addestrata, ed i pesi modificati, sulla base del Test Set. Contemporaneamente, si monitora la differenza tra i risultati ottenuti sottoponendo alla rete il Validation Set. Normalmente si osserva una riduzione dell’errore per i dati appartenenti al Training Set, dovuta alla modificazione dei pesi. Sarebbe lecito aspettarsi una riduzione analoga anche nei confronti del Validation Set ma, se per motivi riconducibili ad Over Fitting, l’errore rispetto al Validation Set dovesse aumentare durante l’allenamento, allora sarebbe il caso di interrompere il processo di training ed attribuire ai pesi i valori assunti prima che l’errore rispetto al Validation Set aumentasse.
Per l’architettura della rete si è deciso di utilizzare 21 neuroni in ingresso (corrispondente al numero di variabili indipendenti), 5 neuroni nello stadio intermedio e 3 neuroni di output (corrispondente al numero di variabili indipendenti). Ecco il listato per Matlab:

load choles_all
% Carica li dataset Choless_all

[pn,meanp,stdp,tn,meant,stdt] = prestd(p,t);
% Standardizza (normalizza) i dati in modo
% che abbiano media 0 e deviazione standard 1
% pn = input normalizzati
% tn = output (target) normalizzati

[R,Q] = size(pn)

iitst = 2:4:Q;
% Crea l’indice per la creazione del dataset di Test

iival = 4:4:Q;
% Crea l’indice per la creazione del dataset di Valutazione

iitr = [1:4:Q 3:4:Q];
% Crea l’indice per la creazione del dataset
% di Training (di dimensione doppia ripetto agli altri 2)

val.P = pn(:,iival);
val.T = tn(:,iival);
% Crea la struttura contenente la porzione di dataset
% riservata alla Valutazione della rete

test.P = pn(:,iitst);
test.T = tn(:,iitst);
% Crea la struttura contenente la porzione di dataset
% riservata al Test della rete

ptr = pn(:,iitr);
ttr = tn(:,iitr);
% Porzione di dataset riservata al training della rete
% Porzione di dataset riservata ai dati utilizzati come
% benchmark durante il training della rete

% Costruisco la rete neurale, in input fornisco i dati normalizzati.
% La rete avrà uno
% strato intermedio formato da 5 neuroni e funzione
% di transizione Tansig
% ed un layer di uscita caratterizzato da 3 neuroni e funzione di
% transizione Purelin. Per l’addestramento della
% rete utilizzo la funzione
% Trainlm (Levenberg-Marquardt backpropagation)

net = newff(minmax(pn),[5 3],{‘tansig’ ‘purelin’},’trainlm’);

[net,tr]=train(net,ptr,ttr,[],[],val,test);
% Training della rete, fornisco i dati di training (ptr),
% i dati di benchmark, il
% validation set ed il test set.

an = sim(net,pn);
% Verifichiamo il comportamento della rete neurale
% fornendo come input i dati standardizzati

a = poststd(an,meant,stdt);
% Ri-trasformo i dati nella forma originale

for i=1:3
figure(i)
[m(i),b(i),r(i)] = postreg(a(i,:),t(i,:));
end
% Grafici

Download listato per Matlab

Print This Page Print This Page