Newsgroup: it.comp.ia
Titolo: Consiglio

Salve di nuovo a tutti...
Ho un problema, ma questa volta non e' un problema propriamente
software... Ma di "concetto", vi spiego: ho fatto una rete (la solita
Feedforward a 3 strati con BP per l'apprendimento), questa rete
ha 16 input, un numero di neuroni nascosti che non so manco io
quanto deve essere ;p e 1 output... Non serve a nulla ma solo a
fare un esperimento...
Questa rete prende in input una stringa di 16 numeri, non casuali,
questi numeri sono una progressione semplice tipo:
1234567890
4567890123
9012345678
Insomma il numero seguente e' maggiore di uno rispetto al
precedente... ma invece di arrivare a 10 torno a contare da 0,
in questo modo ogni input sulla rete e' rappresentato da un
byte.
Su ognuno dei 16 neuroni in ingresso normalizzo il byte in modo
che si trovi su valori compresi tra 0 e 1, i pesi sono inizializzati con
valori compresi tra -1 e 1... La rete cosa deve fare? Deve tornarmi
1 se gli do in pasto una progressione giusta: 123456...
oppure 0 se gli do in pasto qualunque cosa che non sia quella
progressione, ad esempio: 531478620400...
La rete viene addestrata in questo modo: una routine genera un
numero che puo' essere una progressione oppure no, se e' una
progressione allora setta il valore atteso a 1 (perche' la rete
deve tornarmi 1), altrimenti setta il valore atteso a 0 e ovviamente
da' il numero allo strato di input (uso questa tecnica per addestrare
la rete sia con la mia progressione che con numeri "errati").
Solo che variando i neuroni da 50 a 1000 e le epoche di addestramento
da 1000 a 1.000.000 non ottengo alcun tipo di risultato...
A questo punto mi domando: sto cercando di farle apprendere
qualcosa che non puo' apprendere oppure il mio non e' solo il
vaneggiamento di un pazzo ma una cosa fattibile? Grazie mille
a tutti voi :))))

 a tutti voi :))))
Incipit: non sono un esperto, io avrò fatto si e no 4 reti in vita mia e
con una ci ho pescato le telline sulla spiaggia di sabaudia.
Secondo la mia modesta opinione, il tuo non è un tipico problema in cui
l'algoritmo di BP o la teoria delle reti neurali vadano applicati. 
In primis perchè esiste un algoritmo diretto per risolverlo (ed è sempre
da preferire; non facciamo con le reti neurali come con i differenziali,
che appena li scopri li usi dappertutto anche per calcolare il tempo di
cottura del toast).
Poi tu non hai bisogno di un vero e proprio apprendimento di valori
fuori dallo spazio di test (grande utilità delle reti neurali).
Il fatto è che tu sai cosa aspettarti..i numeri sono sempre 0123456789,
poi se parti da 1 o parti da 9 o da 5, o se ci metti 6 cifre o 9 cifre,
cmq sai come sono fatti questi numeri, la caratteristica la conosci.
Ergo a mio parere la conclusione è che:
non c'e' bisogno di rispondere ai tuoi dubbi, perchè il problema non
andava posto in principio.
Lieto di essere sempre d'aiuto..
GPR
PS :)))

Infatti non ho detto che il mio fosse un problema che richiedesse
la presenza di una NN, il fatto e' che la sto realizzando a livello
semplicemente sperimentale, so bene che non ha alcuna utilita' pratica
e infatti non deve averne e' solo a livello didattico, grazie comunque
del consiglio, l'unica cosa che mi interesserebbe sapere e' se e'
possibile realizzare questa cosa con la tipologia di rete che sto
usando :).
A presto.

 a tutti voi :))))
La cosa che vuoi fare, a mio parere dovrebbe essere fattibile.
Puoi vedere il problema da 2 punti di vista:
a) riconoscimento di patern;
b) predizione di una sequenza periodica.
Per ciò che riguarda l'approccio a) credo che l'approccio che hai usato sia
corretto: fai vedere alla rete degli esempi e gli dici, tramite la risposta
attesa, quali di questi sono correti e quali no.
Per ciò che riguarda l'approccio b) puoi considerare la rete come un filtro
FIR non lineare, che deve apprendere una sequenza periodica a dente di sega.
Immagina di scrivere il primo periodo della sequenza (0-9) e ripeterla
quante volte vuoi. Poi pensa allo strato di ingresso della rete come se
fosse composto da una linea di ritardo (x[0]...x[N-1]) e, ad ogni
elaborazione, fai scorrere in avanti gli ingressi su questa linea e fai
entrare un nuovo campione della sequenza. A questo punto l'addestramento
consisterà nel fare in modo che la rete riesca a predirre il campione appena
entrato (x[0]), che quindi costituisce la tua uscita desiderata. L'algoritmo
di BP usato in questa maniera non miimizza più il gradiente globale ma un
gradiente locale, per cui potresti avere dei risultati peggiori.
Credo che dovresti iniziare a far prove di apprendimento con un numero
limitato di neuroni (5-10).
Ciao, andrea

 limitato di neuroni (5-10).
effettivamente a questo non avevo pensato, grazie mi hai dato una buona
idea,
ora provo a "ottimizzare" la mia versione e intanto provo anche a fare
qualche
test con la tua soluzione che magari funziona anche meglio.
Grazie mille!!