Eingabe / Ausgabe-Codierung für ein neuronales Netzwerk zum Erlernen eines gitterbasierten Spiels

13

Ich schreibe ein einfaches Spielzeugspiel mit der Absicht, ein tiefes neuronales Netzwerk darüber zu trainieren. Die Spielregeln sind ungefähr folgende:

  • Das Spiel hat ein Brett aus sechseckigen Zellen.
  • Beide Spieler haben die gleiche Sammlung von Steinen, die sie frei auf dem Brett platzieren können.
  • Wenn Sie verschiedene Arten von Steinen platzieren, erhalten Sie Punkte (oder verringern Sie die Punkte des Gegners), abhängig von ihrer Position und Konfiguration.
  • Wer mehr Punkte hat, gewinnt.

Es gibt zusätzliche Regeln (über Spielzüge, Anzahl und Art der Teile usw.), aber diese sind im Zusammenhang mit dieser Frage nicht wichtig. Ich möchte ein tiefes neuronales Netzwerk entwickeln, das ich iterativ lernen kann, indem ich gegen mich selbst spiele. Meine Fragen beziehen sich auf die Repräsentation von Input und Output. Im Speziellen:

  • Da das Muster von Stücken eine Rolle spielt, dachte ich, dass es zumindest einige Faltungsschichten geben sollte. Das Board kann von unterschiedlicher Größe sein, ist aber im Prinzip sehr klein (6x10 bei meinen Tests, um wenige Zellen zu erweitern). Macht das Sinn? Welche Art von Pooling kann ich verwenden?
  • Wie vertritt man beide Seiten? In diesem Artikel über go verwenden Autoren zwei Eingabematrizen, eine für weiße und eine für schwarze Steine. Kann es auch in diesem Fall funktionieren? Denken Sie jedoch daran, dass ich verschiedene Arten von Stücken habe, z. B. A, B, C und D. Soll ich 2x4-Eingangsmatrizen verwenden? Es scheint mir sehr spärlich und wenig effizient zu sein. Ich fürchte, es wird viel zu spärlich sein, als dass die Faltungsschichten funktionieren könnten.
  • Ich dachte, dass die Ausgabe eine Verteilung der Wahrscheinlichkeiten über die Matrix sein könnte, die die Brettpositionen darstellt, sowie eine separate Reihe von Wahrscheinlichkeiten, die angeben, welches Stück gespielt werden soll. Ich brauche aber auch die Fähigkeit zur Darstellung zu übergeben , die wiederum, was sehr wichtig ist. Wie kann ich es tun, ohne seine Bedeutung unter anderen Wahrscheinlichkeiten zu verwässern?
  • Und was am wichtigsten ist , erzwinge ich nur Gewinnzüge oder verlier ich auch? Das Durchsetzen von Gewinnzügen ist einfach, da ich die gewünschten Wahrscheinlichkeiten auf 1 gesetzt habe. Was kann ich jedoch tun, wenn ich verliere? Setzen Sie diese Bewegungswahrscheinlichkeit auf 0 und alle anderen auf denselben Wert? Ist es auch sinnvoll, Züge um die endgültige Punktzahldifferenz zu erzwingen, obwohl dies der Bedeutung der Ausgaben zuwiderlaufen würde, die ungefähr Wahrscheinlichkeiten sind?

Außerdem habe ich die Game-Engine in node.js entwickelt, um Synaptic als Framework zu verwenden, aber ich bin nicht sicher, ob sie mit Faltungsnetzwerken funktionieren kann (ich bezweifle, dass es eine Möglichkeit gibt, die mit lokalen Wahrnehmungsfeldern verbundenen Gewichte zu korrigieren). Irgendwelche Ratschläge zu anderen Bibliotheken, die mit node kompatibel sind?

Totem
quelle
Sollen wir annehmen, dass Sie möchten, dass die Maschine das unbekannte Spiel lernt und dann lernt, wie man es gewinnt? (Im Gegensatz zum Erlernen, wie man ein Spiel gewinnt, dessen Regeln dem Programmierer vor dem Schreiben der Software für maschinelles Lernen zur Verfügung stehen)
FauChristian

Antworten:

1
  • Um die Stücke darzustellen, sollten Sie in der Lage sein, eine einzelne Eingabematrix zu verwenden. Geben Sie einfach eine Ganzzahl für die verschiedenen Arten von Stücken an. Weiße Steine ​​können positive Ganzzahlen sein und schwarze Steine ​​können negative.

  • Sie können Sigmoid für die Kartenpositionszuverlässigkeit und lineare Aktivierung für die Teilekennung verwenden. Pass wäre ein weiterer Sigmoid-Ausgang. Ich glaube nicht, dass Sie befürchten müssen, dass der Pass verwässert wird. Da es sich um eine so wertvolle Aktion handelt, hängt die Punktzahl stark vom Pass ab Ausgang , und es wird eine große Steigung aufweist. Wenn Sie die Bestehen- Aktion mit hoher Frequenz für das Bestehen- Lernen auswählen müssen, schreiben Sie der Bestehen- Aktion in Ihrer Zufallsauswahlfunktion einfach eine höhere Wahrscheinlichkeit zu .

  • Die endgültige Punktzahldifferenz hat einen großen Einfluss auf die Wünschbarkeit der Züge. Ein großer Unterschied in der Punktzahl sollte einen großen Einfluss auf die Funktion haben. Daher möchten Sie möglicherweise die Größe der Punktedifferenz in Ihre Verlustfunktion einbeziehen.

Dies ist die Art von Arbeit, die Deep Q Learning erledigt. Vielleicht möchten Sie das auch untersuchen.

Standardbild
quelle
1

Sie benötigen keine Conv-Ebenen, da Sie kein Bild als Eingabe einspeisen (siehe unten). Alternativ können Sie versuchen, ein Bild von der Tafel zu verwenden (mit verschiedenen Stücken unterschiedlicher Form). Das kann auch funktionieren. Dann würde ich für 2 Conv-Schichten gehen, Schritt 1, Kernelgröße gleich einer halben Stückgröße. Ich würde es mit einem einzigen Max-Pooling versuchen.

Im Gegensatz zu der anderen Antwort würde ich vorschlagen, einen 3D-Tensor als Eingabe zu verwenden, wobei die Anzahl der Kanäle unterschiedlichen Teilen entspricht. Die anderen beiden Dimensionen entsprechen der Anzahl der Zellen auf der Platine. Verschiedene Transformationen in Ihrem NN werden nicht in der Lage sein, mehrere ganze Zahlen sehr gut zu unterscheiden. Deshalb ist es besser, eine One-Hot-Codierung der Teiletypen zu haben.

Ich würde nur einen Vektor mit n + 1 Komponenten für die Ausgabe verwenden: n für alle möglichen Züge und 1 für den Durchgang. Es würde die erwartete Belohnung für jeden Zug codieren, nicht die Wahrscheinlichkeit.

Ich bin mir nicht sicher, was Sie mit Erzwingen von Zügen meinen. Aber wenn Sie es mit so etwas wie Q-Learning trainieren, ist es sinnvoll, mit einer gewissen Wahrscheinlichkeit (etwa 10% der Fälle) von Zeit zu Zeit einen völlig zufälligen Zug zu machen. Suchen Sie nach https://en.wikipedia.org/wiki/Reinforcement_learning

Höllenmittel
quelle
Tensoren sind übertrieben.
FauChristian