# Intelligenza artificiale/Reti neurali

Intelligenza artificiale
Copertina Tutti i moduli · Sviluppo
* DefinizioneIntelligenza artificiale/Definizione
* StoriaIntelligenza artificiale/Storia
* FilosofiaIntelligenza artificiale/Filosofia
** Test di TuringIntelligenza artificiale/Test di Turing
** Stanza cineseIntelligenza artificiale/Stanza cinese
* Rappresentazione della conoscenzaIntelligenza artificiale/Rappresentazione della conoscenza
** Linguaggi formaliIntelligenza artificiale/Linguaggi formali
** Alberi di decisioneIntelligenza artificiale/Alberi di decisione
* Apprendimento automaticoIntelligenza artificiale/Apprendimento automatico
** Apprendimento non supervisionatoIntelligenza artificiale/Apprendimento non supervisionato
*** ClusteringIntelligenza artificiale/Clustering
*** Regole di associazioneIntelligenza artificiale/Regole di associazione
** Apprendimento supervisionatoIntelligenza artificiale/Apprendimento supervisionato
*** Regole di decisioneIntelligenza artificiale/Regole di decisione
*** Sistemi espertiIntelligenza artificiale/Sistemi esperti
** Apprendimento con rinforzoIntelligenza artificiale/Apprendimento con rinforzo
*** AgenteIntelligenza artificiale/Agente
*** Reti neuraliIntelligenza artificiale/Reti neurali
*** Algoritmi geneticiIntelligenza artificiale/Algoritmi genetici
*** ClassificatoriIntelligenza artificiale/Classificatori
* Logica FuzzyIntelligenza artificiale/Fuzzy
* Problema di soddisfacimento di vincoliIntelligenza artificiale/Problema di soddisfacimento di vincoli
* ApplicazioniIntelligenza artificiale/Applicazioni
Modifica il sommario
Una rete neurale è un insieme di neuroni biologici tra loro interconnessi. Nell'uso moderno si intende però di solito con rete neurale una rete di neuroni artificiali, che cerca di simulare il funzionamento dei neuroni all'interno di un sistema informatico. Può essere composta sia da programmi che da hardware dedicato. Spesso viene utilizzata in congiunzione alla logica fuzzy e funge da base per molti sistemi di intelligenza artificiale.

## Fondamenti biologici

In quasi tutti gli organismi viventi sono presenti complesse organizzazioni di cellule nervose, con compiti di riconoscimento delle configurazioni assunte dall'ambiente esterno, memorizzazione e reazione agli stimoli provenienti dallo stesso. Il cervello umano rappresenta probabilmente il più mirabile frutto dell'evoluzione per le sue capacità di elaborare informazioni. Al fine di compiere tali operazioni, le reti biologiche si servono di un numero imponente di semplici elementi computazionali (neuroni) fittamente interconnessi in modo da variare la loro configurazione in risposta agli stimoli esterni: in questo senso si può parlare di apprendimento ed i modelli artificiali cercano di catturare questo tratto distintivo della biologia.
Tipicamente un neurone è costituito di 3 parti principali: il soma (corpo cellulare), l'assone (linea di uscita del neurone unica ma che si può diramare anche in migliaia di rami) e il dendrite (detto anche albero dendritico in quanto la sua estesa ramificazione ne ricorda la forma, il quale funge da linea di entrata del neurone che riceve segnali in ingresso da altri assoni tramite sinapsi). Il corpo cellulare fa una "somma (algebrica) pesata" (integrazione) dei segnali in ingresso. Se il risultato eccede un certo valore di soglia allora il neurone si attiva ed è prodotto un "potenziale di azione" che è mandato all'assone. Se il risultato non eccede il valore di soglia, il neurone rimane in uno stato di riposo. Una rete neurale artificiale riceve segnali esterni su uno strato di nodi (unità di elaborazione) d'ingresso, ciascuno dei quali è collegato con numerosi nodi interni, organizzati in più livelli. Ogni nodo elabora i segnali ricevuti e trasmette il risultato a nodi successivi.

## Funzionamento di una rete neurale feedforward

