PDA

View Full Version : Rete neurale


fero86
15-08-2010, 23:19
salve a tutti (quei pochi che frequentano il forum in questo periodo :stordita: ) !

anch'io, come Teo@Unix (:D) sto avendo a che fare con una rete neurale feedforward da addestrare partendo da pesi e soglie completamente casuali con la differenza peró che nel mio caso é molto difficile riuscire a definire quali potrebbero essere degli output "corretti" a cui la rete dovrebbe "tendere" durante il suo apprendimento perché tali output sono in una quantitá illimitata e sono ragionevolmente impossibili da definire perché possono essere definiti in un numero illimitato di modi.

é possibile invece, e anche molto ragionevole, definire una "funzione di valutazione" che, ad ogni prova di addestramento, dica "quanto ha agito bene la rete neurale", cioé fornisce una valutazione dell'output restituito dalla rete. io purtroppo sono estremamente ignorante in materia di apprendimento automatico perché ho commesso l'idiozia di preferire altre cose per il mio piano di studi (tenete presente anche questo nel rispondermi) ma credo che l'algoritmo che intendo usare per l'addestramento di questa rete sia una sorta di algoritmo genetico.

la mia domanda é che algoritmo usare per fare evolvere l'addestramento. immagino di dover fondamentalmente:
1) fare una prova
2) valutare l'output con la funzione di valutazione
3) "mutare" la rete
4) tornare al punto 1 per N volte
5) scegliere la mutazione che ha ottenuto la valutazione migliore
6) tornare al punto 1 per M volte

giusto? se si, cosa dovrei fare di preciso al punto 3? come dovrei mutare i neuroni della rete? ed inoltre come scelgo N ed M? a piacere?

concludo il post specificando che, in virtu dell'ignoranza di cui sopra, non so neanche se una rete neurale é quello che fa al caso mio :stordita:
io sto usando una rete feedforward in cui i neuroni usano la funzione gradino e quindi emettono 1.0 se la somma pesata degli input é maggiore della soglia e 0.0 se é minore; inoltre ho messo 4 neuroni per ogni strato e ci sono tre strati, input, output e nascosto.

ma non c'é in realtá un motivo valido per cui sto usando un rete feedforward, ho scelto un po' a caso perché si tratta di un'attivitá del tutto hobbystica :stordita:
per l'esattezza si tratta di dare un cervello al giocatore avversario del gioco Java del primo link della mia firma :asd:
in caso una rete feedforward non sia la cosa piu adatta voi cosa usereste? di sicuro vorrei usare un algoritmo genetico per l'apprendimento perché vorrei che il giocatore umano avesse la possibilitá di "allenare" un blob giocandogli contro.

fero86
15-08-2010, 23:33
specifico qualche dettaglio ulteriore su com'é fatta la rete.

non so se avete visto 3D Volley, il gioco in firma, comunque il personaggio da controllare puó fare sostanzialmente quattro cose:
1. camminare verso destra
2. camminare verso sinistra
3. saltare
4. ridersela di gusto facendo su e giu :asd: (é quello che accade se premete soltanto il tasto freccia giu :D)

queste quattro azioni corrispondono ai quattro tasti freccia del giocatore umano: i tasti freccia destro e sinistro fanno spostare il blob, il tasto su lo fa saltare (dandogli spinta finché é premuto o finché non viene raggiunto un prefissato limite di elevazione) ed il tasto giu lo fa ridere in modo simpatico e giocoso.

i quattro neuroni dello strato di output della rete controllano queste quattro azioni del blob avversario: quando un neurone sta emettendo 1.0 la corrispondente azione viene eseguita, quando emette 0.0 viene interrotta.

