Newsgroup: it.comp.programmare
Titolo: Oscillando..

Salve NG,
vi chiede un parere "pratico".
Ho scritto un'implementazione di una rete neurale che va discretamente
bene. A volte però, a seconda dei valori iniziali dei pesi, facendo un ciclo
di test-learning, inizia ad "oscillare" intorno ai valori attesi senza riuscire
mai a finire.
Cambiando tolleranze o resettando casualamente (con un rand()) i pesi e
ricominciando da capo riesce, ma ovviamente non mi sembra una soluzione elegante.
Avete esperienze in merito?
Io di solito sono sempre riuscito a trovare una taratura ottimale per i casi
specifici, ma il caso generale non l'ho mai affrontato, e mi piacerebbe sapere
se esiste una soluzione pratica senza andare a fare un'analisi numerica sulle
varie derivate :(
Ciao!

 Avete esperienze in merito?
 
Sě, proprio quelle che ti servono, solo che non me le ricordo piů :-D
 
Quasi vent'anni fa all'uni feci l'esame di trattamento dei segnali che 
comprendeva anche le reti neurali. La tesina che feci era proprio sui 
diversi modi di addestrare una MLN, in pratica varianti "furbe" dello 
steepest descend. Una di queste varianti identificava proprio i pesi che 
oscillavano avanti e indietro ad ogni iterazione, prendeva nota del 
punto medio dell'oscillazione e impostava il peso in questione 
esattamente lě. La cosa era fatta "ricordando" gli n valori precedenti 
del peso e testandoli per vedere se oscillava. Era molto efficace.
 
Solo che non mi ricordo il nome di quest'algoritmo, né i dettagli 
implementativi :-(
 

 implementativi :-(
 
Beh, già questo è un bell'aiuto!
Anch'io ho una banale MLP con BP a gradient-descent, e credo mi faccia così
quando i valori sono molto vicini ai bordi del range della funzione
d'attivazione, ma come ho detto non ho analizzato il problema per bene.
Il tuo suggerimento non ci vuole molto a provarlo, appena ho tempo nel
pomeriggio lo implemento e ti dico se ha funzionato! ;-)
Ciao!
:-)

 pomeriggio lo implemento e ti dico se ha funzionato! ;-)
 
Mi sono ricordato ancora qualcosa... in pratica il nuovo valore del peso 
al passo N-esimo di addestramento era calcolato in base ai 5 pesi 
precedenti moltiplicati per 5 coefficienti alfa, cio� in pratica un 
mini-filtro FIR passabasso. Ne avevo presi solo 5 perch� senn� ogni 
passo di addestramento ci metteva un'era geologica e tanto valeva usare 
lo steepest descend normale, lavoravo coi 486...
 

 lo steepest descend normale, lavoravo coi 486...
 
Allora.. ho indagato un po' di più (e purtroppo mi son dovuto andare a rileggere
qualche paper fumoso sull'argomento).
 
Ho provato a fare come dicevi ma non m'ha aiutato molto, per varie ragioni 
implementative che ti risparmio.. In compenso facendolo qualcosa ho scoperto.
 
Il problema sembra risiedere in due punti:
- se parto con pesi casuali a volte l'algoritmo diverge, non importa come sia
settato il learning rate. Partendo con *tutti* i pesi identici invece il GD
evidentemente riesce a livellare i delta in maniera equa. Stranamente, anche
l'implementazione di un adaptive learning-rate non aiuta in alcuna maniera.
- se richiedo una precisione dell'output troppo elevata non riesce mai a finire;
mi son fatto l'idea che succede perché gli step finiscono per essere sotto la
precisione del tipo di dato, visto che continua a convergere sempre più
lentamente finché semplicemente si ferma su un valore molto vicino.
 
Il primo punto è facilmente risolvibile.
Sul secondo beh, pace. Sarà l'utilizzatore a trovare un compromesso tra la
precisione desiderata e la velocità d'apprendimento.
 
Per i miei scopi attuali, in realtà, la fase di learning può durare anche
giorni, visto che una volta che ha appreso può essere "congelata" e ricaricata
così com'è.
 
Per ora grazie mille!
Ciao!