Salve,sento spesso parlare di reti neurali e più o meno ho capito come funzionano. Ma cos’è davvero un neurone? E’ una parte del programma o un programma a se stante? Qual è il linguaggio più indicato per creare una rete neurale? Se è possibile vorrei un piccolo esempio. Grazie!!

Per un’introduzione alle reti neurali si veda ad esempio la pagina su Wikipedia

http://it.wikipedia.org/wiki/Reti_neurali

Riportiamo qui per comodità una descrizione molto sommaria: una rete neurale è un metodo “diverso” per elaborare l’informazione; è diverso perché non si ha necessità di informazioni a priori sui dati da elaborare, la rete è infatti in grado di “imparare” dai dati che le vengono forniti in fase di “apprendimento”. Per un certo tempo si danno in ingresso alla rete dei dati di cui si conoscono i risultati attesi e si correggono (con opportuni algoritmi) i parametri interni della rete finché i risultati sono in linea con le aspettative. Ora, se il campione di apprendimento è sufficientemente generale e la struttura della rete è sufficientemente complessa, la rete è in grado di “generalizzare” rispondendo in modo corretto anche a ingressi che non ha mai “visto”.
Questo avviene perché nella fase di apprendimento (se va tutto bene) viene realizzato, in modo “distribuito” nella rete, un modello che si adatta agli ingressi forniti e anche altri ingressi vengono “interpolati” mediante questo modello.
La generalità del campione di apprendimento, la complessità e la struttura della rete, gli algoritmi di training sono temi attuali di ricerca e approfondimento per i quali si rimanda a letteratura specialistica, (su Internet si trovano un’infinità di informazioni ed esempi).

Una rete neurale può essere realizzata in Software (SW) come suggerito da chi pone la domanda, ma anche direttamente in Hardware o in Firmware; in questi casi un neurone è un oggetto fisico (una parte di circuito) che collega gli ingressi alle uscite nel modo appropriato.
In effetti sarà sempre utile “simulare” prima la rete in SW, anche perché spesso è utile realizzare in questa sede l’apprendimento, e una volta scelti i pesi e le soglie, realizzare la rete neurale definitiva. Quando la rete è implementata in SW un neurone è una parte di programma, che a seconda del tipo di linguaggio utilizzato potrà essere una parte di codice (ASSEMBLER, BASIC, FORTRAN), una procedura o una funzione (PASCAL, C) o un oggetto (OOP, C++); la programmazione orientata agli oggetti (OOP) presenta vantaggi in progetti di una certa complessità.

Si tenga presente che in MatLAB, che spesso è a disposizione di istituzioni di ricerca e/o di aziende hi-tech, esiste un toolbox interamente dedicato alle reti neurali, con le funzioni già pronte. http://www.mathworks.com/products/neuralnet/?BB=1

Come esempio consideriamo una rete abbastanza generica, un perceptron a due livelli:

Matematicamente, in modo molto sintetico, la funzione descritta dalla rete è

dove

I coefficienti W e V sono i pesi della rete e sono chiamati anche interazioni sinaptiche, la funzione σ è una qualunque funzione a soglia, per esempio un gradino matematico, e la soglia è θk.

Un esempio di programma che implementa il generico neurone è:

double Neurone (double x [ N_INGRESSI ], double W [ N_INGRESSI ], double SOGLIA)
{
   /* variabili */
   a = 0;
   for ( i=0; i<N_INGRESSI; i++) 
      a = a + W[ i ] * x[ i ]; 
   if (a > SOGLIA)
      return(1);
   else
      return(0);
}

la funzione Neurone sarà chiamata dal programma main tante volte quanti Neuroni ci sono nella rete, nel nostro esempio N+1, dove l’ultimo è il neurone di uscita.

main ( )
{
   /* variabili */

   for ( i=0; i<M; i++)
      a[ i ]=Neurone( x, W[ ], S[ ] );
   …
   u=Neurone( a, V[ ], S0);
   … 

}