i cinque neuroni dello strato di input invece ricevono rispettivamente i seguenti dati di input (nel post precedente ho scritto che erano quattro, mi sono sbagliato):
1. posizione del blob stesso (l'intelligenza artificiale ha coscienza della sua posizione)
2. posizione della palla
3. vettore velocitá della palla
4. posizione del blob avversario, che sarebbe quello controllato dal giocatore umano
5. vettore velocitá del blob di cui sopra

in questo modo il blob artificiale puó usare una tattica basata in ogni momento sulle cinque informazioni di cui sopra.

i neuroni dello strato intermedio invece sono quattro ma non c'é un motivo particolare per cui sono quattro, ho scelto un numero a caso con l'intento di fare delle prove con vari valori :D

cionci
16-08-2010, 10:30
Sottoponi la rete ad un training set tale che riproduca una serie finita di stati di input, il cui stato di output è conosciuto e certo.
A quel punto usi la backpropagation per istruire i neuroni.
La rete neurale ti aiuterà nelle situazione di incertezza. Ad esempio selezionando l'uscita più alta fra tutte anche se non ha superato il valore di soglia.

Prima di tutto per lo stato di uscita è bene non addestrare mai la rete con più uscite ad 1 contemporaneamente.
Quindi se nel tuo gioco si dovranno presentare situazioni tipo:
- salto e vado avanti (salto in avanti)
- salto e vado indietro (salto indietro)

E' bene che siano codificate e addestrate singolarmente, quindi devi aggiungere un neurone dello strato di uscita per questi casi.

Potresti in teoria anche usare un tipo di apprendimento con rinforzo. Anche se la situazione diventa un bel po' più complessa.

fero86
16-08-2010, 13:32
Sottoponi la rete ad un training set tale che riproduca una serie finita di stati di input, il cui stato di output è conosciuto e certo. non si puó perché per ogni input esistono innumerevoli possibili stati di output, questo per definizione (dipende dalla tattica di gioco che vuole usare il blob). continuo ad avere il sospetto che una rete neurale non faccia al caso mio; quasi sicuramente dovrei usare un algoritmo genetico peró.



Prima di tutto per lo stato di uscita è bene non addestrare mai la rete con più uscite ad 1 contemporaneamente. perché? :confused:



Quindi se nel tuo gioco si dovranno presentare situazioni tipo:
- salto e vado avanti (salto in avanti)
- salto e vado indietro (salto indietro) quindi in sostanza secondo te i neuroni di output dovrebbero diventare 16, cioé 2 alla quarta? (un neurone per ogni possibile combinazione delle 4 azioni)



E' bene che siano codificate e addestrate singolarmente, quindi devi aggiungere un neurone dello strato di uscita per questi casi. leggendo questa frase inizio ad avere qualche intuizione sul perché, ma ripeto che non é possibile definire degli output "corretti" e non é neanche possibile definire quale sia un output corretto rispetto ad un certo input, é soltanto possibile fornire una valutazione al termine di ogni mano di volley, quindi dopo che la rete ha dato molti output. devo passare a qualcosa di diverso da una rete neurale?



Potresti in teoria anche usare un tipo di apprendimento con rinforzo. Anche se la situazione diventa un bel po' più complessa. non ho idea di cosa sia :stordita:

marco.r
16-08-2010, 13:51
non si puó perché per ogni input esistono innumerevoli possibili stati di output, questo per definizione (dipende dalla tattica di gioco che vuole usare il blob). continuo ad avere il sospetto che una rete neurale non faccia al caso mio; quasi sicuramente dovrei usare un algoritmo genetico peró.

Se ad ogni azione non puoi associare Nel tuo caso le reti neurali non sono molto indicate. Quello che puoi fare (e mi sembra di capire sia piu' o meno quello che suggerisce cionci) e' di fare una "giocata" salvando tutte le mosse, valutare il risultato (hai fatto punto o l'hai perso) ed usarlo come "target" per tutte le mosse (se hai vinto il target del singolo esempio e' fare la mossa che hai scelto, altrimenti e' _non_ fare la mossa che hai scelto). Devi anche pensare che i delta dei pesi che vai a generare devono essere commisurati all'apporto della mossa (in altri termini: l'ultima mossa che fai e' piu' rilevante ai fini del punto che non le prime, per cui il contributo al delta delle prime mosse deve essere minore).
Ma a questo punto forse ti conviene effettivamente passare all'apprendimento con rinforzo, che su queste cose penso funzioni meglio (http://en.wikipedia.org/wiki/Reinforcement_learning )

Una alternativa e' quella di suddividere il problema in piu' parti piu' facili.
Ad esempio potresti addestrare a parte una rete che preveda dove vada a cadere la palla (relativamente facile da fare), e poi usare la posizione della caduta e dell'avversario per decidere dove posizionare la persona.


quindi in sostanza secondo te i neuroni di output dovrebbero diventare 16, cioé 2 alla quarta? (un neurone per ogni possibile combinazione delle 4 azioni)

Si' in generale funziona meglio cosi', la rete ci mette meno ad apprendere ed eviti combinazioni impossibili (tipo muovere contemporaneamente a destra e a sinistra)

marco.r
16-08-2010, 14:08
per inciso, mi ha fatto venire una idea carina per un possibile contest... vediamo se in questi giorni riesco a combinare qualcosa

cionci
16-08-2010, 14:32
non si puó perché per ogni input esistono innumerevoli possibili stati di output, questo per definizione (dipende dalla tattica di gioco che vuole usare il blob). continuo ad avere il sospetto che una rete neurale non faccia al caso mio; quasi sicuramente dovrei usare un algoritmo genetico peró.
Una rete neurale solitamente si usa con i pesi già definiti, mi sembra che tu la voglia far apprendere mentre gioca. Difficilmente una rete neurale si usa così. Questo perché per l'apprendimento possono servire molti più input di quelli che si incontrerebbero durante la partita ;)

Come ti ha detto Marco, le combinazioni delle uscite non sono 2^4, ma meno, visto che alcune sono senza senso.
Ripeto: fatti un set di input da usare come training set, allena la rete a riconoscere quando ci si trova in questi casi con la back propagation. Dopo, se non sei soddisfatto del risultato, potrai intraprendere la strada dell'apprendimento con rinforzo.

marco.r
16-08-2010, 14:43
Una rete neurale solitamente si usa con i pesi già definiti, mi sembra che tu la voglia far apprendere mentre gioca. Difficilmente una rete neurale si usa così. Questo perché per l'apprendimento possono servire molti più input di quelli che si incontrerebbero durante la partita ;)

Quello che pensa di fare ha senso se usa il risultato di una partita diventa un elemento di training per un apprendimento online da portare da una partita alla successiva. Idealmente e' una idea carina perche' cosi' il programma impara a giocare contro il giocatore adattandosi al suo stile di gioco.
I problemi di un tale approccio penso siano due
- Devi giocare una quantita' spropositata di partite.
- La rete tendera' ad imparare bene la parte finale di un gioco (ovvero a prendere la palla se ci e' vicino) ma fara' fatica ad apprendere la parte iniziale, e distinguere mosse buone da inutili.

Tommo
16-08-2010, 14:56
Infatti che io sappia nessuno usa le reti neurali per i giochi :D
Per me fai molto prima ad andare con una macchina a stati finiti... è più veloce, è più funzionale, è più semplice ed è anche più piacevole come avversario, perchè in una situazione semplice come il tuo gioco puoi hard-codare strategie a mano.

Non mettere la tecnologia di fronte al gameplay ;)


Comunque non ti so aiutare :asd:

fero86
16-08-2010, 21:02
Ma a questo punto forse ti conviene effettivamente passare all'apprendimento con rinforzo, che su queste cose penso funzioni meglio (http://en.wikipedia.org/wiki/Reinforcement_learning ) ho cercato del materiale di studio su questo apprendimento con rinforzo, comprese le slides del corso di Apprendimento Automatico che c'é alla mia universitá, ma non ho capito una sega ne' da quelle ne' da Wikipedia :fagiano:
o meglio, sono in grado di capire quello che viene detto, ma mi sembrano tutte cose astratte e sconnesse dalla realtá: bisogna trovare una politica pi greco tale da massimizzare la ricompensa, benissimo, e parlando in termini di programmazione che caspita é una politica? che ci devo mettere al posto della rete neurale? o si tratta di un sistema di apprendimento da applicare alle reti neurali?



Una alternativa e' quella di suddividere il problema in piu' parti piu' facili.
Ad esempio potresti addestrare a parte una rete che preveda dove vada a cadere la palla (relativamente facile da fare), e poi usare la posizione della caduta e dell'avversario per decidere dove posizionare la persona. hmm, no... a parte il fatto che a quel punto la rete neurale non serve piu perché il punto di caduta della palla me lo posso calcolare facilmente, ma io speravo in qualcosa di piu semplice, se comincio a usare una combinazione di due strategie temo che diventi troppo complicato :\



Si' in generale funziona meglio cosi', la rete ci mette meno ad apprendere ed eviti combinazioni impossibili (tipo muovere contemporaneamente a destra e a sinistra) posto che mi pare di capire che non devo usare una rete neurale perché non é adatta (ma ste reti servono solo all'OCR?), sarei interessato a sapere come mai in questo modo le reti imparano piu in fretta.

per quanto riguarda lo stato impossibile, per me era trascurabile: se un blob cerca di muoversi sia a destra che a sinistra semplicemente resta fermo, infatti é quello che succede nel gioco se tenete premuti contemporaneamente le frecce destra e sinistra. non mi interessa che durante una sua strategia il giocatore artificiale tenti di muoversi contemporaneamente da entrambe le parti restando quindi fermo, l'importante é che vinca la mano :D



Una rete neurale solitamente si usa con i pesi già definiti, mi sembra che tu la voglia far apprendere mentre gioca. Difficilmente una rete neurale si usa così. Questo perché per l'apprendimento possono servire molti più input di quelli che si incontrerebbero durante la partita ;) questo non é un grosso problema perché ho a disposizione anche un'alternativa: posso simulare miliondi partite molto velocemente in cui due blob artificiali giocano l'uno contro l'altro :)

oppure potrei adottare una soluzione ibrida: uso questo sistema solo per ottenere un giocatore basilare non troppo bravo, dopodiché il giocatore continua ad apprendere quando gioca col giocatore umano e cosi si adatta al suo stile.



Ripeto: fatti un set di input da usare come training set, allena la rete a riconoscere quando ci si trova in questi casi con la back propagation. Dopo, se non sei soddisfatto del risultato, potrai intraprendere la strada dell'apprendimento con rinforzo. raccogliere un insieme di input e di corrispondenti possibili output (perché comunque per ogni input esistono innumerevoli possibili output che verrebbero valutati positivamente e probabilmente se ne possono considerare anche di innumerevoli che verrebbero valutati positivamente allo stesso modo!) mi riesce piuttosto difficile e mi sembra anche molto brutto; se hai visto il gioco puoi comprendere: in ogni istante (e prima che il giocatore artificiale possa avere contatto con la palla di istanti ne passano parecchi, se poi il giocatore umano si mette pure a pensare prima di battere direi che ne passano un'enormitá :)) il giocatore artificiale conosce le cinque informazioni elencate al post #2, avendo quelle informazioni é impossibile dire quale sia la "cosa giusta da fare", puó farne veramente tante di cose, l'importante é che la mano venga vinta.

