Sequenzvorhersage LSTM neuronales Netzwerk fällt zurück

8

Ich versuche, ein Ratespiel zu implementieren, bei dem der Benutzer Coinflip und neuronales Netzwerk versucht, seine Vermutung vorherzusagen (ohne natürlich Rückblick). Das Spiel soll in Echtzeit sein, es passt sich dem Benutzer an. Ich habe synaptische js verwendet, wie es solide schien.

Aber ich scheine nicht in der Lage zu sein, einen Stolperstein zu überwinden: Das neuronale Netzwerk bleibt mit seinen Vermutungen ständig zurück. Zum Beispiel, wenn der Benutzer

drückt %Vor%

Es erkennt zwar das Muster, ist aber durch zwei Bewegungen wie

zurückgefallen %Vor%

Ich habe unzählige Strategien ausprobiert:

  • Zugnetzwerk, wenn der Benutzer auf Kopf oder Zahl klickt und mit dem Benutzer fortfährt
  • Loggen Sie sich in die Benutzereinträge ein, löschen Sie den Netzwerkspeicher und führen Sie eine Neueinschreibung mit allen Einträgen durch, bis Sie raten können
  • mix and match Training mit Aktivierungen eine Reihe von Möglichkeiten
  • versuche, zu Perceptron zu gehen, indem du ihm eine Menge Bewegungen auf einmal übergibst (funktioniert schlimmer als LSTM)
  • viele andere Dinge, die ich vergessen habe

Architektur:

  • 2 Eingaben, unabhängig davon, ob der Benutzer im vorherigen Zug Kopf oder Zahl angeklickt hat
  • 2 Ausgaben, Vorhersage, welcher Benutzer als nächstes klicken wird (dies wird in der nächsten Runde eingegeben)

Ich habe 10-30 Neuronen in den versteckten Schichten und der Vielfalt der Trainingsepochen probiert, aber ich stoße ständig auf das gleiche Problem!

Ich poste den Bucklescript-Code, mit dem ich das mache.

Was mache ich falsch? Oder meine Erwartungen sind einfach unangemessen, um Benutzerraten in Echtzeit vorherzusagen? Gibt es alternative Algorithmen?

%Vor%     
Vanilla Face 12.03.2017, 15:52
quelle

1 Antwort

1

Das Löschen des Netzwerkkontexts vor jeder Trainingsiteration ist der Fix

Das Problem in Ihrem Code ist, dass Ihr Netzwerk rund trainiert ist. Anstatt 1 > 2 > 3 RESET 1 > 2 > 3 zu trainieren, trainierst du das Netzwerk 1 > 2 > 3 > 1 > 2 > 3 . Dies macht Ihr Netzwerk glauben, dass der Wert nach 3 1 sein sollte.

Zweitens gibt es keinen Grund, 2 Ausgangsneuronen zu verwenden. Wenn eins genug ist, entspricht die Ausgabe 1 den Köpfen, die Ausgabe 0 entspricht den Tails. Wir werden nur die Ausgabe runden.

Anstatt Synaptic zu verwenden, habe ich Neataptic in diesem Code verwendet - es ist eine verbesserte Version von Synaptic, die Funktionalität und genetische Algorithmen hinzufügt.

Der Code

Der Code ist ziemlich einfach. Es ein wenig veräppelnd, sieht so aus:

%Vor%

Führen Sie den Code hier aus!

Der Schlüssel zu diesem Code ist clear: true . Dies stellt im Grunde sicher, dass das Netzwerk weiß, dass es vom ersten Trainingssample startet und nicht vom letzten Trainingssample fortfährt. Die Größe des LSTM, die Iterationszahl und die Lernrate sind vollständig anpassbar.

Erfolg!

Bitte beachten Sie, dass das Netzwerk etwa zweimal das Muster benötigt, um es zu lernen.

Es hat jedoch Probleme mit nicht-repetitiven Mustern:

    
Thomas W 15.04.2017, 19:35
quelle