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?