una possibile funzione di valutazione che puó essere usata per dire quanto é andata bene una mano é la seguente, posto N = numero di volte che il giocatore umano é riuscito a respingere la palla facendola ritornare al giocatore artificiale:

+1/N se la mano é stata vinta dal giocatore artificiale,
-1/N se la mano é stata vinta dal giocatore umano.



I problemi di un tale approccio penso siano due
- Devi giocare una quantita' spropositata di partite. vedi sopra circa l'idea dell'auto-apprendimento :D



- La rete tendera' ad imparare bene la parte finale di un gioco (ovvero a prendere la palla se ci e' vicino) ma fara' fatica ad apprendere la parte iniziale, e distinguere mosse buone da inutili. non se uso la quantitá N definita sopra nella funzione di valutazione: in questo modo il giocatore artificiale, per evolversi in meglio, dovrá cercare di vincere la mano nel minor tempo possibile; a quel punto pure se fa delle mosse inutili chi se ne frega :p




Infatti che io sappia nessuno usa le reti neurali per i giochi :D
Per me fai molto prima ad andare con una macchina a stati finiti... è più veloce, è più funzionale, è più semplice ed è anche più piacevole come avversario, perchè in una situazione semplice come il tuo gioco puoi hard-codare strategie a mano.

Non mettere la tecnologia di fronte al gameplay ;)


