In questo capitolo vedremo brevemente il funzionamento di una memoria associativa
realizzata in linguaggio c e contenuta nel dischetto in forma eseguibile.
La rete è in grado di apprendere una associazione di immagini a coppie realizzate
su files ascii con i caratteri "*" e "spazio" che rappresentano rispettivamente
pixel acceso e pixel spento.
Questa rete è una rete ciclica poichè presenta delle connessioni bidirezionali,cioè
gli output ritornano in "retroazione" sugli input (fig.1).
Un sistema retroazionato può presentare differenti comportamenti:
1)si produce una variazione continua dell output tale che il sistema "esplode":
si dice che è un sistema non convergente.
2)l output del sistema continua ad oscillare all infinito e quindi non converge anche
in questo caso.
3)l output converge verso un determinato valore o verso una determinata configurazione
dimostrando che il sistema è a tutti gli effetti una "macchina deterministica".
Quindi, da una rete neurale ciclica ci aspettiamo un comportamento come quello
descritto al punto 3: la rete, in risposta ad un input, avrà un certo numero di oscillazioni
prima di raggiungere uno stato di stabilità che coinciderà con una risposta in output.
Il programma della memoria associativa contenuto nel dischetto si chiama associa.exe,
ed è un programma esclusivamente didattico/dimostrativo: contiene una memoria
associativa tipo BAM(Bidirectional Associative Memory).
Regola di apprendimento La formula di addestramento utilizzata in questa memoria associativa è la regola di Hebb: DW(j,k)=P(j)*P(k)*t dove deltaW(j,k) = variazione del peso di connessione tra il neurone j e il neurone k P(j)=output del neurone j P(k)=output del neurone k t=fattore o tasso di apprendimentoQuesta regola si può spiegare in questi termini: aumenta il peso che connette due neuroni in modo proporzionale al prodotto degli output da loro forniti per un determinato input. Non è una regola universalmente valida ed è applicabile solo per particolari tipi di reti neurali,come quella di cui parliamo in questo capitolo. Esistono diversi tipi di regole di apprendimento destinate a scopi specifici,come la regola delta (dalla quale deriva la retropropagazione dell errore di cui parleremo approfonditamente), o la regola di Kohnen: voglio sottolineare che la regola di apprendimento è il punto critico di ogni rete neurale al di là della architettura sulla quale viene applicata.
Il programma associa.exe è in grado di memorizzare la associazione di coppie
di immagini realizzate con files tipo ascii. Per comodità si possono usare immagini
di lettere e numeri e associare in fase di addestramento lettere minuscole con
corrispondenti lettere maiuscole o lettere con numeri. Il programma presenta il seguente
menù:
feedforward (ciclo input>output) backforward(ciclo di retroazione)
U(k)= -1 se SI(k)<0 U(k)=-1 se SI(k)<0
U(k)= +1 se SI(k)>=0 U(k)=+1 se SI(k)>=0
dove U(k)=uscita o attivazione del neurone k e SI(k)=sommatoria degli inputs del neurone k
La rete in esecuzione oscilla finchè non è stato verificato uno stato di stabilità che
corrisponde all assenza di variazioni di attivazione di ogni neurone della rete.
In una realizzazione software si devono utilizzare alcune semplici procedure:
1) caricamento dei dati input nei neuroni del primo strato (vettore int) da file (pixels immagine)
2) visualizzazione dello stato dei neuroni del secondo strato(vettore int) mappati sull immagine
3) procedura apprendimento contenente regola di Hebb
4) procedura esecuzione che cicla finchè non viene verificata la stabilità
Tralasciamo le procedure 1 e 2 che dipendono dall utilizzo specifico della rete che
può essere differente dall associazione di immagini e, comunque, è abbastanza banale
per un programmatore realizzare una procedura che porti i dati da un file grafico
o di testo su un vettore binario (perchè la rete accetta in input solo valori 0 o 1),o che
visualizzi i dati binari contenuti in un vettore in forma grafica.
Vediamo invece più in dettaglio la realizzazione delle funzioni di apprendimento
ed esecuzione:
a) apprendimento
b) esecuzione
c) display immagine input
d) display immagine output
e) set dimensionale immagine
f) load pesi sinaptici da file
g) store pesi sinaptici su file
h) editor(per creare immagini)
i) edit su matrice dei pesi
l) mappare semigraficamente matrice pesi su file
m) calcolo automatico della distanza di Hamming
n) terminazione programma
Utilizzando la funzione edit disegnate su files le immagini che vi interessano
utilizzando i caratteri spazio(pixel spento) e "*"(pixel acceso)(vi sono sul dischetto
immagini di lettere già preparate che potete seguire come esempio).
Effettuate la fase di apprendimento fornendo i nomi dei due files da associare e
provate il richiamo con la funzione "esecuzione". Provate poi il richiamo modificando
leggermente qualche pixels dell immagine di input: potrete vedere come output
l immagine corretta associata. In questo punto sta il vero significato di una memoria
associativa realizzata con una rete neurale: una associazione tra due immagini potrebbe
essere realizzata con un qualsiasi semplice algoritmo, ma una leggera imprecisione
nei dati di input non porterebbe ad una risposta corretta.La rete neurale è in grado
di essere insensibile al rumore presente nell input e risalire all immagine di input
corretta, partendo da quella rumorosa, per poi fornire come output l immagine associata.
Abbiamo realizzato un robusto sistema di accesso alla memoria per contenuto e non
per indirizzo.Provate a visualizzare l immagine di input con "c" dopo avere eseguito la
rete con un input rumoroso e vedrete che l'immagine è stata corretta sui neuroni del
primo strato della rete dai cicli dovuti ai segnali di riporto dall'output.
Potete addestrare la rete neurale con altre coppie di immagini e verificare in esecuzione,
ma noterete che la capacità di memoria è molto limitata per cui dopo quattro o cinque
coppie cominceranno malfunzionamenti.
La funzione di trasferimento di ogni neurone di questa rete è del tipo a gradino(fig.2).
Una rappresentazione schematica della rete è visibile in fig.1 dove si possono notare
due strati di neuroni in cui i neuroni di ogni strato sono tra loro scollegati,mentre sono
collegati i neuroni di strati differenti.La funzione di trasferimento va intesa come
bidirezionale:
note: peso[k][j] =peso del collegamento
tra il k_esimo neurone del primo strato
e il j_esimo neurone del secondo strato
A[j]= somma dei segnali di ingresso del j_esimo neurone
U[j]= uscita del j_esimo neurone
apprendimento() { carica i dati input nel vettore neuroni primo strato di dimensione k carica i dati da associare nel vettore neuroni secondo strato di dimensione j per ogni neurone output(j) { per ogni input(k) { peso [k][j]=peso[k][j] + input[k]*output[j] (regola di Hebb) } } return }
esecuzione() { carica i dati di input nel vettore input di dimensione k finchè non è verificato stabilità=vero { stabilità=vero dall input verso l output: per ogni neurone output(j) { per ogni neurone input(k) { A2(j)=A2(j)+U1(k) * peso[j][k] } if (A2(j)>=0) then U2(j)=1 (funzione di trasferimento del neurone) else U2(j)=-1 } dall output verso l input(retroazione): per ogni neurone input(k) { per ogni neurone output(j) { A1(k)=A1(k)+U2(j) * peso[j][k] } if((A1(k)<0 and U1(k)=1) or (A1(k)>=0 and U1(k)=-1)) then stabilità=falso (cambiamento) if (A1(k)>=0) then U1(k)=1 (funzione di trasferimento del neurone) else U1(k)=-1 } } (chiude il ciclo verifica stabilità) return }
Per misurare la resistenza al rumore della rete potete modificare i files che
contengono le immagini di input, un pixel alla volta e presentarle in esecuzione.
Quando avete il primo risultato scorretto calcolate la distanza di Hamming* tra
l immagine rumorosa e l immagine originale:questa può essere una misura della
resistenza al rumore di questa memoria associativa. Con questo programma è
possibile editare il file di pesi delle connessioni tra i neuroni, cambiandone
qualcuno per simulare un "guasto neuronale" (che potrebbe esistere in una
implementazione hardware di rete neurale).
I grandi limiti di questa memoria associativa sono:
*distanza di Hamming= S(k) |px(k) - py(k)| cioè sommatoria dei moduli della differenza pixel - pixel
di due immagini
-scarsa capacità di memoria
-possibilità di lavorare con soli inputs booleani (0-1)
-necessità di avere dati di input tutti ortogonali tra loro: questo significa, per esempio
nel caso di immagini, che circa la metà dei pixels di ogni immagine devono essere
differenti da quelli di tutte le altre immagini. Anche in questo caso è possibile
calcolare la ortogonalità delle immagini con la distanza di Hamming: per funzionare
bene la nostra memoria associativa richiede immagini che abbiano tra loro distanze
di Hamming comprese tra 0.40 e 0.60.