J'écris un jeu de jouet simple avec l'intention d'entraîner un réseau neuronal profond par-dessus. Les règles du jeu sont à peu près les suivantes:
- Le jeu a un plateau composé de cellules hexagonales.
- Les deux joueurs ont la même collection de pièces qu'ils peuvent choisir de positionner librement sur le plateau.
- Placer différents types de pièces attribue des points (ou diminue les points de l'adversaire) en fonction de leur position et de leur configuration l'une par rapport à l'autre.
- Celui qui a le plus de points gagne.
Il existe des règles supplémentaires (concernant les tours, le nombre et les types de pièces, etc ...) mais elles ne sont pas importantes dans le cadre de cette question. Je veux concevoir un réseau neuronal profond qui peut apprendre itérativement en jouant contre lui-même. Mes questions portent sur la représentation des entrées et des sorties. En particulier:
- Comme le motif des pièces est important, je pensais avoir au moins quelques couches convolutives. La carte peut être de différentes tailles mais en principe très petite (6x10 sur mes tests, à étendre de quelques cellules). Est-ce que ça fait du sens? Quel type de pool puis-je utiliser?
- Comment représenter les deux côtés? Dans cet article sur go, les auteurs utilisent deux matrices d'entrée, l'une pour les pierres blanches et l'autre pour les pierres noires. Cela peut-il aussi fonctionner dans ce cas? Mais rappelez-vous que j'ai différents types de pièces, disons A, B, C et D. Dois-je utiliser des matrices d'entrée 2x4? Cela me semble très rare et peu efficace. Je crains que ce ne soit trop clairsemé pour que les couches convolutives fonctionnent.
- Je pensais que la sortie pourrait être une distribution de probabilités sur la matrice représentant les positions du tableau, plus un tableau séparé de probabilités indiquant quelle pièce jouer. Cependant, je dois également représenter la capacité de passer le virage, ce qui est très important. Comment puis-je le faire sans diluer sa signification parmi d'autres probabilités?
- Et surtout , est-ce que j'applique uniquement les coups gagnants ou les coups perdants? L'application des coups gagnants est facile car je fixe simplement les probabilités souhaitées à 1. Cependant, quand je perds, que puis-je faire? Définir cette probabilité de déplacement à 0 et tous les autres à la même valeur? En outre, est-il judicieux d'imposer des mouvements par la différence de score final, même si cela irait à l'encontre du sens des sorties, qui sont à peu près des probabilités?
De plus, j'ai développé le moteur de jeu dans node.js en pensant utiliser Synaptic comme framework, mais je ne suis pas sûr qu'il puisse fonctionner avec des réseaux convolutionnels (je doute qu'il existe un moyen de fixer les poids associés aux champs perceptifs locaux). Des conseils sur d'autres bibliothèques compatibles avec le nœud?