Comunque non ti so aiutare :asd: recapitolando quanto ho letto in questa discussione, una rete neurale non si adatta benissimo ai miei scopi. mi chiedo cosa dovrei usare in sostituzione, e questo é il primo post dove leggo una vera alternativa :D
o meglio, mi hanno suggerito anche l'apprendimento per rinforzo, ma ho esposto sopra i miei dubbi in merito (che spero qualcuno sappia risolvere).

per quanto riguarda la macchina a stati, non ho capito :D
quali dovrebbero essere gli stati? e dopodiché che ci faccio? sinceramente mi rattrista il dover abbandonare l'idea di un giocatore che si evolve in base all'avversario perché era molto fica :stordita:

Tommo
16-08-2010, 23:13
recapitolando quanto ho letto in questa discussione, una rete neurale non si adatta benissimo ai miei scopi. mi chiedo cosa dovrei usare in sostituzione, e questo é il primo post dove leggo una vera alternativa :D
o meglio, mi hanno suggerito anche l'apprendimento per rinforzo, ma ho esposto sopra i miei dubbi in merito (che spero qualcuno sappia risolvere).

per quanto riguarda la macchina a stati, non ho capito :D
quali dovrebbero essere gli stati? e dopodiché che ci faccio? sinceramente mi rattrista il dover abbandonare l'idea di un giocatore che si evolve in base all'avversario perché era molto fica :stordita:

