Utilizzo delle reti neurali di tipo MLP e RBF per l`approssimazione di

annuncio pubblicitario
Utilizzo delle reti neurali di tipo MLP e RBF per
l’approssimazione di funzioni reali di variabile reale note
mediante coppie di punti (x,y) in presenza di rumore
Davide Anastasia, Nicola Cogotti
27 dicembre 2005
Sommario
• x tr ed y tr sono i vettori con i punti da
approssimare appartenenti al training set,
x ts è il vettore contenente le osservazioni
del test set.
• y tr mlp e y ts mlp sono i valori approssimati ottenuti dalla rete MLP sul training
e sul test set, rispettivamente;
• y tr rbf e y ts rbf sono i valori approssimati ottenuti dalla rete RBF sul training
e sul test set, rispettivamente;
• k è il numero di neuroni (nascosti).
In molte applicazioni ingegneristiche capita frequentemente di disporre di una serie di osservazioni che caratterizzano un dato sistema fisico a
livello ingresso-uscita. Spesso si assume l’esistenza
di una relazione tempo-invariante R(x, y) che leghi la variabile di uscita y a quella di ingresso x.
In molti casi, poi, si assume che tale relazione sia
una funzione, ossia che esista una legge del tipo
y = f (x). Il problema da risolvere in questa esercitazione consiste nel progettare due tipi di approssimatori basati sue due tipologie diverse di reti neurali: Multi-Layer Perceptron (MLP) e Radiai
Basis Function (RBF), capaci di approssimare
le N coppie di valori reali (xi , yi ), i = 1..N .
Alla fine del testo è stata inclusa la parte relativa
alla esercitazione 3, la quale realizza una interfaccia grafica tale da poter utilizzare questo lavoro in
maniera intuitiva ed interattiva.
1
Inserire, oltre a quelli specificati, tutti i parametri che si ritengono necessari prevedendo
per ciascuno di essi un valore di default.
2. Realizzare una funzione che generi:
• N valori reali {xi }N
( i = 1), scelti in maniera casuale con distribuzione uniforme
all’interno dell’intervallo [a, b], con a, b ∈
R,
• i corrispondenti N valori reali {yi }( i =
1)N , con yi = f (xi )+L∗ei, dove la funzione f (·) è descritta da una stringa del tipo
’sin(x)/x’, ’x∗x+3∗x’, ecc., ed L∗ei rappresenta il rumore (in particolare, ei è un
valore reale generato a caso secondo una
distribuzione gaussiana con media zero e
varianza uno, ed L è l’ampiezza di tale
rumore).
Specifiche della soluzione
1. Realizzare due funzioni Matlab che provvedano, rispettivamente, a costruire, addestrare e
simulare la rete neurale MLP (con un solo strato nascosto) e la rete RBF. I prototipi delle due
funzioni sono i seguenti:
• [y tr mlp, y ts mlp] = fun appr mlp
(x tr, y tr, x ts, k, ...)
Il prototipo della funzione richiesta è il
seguente:
• [y tr rbf, y ts rbf] = fun appr rbf
(x tr, y ts, x ts, k, ...)
• [x,y] = datagenxy(function string,
N, a, b, L)
dove
1
3. Realizzare la seguente funzione di plot:
5. Confrontare la rete MLP realizzata con
un’equivalente rete MLP con due strati
nascosti.
• plotxy(x tr, y tr, x ts, y ts,
y tr mlp, y ts mlp, y tr rbf,
y ts rbf)
6. Confrontare le performance della rete MLP
(con un solo strato nascosto) e della rete RBF
sia al variare del numero di neuroni e del livello
di rumore, sia al variare di parametri specifici per le due reti, quali ad esempio il numero
di epoche, il goal, la funzione utilizzata per
l’addestramento, lo spread, ecc.
dove x tr, y tr, x ts, y ts, y tr mlp, y ts mlp,
y tr rbf, y ts rbf sono, rispettivamente, gli ingressi e le uscite desiderate contenute nel training set, gli ingressi e le uscite desiderate contenute nel test set, le uscite della rete MLP sul
training set, le uscite della rete MLP sul test
set, le uscite della rete RBF sul training set, le
uscite della rete RBF sul test set. La funzione
plotxy produce un grafico con 4 subplots:
7. (Opzionale) Dotare l’applicazione di una
interfaccia grafica.
(a) in alto a sinistra il grafico della coppia
(x tr, y tr) e quello della coppia (x tr,
y tr mlp)
2
2.1
(b) in alto a destra il grafico della coppia
(x ts, y ts) e quello della coppia (x ts,
y ts mlp)
Soluzione del problema
Generazione dei dati
Per prima cosa si è scelto di implementare la funzione datagenxy descritta al punto 2 delle specifiche
sopra riportate.
Di seguito viene riportato il codice Matlab usato:
(c) in basso a sinistra il grafico della coppia (x tr, y tr) e quello della coppia (x tr,
y tr rbf )
function [x,y] = datagenxy(function string, N, a, b, L)
(d) in alto a destra il grafico della coppia
(x ts,y ts) e quello della coppia (x ts,
y ts rbf )
Descrizione
funzione
dei
valori
di
ingresso
alla
4. Realizzare un funzione principale denominata
• N = il numero di valori random da generare;
main che provveda a chiamare tre volte la fun• a = l’estremo inferiore dei valori random;
zione datagenxy, per creare tre training set con
diversi livelli di rumore (da assente a ’medio’
• b = estremo superiore dei valori random;
ad ’alto’) ed una volta per creare un test set,
privo di rumore. Tale funzione deve provvede• L = ampiezza del rumore sui dati;
re anche ad addestrare entrambe le reti su tutti e tre i training set per tre volte, cambiando Descrizione dei valori di ritorno
ogni volta il numero di neuroni (passando da
• x = valori random;
’pochi’ a ’medi’ a ’molti’), ed a plottare i risultati. Discutere, a seconda del tipo di funzione
• y = valutazione di function string su x più il
da approssimare e del numero di punti dei trairumore;
ning set, quali possono essere valori sensati per
i termini ’pochi’, ’medi’, ecc...
Per generare i valori random x si è usata la funDiscutere la bontà delle approssimazioni zione di Matlab RANDOM. Essa genera numeri caottenute dalle due reti nei sei casi.
suali con la distribuzione che gli viene indicata (in
Suggerimento: Si può partire dall’approssima- questo caso, come richiesto dalle specifiche, si è usazione della funzione ’10 ∗ sin(x)’ nell’intervallo ta la distribuzione uniforme) su un intervallo [a, b].
[0,6.28], con livelli di rumore 0, 2 e 5, con un Il risultato della funzione è un vettore colonna di
training set di 20 coppie di punti ed utilizzando N elementi.
i seguenti numeri di neuroni: 5, 10 e 20.
x = random(’uniform’,a,b,N,1);
2
Viene valutata la funzione passata come parametro
su gli N valori casuali e si somma a questi ultimi
del rumore gaussiano con media zero, varianza 1 e
ampiezza L.
1. È in grado di offrire un addestramento molto
veloce (in termini temporali);
2. È particolarmente adatto nell’addestramento
di reti che hanno il compito di approssimare
funzioni;
y = (feval(function string, x)+L∗randn(N,1));
Realizzazione della rete neurale
MLP
3. È accurato quando la rete non è particolarmente grande;
Di seguito verrà illustrata la procedura con la quale
si è realizzata, addestrata e, infine, simulata la rete
di tipo MLP.
I difetti principali di questo algoritmo si posso riscontrare quando si è in presenza di reti particolarmente grandi (con un numero molto elevato di
pesi e neuroni), o quando si devono progettare reti
neurali impiegate nel riconoscimento di pattern.
Da quanto detto sopra, quindi, si è scelto di usare
trainlm come algoritmo di addestramento.
In fine si è simulata la rete usando la funzione
sim del Matlab
2.2
function [y tr mlp, y ts mlp] = fun appr mlp(x tr, y tr,
x ts, k)
Descrizione della funzione La funzione
fun appr mlp crea una rete di perceptron con k
neuroni nello stato nascosto e funzioni di learning
e training di default (Matlab da la possibilità di
specificare altri tipi di funzioni d’addestramento
e d’apprendimento passando alla newff i nuovi
valori come parametro). La rete è formata da
neuroni di tipo sigmoidi nello strato nascosto e da
neuroni di tipo lineari nello strato di uscita.
y ts mlp = sim(net, x ts);
2.3
Realizzazione della rete neurale
di tipo RBF
Illustriamo ora la realizzazione della funzione che
crea, addestra e simula la rete RBF.
Codice della funzione La rete è stata creata nel
seguente modo:
function [y tr rbf, y ts rbf] = fun appr rbf(x tr, y tr, x ts,
k)
net = newff(minmax(x tr), [k, 1], {’tansig’, ’purelin’});
Successivamente sono stati settati i parametri
riguardanti l’addestramento come di seguito:
Descrizione funzione La funzione deve creare
una rete neurale RBF con k neuroni nello strato
nascosto; per fare questo si usa la funzione newrb
di Matlab:
net.trainParam.epochs = 300;
Questa istruzione consente di determinare il numero di epoche per cui si desidera addestrare la rete.
Si è ritenuto che trecento epoche fossero sufficienti
alla rete per essere addestrata, considerando anche
il fatto che sui dati viene applicato del rumore.
net = newrb(x tr, y tr, 0.0, 1.0, k);
net = init(net);
Descrizione dei parametri della newrb
Questa istruzione consente di inizializzare la rete
con dei pesi iniziali che verranno adattati e cambiati
durante la fase di addestramento.
• x tr = matrice di ingresso alla rete;
• y tr = matrice delle sucite target della rete;
[net, tr, y tr mlp] = train(net, x tr, y tr);
In fine si è eseguita la funzione di addestramento train con l’algoritmo di addestramento di default che Matlab setta a trainlm. Questo algoritmo di addestramento risulta essere particolarmente
efficace per i seguenti motivi:
• goal = è la variabile che si usa per determinare
un criterio di stop all’addestramento;
• spread = questo parametro risulta essere cruciale per il buon funzionamento di una re3
• In basso a sinistra viene ripostato il grafico
relativo alla fase di addestramento della rete
RBF;
te RBF e merita dunque una attenzione
maggiore.1
• k = numero di neuroni nello strato nascosto.
• In basso a destra viene riportato il grafico
relativo alla fase di testing della rete RBF.
In fine si è usata la sim per la simulazione della
rete su due tipi di insieme di dati diversi, uno per
l’addestramento e uno per il test della funzione.
Quanto detto sopra è osservabile nell’immagine che
riportiamo di seguito per una maggiore chiarezza.
y tr rbf = sim(net, x tr);
y ts rbf = sim(net, x ts);
2.4
Realizzazione
plotxy
della
funzione
La seguente funzione ha lo scopo di realizzare un
grafico composto da quattro sottografici che mostrino i risultati delle reti RBF e MLP in base ai
dati.
La dichiarazione della funzione è:
function plotxy(x tr, y tr, x ts, y ts, y tr mlp, y ts mlp,
y tr rbf, y ts rbf)
Come si vede dal codice, la funzione prende in ingresso i dati di training e le uscite desiderate (rispettivamente x tr e y tr), i dati di test e le uscite
desiderate del test (rispettivamente x ts e y ts) e
infine le uscite fornite dalle reti MLP e RBF sia
dalla fase di addestramento sia dalla fase di test (rispettivamente y tr mp, y tr rbf, y ts mpl,
y ts rbf). Per ogni rete esegue il grafico dei risultati sia nella fase di testing sia in quella di
training.
I quattro grafici sono cosi organizzati:
Figura 1: Grafico generato dalla funzione plotxy
I + in blu si riferiscono agli ingressi e alle uscite desiderate nel training set (la parte sinistra del
grafico) più il disturbo dovuto al rumore introdotto, le o in rosso invece sono le risposte della rete.
La parte destra del grafico si riferisce alla fase di
test. È possibile vedere il codice della funzione nei
sorgenti allegati alla presente relazione.
2.5
• In alto a sinista si può vedere il grafico relativo
alla fase di training della rete MLP;
Realizzazione del main
La funzione main sostanzialmente non fa altro che
richiamare le funzioni precedentemete descritte va• In alto a destra viene riportato il grafico
riando il numero dei neuroni e l’intensità del rumorelativo alla fase di testing della rete MLP;
re applicato sui dati. Si sono dichiarati due vettori,
1 Più grande sarà lo spread (apertura in inglese) più ark ed L, che rispettivamente contengono il numemoniosa e precisa, in genere, sarà l’approsimazione della fun- ro di neuroni che si assegnano alla rete e il livello
zione da parte della rete. Tuttavia si ha che con uno spread
di rumore che si applica ai dati, come mostrato di
troppo grande sarà necessario un numero di neuroni molto
elevato perché la rete possa approssimare una funzione che seguito:
cambia velocemente. Un spread troppo piccolo significa che
saranno richiesti molti neuroni per aprossimare una funzione
regolare impedendo alla rete di generalizzare bene. La scelta
di questo parametro quindi è fondamentale per permettere
alla rete di funzionare bene e solitamente è richiesto un certo numero di prove per la determinazione dello spread che
è strettamente collegato alla complessità e alla varietà delle
situazioni che la rete dovrà affrontare;
k = [5, 10 ,20];
L = [0, 0.2 , 0.5];
Succesivamente girano due cicli for annidati: quello più esterno contiene l’indice i sull’array K (dei
neuroni), mentre quello più interno contiene l’indice
j sul rumore sulla array L (del rumore).
4
Viene quindi creata una rete inizialmente con 5
neuroni nello strato nascosto e viene addestrata e
testata per tutti i livelli di rumore presenti nell’array L; successivamente viene creata una nuova rete
con 10 neuroni nello strato nascosto e anche questa
viene addestrata e testata per tutti i livelli di rumore presenti nell’array L. In fine si crea un’ultima
rete con 20 neuroni nello strato nascosto che viene addestrata e testata su tutti i livelli di rumore
presenti nell’array L.
Per tutte le iterazioni viene chiamata la funzione
ploxy che produce il grafico relativo alla rete realizzata (si avranno quindi in totale 9 grafici che illustreranno le prestazioni delle reti nelle condizioni
di 5 neuroni per tutti i livelli di rumore, 10 neuroni
per tutti i livelli di rumore e, in fine, 20 neuroni per
tutti i livelli di rumore).
Di seguito viene riportato il codice illustrato
precedentemente.
i valori numerici dello scarto quadrativo medio per
entrambi le reti sia sul training che sul test set (poco significativo quest’ultimo per quanto riguarda la
rete RBF, ma comunque calcolato e visualizzato).
L’applicazione è stata realizzata servendosi dello strumento GUIDE per collocare i vari elementi
dell’interfaccia nella posizione desiderata della finestra. A questo punto è stato scritto un callback
associato all’evento di pressione del tasto presente nell’interfaccia: questo prende i parametri in ingresso, calcola il main dell’esercitazione 1 con questi
parametri e visualizza le uscite nella stessa finestra
sotto forma di grafici e campi di testo. In particolari, i grafici sono realizzati con due colori: in rosso
c’è l’andamento ideale, mentre in blu si può vedere
il risultato del training e della simulazione sul test
set. In basso nell’interfaccia appaiono anche i valori
di SSE.
Poiché la maggior parte del lavoro è stato realizzato attraverso uno strumento grafico semi automatico, mostriamo solo il codice relativo al callback,
che rappresenta di fatto l’unica parte realizzata da
noi.
%Codice della funzione main
k = [5, 10 ,20];
L = [0, 0.2 , 0.5];
for i = 1:3 % indice sui neuroni
for j = 1:3 % indice sul rumore
% Training set
[x tr, y tr] = datagenxy(’sin’, 500, 0, 6.28, L(j));
% Test set
[x ts, y ts] = datagenxy(’sin’, 50, 0, 6.28, 0);
% −−− Executes on button press in pb simulation plot.
function pb simulation plot Callback(hObject, eventdata,
handles)
% hObject handle to pb simulation plot (see GCBO)
% eventdata reserved − to be defined in a future version
of MATLAB
% handles structure with handles and user data (see
GUIDATA)
[y tr mlp, y ts mlp] = fun appr mlp(x tr’, y tr’,
x ts’, k(i));
[y tr rbf, y ts rbf] = fun appr rbf(x tr’, y tr’, x ts’,
k(i));
function string = get(handles.ed function string, ’String’);
sx = str2num(get(handles.ed estremo sx, ’String’));
dx = str2num(get(handles.ed estremo dx, ’String’));
N = str2num(get(handles.ed points, ’String’));
L = str2num(get(handles.ed noise, ’String’));
k = str2num(get(handles.ed neurons, ’String’));
plotxy(x tr, y tr, x ts, y ts, y tr mlp, y ts mlp,
y tr rbf, y ts rbf)
%figure;
end
end
%subplot(handles.axes1);
[mlp tr, mlp ts, rbf ts, rbf tr] = main(function string, sx,
dx,N, L, k);
3
Esercitazione 3: interfaccia
grafica
set(handles.sse
set(handles.sse
set(handles.sse
set(handles.sse
L’esercitazione 3 (di cui non riportiamo il testo) richiede di prendere familiarità con le interfacce grafiche e di realizzarne una per l’applicazione appena
descritta.
Si tratta di fatto di accettare una serie di parametri e di mostrare a video i grafici relativi all’andamento del training e del test set sia per la MLP
che per la RBF. Inoltre l’interfaccia mostra a video
5
mlp tr, ’String’, mlp tr);
mlp ts, ’String’, mlp ts);
rbf tr, ’String’, rbf tr);
rbf ts, ’String’, rbf ts);
Scarica