Reti Neurali e Intelligenza Artificiale: Introduzione al progetto Open Source Joone (Joone Object Oriented Neural Engine).
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).
Figura 2 – Esempio di neurone
Come lavora una rete neurale?
Per prima cosa si deve istruire la rete neurale attraverso una fase di apprendimento, ossia:
- Fornire i dati alla rete
- La rete calcola un risultato
- La rete confronta il risultato ottenuto con il valore desiderato
- La rete introduce dei pesi per correggere l‘errore
Figura 3 – Fase di apprendimento
successivamente, si potrà utilizzare la rete neurale, ossia:
- Fornire nuovi dati alla rete
- 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)
Figura 4 – Esecuzione diÃÂ JooneEditor1.2.1-Win-NoVM.exe
Premere il pulsante Next fino alla fine e per ultima il pulsante “Done” (figura 5)
Figura 5 – Fine Installazione di Joone
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à implemetare è quella rappresentata in figura 6:
Figura 6 – Rete Neurale XOR
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):
Figura 7 – Editor Joone
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.
Figura 8 – Input, Hidden, Output Layers
Inserire un “File Input layer” alla sinistra dell‘input layer e collegarlo all‘Input Layer come in figura 9.
Figura 9 – File Input Layer 1
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 files).
Figura 10 – File Input Layer 1 Properties
Adesso dobbiamo inserire un Teacher layer alla destra dell‘output layer.
ÃÂ Collegare l‘output layer al Teacher layer (figura 11).
Figura 11 – Teacher Layer
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:
Figura 12 – File Input Layer 2
Cambiare le impostazioni al “File Input layer”nel modo seguente (figura 13):
Impostare il parametro AdvancedColumnSelector a 3
Impotare il parametro “fileName parameter” scegliendo il file xor.txt
Lasciare il parametro firstRow a 1 ed il pametro lastRow a 0 (zero vuol dire che il File Input Layer leggerà tutto il file).
Figura 13 – File Input Layer 2 Properties
Aprire adesso la Finestra Tools e scegliere Control Panel (Figura 14).
Figura 14 – Control Panel 1
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
Figura 15 – Control Panel 2
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.
Figura 16 – File Output Layer
Impostare le proprietà nel modo seguente (figura 17):
Parametro fileName con /tmp/xorout.txt
Figura 17 – File Output Layer
Disabilitare il Teacher Layer modificando le sue Properties (figura 18).
Figura 18 – Teacher Disabled
La rete neurale dovrebbe essere come in figura 19:
Figura 19 – Layers
Aprire adesso la Finestra Tools –> Control Panel (Figura 20).
Figura 20 – Control Panel 3
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)
Marco Ratto ha conseguito la laurea in Scienze dell‘Informazione nel 1999 presso la Facoltà di Scienze Matematiche Fisiche e Naturali dell‘Università degli Studi di Torino con la realizzazione della tesi ‘‘Accesso remoto ad un servizio di creazione di un orario: autenticazione dell‘utente in ambiente Java‘‘ .
Dal 1994 ha iniziato a lavorare come consulente nel settore IT e dal 2000 lavora come esperto di tecnologie J2EE ed Open Source in Banksiel per quanto riguarda il campo bancario/assicurativo e in Finsiel nel campo della Pubblica Amministrazione.