Il principio fondamentale è che invece di scrivere un programma di calcolo con istruzioni esplicite, esempio di calcolo simbolico, si cerca, con apposite procedure di addestramento, di ottenere una rete con connessioni fra le unità i cui valori consentano alla rete di risolvere il compito per cui è stata addestrata in maniera implicita, con semplici calcoli analogici come il computo del livello di attivazione di ciascuna unità.
Fra le numerose applicazioni ingegneristiche di sistemi artificiali basati su reti neurali ve ne sono alcune in ambito medico, ad esempio per aiutare medici umani o sistemi esperti tradizionali nelle diagnosi di patologie specifiche da un insieme di sintomi e dati sul paziente. La rete li confronta, con un' impressione per così dire visuale piuttosto che logico- simbolica, con il quadro presentato da altri pazienti di cui è già nota la diagnosi corretta, e che viene fornito alla rete in fase di addestramento.
Queste applicazioni delle reti neurali hanno avuto un grado variabile di successo pratico, ma in generale ci si scontra con due caratteristiche dei sistemi artificiali fondamentalmente differenti da quelle del sistema nervoso:
1) le unità di calcolo di un sistema artificiale possono operare con estrema velocità, milioni di volte più veloci dei neuroni che costituiscono le unità di calcolo del nostro sistema nervoso
2) bisogna però spiegar loro cosa fare, almeno al livello di fornirgli richieste precise in fase di addestramento, mentre le reti neurali naturali sfruttano meccanismi di apprendimento basati sulla modifica spontanea e indipendente di un numero enorme di connessioni sinaptiche (ne abbiamo circa un milione di miliardi nel nostro cervello) fra i singoli neuroni.
Anche se crediamo adesso di comprendere, in prima approssimazione, i principi della plasticità sinaptica, non riusciamo per ora a convincere nessun sistema artificiale, da noi costruito, a modificare spontaneamente un milione di miliardi di variabili, senza che gli diciamo noi come fare.
Esiste poi una branca in forte espansione nell'ambito delle neuroscienze, che studia i processi naturali di calcolo neurale, realizzati nelle reti del nostro sistema nervoso. Questo è un campo affatto diverso e per me affascinante, i cui rudimenti ho cercato di spiegare in un libriccino introduttivo edito dalla Bruno Mondadori, Come funziona la memoria (1999).
Anche qui si ha a che fare, in un certo senso, con la medicina, ma si affrontano, ben prima delle patologie, questioni fondamentali della ricerca di base del tipo: a cosa corrispondono, nel nostro cervello, i processi mentali, il pensiero?Le reti neurali (o neuronali) sono una delle aree più interessanti della ricerca in Intelligenza Artificiale. Nonostante la loro ideazione risalga ai primi anni '60, solo di recente si sono avuti notevoli risvolti applicativi e teorici.
L'idea che sta alla base delle reti neurali è quella di "imitare" in funzionamento del cervello, utilizzando un certo numero di semplici elementi di calcolo fortemente interconnessi tra loro per elaborare dati.
Gli elementi di calcolo semplici vengono chiamati neuroni. In una rete neurale alcuni neuroni sono utilizzati come ingressi, altri come uscite, altri ancora (non sempre presenti) non sono connessi con l'esterno e svolgono una funzione di "calcolo" e vengono chiamati neuroni "nascosti" (hidden).
La grande differenza rispetto ad altri sistemi di calcolo consiste nel fatto che la rete non è programmata per svolgere un determinato compito, ma viene "addestrata" mostrandole degli esempi (sotto forma di coppie ingresso-uscita), la rete impara così ad associare ad ogni ingresso un'uscita e anche in una certa misura a generalizzare quello che ha imparato per ingressi che non le erano stati presentati in fase di addestramento. Così per ottenere l'uscita voluta è sufficiente che l'ingresso "somigli" a quello originario. Questa proprietà rende le reti neurali adatta a tutti i compiti che hanno a che fare con il riconoscimento e classificazione di input (caratteri, immagini, suoni...).
Le capacità della rete sono determinate sia dal numero di neuroni, sia soprattutto dalla topologia (cioè da come sono collegati tra loro i neuroni). Esistono infinite topologie possibili, ma le più utilizzate si possono schematizzare in due classi: le reti alimentate in avanti (feed forward) e le reti ricorrenti (o ricorsive).
Nelle prime non esiste nessun collegamento che riporti in qualche modo le uscite in ingresso, questo le rende abbastanza semplici da studiare ed addestrare ma non gli permette di mantenere uno "stato" interno, cioè una memoria di quello che è successo nel passato. Questo tipo di rete è il più studiato ed utilizzato.
Le reti ricorrenti hanno delle capacità più estese però non sono state in generale ancora ben comprese e non si conosce sempre un metodo adatto per addestrarle.
Percettrone multi livello (Multi Layer Perceptron)
Una delle reti di più utilizzate è il cosiddetto "percettrone multi livello".
Per permettere alla rete di apprendere funzioni non lineari è necessario usare una funzione non lineare. Le funzioni più utilizzate sono la funzione "gradino", e la funzione "sigmoide" (nota anche come funzione di Fermi). La prima viene utilizzata quando è necessaria una risposta "digitale" (cioè di tipo on/off), la seconda quando invece l'uscita deve assumere valori continui compresi in un intervallo limitato.
Ottenere il valore dell'uscita dati gli ingressi si riduce a fare propagare in avanti il segnale, cioè a calcolare in successione tutte le varie attivazioni partendo dagli ingressi.
L'addestramento della rete risulta un pò più complesso: all'inizio la rete non contiene nessuna informazione, si assegnano i valori dei pesi in modo casuale (ad esempio con valori compresi tra -0.5 e 0.5), successivamente si presentano gli ingressi, si calcola l'uscita della rete, si calcola l'errore, come differenza tra il valore ottenuto e i valori che si volevano, e si aggiustano i pesi in modo da fare diminuire l'errore.
Per aggiustare i pesi esistono diverse regole a seconda del tipo di rete, per una rete senza strati nascosti si utilizzano la formula seguente:
Wj = Wj + alj * (T-O)
dove Wj è il peso del collegamento j-esimo, alfa è una costante chiamata "velocità di apprendimento" (learning rate), Ij è l'ingresso j-esimo, T è l'uscita i-esima desiderata e O è l'uscita i-esima della rete. La costante alfa viene utilizzata per diminuire la velocità di convergenza, in modo da limitare oscillazioni attorno al minimo di errore (l'errore è rappresentato da T-O).
Reti di questo tipo con funzioni di attivazione lineari (chiamate adalines) vengono impiegate spesso nel riconoscimento dei caratteri o nella costruzione di filtri adattivi.
Se la rete contiene strati di neuroni nascosti è necessario utilizzare per l'addestramento la tecnica di "backpropagation", grazie alla quale si riesce a suddividere l'errore all'uscita tra i neuroni dei livelli nascosti e quindi a variare i pesi in modo da minimizzare l'errore.
Nell'addestramento di una rete neurale è importante presentare tutte le coppie di ingresso-uscita diverse volte. Ciascuna presentazione viene chiamata "epoca" di addestramento. Se l'addestramento procede correttamente ad ogni epoca l'errore (quadratico) medio su tutte le uscite dovrebbe diminuire.
L'algoritmo di addestramento può essere schematizzato come segue:
;Ripeti per n epoche
Per ogni esempio di addestramento
Presenta ingressi
Propaga in avanti
calcola errore (T-O)
Ritocca pesi
Fine ciclo esempi
Fine ciclo epoche
Per utilizzare una rete neurale nella risoluzione di un particolare problema è opportuno cercare di identificare gli ingressi e le uscite che riescano a caratterizzare bene il problema. Riguardo alla topologia della rete da usare non si può dire molto, in quanto non sono ancora disponibili teorie riguardo al numero ottimale di neuroni e collegamenti da utilizzare.
Un risultato importante è che le reti con un solo livello nascosto riescono a rappresentare tutte le funzioni continue, mentre le reti con due livelli riescono a rappresentare anche quelle discontinue. Le prestazioni di tutte le reti neurali dipendono molto dal set di addestramento: più il set è rappresentativo del problema e più è completo più le prestazioni saranno migliori e la anche la capacità di generalizzare della rete sarà migliore.
Esempio. La rete della prima figura è un rete che viene utilizzata di solito nel riconoscimento di caratteri. In questo caso numero delle uscite sono tante quante i caratteri da riconoscere (un neurone per ogni carattere). Gli ingressi ricevono la luminosità media di un certo numero di aree dell'immagine (normalmente disposte a griglia). Il neurone che ha attivazione più alta in uscita viene considerato come risposta della rete.
Atri tipi di reti neurali
Tra i numerosi tipi di reti neurali esistenti sono da ricordare le reti di Hopfield e le self organizing nets di Kohonen.
Le prime sono delle reti ricorrenti formate da un solo strato di neuroni. Ciascun uscita è collegata agli ingressi di tutti gli altri neuroni. Questa rete viene addestrata utilizzando delle particolari formule lineari e può funzionare come rete auto associativa. Dopo la fase di allenamento la rete è in grado di riconoscere una configurazione che ha imparato (anche se parzialmente corrotta) e di presentare in uscita la versione originale (quindi integra). La rete viene utilizzata ad esempio per riconoscere immagini ad un solo bit colore. Un risultato teorico interessante è che la rete può memorizzare in maniera affidabile fino a 0.138N esempi, dove N è il numero di neuroni della rete.
Le reti di Kohonen invece costituiscono un esempio di reti che sono in grado di apprendere senza bisogno di supervisione, cioè hanno la capacità di ricevere diverse configurazioni in ingresso e di classificarle per somiglianza. Anche in questo caso le formule usate nell'addestramento sono diverse da quelle usate per i percettroni.
Nessun commento:
Posta un commento