Encodage d'entrée / sortie pour un réseau de neurones pour apprendre un jeu basé sur une grille

13

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?

Totem
la source
Devons-nous supposer que vous souhaitez que la machine apprenne le jeu inconnu, puis apprenne à le gagner? (Par opposition à apprendre à gagner un jeu dont les règles sont à la disposition du programmeur avant d'écrire le logiciel d'apprentissage automatique)
FauChristian

Réponses:

1
  • Pour représenter les pièces, vous devriez pouvoir utiliser une seule matrice d'entrée. Désignez simplement un nombre entier pour les différents types de pièces. Les pierres blanches peuvent être des nombres entiers positifs et les pierres noires peuvent être négatives.

  • Vous pouvez utiliser sigmoïde pour la confiance de la position du panneau et l'activation linéaire pour l'identificateur de pièce. passer serait une autre sortie sigmoïde. Je ne pense pas que vous aurez à vous soucier de la dilution du laissez-passer . Puisqu'il s'agit d'une telle action précieuse, le score dépendra beaucoup de la sortie de la passe et il aura un grand gradient. Si vous devez sélectionner l' action de passe à haute fréquence à des fins d'apprentissage par renforcement, attribuez simplement une probabilité plus élevée à l' action de passe dans votre fonction de choix aléatoire.

  • La différence de score final a un impact important sur l'opportunité des mouvements. Une grande différence de score devrait avoir un impact important sur la fonction. Par conséquent, vous souhaiterez peut-être inclure l'amplitude de la différence de score dans votre fonction de perte.

C'est le type de travail que fait Deep Q Learning. Peut-être voudrez-vous également examiner cela.

Image par défaut
la source
1

Vous n'avez pas besoin de couches conv, car vous ne nourrissez pas une image en entrée (voir ci-dessous). Alternativement, vous pouvez essayer d'utiliser une image de la planche (avec différentes pièces de formes différentes). Cela peut aussi fonctionner. Ensuite, j'irais pour 2 couches conv, foulée 1, la taille du noyau égale à la moitié d'une taille de morceau. Je l'essayerais avec un seul pool max.

Contrairement à l'autre réponse, je suggérerais d'utiliser un tenseur 3d comme entrée, avec un nombre de canaux égal à différentes pièces. Les deux autres dimensions égales correspondraient au nombre de cellules sur la carte. Diverses transformations en vous NN ne pourront pas très bien distinguer entre plusieurs entiers. C'est pourquoi il est préférable d'avoir un encodage à chaud des types de pièces.

Je n'utiliserais qu'un vecteur avec n + 1 composants pour la sortie: n pour tous les mouvements possibles et 1 pour la passe. Il encoderait la récompense attendue pour chaque mouvement, pas la probabilité.

Vous ne savez pas ce que vous entendez par appliquer les mouvements. Mais lorsque vous allez l'entraîner avec quelque chose comme Q-learning, il serait logique de faire un mouvement complètement aléatoire de temps en temps avec une certaine probabilité (disons 10% des fois). Recherche https://en.wikipedia.org/wiki/Reinforcement_learning

hellmean
la source
Les tenseurs sont exagérés.
FauChristian