Introduzione
In questo articolo verrà affrontato un argomento molto complesso ma anche molto affascinante: le Reti Neurali. Dopo una breve introduzione teorica sulle reti neurali, passerò ad illustrare un prodotto Open Source (Joone) con un piccolo esempio.
Reti Neurali Artificiali
Una rete neurale (vedere fig. 1) è composta da elementi di elaborazione (Neuroni) connessi tra di loro tramite collegamenti (Sinapsi), in modo da formare uno schema assimilabile ad un semplicissimo tessuto nervoso. I neuroni sono raggruppati in strati successivi (Layers), nei quali ogni neurone riceve il segnale esclusivamente dai neuroni dello strato precedente (rete neurale feed-forward).
Ogni Neurone, attraverso le connessioni (W1, W2, ...Wn), riceve in ingresso il segnale da tutti i neuroni dello strato precedente (I1, I2,...In). Gli input, così pesati, vengono sommati e al risultato finale (l'input netto) viene applicata una funzione di trasferimento. Il valore di output così calcolato (Y) viene presentato in ingresso ai neuroni dello strato successivo... e così via (figura 2).
Come lavora una rete neurale?
Per prima cosa si deve istruire la rete neurale attraverso una fase di apprendimento, ossia:
1. Fornire i dati alla rete 2. La rete calcola un risultato 3. La rete confronta il risultato ottenuto con il valore desiderato 4. La rete introduce dei pesi per correggere l'errore
Successivamente, si potrà utilizzare la rete neurale, ossia:
1. Fornire nuovi dati alla rete 2. La rete calcola il risultato in base alla conoscenza ottenuta nel passo precedente
Le caratteristiche principali di una rete neurale addestrata sono le seguenti:
Categorizzazione
Una rete neurale è in grado di classificare gli esempi in ingresso (patterns) "estraendo" le caratteristiche peculiari dai dati usati per il training.
Generalizzazione
Una rete neurale è in grado di fornire risposte corrette anche con dati di ingresso diversi rispetto a quelli usati per il training.
Robustezza
Una rete neurale è in grado di fornire comunque una risposta corretta anche in presenza di dati incompleti o parzialmente errati.
I campi di applicazione delle reti neurali sono i più svariati, ad esempio:
Classificazione
Diagnosi mediche, riconoscimento del testo (OCR), riconoscimento vocale, strumenti di anti-spam per e-mail, ecc.
Approssimazione di funzioni
Controllo dei processi, data modeling, ecc.
Predizione di serie temporali
Previsione andamento dei mercati finanziari, analisi di portafoglio, ecc.
Data Mining
Visualizzazione ed estrazione di dati, ecc.
Il progetto Joone
Joone (http://www.joone.org/) è un framework scritto in Java che serve a scrivere ed eseguire applicazioni di Intelligenza Artificiale basate sulle reti neurali. Le applicazioni che utilizzano Joone possono essere disegnate su una singola macchina, istruite utilizzando una rete distribuita ed eseguite su qualsiasi altro device che supporta java. Joone è realizzato con un'architettura modulare; i moduli principali di Joone sono:
- Un core engine che espone API Java per la costruzione di reti neurali embedded in altre applicazioni
- Un editor visuale per la creazione, addestramento e test di reti neurali attraverso un'interfaccia grafica user-friendly
- Un ambiente di training distribuito basato su tecnologia Jini, con il quale è possibile addestrare in parallelo diverse reti neurali su di un numero illimitato di macchine connesse in LAN
Installazione di Joone
Joone è 100% java e può essere eseguito su un qualsiasi sistema operativo dotato di Java Runtime Environment (JRE) versione 1.4.x o superiore. Attualmente il progetto è testato sui seguenti sistemi operativi:
- Linux
- Mac OSX
- Windows 2000
- Windows XP
- SUN Solaris
La memoria necessaria a far funzionare Joone è strettamente legata alla complessità della rete neurale (minimo 128 MB).
Su Linux è meglio utilizzare il file ZIP in quanto il file di setup JooneEditor1.2.1-Linux-NoVM.bin non funziona in modo corretto:
# unzip JooneEditor1.2.1-All.zip
Su Windows
Lanciare il file "JooneEditor1.2.1-Win-NoVM.exe" (figura 4):
Premere il pulsante Next fino alla fine e per ultima il pulsante "Done" (figura 5):
Esempio: calcolo della funzione XOR
Come esempio utilizzeremo Joone e le reti Neurali per il calcolo della funzione XOR. Per prima cosa rivediamo la tabella dello XOR:
| Input 1 | Input 2 | Output | |---------|---------|--------| | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 0 |
La rete neurale che si dovrà implementare è quella rappresentata in figura 6:
Aprire l'editor di Joone, su Linux:
# cd joone/ # ./RunEditor.sh
Su Windows fare doppio clic sull'icona "Joone".
Appare la seguente finestra (figura 7):
- Aggiungere un sigmoid layer e impostare come nome "Input" e come parametro rows 2
- Aggiungere un sigmoid layer e impostare come nome "Hidden" e come parametro rows 3
- Aggiungere un sigmoid layer e impostare come nome "Output" e come parametro rows 1
- Connettere l'input layer con l'hidden layer trascinando una linea dal cerchio blu del bordo destro dell'input layer, rilasciare il mouse sopra l'hidden layer
- Ripetere per collegare l'hidden layer all'output layer
Il risultato dovrebbe essere quello di figura 8:
Inserire un "File Input layer" alla sinistra dell'input layer e collegarlo all'Input Layer come in figura 9:
Cambiare le impostazioni al "File Input layer" nel modo seguente (figura 10):
- Impostare il parametro AdvancedColumnSelector a 1,2
- Impostare il parametro "fileName parameter" scegliendo il file xor.txt
- Lasciare il parametro firstRow a 1 ed il parametro lastRow a 0 (zero vuol dire che il File Input Layer leggerà tutto il file)
Adesso dobbiamo inserire un Teacher layer alla destra dell'output layer. Collegare l'output layer al Teacher layer (figura 11):
Adesso dobbiamo fornire i dati per istruire la rete (ossia l'ultima colonna del file xor.txt). Inserire un File Input layer sopra al Teacher layer, collegare il Teacher Layer al File Input Layer come in figura 12:
Cambiare le impostazioni al "File Input layer" nel modo seguente (figura 13):
- Impostare il parametro AdvancedColumnSelector a 3
- Impostare il parametro "fileName parameter" scegliendo il file xor.txt
- Lasciare il parametro firstRow a 1 ed il parametro lastRow a 0 (zero vuol dire che il File Input Layer leggerà tutto il file)
Aprire adesso la Finestra Tools e scegliere Control Panel (Figura 14):
Impostare i seguenti parametri:
- Parametro epochs a 10000 (il file verrà letto 10000 volte)
- Parametro "training patterns" a 4 (numero di righe dell'esempio)
- Parametro learningRate a 0.8
- Parametro momentum a 0.3
- Parametro learning a TRUE (perché la rete deve essere istruita)
Premere il pulsante Run per dar inizio al processo di apprendimento della rete. Attendere la fine dell'esecuzione, verificare che l'errore (RMSE) dovrà essere un numero molto piccolo inferiore a 0.1. Se fosse più grande, allora andare sulla voce di menu Tools, scegliere Randomize e poi premere di nuovo il pulsante Run.
A questo punto la rete è istruita ed è possibile salvare i dati della rete per poi ricaricarli successivamente andando sull'opzione File e poi Save as.
Vediamo se la rete neurale ha imparato correttamente verificandone il risultato. Aggiungere un File Output Layer come in figura 16:
Impostare le proprietà nel modo seguente (figura 17):
- Parametro fileName con /tmp/xorout.txt
Disabilitare il Teacher Layer modificando le sue Properties (figura 18):
La rete neurale dovrebbe essere come in figura 19:
Aprire adesso la Finestra Tools --> Control Panel (Figura 20):
Modificare solo i seguenti parametri:
- Parametro epochs a 1 (il file verrà letto una sola volta)
- Parametro learning a FALSE (non è più una fase di apprendimento)
Premere il pulsante Run.
Verrà scritto il file /tmp/xorout.txt. Il contenuto del file sarà simile al seguente:
# cat /tmp/xorout.txt 0.009558925072561689 0.9913854170900274 0.9912069173284735 0.008018880123792496
Questo risultato mostra come la rete neurale ha correttamente imparato il problema dello XOR, fornendo i valori corretti:
- un valore vicino allo zero per le colonne di input [0, 0] e [1, 1]
- un valore vicino ad 1 per le colonne di input [0, 1] e [1, 0]
Conclusioni
In questo articolo è stata fatta un'introduzione teorica sulle reti neurali e sul progetto Open Source Joone che permette di sperimentare ed apprendere meglio questa materia. Per chi volesse sperimentare un filtro Anti-Spam con Joone, è possibile scaricare i files necessari direttamente dal sito http://www.jugroma.it/jug/gen2006/joone/
Contenuto del file ZIP
Il file joone_esempio.zip (menu in alto a sinistra) contiene i seguenti files:
- xor.ser: il progetto di Joone
- xor.txt: il file di input
- xorout.txt: il file di output per verificare il risultato
Riferimenti
- [1] Paolo Marrone, "Joone Complete Guide", JooneCompleteGuide.pdf, 03/02/2005
- [2] Paolo Marrone, "JOONE, un framework Open Source per l'utilizzo delle Reti Neurali Artificiali in Java", mi28_p6_marrone.pdf, Javaconference 2006
- [3] Paolo Marrone, "The Core Engine", engine.pdf, 2004
- [4] Paolo Marrone, "The GUI Editor", guiEditor.pdf, 2004
- [5] Wiki, http://www.jooneworld.com/wiki
Risorse
[1] JDK 1.4.2, http://java.sun.com/j2se/1.4.2/download.html [2] Progetto, http://sourceforge.net/projects/joone [3] Joone 1.2.1, http://www.joone.org/ [4] Esempio dell'articolo, joone_esempio.zip (menu in alto a sinistra)
