Newsgroup: it.comp.ia
Titolo: ANN a 3 strati e funzioni continue

Perchè con una rete a 4 strati (feed forward) ottengo risultati migliori di 
una rete a 3, nell'approssimare una funzione continua?
Eppure sapevo che (teorema di Cybenko) una rete a 3 strati (uno hidden) è 
in grado di approssimare qualsiasi funzione continua, mentre solo per le 
discontinue occorrevano quattro strati.


Il teorema di Cybenko è un teorema di esistenza: dice che per ogni
funzione reale a valori reali continua e per ogni margine di
approssimazione epsilon esiste un multi layer perceptron a singolo
strato nascosto che approssima tale funzione con almeno tale margine
epsilon (i dettagli non li conosco).
Non dice nulla su quanti nodi nascosti debba avere tale rete e su come
fare a trovare i valori dei pesi.
In generale può accadere che una certa funzione f possa essere
approssimata con un certo margine epsilon con pochi nodi usando due
strati nascosti o con moltissimi nodi usandone uno solo.
Inoltre, quando addestri una rete con un training set, non fa tanta
differenza se la funzione da cui sono tratti gli esempi è continua o
discontinua, poichè comunque fornisci all'algoritmo di addestramento
un insieme discreto (e finito) di punti.
Per di più, gli algoritmi di ottimizzazione utilizzati per addestrare
le reti neurali (discesa lungo il gradiente, metodi con le derivate
seconde, algoritmi genetici, ecc.) non garantiscono di trovare
efficientemente l'ottimo globale della funzione obiettivo (in genere
la funzione d'errore della rete sul training set), il che significa
che anche se una configurazione della rete (pesi ed eventualmente
topologia) che risulti nell'approssimazione desiderata è consentita
dai parametri limite con cui si esegue l'algoritmo, non vi è garanzia
che essa venga trovata.
Ad esempio, se addestri reti con singolo strato nascosto di 30 nodi
usando l'error backpropagation, anche se esiste un insieme di pesi per
quella topologia che approssima il tuo training set con il margine da
te voluto, non hai alcuna garanzia di trovarlo. In genere l'algoritmo
convergerà ad un ottimo locale della funzione d'errore. Eseguendo più
volte l'algoritmo partendo da diversi pesi iniziali troveresti
l'ottimo globale prima o poi, ma potrebbe volertici un tempo
comparabile a quello di una ricerca casuale.

 epsilon (i dettagli non li conosco).
[...]
Finalmente un post leggibile. :)
Cmq penso si riferisse a qualche corollario specifico.
-- 
C++U,
   GiO

 che essa venga trovata.
L'algoritmo usato per l'apprendimento è genetico, mentre per ottimizzare i 
minimi un normale backpropagation con momentum.

 
Colgo l'occasione (ed il thread che non parla di E.) per dirti di essere 
onorato e felice della tua presenza in questo ng (...ps...ho visto alcuni 
tuoi lavori...).
Francesco

 minimi un normale backpropagation con momentum.
Non ho capito cosa ottimizzi con l'algoritmo genetico.

> [...]


Grazie mille, purtroppo io non sono un esperto di IA, quindi il mio 
contributo a questo NG puň essere spesso piů quello di dare spunti che 
di offrire risposte.
-- 
C++U,
   GiO

 
Non ho detto che ottimizzo con l'algoritmo genetico, ma che ottimizzo i 
minimi con backpropagation!
Con l'evoluzione genetica esploro piu' cammini, per non fossilizzare la 
backpropagation su minimi locali.

 backpropagation su minimi locali.
Ok ora è più chiaro. Cmq, per curiosità, come usi gli operatori
genetici?

 genetici?
Ogni cromosoma è una sequenza di double, che rappresentano i pesi di ogni rete.
Per ogni generazione tengo il 20% dei cromosomi invariati (quelli con il 
fitness piu alto).
I successivi 10% faccio una piccola mutazione su un solo double 
(nell'ordine di 0.001).
Per gli altri faccio un crossover con blend, a range. Nel senso che 
seleziono un punto iniziale ed uno finale. In quel punto scambio i valori 
dei genitori. Lo scambio non è completo, ma con blend casuale (come si fa 
per mixare l'alpha channel).
La popolazione varia dai 20 ai 100 cromosomi.
Devo dire che le reti si addestrano molto bene anche senza backpropagation, 
che viene utilizzata alla fine solo per diminuire ulteriormente l'errore.

 che viene utilizzata alla fine solo per diminuire ulteriormente l'errore.
Ok.

 Questa funzione satura per -1 <= x >= 1
Cioč mai? :)))
(ovviamente ho capito - scherzo)
-- 
C++U,
   GiO

 funzione logistica).
...no uso la derivata della funzione logistica, ma poi applico la versione 
approssimata in fase di propagazione feedforward....lo so che non è proprio 
corretto, ma funziona(va) bene per alcuni set.
Approfitto visto che ne sai molto: conosci qualche testo (..o codice) che 
spieghi come eseguire una rete ricorrente? Per "eseguire" intendo proprio 
la sequenza di calcolo dei vari strati.

 non è proprio corretto, ma funziona(va) bene per alcuni set.
volevo dire: Uso la derivata della funzione logistica e poi applicato la 
versione approssimata in fase di propagazione...


Non ho dei testi sotto mano. Non ci ho mai lavorato in maniera
specifica, cmq so che ci sono vari modi per farlo.
Nel modo sincrono, devi avere due variabili per nodo: in una ci tieni
lo stato (uscita) corrente e in un altra il nuovo stato. Ad ogni ciclo
per ciascun nodo aggiorni il nuovo stato con l'uscita del nodo
calcolata utilizzando come ingressi gli stati correnti; quando ai
finito di aggiornare tutti i nodi li scorri di nuovo scrivendo nello
stato corrente il nuovo stato calcolato prima. In questo modo è come
se ad ogni ciclo tutti i nodi si aggiornassero contemporaneamente.
Nel modo asincrono, aggiorni i nodi secondo un certo ordine e la nuova
uscita diventa immediatamente lo stato corrente del nodo.

 se ad ogni ciclo tutti i nodi si aggiornassero contemporaneamente.
grazie proverò questo!


prego