Beh, nei miei giochi uso sempre macchine a stati finiti, che anche se risultano piuttosto "artigianali" (per niente scientifiche) fanno il loro sporco lavoro :D

Di solito ho una interfaccia StateInterface, che implementa la funzione setState.
Quando setState viene chiamato, chiama onStateEnd sullo stato che finisce, onStateBegin su quello che inizia, e in seguito onStateLoop per ogni frame sullo stato corrente.
Quindi come tecnologia è un observer stupido stupido, e gli stati possono essere benissimo mappati come cases di uno switch nelle 3 funzioni di cui sopra.

Quindi un nemico tipico di un FPS avrà gli stati "aspetta", "insegui", "scappa", "morto" etc.

Nel caso del tuo gioco magari è pure eccessivo, perchè da quello che ho capito sti blob alla fine possono fare ben poche cose...
probabilmente basta spezzare il problema in 3 stati del blob:
-una dove riceve la palla e quindi si limita ad andare verso il punto di caduta;
-una dove attacca: all'inizio sceglie il tipo di attacco a seconda della posizione del nemico, quindi aspetta la fine dell'animazione e va nello stato successivo;
-una dove osserva gli altri ricevere, quindi deve ridisporsi considerando dove potrebbe tirare l'avversario.

Ovviamente tutte le "considerazioni" "scelte" etc devono essere scritte a mano da te.
Come ho già detto è molto artigianale come approccio, ma che io sappia è più o meno sempre la base :D

Peccato che su mac non posso provare il gioco perchè "non ho i driver aggiornati"...

