Pattern Recognition con Reti Neurali MLP Esercitazione N°3 Pattern Recognition con Reti Neurali MLP
Esercizio 1 – Superfici di decisione Una rete neurale come quella di Fig. 1 permette di classificare due insiemi di punti tra loro linearmente separabili. Infatti, il valore su cui viene calcolata la funzione soglia è pari a: bias uscita ingresso wi S f (.) Fig. 1 In figura è riportato uno schema di Perceptron con un solo neurone di uscita. Come si può notare, lo schema è molto simile a quello del regressore lineare, visto nell’esercitazione precedente, con la differenza che il processore elementare (neurone) effettua due operazioni in serie sugli ingressi: prima somma gli ingressi, poi applica a tale somma una funzione soglia. Il tipo più semplice di funzione soglia è il gradino, adottato da Mc Culloch e Pitts: essendo x il vettore degli ingressi, w il vettore dei pesi delle connessioni, b il valore di bias. Una funzione soglia come quella di Fig. 2 applica la funzione segno alla quantità net: Di conseguenza, lo spazio dei punti in cui è definito x (spazio degli ingressi) viene diviso in due semi-spazi, ognuno associato ad una delle due uscite della rete. La frontiera dei due semi-spazi è data dai punti in cui net cambia segno: 1 -1 Input Output Fig. 2
Utilizzeremo solo i comandi dal prompt. Per definire un nuovo perceptron utilizziamo il seguente comando: >> net = newp(pr,s,tl,sf); essendo: pr: intervallo di variazione degli ingressi s: numero di neuroni di uscita tf: funzione di trasferimento lf: funzione di apprendimento Nel nostro esempio vogliamo esplorare la regione quadrata centrata nell’origine di lato 2, abbiamo un solo neurone di uscita, con funzione di trasferimento a gradino (‘hardlim’, default), mentre non ci interessa la funzione di apprendimento perché assegnamo noi i pesi delle connessioni: >> net = newp([-1 1; -1 1],1); Ora assegnamo i pesi delle connessioni: >> net.IW{1}=[1 1]; % connessioni >> net.b{1} = -1; % bias ossia la rete di Fig. 1 effettua una separazione lineare dello spazio degli ingressi. Infatti, la frontiera che separa i due semi-spazi (superficie di decisione) è un iperpiano, la cui equazione ha coefficienti pari ai pesi delle connessioni e termine costante pari al valore di bias. In Fig. 3 Sono indicati una rete con due ingressi e i due semi-spazi da essa individuati nello spazio degli ingressi. bias uscita 1 S -1 x1 x2 Fig. 3 uscita = 1 uscita = -1 Costruiamo questo esempio nell’ambiente di Matlab:
Osserviamo come viene mappato lo spazio degli ingressi: >> x = -1:0.01:1; >> y = x; >> for i = 1:201, for j = 1:201, z(i,j) = sim(net, [x(i);y(j)]); end >> mesh(x,y,z) La rete che abbiamo costruito mappa lo spazio degli ingressi nei due valori 1 e 0, perché per default viene assunta la funzione di soglia con questi valori dell’uscita. Se vogliamo modificare i valori in uscita dalla rete modifichiamo la funzione soglia: >> net.layers{1}.transferFcn = 'hardlims'; In questo modo le uscite sono –1 e 1, come previsto dal modello di McCulloch-Pitts. In alternativa possiamo utilizzare una funzione soglia continua, con una regione di frontiera tra i due semi-spazi associata a valori intermedi tra quelli di saturazione: >> net.layers{1}.transferFcn = ‘logsig';
Esercizio 2 – Classificazione in R1 In ingresso alla rete sono inviati i campioni di una sinusoide, ai quali si vuole applicare una soglia in corrispondenza del valore 0,5. Definiamo il vettore x dei punti in cui campionare la sinusoide, e i valori di y corrispondenti. L’asse y rappresenta il dominio degli ingressi della rete neurale. Il vettore target ha le dimensioni di y ed ha componenti uguali a 1 in corrispondenza delle componenti di y maggiori di 0,5 mentre le altre componenti sono uguali a –1. In figura è riportata la sequenza dei valori di y (asterischi) e i corrispondenti valori del target (cerchietti). Il comando “>>hold on” permette di sovrapporre i grafici. Una linea orizzontale separa i punti delle due classi. La rete neurale ha le seguente struttura: Utilizziamo una rete come quella dell’esercizio precedente per applicare un valore di soglia ad un segnale di ingresso: >> x = 2*pi*(0:0.05:1); >> plot(sin(x),'*'); >> y = sin(x); >> target = -ones(1,21); >> target(find(y > 0.5)) = 1; >> hold on; >> plot(target,'ro'); >> axis([0 25 -1.2 1.2]); >> line([0 25],[0.5 0.5]) bias uscita 1 S -0.5 y
Infatti, l’ingresso al neurone vale: I = 1*y – 0,5 che è negativo per y < 0,5 e positivo per y > 0,5 Costruiamo la rete richiesta: >> net = newp([-1 1],1); >> net.layers{1}.transferFcn = 'hardlims'; >> net.IW{1} = 1; >> net.b{1} = -0.5; Notiamo che la funzione di soglia è stata modificata perché per default si assume quella con uscite 0 e 1. Verifichiamo che la rete che abbiamo costruito effettui correttamente la classificazione dei punti di y. >> out = sim(net,y); >> hold on; >> plot(out,’m^’) % triangoli color magenta Si ottiene il grafico seguente: Le uscite calcolate si sovrappongono esattamente con i valori di target, quindi si ottiene la classificazione corretta per tutti i campioni.
Insiemi non linearmente separabili. Esercizio 3 – Insiemi non linearmente separabili. Riprendiamo l’esempio dell’esercizio precedente, ma modifichiamo la mappatura dello spazio degli ingressi nel seguente modo: >> x = 2*pi*(0:0.05:1); >> y = sin(x); >> target = -ones(1,21); >> target([find(y > 0.5) find(y < -0.5)]) = 1; cioè sono associati al valore 1 i valori superiori a 0,5 e quelli inferiori a –0,5. >> plot(y,'*'); >> hold on; >> plot(target,'ro'); >> line([0;25],[0.5 0.5]) >> line([0;25],[-0.5 -0.5]) >> axis([0 25 -1.2 1.2]); Non è possibile definire un’unica soglia che distingua i due insiemi di punti, quindi dobbiamo prevedere una classificazione intermedia, che ci porta alla costruzione di una rete a più strati: (Multi Layer Perceptron, MLP) La struttura della rete è la seguente: 1 -1 y S uscita -0,5
uscita) e, a seguire, la funzione soglia per ogni strato. In questa rete, i due neuroni del primo strato (neuroni nascosti) classificano gli ingressi ognuno in base ad una soglia, nel senso che il primo neurone distingue dagli altri i valori superiori a 0,5 mentre il secondo neurone distingue dagli altri i valori inferiori a –0,5. I punti dello spazio degli ingressi sono proiettati in uno spazio di 2 dimensioni, diventando linearmente separabili. Per costruire la rete MLP utilizziamo una nuova funzione, utilizzata in generale per costruire reti neurali Feed Forward: >> mlp = newff([-1 1],[2 1],{'hardlims','hardlims'}); Visualizzare l’help in linea per un elenco completo delle opzioni di questo comando. Nel caso in esame abbiamo indicato l’intervallo di variazione degli ingressi (un solo intervallo perché abbiamo un solo ingresso), il numero di neuroni in ogni strato (cioè 2 nello strato nascosto e 1 in uscita) e, a seguire, la funzione soglia per ogni strato. Ora assegnamo i pesi alle connessioni. Anche se abbiamo reti con diversa struttura rispetto agli esercizi precedenti, Matlab tende, finché è possibile, a tenere fissi i nomi dei campi corrispondenti. In particolare questo vale per i campi delle connessioni che, come nel Perceptron a singolo strato, si chiamano .IW e .b In questo caso, però, esiste un campo aggiuntivo, che corrisponde alle connessioni tra lo strato nascosto e quello di uscita: .LW Ognuno di questi campi è costituito da una struttura a celle, alcune delle quali sono vuote, a causa delle caratteristiche da noi assegnate alla rete. Attribuiamo i pesi: >> mlp.IW{1} = [1; -1]; % pesi del I strato >> mlp.b{1} = [-0.5; -0.5]; % bias del I strato >> mlp.LW{2,1} = [1 1]; % pesi del II strato >> mlp.b{2} = 1; % bias del II strato
>> out = sim(mlp,y); >> hold on; 0,5 y -0,5 h1 h2 out 1 -1 Come nell’esercizio precedente, confrontiamo le uscite calcolate e i valori fissati come target. >> out = sim(mlp,y); >> hold on; >> plot(out,’m^’) % triangoli color magenta h1 out y h2 Ogni nodo rappresenta un asse coordinato in uno spazio associato allo strato di cui fa parte. In ognuno di tali spazi sono definiti iperpiani, i cui coefficienti sono pari ai pesi delle connessioni. Ad ognuno di tali iperpiani corrisponde un neurone dello strato successivo. Si noti come lo strato nascosto definisca uno spazio in cui le due classi sono linearmente separabili. La classificazione corretta è resa possibile dallo strato nascosto. Questo fatto si può mostrare graficamente.
Esercizio 4 – Il problema XOR. In questo caso lo spazio degli ingressi ha dimensione pari a 2, quindi i neuroni dello strato a seguire (nascosto) determinano superfici di decisione rappresentate da rette. E’ evidente che nessuna retta può risolvere, da sola, il problema dato, cioè non esiste una rette tale da far cadere i triangoli in un semi-spazio e i cerchietti nell’altro. Anche in questo caso è necessario prevedere uno strato nascosto di neuroni. Con lo stesso procedimento adottato nell’esercizio precedente, effettuiamo la separazione delle due classi di punti con una serie di separatori lineari e, ad ognuno, facciamo corrispondere un neurone dello strato successivo. I pesi delle connessioni con ogni neurone sono pari ai coefficienti della retta corrispondente, e il valore di bias al termine costante della stessa retta. In Fig.2 è mostrata una delle soluzioni possibili: Il problema dell’or esclusivo (XOR) è diventato un riferimento importante da quando Minsky e Papert lo utilizzarono per mostrare i limiti dell’approccio neurale. Da allora tali limiti sono stati abbondantemente superati, ma questo esempio continua ad essere utilizzato perché da qui sono derivati gli sforzi per definire tecniche di sintesi per reti neurali a più strati. In Fig. 1 sono mostrati la tabella della verità del problema e una sua rappresentazione grafica. x1 x2 x1 x2 out 1 Fig. 1
x1 x2 Fig. 2 Le funzioni lineari g1 e g2 diventano discontinue per effetto delle funzioni soglia dei neuroni nascosti. Adottando funzioni soglia con uscite 0 e 1, si può verificare facilmente che le uscite dello strato nascosto, in corrispondenza dei 4 ingressi del problema, valgono rispettivamente: Si noti che le due superfici di decisione sono state indicate come funzioni lineari e non come equazioni. Infatti, i neuroni nascosti individuano delle funzioni definite in TUTTO lo spazio degli ingressi, e le rette che abbiamo tracciato rappresentano solo la superficie di decisione, cioè il luogo dei punti in cui vale zero l’ingresso al neurone. Per questo motivo non è ininfluente cambiare il segno del gruppo di connessioni che convergono ad un neurone nascosto: infatti, con tale cambio di segno, si scambiano i valori delle uscite associati dal neurone ai due semi-spazi. Contrassegnamo con un segno + il semi-spazio associato dal neurone al valore +1 h1 h2 x1 x2 h1 h2 1 Fig. 3 Nel piano (h1,h2) le due classi di punti possono essere separate linearmente. In Fig. 3 è rappresentata la retta g3 = 0 che normalmente è considerata la soluzione migliore perché è quella che assicura il massimo margine rispetto ai punti da classificare. La g3 fornisce i pesi del secondo strato di connessioni. Ora possiamo disegnare la rete finale:
out(i,j) = sim(xor,[x1(i);x2(j)]); end >> mesh(x1,x2,out) x1 g1 >> for i = 1:51, for j = 1:51, out(i,j) = sim(xor,[x1(i);x2(j)]); end >> mesh(x1,x2,out) 1 x1 g1 x2 h1 g2 h2 g3 out -1 -1,5 0,5 -0,5 Fig. 4 Costruiamo questa rete su Matlab. >> xor = newff([0 1; 0 1 ],[2 1],{'hardlim','hardlim'}); si noti che, rispetto all’esercizio precedente, sono definiti due intervalli di variazione degli ingressi (due righe) e questo dato è utilizzato per indicare che la rete ha due ingressi. Assegnamo i pesi delle connessioni >> xor.IW{1} = [1 1; -1 -1]; >> xor.b{1} = [-1.5; 0.5]; >> xor.LW{2,1} = [1 1]; >> xor.b{2} = -0.5; Ora non resta che verificare la mappatura realizzata da questa rete. Fig. 5
Il criterio consiste in questo: Come indicazione, in questa sede, diamo un criterio che gode della proprietà, che non dimostriamo, di trasformare qualunque coppia di insiemi con un numero finito di punti in due insiemi linearmente separabili nello spazio associato allo strato nascosto. Il criterio consiste in questo: Si definisce una serie di superfici di decisione in modo tale che ognuna separi, via via, un gruppo di punti della stessa classe dal resto dei punti non ancora separati. La serie si interrompe quando i punti restanti appartengono tutti alla stessa classe. Si noti che questo criterio è stato adottato per risolvere l’esempio di questo esercizio. In Fig.6 è riportato un altro esempio. Commento Il metodo applicato nell’esercizio precedente può essere applicato in generale, ma non abbiamo affrontato un’importante questione: “Come possiamo essere sicuri che i due insiemi di punti diventino linearmente separabili nello spazio associato allo strato nascosto?” Infatti, se non adottiamo un criterio, la separazione effettuata dai neuroni nascosti potrebbe essere del tutto inutile. Si provi, per esempio, cosa succede se come superfici di decisione in Fig. 2 si adottano una retta orizzontale e una verticale. Il discorso può portare molto lontano, anche perché in generale si pone il problema di trovare non solo una soluzione che renda i due insiemi linearmente separabili, ma anche che non richieda un numero eccessivo di neuroni nascosti, meglio se si trovasse la soluzione con il numero minimo di neuroni. 1 2 3 4 Fig.6