2.2.1 Concetti base

Una rete neurale artificiale è un modello computazionale parallelo, costituito da numerose unità eleborative omogenee, fortemente interconnesse mediante collegamenti di diversa intensità.

Il loro funzionamento è altamente parallelizzabile, infatti sono composte da numerose unità elementari il cui funzionamento è molto semplice. Ogni neurone artificiale esegue la somma degli input pesati con il valore delle interconessioni, per poi farne una trasformazione con una funzione spesso non lineare. Uno degli aspetti più interessanti è che una rete neurale non viene progettata per compiere una particolare attività, ma viene addestrata, con una serie di esempi, tramite un algoritmo di apprendimento automantico.

Figure 2.2: Rete neurale artificiale
Image FIGrete_neurale
Questa qualità ne consente l'applicazione in svariati campi quali l'intelligenza artificiale, il trattamento dei segnali (voce, immagini, etc.), il controllo di robot o di processi industriali o la soluzione di problemi complessi raggiungendo, in molti casi, le prestazioni di altre tecniche più complesse e piú difficili da progettare. Nel corso degli anni si sono sperimentate diverse strutture, tra cui quella in assoluto più utilizzata è quella di tipo feed-forward, di solito con più strati (figura 2.2).

Andando ad analizzare più in dettaglio la struttura di un singolo neurone possiamo concettualmente dividerlo negli ingressi, nei pesi (dendriti), nel corpo (cellula) e in una funzione di uscita (sinapsi) (figura 2.3). I pesi saranno i responsabili, assieme al tipo di funzione di uscita, del comportamento del singolo neurone e della rete in generale. Saranno loro che dovranno essere correttamente modificati in fase di addestramento, al fine di garantire un comportamento corretto al modello.

Definito per ogni singola unità $i$ un vettore di ingresso $x_i=(x_1,x_2,...,x_n)$ e un vettore di pesi $w_i=(w_{i1},w_{i2},...,w_{in})$, il corpo del neurone compie una somma pesata degli ingressi:

\begin{displaymath}
net_i=\sum_{j=1}^{n} w_{ij} x_j
\end{displaymath} (2.1)

Tra i pesi ne esiste uno speciale che prende il nome di bias . Esso non è legato a nessun'altra unità della rete ed è come se avesse ingresso sempre uguale a 1. Il bias serve a far compiere una traslazione sull'asse delle ascisse alla funzione di uscita. I nuovi ingressi prenderanno perciò la forma $x_i=(x_{i1},x_{i2},...,x_{in},1)$ e nel vettore dei pesi sarà presente un elemento addizionale $b_i$ che rappresentera il peso riferito al bias $w_i=(w_{i1},w_{i2},...,w_{in},b_i)$. L'equazione (2.1) prenderà perciò la forma:

\begin{displaymath}
net_i=(\sum_{j=1}^{n} w_{ij} x_j)+b_i
\end{displaymath} (2.2)

Figure 2.3: Neurone artificiale
Image FIGneurone_artificiale

Al valore $net_i$ viene poi applicata una trasformazione al fine di generare l'uscita $out_i$. Le più comuni sono la funzione sigmoide, la funzione gradino, la funzione lineare, la funzione tangente iperbolica e la funzione segno, anche se quella più utilizzata in assoluto è la funzione sigmoide:

\begin{displaymath}
out_i=\frac{1}{1+e^{-net_i}}
\end{displaymath} (2.3)

A questo punto il funzionamento della rete neurale può essere spiegato senza difficoltà. La rete è semplicemente formata da un insieme di unità elementari. Quando arriva un nuovo segnale da analizzare esso viene caricato nei dati di input del primo livello di neuroni i quali, tramite (2.2) e (2.3) generano un output. Questo risultato, assieme all'uscita dei neuroni dello stesso livello, costituirà un nuovo input per le unità al livello superiore. Il processo sarà così iterato fino all'ultimo livello in cui si otterrà la probabilità per ogni singlo output.

Nella realtà è tutto un po' più complicato, nell'ultimo livello di una rete neurale di tipo feed-forward si utilizza di solito la funzione softmax. Essa è utile tutte le volte in cui si vuole interpretare l'output di una rete come una probabilità a posteriori. Dato $net_i$, $1\leq i \leq N$, dove $N$ rappresenta il numero di output della rete e $net_i$ è il valore ottenuto da (2.2), la funzione softmax si scrive come:

\begin{displaymath}
out_i=\frac{e^{net_i}}{\sum_{j=1}^{N} e^{net_j}}
\end{displaymath} (2.4)

con:

\begin{displaymath}
0 \leq out_i \leq 1
\end{displaymath}


\begin{displaymath}
{\sum_{i=1}^{N} out_i}=1
\end{displaymath}

Una volta capito il funzionamento, l'aspetto più importante e difficile da affrontare consiste nel addestramento della rete: nel cercare cioè i pesi e i bias che le permettano di essere il più possibile aderente al fenomeno che deve modellare.

Stefano Scanzio 2007-10-16