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.