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?