Esercitazione N°5
Approssimazione di Funzioni
Esercizio 1
Costruzione di una rete RBF
Il metodo più semplice per approssimare una
funzione mediante reti neurali è quello di
usare le Radial Basis Functions (RBF).
Queste hanno una struttura come quella
descritta nella figura seguente:
Gli ingressi passano attraverso un primo
strato di connessioni per costituire l'ingresso
di uno strato di neuroni con funzione di
attivazione di tipo gaussiano. Le uscite dello
strato sono combinate linearmente per dare
le uscite. Nella versione più semplice, viene
assegnato un neurone nascosto ad ogni
pattern del training-set e si definiscono i
pesi del primo strato di connessioni in modo
tale che la gaussiana abbia il massimo in
corrispondenza del punto.
E' quindi possibile, ed anche semplice, definire
i pesi delle connessioni del secondo strato che
ricalcano perfettamente i valori del target in
corrispondenza dei punti del training set.
Una seconda versione di RBF ammette un
certo valore di errore, posizionando il massimo
della gaussiana in corrispondenza di una parte
del training set o di punti medi di gruppi di
punti. In questo modo, ammettendo di avere
un'approssimazione non esatta della funzione,
si può ridurre il numero di neuroni dello strato
nascosto.
La funzione di attivazione utilizzata dalle RBF
si richiama con la parola chiave radbas:
>> p = -3 : 0.1 : 3;
>> a = radbas(p);
>> plot(p,a);
Vediamo come si possano usare le RBF per
costruire una funzione. Nell'esempio che
segue, tre funzioni radbas sono combinate
linearmente per ottenere la funzione che in
figura appare di colore magenta. La principale
differenza, rispetto alle MLP viste finora, è
che le funzioni elementari che vengono
combinate sono pressoché ortogonali tra loro.
>> p = -3 : 0.1 : 3;
>> clf
>> hold on;
>> plot(p,radbas(p));
>> plot(p,radbas(p-1.5));
>> plot(p,radbas(p+2));
>> rb1 = radbas(p);
>> rb2 = radbas(p-1.5);
>> rb3 = radbas(p+2);
>> plot( p, rb1+ rb2 + 0.5*rb3 , 'm' );
Matlab prevede due comandi distinti per la
costruzione di reti RBF, a seconda che si
ammetta o no un errore di approssimazione
della funzione.
Il comando newrb crea una rete RBF
ammettendo un errore di approssimazione
assegnato come parametro. La sintassi è la
seguente:
>> eg = 0.02; % errore ammesso
>> sc = 1; % costante di spread
>> p = -3 : 0.1 : 3; % ingressi
>> t = sin(p); % target
>> net = newrb(p,t,eg,sc); % costruzione RBF
plottando i campioni della funzione insieme
alle uscite della rete otteniamo il seguente
grafico:
>> plot(p,sim(net,p),'*',p,t,'o')
Esclusi due campioni, l'approssimazione è
accettabile. Possiamo vedere cosa succede
se riduciamo il coefficiente sc, cioè se
utilizziamo gaussiane più strette:
>> eg = 0.02; % errore ammesso
>> sc = 0.01; % costante di spread
>> p = -3 : 0.1 : 3; % ingressi
>> t = sin(p); % target
>> net = newrb(p,t,eg,sc); % rete RBF
Eseguendo il plot in questo secondo caso, i
punti della funzione sono riprodotti con la
stessa precisione di prima, ma ora la rete
ha 50 neuroni nello strato nascosto, mentre
prima ne aveva solo 25. Inoltre, se si
riduce il passo di campionamento, si può
osservare che l'uscita della rete
corrisponde alla funzione approssimata
solo nei punti di addestramento, mentre in
tutti gli altri punti l'errore può essere
elevato.
Viceversa, se il parametro sc è molto elevato,
per esempio sc = 100, la rete ha difficoltà ad
approssimare anche i punti di addestramento.
Lo stesso problema si può affrontare con le reti
RBF esatte. In questo caso i parametri di
errore e di varianza della gaussiana non
devono essere più assegnati, perché il primo è
nullo per definizione e il secondo viene
calcolato dall'algoritmo sulla base della
distribusione dei punti di addestramento nello
spazio degli ingressi. La funzione per la
costruzione di una tale rete è newrbe:
>> p = -3 : 0.1 : 3; % ingressi
>> t = sin(p); % target
>> netE = newrb(p,t); % rete RBF
Ripetendo i comandi per la graficazione dei
punti utilizzata in precedenza, si può
osservare che la rete approssima
perfettamente la funzione anche in punti
diversi da quelli di addestramento.
Inevitabilmente, la rete RBF creata in
questo modo ha 61 neuroni nascosti, tanti
quanti sono i campioni utilizzati
nell'addestramento.
Possiamo provare ad approssimare la stessa
funzione con una rete MLP:
>> netFF =
newff([-3 3], [10 1], {'logsig' 'purelin'});
>> netFF = train(netFF,p,t);
lo strato nascosto ha soltanto 10 neuroni.
L'addestramento della rete è piuttosto
rapido. In 100 epoche raggiunge un errore
di 5e-9. Vediamo la qualità
dell'approssimazione:
>> plot(pp,sim(netFF,pp),'.',pp,sin(pp));
L'approssimazione è buona quanto quella
della rete RBF con 61 neuroni nascosti.
Esercizio 2
Funzione di Schwefel
La funzione di Schwefel è così
definita:
f : [0 ; 500]n  
n
f x    xi  sin
i 1
 x
i
Grafichiamo la funzione nel caso di n = 2
>> [X,Y] = meshgrid(0:500, 0:500);
>> Z = -X.*sin(sqrt(X)) -Y.*sin(sqrt(Y));
>> mesh(Z);
si ottiene la seguente figura:
Lo studente approssimi questa funzione con
una RBF esatta, con una approssimata e
con una MLP. Confronti, poi le prestazioni
e le dimensioni delle tre reti ottenute.