Le reti neurali si basano principalmente sulla simulazione di neuroni artificiali opportunamente collegati. Il modello rappresentato in figura è quello proposto da McCullock e Pitts.
I suddetti neuroni ricevono in ingresso degli stimoli e li elaborano. L'elaborazione può essere anche molto sofisticata ma in un caso semplice si può pensare che i singoli ingressi vengano moltiplicati per un opportuno valore detto peso, il risultato delle moltiplicazioni viene sommato e se la somma supera una certa soglia il neurone si attiva attivando la sua uscita. Il peso indica l'efficacia sinaptica della linea di ingresso e serve a quantificarne l'importanza, un ingresso molto importante avrà un peso elevato, mentre un ingresso poco utile all'elaborazione avrà un peso inferiore. Si può pensare che se due neuroni comunicano fra loro utilizzando maggiormente alcune connessioni allora tali connessioni avranno un peso maggiore.
I singoli neuroni vengono collegati alla schiera di neuroni successivi, in modo da formare una rete di neuroni. Normalmente una rete è formata da tre strati. Nel primo abbiamo gli ingressi (I), questo strato si preoccupa di trattare gli ingressi in modo da adeguarli alle richieste dei neuroni. Se i segnali in ingresso sono già trattati può anche non esserci. Il secondo strato è quello nascosto (H, hidden), si preoccupa dell'elaborazione vera e propria e può essere composto anche da più colonne di neuroni. Il terzo strato è quello di uscita (O) e si preoccupa di raccogliere i risultati ed adattarli alle richieste del blocco successivo della rete neurale. Queste reti possono essere anche molto complesse e coinvolgere migliaia di neuroni e decine di migliaia di connessioni.

## Storia