cionci
17-08-2010, 01:36
ho cercato del materiale di studio su questo apprendimento con rinforzo, comprese le slides del corso di Apprendimento Automatico che c'é alla mia universitá, ma non ho capito una sega ne' da quelle ne' da Wikipedia :fagiano:
o meglio, sono in grado di capire quello che viene detto, ma mi sembrano tutte cose astratte e sconnesse dalla realtá: bisogna trovare una politica pi greco tale da massimizzare la ricompensa, benissimo, e parlando in termini di programmazione che caspita é una politica? che ci devo mettere al posto della rete neurale? o si tratta di un sistema di apprendimento da applicare alle reti neurali?
Sinceramente non ho mai programmato un apprendimento con rinforzo, ma di fatto si tratta di rinforzare i pesi delle delle sinapsi che portano un dato neurone ad avere un valore superiore alla soglia con l'input attuale e a diminuire gli altri.
Come farlo ? E' assolutamente dipendente dal problema.
per quanto riguarda lo stato impossibile, per me era trascurabile: se un blob cerca di muoversi sia a destra che a sinistra semplicemente resta fermo, infatti é quello che succede nel gioco se tenete premuti contemporaneamente le frecce destra e sinistra. non mi interessa che durante una sua strategia il giocatore artificiale tenti di muoversi contemporaneamente da entrambe le parti restando quindi fermo, l'importante é che vinca la mano :D
Resta fermo può essere uno degli output, ma altri hanno meno senso, come premere su e giù contemporaneamente.
Meno uscite hai contemporaneamente ad uno e più semplice è l'apprendimento. Determinati neuroni sono specializzati nel riconoscimento di un dato stato di input. Se mescoli gli stati di uscita avrai riconoscimento parziale anche per altri stati di input.
Inoltre è più facile capire dove si sta evolvendo la rete neurale per determinare quali siano uscite spurie e quali siano effettivamente uscite vere. Se rafforzi un'uscita spuria rafforzi un comportamento non corretto della rete neurale.
questo non é un grosso problema perché ho a disposizione anche un'alternativa: posso simulare miliondi partite molto velocemente in cui due blob artificiali giocano l'uno contro l'altro :)
Di fatto questo è un training set, ma il problema è che per ogni azione tu devi avere un metro di valutazione che determini quanto distante si trovi lo stato dell'uscita dal valore desiderato. Se non riesci a fare una valutazione di questo tipo allora non riesci a far apprendere la rete neurale perché non sei capace di dire se un'azione è migliore dell'altra.
raccogliere un insieme di input e di corrispondenti possibili output (perché comunque per ogni input esistono innumerevoli possibili output che verrebbero valutati positivamente e probabilmente se ne possono considerare anche di innumerevoli che verrebbero valutati positivamente allo stesso modo!) mi riesce piuttosto difficile e mi sembra anche molto brutto; se hai visto il gioco puoi comprendere: in ogni istante (e prima che il giocatore artificiale possa avere contatto con la palla di istanti ne passano parecchi, se poi il giocatore umano si mette pure a pensare prima di battere direi che ne passano un'enormitá :)) il giocatore artificiale conosce le cinque informazioni elencate al post #2, avendo quelle informazioni é impossibile dire quale sia la "cosa giusta da fare", puó farne veramente tante di cose, l'importante é che la mano venga vinta.
No, devi valutare il comportamento della rete istante per istante. Non azione di gioco per azione di gioco.
una possibile funzione di valutazione che puó essere usata per dire quanto é andata bene una mano é la seguente, posto N = numero di volte che il giocatore umano é riuscito a respingere la palla facendola ritornare al giocatore artificiale:

+1/N se la mano é stata vinta dal giocatore artificiale,
-1/N se la mano é stata vinta dal giocatore umano.

Non va bene, perché tu valuti molteplici soluzioni della rete neurale contemporaneamente. Ed a quel punto quali pesi vuoi rinforzare ?
Tu devi rinforzare la rete dopo ogni singola soluzione. Quindi devi trovare un metro di valutazione del comportamento, istante per istante, della rete.

Ci sono due possibili approcci:
- la rete neurale analizza il tipo di stato (posizione della palla, posizione dell'avversario, mia posizione, velocità della palla, punto di caduta della palla) e propone una strategia di gioco (non un'azione singola)
- la rete neurale analizza lo stato istante per istante della parabola della palla e propone un'azione (movimento, salto, etc etc)

Analizzando il primo approccio, gli output della rete possono essere i punti del campo avversario in cui voglio far cadere la palla. Come fare a raggiungere questo obiettivo è solo un mero calcolo considerando la fisica del gioco.
Un metro di valutazione della bontà del risultato può essere: riproduco la traiettoria della palla con ogni possibile output della rete e seleziono il primo che porta ad un punto.
Quindi hai l'uscita attuale, l'uscita desiderata per quei dati di input e puoi quindi calcolare un delta per fare la back propagation.

Nel secondo approccio le cose si fanno più complesse. La risposta della rete va valutata istante per istante.
Ad esempio: la rete neurale offre come risultato il salto, ma saltando non colpisco la palla. Devo quindi decidere quale sia l'uscita desiderata in base a calcoli matematici (gli stessi che faresti nell'altro caso per implementare una data strategia di gioco) e calcolare il delta ed eseguire la back propagation.

