[PYTHON] Lernen Sie mit einem umgekehrten Pendel DQN (Deep Q Network)

Lösen wir das Problem des Hochschwingens eines invertierten Pendels mithilfe von Deep Q Network, allgemein bekannt als DQN, das Q-Learning, eine Methode des verbesserten Lernens, und ein tiefes neuronales Netz kombiniert.

Problemstellung

Das "Problem des umgekehrten Pendelschwingens" ist diesmal ein solches Problem.

Erstens befindet sich ein stationärer Motor in der Luft, und ein Ende der Stange ist mit der Motorwelle verbunden. Die Stange ist eine gewöhnliche Stange mit einer konzentrierten Masse in der Mitte, Steifheit $ \ infty $ und Dicke 0. Im Ausgangszustand hängt die Stange aufgrund der Schwerkraft nach unten. Das Problem ist, dass Sie das Pendel aus diesem Zustand hochschwenken und es in einem umgekehrten Zustand stillstehen lassen sollten. In der guten alten Steuerungstechnik müssen Sie sich damit befassen, indem Sie eine Steuerung verwenden, die nichtlineare Elemente enthält, z. B. die Vorbereitung von zwei Steuerungen, die separat zum Aufschwenken und stationär ausgelegt sind. Nein, ich habe es nie getan, aber es scheint.

Diesmal kann sich der Motor nur mit konstantem Drehmoment nach rechts oder links drehen. Auch wenn es ein wenig chaotisch ist, ist die Bedingung, dass das Drehmoment des Motors nicht so groß ist, und selbst wenn er sich vom Ausgangszustand in eine Richtung dreht, kann er die Schwerkraft nicht überwinden und nicht hochschwingen. Unten ist eine Animation, wenn ich süchtig nach der Falle bin. Es befindet sich in einem Zustand, in dem das Drehmoment ganz nach rechts ausgeübt wird, aber wenn es horizontal verläuft, nimmt der Beitrag der Schwerkraftbeschleunigung in Winkelrichtung zu, sodass es zurückgedrückt wird und vibriert.

initial.gif

Was DQN selbst betrifft, so ist der wunderbare Artikel hier detailliert, daher werde ich in diesem Artikel hauptsächlich die Ergebnisse und Ideen zur Implementierung erläutern.

Zuerst aus dem Ergebnis

Der Agent (in diesem Fall die Steuerung des Motors) führt eine Aktion (Anweisung der Drehrichtung des Motors) zur Umgebung (Motor und Stange) aus und lässt den Agenten die optimale Richtlinie unter der Bedingung lernen, eine Belohnung und ein Beobachtungsergebnis zu erhalten. ..

Für die Belohnung haben wir die folgende Funktion $ r (h) $ verwendet, die besagt, dass je höher die Höhe der Stangenspitze vom Motor aus gesehen ist, desto besser.

