Codifica input / output per una rete neurale per imparare un gioco a griglia


13

Sto scrivendo un semplice gioco di giocattoli con l'intenzione di allenare una profonda rete neurale. Le regole dei giochi sono all'incirca le seguenti:

  • Il gioco ha una tavola composta da celle esagonali.
  • Entrambi i giocatori hanno la stessa collezione di pezzi che possono scegliere di posizionare liberamente sul tabellone.
  • Posizionando diversi tipi di pezzi si assegnano punti (o si riducono i punti dell'avversario) a seconda della posizione e della configurazione.
  • Chiunque abbia più punti vince.

Ci sono regole aggiuntive (su giri, numero e tipi di pezzi, ecc ...) ma non sono importanti nel contesto di questa domanda. Voglio escogitare una rete neurale profonda che possa imparare iterativamente giocando contro se stessa. Le mie domande riguardano la rappresentazione di input e output. In particolare:

  • Dato che lo schema dei pezzi conta, pensavo di avere almeno alcuni strati convoluzionali. La scheda può essere di varie dimensioni ma in linea di principio molto piccola (6x10 nei miei test, espandibile di poche celle). Ha senso? Che tipo di pooling posso usare?
  • Come rappresentare entrambe le parti? In questo articolo su go, gli autori usano due matrici di input, una per le pietre bianche e una per le pietre nere. Può funzionare anche in questo caso? Ma ricorda che ho diversi tipi di pezzi, ad esempio A, B, C e D. Dovrei usare matrici di input 2x4? Mi sembra molto scarso e di scarsa efficienza per me. Temo che sarà troppo scarso perché gli strati convoluzionali funzionino.
  • Ho pensato che l'output potesse essere una distribuzione di probabilità sulla matrice che rappresentano le posizioni della scacchiera, oltre a una matrice separata di probabilità che indica quale pezzo giocare. Tuttavia, devo anche rappresentare la capacità di passare il turno, il che è molto importante. Come posso farlo senza diluirne il significato tra le altre probabilità?
  • E , soprattutto , impongo solo le mosse vincenti o anche quelle perse? Applicare le mosse vincenti è facile perché ho appena impostato le probabilità desiderate su 1. Tuttavia, quando perdo, cosa posso fare? Impostare quella probabilità di spostamento su 0 e tutti gli altri sullo stesso valore? Inoltre, ha senso applicare le mosse in base alla differenza del punteggio finale, anche se ciò andrebbe contro il significato degli output, che sono approssimativamente delle probabilità?

Inoltre, ho sviluppato il motore di gioco in node.js pensando di usare Synaptic come framework, ma non sono sicuro che possa funzionare con reti convoluzionali (dubito che ci sia un modo per fissare i pesi associati ai campi percettivi locali). Qualche consiglio su altre librerie compatibili con il nodo?


Supponiamo che desideri che la macchina apprenda il gioco sconosciuto e poi impari come vincerlo? (Invece di imparare a vincere una partita le cui regole sono disponibili per il programmatore prima di scrivere il software di apprendimento automatico)
FauChristian

Risposte:


1
  • Per rappresentare i pezzi, dovresti essere in grado di utilizzare una singola matrice di input. Basta designare un numero intero per i diversi tipi di pezzi. Le pietre bianche possono essere numeri interi positivi e le pietre nere possono essere negative.

  • È possibile utilizzare sigmoid per la sicurezza della posizione della scheda e l'attivazione lineare per l'identificatore del pezzo. pass sarebbe un altro output sigmoideo. Non credo che dovrai preoccuparti che il pass venga diluito. Dal momento che è un'azione così preziosa, il punteggio dipenderà molto dall'output del passaggio e avrà una grande pendenza. Se è necessario selezionare l' azione di passaggio ad alta frequenza per scopi di apprendimento di rinforzo, è sufficiente attribuire una maggiore probabilità all'azione di passaggio nella funzione di scelta casuale.

  • La differenza del punteggio finale ha un grande impatto sulla desiderabilità delle mosse. Una grande differenza di punteggio dovrebbe comportare un grande impatto sulla funzione. Pertanto potresti voler includere l'entità della differenza di punteggio nella tua funzione di perdita.

Questo è il tipo di lavoro svolto da Deep Q Learning. Forse ti consigliamo di esaminare anche quello.


1

Non hai bisogno di livelli conv, poiché non inserisci un'immagine come input (vedi sotto). In alternativa, puoi provare a utilizzare un'immagine del tabellone (con pezzi diversi con forme diverse). Anche questo può funzionare. Quindi andrei per 2 strati conv, passo 1, dimensione del kernel pari a mezzo pezzo. Lo proverei con un singolo pool massimo.

A differenza dell'altra risposta, suggerirei di utilizzare un tensore 3d come input, con un numero di canali uguale a pezzi diversi. Le altre due dimensioni uguali corrisponderebbero al numero di celle sulla scheda. Varie trasformazioni in te NN non saranno in grado di distinguere molto bene tra più numeri interi. Ecco perché è meglio avere una codifica one-hot dei tipi di pezzi.

Vorrei usare solo un vettore con n + 1 componenti per l'output: n per tutte le mosse possibili e 1 per il passaggio. Codificherebbe la ricompensa prevista per ogni mossa, non la probabilità.

Non sono sicuro di cosa intendi imponendo le mosse. Ma quando hai intenzione di allenarlo con qualcosa come Q-learning, sarebbe logico fare una mossa completamente casuale ogni tanto con una certa probabilità (diciamo il 10% delle volte). Ricerca https://en.wikipedia.org/wiki/Reinforcement_learning


I tensori sono eccessivi.
FauChristian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.