Esercitazione N°3
Pattern Recognition con Reti Neurali MLP
Esercizio 1 – Superfici di decisione
wi
ingresso
S
uscita
f (.)
Fig. 1
bias
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:
1
Output
Input
-1
Fig. 2
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:
net  w  x  b
T
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:
net  0

net  0
uscita  1
uscita  1
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:
net  w  x  b  0
T
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.
x2
x1
1
uscita
1 uscita = 1
S
1
x2
-1
x1
uscita = -1 1
bias
Fig. 3
x1  x2 1  0
Costruiamo questo esempio nell’ambiente di
Matlab:
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
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
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
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])
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:
y
1
uscita
S
-0.5
bias
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.
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:
S
1
y
-0,5
S
-1
-0,5
1
1
1
S
uscita
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
y
Come nell’esercizio precedente, confrontiamo
le uscite calcolate e i valori fissati come target.
0,5
h2
out
1
h1
0
>> out = sim(mlp,y);
>> hold on;
>> plot(out,’m^’) % triangoli color magenta
0
-1
-0,5
out
h1
out
y
h2
La classificazione corretta è resa possibile
dallo strato nascosto. Questo fatto si può
mostrare graficamente.
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.
Esercizio 4 – Il problema XOR.
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
0
0
1
1
x2
0
1
0
1
out
1
0
0
1
x2
x1
Fig. 1
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:
x2


g1  x1  x2 1,5


x1
g2   x1  x2  0,5
Fig. 2
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
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:
x1 x2
h1
h2
0
0
1
1
0
0
0
1
1
0
0
0
0
1
0
1
h2

Fig. 3
h1

g3  x1  x2  0,5
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:
1
x1
g1 h1
-1
1
1
x2
-1
g2 h2
-1,5
1
-0,5
0,5
g3 out
Fig. 4
Costruiamo questa rete su Matlab.
>> x1 = 0:0.02:1;
>> x2 = 0:0.02:1;
>> for i = 1:51,
for j = 1:51,
out(i,j) = sim(xor,[x1(i);x2(j)]);
end
end
>> mesh(x1,x2,out)
>> 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
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.
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.
1
2
4
3
4
Fig.6
1
3
2
Scarica

Pattern Recognition con Reti MLP