9

Ho deciso di utilizzare una rete neurale per creare comportamenti per un motore di animazione che possiedo. La rete neurale contiene 3 vector3s e 1 angolo di Eulero per ogni parte del corpo che ho. Il primo vettore3 è la posizione, il secondo è la sua velocità e il terzo è la sua velocità angolare. L'angolo di Eulero è la rotazione della parte del corpo. e ho 7 parti del corpo. Ognuno di questi tipi di dati ha 3 float. 7 * 4 * 3 = 84, quindi ho 84 ingressi per la mia rete neurale. Le uscite sono mappate ai muscoli del personaggio. Forniscono la quantità di forza da applicare a ciascun muscolo e ce ne sono 15.Dimensioni della rete neurale per il sistema di animazione

Sono in esecuzione 15 reti contemporaneamente per 10 secondi, valutazione della loro idoneità calcolando il consumo energetico più basso, con la minima quantità di movimento z e x e se le parti del corpo sono nella posizione y corretta rispetto al resto (hips.y> upperleg.y, upperleg.y> lowerleg.y ecc.), quindi eseguendoli attraverso un algoritmo genetico. Gestivo una rete neurale di 168 neuroni per strato nascosto, con 8 livelli nascosti. Sto cercando di convincere il personaggio a stare dritto e non muoversi troppo. Ho gestito questo per 3000 generazioni e non mi sono nemmeno avvicinato.

La rete neurale e l'algoritmo genetico sono versioni C# this tutorial. Ho modificato il metodo crossover da un punto a quello di fusione.

Ho 84 ingressi e 15 uscite. Quanto dovrebbe essere grande la mia rete neurale?

risposta

5

Il problema che si vuole risolvere è piuttosto complesso, dubito che qualsiasi GA "vaniglia" (specialmente quello che usa un'architettura fissa per le reti) lo risolva (in un tempo ragionevole). Inoltre, non penso che troverai mai il "numero giusto di neuroni" nel livello nascosto.

Tuttavia, se si è disposti a passare un po 'di tempo a dare un'occhiata a HyperNEAT for Locomotion Control in Modular Robots che si occupa più o meno dello stesso problema. Usano una tecnica GA piuttosto avanzata chiamata HyperNEAT e riportano alcuni buoni risultati.

HyperNEAT è costruito sopra NEAT (Neuroevolution of augmenting topologies). NEAT è in grado di evolvere non solo i pesi delle RNA, ma anche la loro struttura. Inizia con reti semplici e le rende più complesse fino a raggiungere il tuo obiettivo (o rinunciare).

Quindi NEAT è leggermente alterato, per poter utilizzare varie funzioni di attivazione. Ciò consentirà di produrre un'ampia varietà di "pattern" quando è applicato a un insieme di punti, ad es.in un sistema di coordinate. Gli schemi possono avere tratti interessanti, come la simmetria perfetta/imperfetta o possono essere periodici. Questa variante è denominata Compositional pattern-producing network o CPPN. Un'applicazione spettacolare di questa tecnologia è PicBreeder in cui le reti vengono utilizzate per "disegnare" le immagini.

In HyperNEAT i CPPN vengono utilizzati per creare altre ANN. Lo strato nascosto delle nuove reti è rappresentato da un cosiddetto substrato, che può essere immaginato come se i neuroni del livello fossero posti a un sistema di coordinate 2D/3D. Quindi per ogni coppia possibile di neuroni (tutti dallo strato di input a tutti nascosti, da tutti nascosti a tutti gli output) il CPPN viene utilizzato per determinare il peso. Così abbiamo una codifica indiretta, che

  • di per sé è piccola
  • in grado di produrre grandi reti arbitrarie alla fine
  • che può anche mostrare un comportamento abbastanza complessa
  • modelli che appaiono in realtà/natura (ancora, simmetria, comportamento periodico) può emergere relativamente facilmente. Si noti che per l'animazione/la locomozione efficace entrambi sono molto vantaggiosi (se non obbligatori).

Tutto sommato, ti darebbe la possibilità di risolvere il tuo problema complesso.

Come potete vedere ci sono vari livelli di questa tecnica, quindi l'implementazione per il vostro non è così facile. Fortunatamente ci sono alcune buone implementazioni, puoi trovarle sul NEAT home page, insieme a molti altri documenti, documenti ed esercitazioni.

+0

Non mi piace la tua risposta, ma sembra essere vero. Grazie per l'heads up però. Sono curioso dopo aver guardato attraverso la letteratura. La differenza tra NEAT e HyperNEAT è la CPPN, corretta? Il CPPN è in grado di creare reti neurali, ma non è esso stesso una rete neurale? O è una rete neurale che si evolve e quindi crea altre reti neurali? Molto utile, grazie. – DrSammyD

+0

NEAT utilizza una codifica diretta, nel senso che per ogni neurone e connessione nel genoma si avrà lo stesso nella rete finale. HyperNEAT utilizza la codifica indiretta. Il genoma è una rete (il CPPN si è evoluto con NEAT), che - quando applicate su coppie di neuroni del substrato (~ neuroni della seconda rete + qualche altra informazione, tipicamente le sue coordinate in un sistema di coordinate 2D/3D) - produrrà i pesi di connessione. Penso che tecnicamente il CPPN sia anche un NN, ma può usare funzioni di attivazione di fantasia, invece del solito sigmoid/tanh. Tuttavia, potrebbero esserci altre piccole differenze. –

0

Riesci a semplificare le cose necessarie? Avere un piede e uno stinco, e questo è tutto; due parti del corpo, due angoli, e fallo alzare.

0

Approccio interessante! Ho pensato a qualcosa di simile per un po ', mi piacerebbe sapere quali risultati ottieni.

Dovrai testare, ma suppongo che tu abbia troppi livelli nascosti. Penso che questa applicazione potrebbe funzionare al massimo con uno o due.

Dovresti anche dare un'occhiata alla tua funzione fitness - sospetto che potrebbe essere "troppo difficile" fornire apprendimento, nel senso che all'inizio non ha speranza di alzarsi in piedi. Quindi il "minimo locale" in cui cadi sta imparando a cadere con il minimo sforzo. Non molto utile. Le GA generalmente soffrono di minimi locali molto.

Per migliorare la funzione di fitness, proverei qualcosa come penalizzare la deviazione da verticale ogni fotogramma. Ciò darà credito alle soluzioni che gestiscono il saldo parziale, quindi dovrebbe esserci un percorso di miglioramento. Non mi preoccuperei affatto del consumo di energia finché non li avrai bilanciati.

+0

In realtà, mi sono liberato della metrica in piedi, e mi sono concentrato sul minimizzare l'energia e rimanere in una posizione x z. Anche questo non funziona in meno di 30 generazioni. – DrSammyD

+0

È possibile che qualcosa non funzioni con il mio algoritmo genetico. – DrSammyD

+0

Era qualcosa di sbagliato nel modo in cui stavo calcolando l'idoneità. Ha iniziato a lavorare per le basse energie e rimanere in una posizione x z. Ti faccio sapere come va con la posizione. – DrSammyD