|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Rete neurale
salve a tutti (quei pochi che frequentano il forum in questo periodo
) !anch'io, come Teo@Unix ( é 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 ![]() 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 ![]() per l'esattezza si tratta di dare un cervello al giocatore avversario del gioco Java del primo link della mia firma ![]() 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. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
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 (é quello che accade se premete soltanto il tasto freccia giu 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 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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. |
|
|
|
|
|
#4 | |||||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
Quote:
Quote:
Quote:
|
|||||
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
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. Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
||
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
per inciso, mi ha fatto venire una idea carina per un possibile contest... vediamo se in questi giorni riesco a combinare qualcosa
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
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. |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
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.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
[OT]
Infatti che io sappia nessuno usa le reti neurali per i giochi 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 [/OT] Comunque non ti so aiutare
|
|
|
|
|
|
#10 | ||||||||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
![]() 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? Quote:
Quote:
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 Quote:
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. Quote:
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. Quote:
Quote:
Quote:
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 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
|
||||||||
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
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 Peccato che su mac non posso provare il gioco perchè "non ho i driver aggiornati"... Ultima modifica di Tommo : 17-08-2010 alle 00:16. |
|
|
|
|
|
|
#12 | |||||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Come farlo ? E' assolutamente dipendente dal problema. Quote:
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. Quote:
Quote:
Quote:
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. Ultima modifica di cionci : 17-08-2010 alle 02:42. |
|||||
|
|
|
|
|
#13 | ||||
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
http://webdocs.cs.ualberta.ca/~sutto.../the-book.html Quote:
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. Quote:
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. Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
||||
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2003
Messaggi: 591
|
La butto lì, magari è una cazzata, non potrebbe essere più utile addestrare un modello probabilistico? Tipo un Hidden Markov Model.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:39.










) !