Secondo me il primo approccio è il più carino, invece di dare in mano alla rete neurale il semplice spostamento del giocatore.
Per ogni livello di gioco potresti caricare i pesi con errori sempre più piccoli.

marco.r
17-08-2010, 14:59
ho cercato del materiale di studio su questo apprendimento con rinforzo, comprese le slides del corso di Apprendimento Automatico che c'é alla mia universitá, ma non ho capito una sega ne' da quelle ne' da Wikipedia :fagiano:

Prova qua, e' un libro intero sull'argomento:
http://webdocs.cs.ualberta.ca/~sutton/book/ebook/the-book.html



o meglio, sono in grado di capire quello che viene detto, ma mi sembrano tutte cose astratte e sconnesse dalla realtá: bisogna trovare una politica pi greco tale da massimizzare la ricompensa, benissimo, e parlando in termini di programmazione che caspita é una politica? che ci devo mettere al posto della rete neurale? o si tratta di un sistema di apprendimento da applicare alle reti neurali?

No e' facile da capire se la pensi come ad un agente che si muove in un ambiente.
Nel tuo caso l'agente e' il personaggio mentre l'ambiente e' l'insieme dei parametri che definiscono lo stato del gioco (posizione del giocatore, posizione dell'avversario, posizione e velocita' della palla).
La ricompensa e' un premio (valore numerico) che viene assegnato ogni volta che in uno certo stato fai una determinata mossa. Ad esempio una mossa durante il gioco vale 0, un mossa che fa vincere la mano vale 1, uno che la fa perdere -1.
La politica non e' altro che una funzione che valuta la bonta' delle mosse possibili in uno dato stato. In un certo senso e' analoga alla funzione di valutazione che negli scacchi fa decidere quale e' la mossa migliore da fare, con una rilevante differenza.
Nel caso dell'apprendimento con rinforzo la valutazione della bonta' di una mossa (della politica da adottare se preferisci) non e' data da una approfondita analisi dell'albero delle mosse, quanto dall'esperienza pregressa dovuta al fatto che l'agente si e' gia' trovato in una situazione analoga.
In altri termini la politica opportuna viene ricavata nel corso del tempo "propagando" le ricompense dagli stati che effettivamente le elargiscono a quelli vicini, nell'ipotesi che per vincere una gara devo arrivare vicino al traguardo.

quindi mentre all'inizio hai che tutti gli stati non finali valgono 0, col tempo quelli che portano alla vittoria avranno un punteggio positivio mentre quelli che portano alla sconfitta ne avranno uno negativo.

E' un riassunto un po' becero (ho pure identificato arbitrariamente mosse con gli stati in cui portano e premi relativi...) ma penso renda l'idea.



posto che mi pare di capire che non devo usare una rete neurale perché non é adatta (ma ste reti servono solo all'OCR?), sarei interessato a sapere come mai in questo modo le reti imparano piu in fretta.

Impara piu' in fretta perche' anche se premere tasto destro e sinistro e' la stessa cosa che non premerli, la rete non lo sa' e spendera' tanto tempo a capire cosa succede quando preme entrambi i tasti quanto per capire cosa succede quando non li preme, facendo doppio lavoro del necessario.
In generale le reti neurali vanno bene per imparare funzioni da R^n -> R^m (tra spazi vettoriali) oppure {0,1}^n -> {0,1}^m oppure un mix delle due. L'OCR non e' altro che un caso di questi.



questo non é un grosso problema perché ho a disposizione anche un'alternativa: posso simulare miliondi partite molto velocemente in cui due blob artificiali giocano l'uno contro l'altro :)

Quello che ottieni pero' non e' piu' un giocatore che impara ad affrontare un dato avversario, ma uno che riesce a giocare molto bene (e al limite noiosamente imbattibile)

B|4KWH|T3
17-08-2010, 16:18
La butto lì, magari è una cazzata, non potrebbe essere più utile addestrare un modello probabilistico? Tipo un Hidden Markov Model.