[PYTHON] Ich möchte, dass DQN Puniki einen Homerun macht
Deep Q-Network (DQN)
Ich fand Deep Q-Network, das Deep Learning + erweitertes Lernen verwendet, um Verhaltensmuster zu lernen, interessant, also habe ich es implementiert. Ich werde es veröffentlichen, weil ich ein kleines Ergebnis habe.
Der Quellcode ist unten verfügbar.
https://github.com/dsanno/chainer-dqn
Im Folgenden wird detailliert auf DQN eingegangen.
Geschichte von DQN + Deep Q-Network in Chainer geschrieben
Lernziel
Das Spiel, das DQN diesmal lernen wird, ist Kuma no Poohs Homelander Bee! . (Beachten Sie, dass am Verbindungsziel ein Ton zu hören ist.)
Das Ziel ist es, Aniki, auch bekannt als Puniki, dazu zu bringen, viele Homeruns zu schlagen.
Die Gründe für die Wahl dieses Spiels sind folgende
- Einfache Regeln
Schlagen Sie den vom Werfer geworfenen Ball mit einem Baumstamm und treffen Sie die angegebene Anzahl von Home Runs, um ihn zu löschen.
- Leicht zu beurteilende Belohnung
Da das Ergebnis durch Bilder wie "Homerun" und "Strike" angezeigt wird, geben wir eine Belohnung, die dem Bild entspricht
Es gab auch einen Grund, warum es für Menschen sehr schwierig war, aber ich konnte den Punkt nicht erreichen, an dem es schwierig wurde. (Referenz: [Niko Niko Encyclopedia](http://dic.nicovideo.jp/a/%E3%81%8F%E3%81%BE%E3%81%AE%E3%83%97%E3%83% BC% E3% 81% 95% E3% 82% 93% E3% 81% AE% E3% 83% 9B% E3% 83% BC% E3% 83% A0% E3% 83% A9% E3% 83% B3% E3% 83% 80% E3% 83% BC% E3% 83% 93% E3% 83% BC!))
Entwicklungsumgebung
- Windows 10
- Chainer 1.5.1
- Verwenden Sie PyAutoGUI für die Bildschirmaufnahme und den Betrieb
- GeForce GTX970
Das Erlernen der CPU dauert zu lange und funktioniert nicht gut
Konfiguration des neuronalen Netzwerks
- Die Eingabe erfolgt über 150 x 112 x 3ch Pixeldaten. Die Größe des Spielbildschirms beträgt 600 x 450 Pixel, aber das aufgenommene Bild wird vertikal und horizontal um 1/4 reduziert und eingegeben.
- Die Ausgabe ist ein Vektor von Verhaltensbewertungen.
Die Länge des Vektors entspricht der Anzahl der Verhaltensmuster.
Dieses Mal ist die Y-Koordinate des Zeigers festgelegt und die X-Koordinate wird in 33 Schritten geändert.
Die Schaltfläche hat zwei Zustände, EIN und AUS, und verfügt über insgesamt 66 Aktionsmuster.
- Die Zwischenschichten sind Convolutional Neural Network mit 3 Schichten, LSTM mit 1 Schicht und Fully Connected Layer mit 1 Schicht.
Über das Spielen
- Klicken Sie im Titelbildschirm, im Pitcher-Auswahlbildschirm usw. auf die angegebene Position.
- Während des Spiels wird der Bildschirm alle 100 ms erfasst und als Eingabebild verwendet. (Im Folgenden wird die Einheit des 100-ms-Intervalls als "Rahmen" bezeichnet.) Das Aktionsmuster mit dem höchsten Bewertungswert ist die Aktion des nächsten Rahmens.
- Eine Belohnung wurde gegeben, wenn die folgenden Bedingungen beurteilt wurden. Die Belohnung für andere Frames ist 0.
Nach den Regeln werden Fouls und Treffer als Fehlschläge wie Schläge behandelt. Da es jedoch besser ist, den Ball zu treffen als verpasste Schläge, ist die Belohnung etwas höher als Schläge.
- Homerun: 100
- Streik: -100
- Foul: -90
- Treffer: -80
- Die folgenden 3 Muster werden verwendet, um zufällige Aktionen auszuführen.
In diesem Spiel ist es nicht sehr sinnvoll, zufällige Aktionen nur für einen Frame auszuführen. Deshalb habe ich sie dazu gebracht, zufällige Aktionen für aufeinanderfolgende Frames im Bereich von 10 bis 30 Frames auszuführen.
- Nur zufällige Zeigerposition
- Nur der Schaltflächenstatus ist zufällig
- Zufällige Zeigerposition und Tastenstatus
Über das Lernen
- Das Lernen wurde parallel zum Spielen in einem separaten Thread durchgeführt.
- Um LSTM zu lernen, werden die Parameter aktualisiert, indem die Eingabewerte aufeinanderfolgender Frames wie unten gezeigt angegeben werden.
m wurde allmählich im Bereich von 4 bis 32 erhöht.
- Wählen Sie zufällig n aus
- Geben Sie den Eingabewert von Frame n ein
- Geben Sie den Eingabewert von Frame n + 1 ein, um den maximalen Auswertungswert von Frame n + 1 zu ermitteln. Verwenden Sie diese Option, um die Parameter von Frame n zu aktualisieren
- Geben Sie den Eingabewert von Frame n + m ein, um den maximalen Auswertungswert von Frame n + m zu ermitteln. Verwenden Sie diese Option, um die Parameter für Frame n + m -1 zu aktualisieren
Aufbau
- Anzahl der Mini-Chargen: 64
- DQN-Gamma: 0,98
- optimizer: AdaDelta
Ich habe AdaDelta in Referenz [2] verwendet und es übernommen.
Die Parameter sind Standard rho = 0,95, eps = 1e-06.
- Begrenzen Sie die L2-Norm mit chainer.optimizer.GradientClipping () auf maximal 0,1
Wenn der Gradient nicht begrenzt wäre, würde der Q-Wert zu groß und das Lernen wäre nicht stabil.
Lernergebnis
Nachdem ich ungefähr 10 Stunden in Stufe 1 weiter studiert hatte, konnte ich Stufe 1 fast beenden.
Ich habe das Play-Video unten hochgeladen.
Ich versuche, beim Aufnehmen von Videos keine zufälligen Aktionen auszuführen.
https://youtu.be/J4V6ZveYFUM
Nachdem ich gelernt hatte, einschließlich anderer Stadien, konnte ich bestätigen, dass Stufe 3 durch einen Zufall beseitigt wurde.
Verweise