r(h)= \Biggl\{\quad 
\begin{eqnarray}
5h & \mathrm{if} h\ge 0\\
 h & \mathrm{if} h< 0
\end{eqnarray}

Ich habe die positive Seite voreingenommen, aber es könnte zusätzliche Sorgfalt gewesen sein. Zur Beobachtung wird das Bildschirmbild im Beispiel von ATARI direkt eingegeben, aber diesmal habe ich versucht, den Pendelwinkel selbst einzugeben. Es wird angenommen, dass die Winkelsequenz für 4 Schritte der Simulation als Sequenz erhalten werden kann.

Unten ist eine Darstellung des Wachstums. Die horizontale Achse ist die Anzahl der Versuche, und die vertikale Achse ist die Gesamtpunktzahl, die in den Versuchen erhalten wurde. Die blauen Punkte sind die Ergebnisse jeder Generation, und die roten Linien sind die Highscores.

bestER.png

Das Ergebnis ist sehr vibrierend, wahrscheinlich aufgrund des nichtlinearen und multimodalen Systems, und selbst nach der Konvergenz vibriert es mit positiven und negativen Ergebnissen, aber das Ergebnis mit hoher Punktzahl wächst stetig. Schauen wir uns den folgenden Wachstumsprozess an.

Du bist zum ersten Mal in einer Falle. 000000.gif

Beim 120. Mal bemerke ich, dass es möglich ist, durch Hin- und Hergehen nach oben zu schwingen, aber danach kann ich nicht mehr aufhören. 000120.gif

Es scheint, dass er das Talent der Stille ergriffen hat, nachdem er zum 6950. Mal hochgeschwungen war. Ein bisschen mehr! Kampf! 006950.gif

Zum 7640. Mal wurde der Zweck fast erreicht. 007640.gif

Dies ist das beste Ergebnis in 30000 Iterationen. Chi Es ist ein wenig übertrieben, aber es scheint besser zu sein, den ersten Schlag in kürzester Zeit zu machen.

024410.gif

Ich bin ein wenig überrascht, dass es besser funktioniert als ich erwartet hatte. Für das letzte Beispiel ist hier eine chronologische Darstellung der Höhe und des Profils der Steuereingaben des Motors. Die Denkweise ist völlig anders zwischen Aufschwingen und Halten, aber Sie können sehen, dass Sie das lernen.

profile.png

Über die Implementierung von DQN

DQN-Artikel früher vorgestellt zeigt ebenfalls die Implementierung, aber dieses Mal habe ich die Räder zum Verständnis wieder montiert. Sah. Ich habe die Implementierung gemäß diesem Dokument in hier eingefügt.

Was ich beim Lesen des Papiers nicht vollständig verstehen konnte, war, wie man das wesentliche tiefe Netz strukturiert und wie man es aktualisiert. Ich werde das erklären.

Deep Neural Net $ Q $ ist ein Netz, das den Aktionswert jeder Aktion ausgibt, wenn eine Folge von Zustandsbeobachtungsergebnissen eingegeben wird. In diesem Fall ist der Aktionswert ein Vektor, der zeigt, "wie glücklich es ist, den Motor in der durch die Eingangswinkelfolge angegebenen Situation nach rechts und links zu drehen".

Natürlich ist dieses Netz in den frühen Lernphasen zufällig und liefert daher zufällige Ergebnisse. Wenn Sie dies mit dem von nun an erläuterten Verfahren aktualisieren, wird es zu einem guten Netz, mit dem Sie in Zukunft viele Gesamtbelohnungen erhalten können.

Angenommen, Sie führen eine Aktion $ a \ _t $ für den Status $ s \ _t $ aus, um die Belohnung $ r \ _t $ zu erhalten und in $ s \ _ {t + 1} $ zu ändern. Zu diesem Zeitpunkt wird aus dem Aktionswertvektor $ Q (s_t) $, der die Ausgabe von $ Q $ ist, wenn $ s \ _t $ eingegeben wird, nur der Aktionswert, der $ a \ _t $ entspricht, gemäß der folgenden Formel neu geschrieben. Erstellen Sie $ y \ _t $ (das Symbol wurde gegenüber dem Originalpapier geändert).

y_t = Q(s_t)  \\
y_t[a_t] \leftarrow r_t + γ max Q(s_{t+1})

Aktualisieren Sie die Nettogewichte um einen Schritt, sodass $ Q (s \ _t) $ näher an diesem $ y \ _t $ liegt. Diese Belohnung wird zu dem maximalen Aktionswert addiert, der mit dem nächsten Zug erzielt werden kann, multipliziert mit einem bestimmten Abzinsungssatz von $ \ gamma $. Idealerweise sollte der Wert dieser Aktion aus der Summe der Aktionswerte bis zum Ende der Episode ermittelt werden. Da die Berechnungszeit jedoch zu kurz ist, werden wir nur den nächsten Schritt ausführen. Wenn Sie diesen Aktualisierungsvorgang auf unbestimmte Zeit wiederholen, erhalten Sie einen Aktionswert basierend auf der Gesamtbelohnung des Staates. Ich frage mich, ob es wahr ist. Zumindest verstehe ich das, ich werde es einfach sagen.

Die Zusammensetzung des tiefen Netzes selbst wurde nicht so oft ausprobiert und fehlerhaft, aber ich denke, es gibt keinen Fehler, wenn es vertieft wird. Ist es wirklich besser, Dropout, Batch-Normalisierung usw. hinzuzufügen, um die Generalisierungsleistung zu verbessern? Ich denke, es hängt vom Problem ab.

Best Experience Replay

Diese Implementierung ist im Grunde die gleiche wie das Papier, aber ich werde es erklären, weil es einen Punkt gibt, den ich mir ausgedacht habe.

Es scheint, dass es besser ist, eine Reihe von "Status / Aktion / Belohnung" zu verwenden, die zum Lernen verwendet werden und nicht miteinander korrelieren. Aus diesem Grund ist eine Methode namens ER (Experience Replay) wichtig. Es scheint einer der größten Punkte von DQN zu sein. Es ist eine Methode, sich an vergangene Erfahrungen zu erinnern und aus dem Satz zu lernen, der zufällig daraus extrahiert wurde.

Ein Versuch wird als Episode bezeichnet, aber in der Originalarbeit werden alle Episoden vollständig auswendig gelernt. Um eine neue Erfahrung zu erhalten, wird jede Episode auf eine Weise experimentiert, die $ \ epsilon $ -greedy heißt. $ \ Epsilon $ -greedy wählt die zufällige Aktion und die Aktion gemäß dem Netz (gierige Aktion) mit einer bestimmten Wahrscheinlichkeit $ \ epsilon $ aus. Zu Beginn des Lernens ist $ \ epsilon $ groß und Sie lernen aus fast zufälligen Bewegungen.

Sobald Sie genug gelernt haben, können Sie mit nur der gierigen Aktion Ergebnisse erzielen. Aus diesem Grund versuche ich manchmal eine komplette gierige Operation, um zu sehen, wie es funktioniert.

Ich war immer skeptisch gegenüber DQNs Papieren, aber wenn ich es versuche, ist es wahr, besonders in den frühen Tagen, mit immer mehr Episoden, an die es sich eindeutig nicht zu erinnern lohnt, und die wenigen guten Erfahrungen verschwinden aus dem Gedächtnis. Immerhin ist es völlig zufällig. Natürlich können Sie aus den Fehlern lernen, aber ich denke, es ist besser, eine gute Erfahrung als Modell zu verwenden. Deshalb habe ich mich dieses Mal entschlossen, den Episoden, die eine gute Punktzahl (lebenslange Belohnung) erhalten haben, Vorrang einzuräumen und sie auswendig zu lernen, ohne zwischen $ \ epsilon $ -grünen Episoden und gierigen Episoden zu unterscheiden. Ich habe beschlossen, die besten 100 Folgen aller Zeiten zu behalten, und nur die Folgen mit Punkten, die in die Rangliste fallen, werden gespeichert. Selbst wenn Sie es nicht in die Rangliste aufnehmen, können Sie sich mit einer Chance von 1% daran erinnern.

Nennen wir diese Methode Best ER. Aus dem Zustand, der mit demselben Startwert initialisiert wurde, habe ich den Unterschied im Konvergenzstatus zwischen Best ER und Simple ER aufgezeichnet.

compare.png

Es sieht ziemlich effektiv aus. Ich habe es in verschiedenen Fällen aufgrund von Computerressourcen nicht ausprobiert. ..

Ich habe eine Methode ausprobiert, die für eine Weile keine neuen Erfahrungen aufnimmt, aber ich habe festgestellt, dass sie nach einer Weile nach dem goldenen Zeitalter zurückgegangen ist. Es wurde wie folgt.

bestER.png

Das gleiche passierte, als ich den Startwert der Zufallszahl änderte. Ich habe die Ursache nicht gut untersucht, aber ich kann mir vorstellen, dass dies geschieht, nachdem die Highscoring-Erfolge der erwachsenen gierigen Episoden die Rangliste gefüllt haben, nicht weil die Daten zu korreliert sind oder in der Vielfalt verloren gehen. Ich denke. Es scheint jedoch, dass die verbesserte Version das goldene Zeitalter noch nicht erreicht hat. Ich denke, es gibt noch Raum für Verbesserungen.

Ich denke auch, dass Best ER von kleinen Erfolgen überwältigt werden kann. Danach kann ich Änderungen in der Umgebung nicht mehr bewältigen. Weil ich in der Herrlichkeit der Vergangenheit gefangen bin. Es ist ein bisschen wie das goldene Zeitalter, und es bringt mich dazu, es meiner Lebenstheorie hinzuzufügen, aber es hängt von der Aufgabe ab.

Es mag eine Tendenz von DQN sein, aber es ist schwierig zu sagen, ob das Lernen Fortschritte macht. Daher ist es wichtig, Kandidaten zu retten, die gut aussehen. Wie bei der numerischen Optimierung multimodaler Funktionen ist der Eindruck, dass die Zeit, die zur Erstellung der Ergebnisse benötigt wird, sehr stark von den Anfangswerten abhängt. Wenn Sie diesen Fall jedoch mehrmals versuchen, können Sie mit 10.000 Iterationen fast die höchste Punktzahl erzielen. Auf meinem PC (MacBook Pro Core i5 2,5 GHz x2 Core) dauerte es ungefähr eine Stunde.

Zusammenfassung

Ich konnte den DQN ausprobieren, den ich schon immer ausprobieren wollte. Ich schlug auch eine Methode namens Best ER vor, um die Konvergenz zu beschleunigen. Wenn Sie es selbst implementieren, können Sie Ihr Verständnis vertiefen.

Ich bin überrascht, ein solches Ergebnis zu sehen, ohne die Controllerseite abzustimmen oder einzuschalten. Es gibt viele Dinge, die ich tun möchte, z. B. die Motorsteuerung kontinuierlich machen, doppelt pendeln, mit Bildern anstelle von Winkeln beobachten, mit der eigentlichen Maschine und der Webcam usw., aber ich werde hier aus Zeitgründen aufhören.

Diesmal habe ich es mit CPU gemacht, aber es ist immerhin die Grenze mit CPU für Versuch und Irrtum in diesem Bereich. Ich freue mich auf das kürzlich angekündigte Cloud Machine Learning. Ich höre Leute, die mir sagen, ich solle leise eine GPU kaufen. .. ..

Recommended Posts

Lernen Sie mit einem umgekehrten Pendel DQN (Deep Q Network)
Lass uns mit Selene Deep SEA lernen
DQN mit Chainer. Ich habe verschiedene Verstärkungslernen hintereinander ausprobiert. (Deep Q Network, Q-Lernen, Monte Carlo)
Invertiertes Pendel mit modellprädiktiver Steuerung
Versuchen Sie es mit Chainer Deep Q Learning - Launch