L'ampia varietà di modelli non può prescindere dal costituente di base, il neurone artificiale proposto da W.S. McCulloch e W. Pitts in un famoso lavoro del 1943, il quale schematizza un combinatore lineare a soglia, con dati binari multipli in entrata e un singolo dato binario in uscita: un numero opportuno di tali elementi, connessi in modo da formare una rete, è in grado di calcolare semplici funzioni booleane.
Nel 1958, F. Rosenblatt introduce il primo schema di rete neurale, detto perceptron (percettrone), antesignano delle attuali reti neurali, per il riconoscimento e la classificazione di forme, allo scopo di fornire un'interpretazione dell'organizzazione generale dei sistemi biologici. Il modello probabilistico di Rosenblatt è quindi mirato all'analisi, in forma matematica, di funzioni quali l'immagazzinamento delle informazioni, e della loro influenza sul riconoscimento dei patterns; esso costituisce un progresso decisivo rispetto al modello binario di McCulloch e Pitts, perché i suoi pesi sinaptici sono variabili e quindi il percettrone è in grado di apprendere.
L'opera di Rosenblatt stimola una quantità di studi e ricerche, e suscita un vivo interesse e notevoli aspettative nella comunità scientifica, destinate tuttavia ad essere notevolmente ridimensionate allorché nel 1969 Marvin Minsky e Seymour A. Papert mostrano i limiti operativi delle semplici reti a due strati basate sui percettroni, e dimostrano l'impossibilità di risolvere per questa via molte classi di problemi, ossia tutti quelli non caratterizzati da separabilità lineare delle soluzioni: questo tipo di rete neurale non è abbastanza potente, infatti non è in grado di calcolare neanche la funzione or esclusivo (XOR). Di conseguenza, a causa di queste limitazioni, ad un periodo di euforia per i primi risultati della cibernetica (come veniva chiamata negli anni '60), segue un periodo di diffidenza durante il quale tutte le ricerche in questo campo non ricevono più alcun finanziamento dal governo degli Stati Uniti d'America;le ricerche sulle reti tendono, di fatto, a ristagnare per oltre un decennio, e l'entusiasmo iniziale risulta fortemente ridimensionato.
Il contesto matematico per addestrare le reti MLP (Multi-Layers Perceptron, ossia percettrone multistrato) fu stabilito dal matematico americano Paul Werbos nella sua tesi di dottorato (Ph.D.) del 1974. Uno dei metodi più noti ed efficaci per l'addestramento di tale classe di reti neurali è il cosiddetto algoritmo di retropropagazione dell'errore (error backpropagation), proposto nel 1986 da David E. Rumelhart, G. Hinton e R. J. Williams, il quale modifica sistematicamente i pesi delle connessioni tra i nodi, così che la risposta della rete si avvicini sempre di più a quella desiderata. L'algoritmo di backpropagation (BP) è una tecnica d'apprendimento tramite esempi, costituente una generalizzazione dell'algoritmo d'apprendimento per il percettrone sviluppato da Rosenblatt nei primi anni ’60. Mediante questa tecnica era possibile, come detto, trattare unicamente applicazioni caratterizzabili come funzioni booleane linearmente separabili.
L'algoritmo di apprendimento si basa sul metodo della discesa del gradiente che permette di trovare un minimo locale di una funzione in uno spazio a N dimensioni. I pesi associati ai collegamenti tra gli strati di neuroni si inizializzano a valori piccoli e casuali e poi si applica la regola di apprendimento presentando alla rete dei pattern di esempio. Queste reti neurali sono capaci di generalizzare in modo appropriato, cioè di dare risposte plausibili per input che non hanno mai visto.
L'addestramento di una rete neurale di tipo BP avviene in due diversi stadi: forward-pass e backward-pass. Nella prima fase i vettori in input sono applicati ai nodi in ingresso con una propagazione in avanti dei segnali attraverso ciascun livello della rete (forward-pass). Durante questa fase i valori dei pesi sinaptici sono tutti fissati. Nella seconda fase la risposta della rete viene confrontata con l'uscita desiderata ottenendo il segnale d'errore. L'errore calcolato è propagato nella direzione inversa rispetto a quella delle connessioni sinaptiche. I pesi sinaptici infine sono modificati in modo da minimizzare la differenza tra l'uscita attuale e l'uscita desiderata (backward-pass).
Tale algoritmo consente di superare le limitazioni del percettrone e di risolvere il problema della separabilità non lineare (e quindi di calcolare la funzione XOR), segnando il definitivo rilancio delle reti neurali, come testimoniato anche dall'ampia varietà d'applicazioni commerciali: attualmente la BP rappresenta un algoritmo di largo uso in molti campi applicativi.

## Algoritmo di Backpropagation

L'algoritmo di backpropagation è utilizzato nell'apprendimento con supervisione. Esso permette di modificare i pesi delle connessioni in modo tale che si minimizzi una certa funzione errore E. Tale funzione dipende dal vettore h-esimo di output ${\overline {out}}^{h}$ restituito dalla rete, dato il vettore h-esimo di ingresso ${\overline {x}}^{h}$ e dal vettore h-esimo di output ${\overline {y}}^{h}$che noi desideriamo (che fa parte del training set). Il training set è dunque un insieme di N coppie di vettori $({\overline {x}}^{h},{\overline {y}}^{h})$, con $h=1,...,N$. La funzione errore che si deve minimizzare si può scrivere come: ${\frac {1}{2}}\sum _{h}\sum _{k}(out_{k}^{h}-y_{k}^{h})^{2}$, dove l'indice k rappresenta il valore corrispondente al k-esimo neurone di output. E è una funzione dipendente dai pesi (che in generale variano nel tempo). Per minimizzare E(w) si può usare l'algoritmo della discesa del gradiente (gradient-descent). L'algortimo parte da un punto generico ${\overline {x}}(0)$ e calcola il gradiente $\nabla f({\overline {x}}^{0})$. Il gradiente dà la direzione verso cui muoversi lungo la quale ho il massimo incremento (o decremento se considero $-\nabla$). Definita la direzione ci si muove di una distanza $\eta$ predefinita a priori e si trova un nuovo punto ${\overline {x}}(1)$ sul quale è calcolato nuovamente il gradiente. Si continua iterativamente finché il gradiente non è nullo.
L'algoritmo di backpropagation può essere diviso in due passi:
* Forward pass: l'input dato alla rete è propagato al livello successivo e così via ai livelli successivi (il flusso di informazioni si sposta in avanti, cioè forward). Si calcola dunque E(w), l'errore commesso.
* Backward pass: L'errore fatto dalla rete è propagato all'indietro (backward) e i pesi sono aggiornati in maniera appropriata.

## Pregi

Le reti neurali per come sono costruite lavorano in parallelo e sono quindi in grado di trattare molti dati. Si tratta in sostanza di un sofisticato sistema di tipo statistico dotato di una buona immunità al rumore; se alcune unità del sistema dovessero funzionare male, la rete nel suo complesso avrebbe delle riduzioni di prestazioni ma difficilmente andrebbe incontro ad un blocco del sistema. I software di ultima generazione dedicati alle reti neurali richiedono comunque buone conoscenze statistiche; il grado di apparente utilizzabilità immediata non deve trarre in inganno, pur permettendo all'utente di effettuare da subito previsioni o classificazioni, seppure con i limiti del caso. Da un punto di vista industriale, risultano efficaci quando si dispone di dati storici che possono essere trattati con gli algoritmi neurali. Ciò è di interesse per la produzione perché permette di estrarre dati e modelli senza effettuare ulteriori prove e sperimentazioni.

## Difetti

I modelli prodotti dalle reti neurali, anche se molto efficienti, non sono spiegabili in linguaggio simbolico umano: i risultati vanno accettati "così come sono", da cui anche la definizione inglese delle reti neurali come "black box". Come per qualsiasi algoritmo di modellazione, anche le reti neurali sono efficienti solo se le variabili predittive sono scelte con cura. Non sono in grado di trattare in modo efficiente variabili di tipo categorico (per esempio, il nome della città) con molti valori diversi. Necessitano di una fase di addestramento del sistema che fissi i pesi dei singoli Neuroni e questa fase può richiedere molto tempo, se il numero dei record e delle variabili analizzate è molto grande. Non esistono teoremi o modelli che permettano di definire la rete ottima, quindi la riuscita di una rete dipende molto dall'esperienza del creatore.