[PYTHON] Verstärkungslernen 3 Dynamische Planungsmethode / TD-Methode

Aidemy 2020/11/16

Einführung

Hallo, es ist ja! Obwohl es ein knuspriges literarisches System ist, interessierte ich mich für die Möglichkeiten der KI, also ging ich zur KI-Fachschule "Aidemy", um zu studieren. Ich möchte das hier gewonnene Wissen mit Ihnen teilen und habe es in Qiita zusammengefasst. Ich freue mich sehr, dass viele Menschen den vorherigen zusammenfassenden Artikel gelesen haben. Vielen Dank! Dies ist der dritte Beitrag zum verbesserten Lernen. Freut mich, dich kennenzulernen.

Was diesmal zu lernen ・ Informationen zur dynamischen Planungsmethode ・ Informationen zur TD-Methode

Dynamische Planungsmethode

Was ist eine dynamische Planungsmethode?

・ In Kapitel 2 habe ich erklärt, dass __Bellman-Gleichung __ verwendet wird, um die optimale Richtlinie zu finden, aber in diesem Kapitel __ werde ich dies tatsächlich tun __.

Politische Bewertung

-Die Berechnung der Wertfunktion $ V ^ \ pi (s) $ bei Verwendung der Methode $ \ pi $ wird als Messungsbewertung bezeichnet. Die Ausführungsmethode ist wie folgt. ・ Legen Sie zunächst den Schwellenwert $ \ epsilon $ fest, um die Richtlinie im Voraus zu aktualisieren. Geben Sie dann die Strategie $ \ pi $ ein, nehmen Sie an, dass $ V (s) $ in allen Zuständen 0 ist, und machen Sie den Unterschied in allen Zuständen kleiner als der Schwellenwert , wenn Sie __ aktualisieren, also "$ \ Delta $ "ist definiert. ・ Einmal definiert, "v" für alle Zustände s=V(s)Wie__Mit der Belman-GleichungV(s)Ist berechnet. Um den Aktualisierungsbetrag zu vergleichen, wird der vordefinierte "\delta""\max(\delta,|v-V(s)|)Und das ist "\epsilon""__Wenn es darunter fällt__Zu diesem Zeitpunkt ist die Berechnung abgeschlossen und "V(s)""V^\pi(s)Wird die Ausgabe unter der Annahme einer ungefähren Lösung von. -Der Code für die oben genannten ist wie folgt.

スクリーンショット 2020-11-14 17.19.32.png

-Für die Funktion __ "policy_evaluation ()" , die die Richtlinie auswertet, übergeben Sie "Richtlinie pi, Statuszustände, Schwellenwert epsilon" als Argument. - Definieren Sie zuerst "$ \ delta = 0 " __. Dann wird von hier aus __ die obige Methode für alle Zustände s ausgeführt. Weisen Sie zunächst der Variablen __ "v" __ mit __ "v = V.copy ()" __ die Wertfunktion V zu. Bereiten Sie auch die Variable __ "x" __ vor, in der die in der nächsten Berechnung berechneten "V [s]" gespeichert sind. -Für __ "für (p, s1) in T (s, pi [s]):" __, __ "p" __ wird in Episode T erhalten __ "Wahrscheinlichkeit, diese Aktion auszuführen ( \ pi ($ \ pi ($ \ pi)) a | s) $) "__, " s1 " ist " Status (after_state) des Übergangsziels ". Verwenden Sie diese, um $ V (s) $ mit der __Belman-Gleichung __ zu berechnen (siehe Formel in Kapitel 2). Ersetzen Sie dies durch __ "x" __. ・ Berechnen Sie "$ \ delta $" mit der obigen Formel unter Verwendung von $ V (s) $ und $ v (s) . Wenn der Schwellenwert " \ epsilon $" unterschritten wird, wird der ungefähre Wert der Wertefunktion "V" verwendet. Gib es zurück.

・ Ausführungsteil![Screenshot 2020-11-14 17.21.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/7260cfde-0802-6188 -96e9-db5d3ba10faf.png)

Richtlinienwiederholung

スクリーンショット 2020-11-14 18.42.37.png

-Für den obigen Code initialisieren Sie zuerst die Wertfunktion V und die Richtlinie pi. Anschließend wird für V die Kennzahlbewertung mit der in Kapitel 2 erstellten Funktion "policy_evaluation ()" durchgeführt. Setzen Sie gleichzeitig __ "policy_flag = True" __.

・ Ausführungsteil![Screenshot 2020-11-14 20.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/309fc249-436a-782a -6fb7-46b0d149eb4a.png)

-Die Richtlinieniterationsfunktion __ "policy_iteration ()" __ gibt die Richtlinie pi zurück, sodass dieses Ausführungsergebnis die Richtlinie "AktionX bei Status A und Aktion X bei Status B ausführen" darstellt.

Wertwiederholung

・ In der Richtlinieniteration des vorherigen Abschnitts ist es zur Berechnung von __policy pi erforderlich, die Wertefunktion für alle Zustände __ mehrfach zu berechnen __, und der Rechenaufwand nimmt mit zunehmender Anzahl von Zuständen zu. Es wird zunehmen. Die Lösung hierfür ist eine Technik namens __ "Wertiteration" __. -In der Wertiteration wird die Wertfunktion direkt für jeden Zustand s abgerufen und aktualisiert, um den __Wert v zu berechnen, sodass die __Wertfunktion nur einmal __ berechnet werden kann. -Das Folgende ist der Code der Wertiterationsfunktion __ "value_iteration ()" __.

スクリーンショット 2020-11-14 20.59.43.png

-Für diese Funktion wird der erste __Statuswert V wie zuvor __ initialisiert. Im Gegensatz zur Richtlinieniteration wird __policy pi nicht als __ betrachtet, sodass __pi __ nicht initialisiert werden muss. Als nächstes wird für jede Aktion __Messungsbewertung __ durchgeführt und der __maximale Wert von $ V (s) $ berechnet __ aktualisiert.

・ Ausführungsteil![Screenshot 2020-11-14 21.00.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/751f94af-3263-29a4 -d262-053ea8522ea6.png)

TD-Methode

Was ist die TD-Methode?

-Die obige Methode ist dynamische Planungsmethode, und die Zustandsübergangswahrscheinlichkeit P muss im Voraus bekannt sein. Im Gegenteil, wenn die Zustandsübergangswahrscheinlichkeit nicht bekannt ist, muss dies aus den tatsächlich gesammelten Belohnungen geschätzt werden, wie in Kapitel 1 erfahren. -Es gibt eine __ "TD-Methode" __ als diese Schätzmethode. Abkürzung für TimeDifferance, die durchgeführt wird, indem der nächste geschätzte Wert unter Verwendung des aktuellen Schätzwerts aktualisiert wird, ohne das Endergebnis zu sehen. -Es gibt Methoden wie __ "Sarsa" und "Q-Learning" __ in der TD-Methode.

・ Verwenden Sie danach das folgende __ "Umgebung 2" __. スクリーンショット 2020-11-14 22.48.44.png

-Der Startpunkt ist die "Start" -Zelle in der Abbildung, der Endpunkt ist die "+1" - oder "-1" -Zelle, und die schwarze Zelle ist nicht übertragbar und kann sich von der benachbarten Zelle nach oben, unten, links und rechts bewegen. Darüber hinaus ist es mit einer Wahrscheinlichkeit von __80% __ möglich, einen Übergang wie ausgewählt durchzuführen. Mit ___% __ wird der Übergang in die ausgewählte Richtung um 90 Grad im Uhrzeigersinn und mit den verbleibenden ___% __ gegen den Uhrzeigersinn verschoben. Machen. Für die Belohnung wird angenommen, dass die Endzelle __die Punktzahl __ ist und die anderen Zellen __ "-0,04" __ sind. -Der folgende Code ist eine Funktion, die die Position ausgibt, wenn Sie versuchen, __ "zwei nach oben, drei nach rechts" __ vom Startpunkt zu bewegen.

スクリーンショット 2020-11-15 11.21.11.png

スクリーンショット 2020-11-15 11.21.29.png

・ Da wir eine neue Umgebung verwenden, definieren Sie diese zuerst. Da die Funktion __ "T ()" __, die die Episode definiert, in "take_single_action ()" verwendet wird, wird sie so definiert, dass die 0. Spalte das probabilily und die 1. Spalte das next_state Array zurückgibt. Um den Status von next_state zu ändern, erstellen Sie __ "go ()" __, das __ Ziel __ aus Status und Richtung definiert. -Die Funktion __ "take_single_action ()" __, die den nächsten Zustand basierend auf der Übergangswahrscheinlichkeit bestimmt, wird auch hier verwendet. Der "nächste Zustand" wird aktualisiert, bis die im obigen "T ()" definierte "Übergangswahrscheinlichkeit" x überschreitet und die Belohnung am Ende der Aktualisierung festgelegt ist.

・ Ausführungsteil![Screenshot 2020-11-15 11.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/21e90c1f-d9b9-999b -175d-e0aea00aebcf.png)

・ Jede Zelle ist für die Umgebung definiert. Sie können auch den Anfangsposition und den Endpunkt definieren und mit move () den Status nach dem Verschieben ermitteln.

Sarsa ・ Sarsa ist eine der TD-Methoden und löst __Bellman-Gleichung __ durch Versuch und Irrtum. Bei der Wertiteration usw. wurde $ V (s) $ verwendet, aber hier wird __ Aktionswertfunktion $ Q (s, a) $ verwendet __. Diese Q-Funktion wird durch ein Array von __ [alle Zustände x alle Aktionen] __ dargestellt.

-Der spezifische Code lautet wie folgt. (Der Teil, der sich mit dem vorherigen Abschnitt überschneidet, wird weggelassen.) スクリーンショット 2020-11-15 12.30.29.png

-__ "Get_action ()" __ ist eine Funktion, die die Aktion basierend auf dem Maximalwert der später definierten Q-Funktion (q_table) __ bestimmt. Der zu diesem Zeitpunkt übergebene __ "t_state" __ ist der oben beschriebene __ "Zustand mit konvertierten Koordinaten" . - "Take_single_action ()" __ hat den gleichen Zweck wie der vorherige, aber wenn die Belohnung nicht als zurückgegebener Wert festgelegt ist, dh wenn sich das Aktionsziel __ aufgrund einer Wand oder eines Hindernisses nicht bewegen kann __ , Gibt den Status "state" und die Belohnung "-0.04" im Sinne eines Stopps an Ort und Stelle zurück und gibt "next_state" und seine Belohnung auf dem Feld zurück, auf dem die Belohnung festgelegt ist. - "update_qtable ()" __ ist eine Funktion, die die aktionswertfunktion Q tatsächlich berechnet und aktualisiert. Die zum Zeitpunkt dieses Updates verwendete Formel lautet: $Q(s,a) += \alpha[r + \gamma Q(s',a') - Q(s,a)]$

・ Diese $ \ alpha $ ist Lernrate und muss im Voraus festgelegt werden. Diesmal mit __ "0.4" __ einstellen. Der Abzinsungssatz $ \ gamma $ beträgt __ "0,8" __. Außerdem wird der zu diesem Zeitpunkt übergebene Zustand auch als "Zustand, in dem Koordinaten konvertiert werden" bezeichnet. Die Berechnung selbst kann nach der Formel erfolgen.

・ Ausführungsteil![Screenshot 2020-11-15 12.59.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/3984e81e-9e7b-fc38 -24c3-5b2d25a1c6ea.png)

スクリーンショット 2020-11-15 12.59.55.png

-Wenn Sie Sarsa ausführen, initialisieren Sie zuerst die aktionswertfunktion Q. Dieses Mal beträgt die Anzahl der Episoden 500, der Zeitschritt maximal 1000 Mal und __ "Die durchschnittliche Belohnung beträgt 5 aufeinanderfolgende Male 0,7 oder mehr" __ wird als Endbedingung für die Episode festgelegt. Bereiten Sie daher ein Array vor, um dies zu verwalten. Die Umgebung ist dieselbe wie im vorherigen Abschnitt. -Nächste wiederholen Sie für jede der 500 Folgen alles nach __ (bis die Endbedingung erfüllt ist) __. ・ Initialisieren Sie zuerst __state __. Darauf basierend werden der "t_state" und die Aktion "action" berechnet, die an die Q-Funktion übergeben werden sollen. Verwenden Sie die Funktionen "trans_state ()" und "get_action ()". ・ Als nächstes erhalten Sie für jeden Zeitschritt in der Episode den nächsten Status und die Belohnung r, wenn die Aktion a mit __ "take_single_action ()" __ ausgeführt wird, und sammeln Sie __ Belohnungen __ Ich werde gehen. Außerdem werden für den Zustand s 'der "t_next_state" und die Aktion "next_action" berechnet, die an die Q-Funktion übergeben werden sollen. -Pass diese an __ "update_qtable ()" __, um die __Aktionswertfunktion __ zu aktualisieren. Aktualisieren Sie auch den Status und die Aktion, um mit dem nächsten Zeitschritt fortzufahren. ・ Wenn Sie den Endpunkt erreicht haben, endet diese Episode und Sie fahren mit der nächsten Episode fort. Aktualisieren Sie vor dem Verschieben __ "total_reward_vec" für die Belohnung, die die Endbedingung der Episode darstellt, und geben Sie sie aus. In ähnlicher Weise wird die Nummer der beendeten Episode und die Anzahl der Schritte ausgegeben. ・ Wenn der __Mindestwert __ dieses "total_reward_vec" 0,7 überschreitet, endet die Wiederholung der Episode.

-Ausführungsergebnis (nur Teil)![Screenshot 2020-11-15 13.34.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/ d8d32f7c-e892-dfbe-7c9a-dd7b0689e03f.png)

Implementierung der ε-gierigen Methode in Sarsa

-In der Methode im vorherigen Abschnitt wurde nur der Maximalwert der Q-Funktion ausgewählt, aber dabei besteht die Gefahr, dass eine bessere Methode als __ übersehen wird. Um dies zu vermeiden, werden wir mit der __ε-gierigen Methode __ nach neuen Methoden suchen. ・ Obwohl in Kapitel 1 die ε-gierige Methode verwendet wurde, wird sie mit einer geringfügigen Änderung verwendet. Dieses Mal verwenden wir die Methode __ "Erhöhen Sie ε, um das Suchverhältnis zu erhöhen, während die Episode früh ist, und verringern Sie den Wert von ε, um die Suche im Verlauf der Episode einzugrenzen." Das Folgende wird als Formel verwendet. $\epsilon = 0.5 * (1 / ( episode + 1)) $

-Der spezifische Code lautet wie folgt: Nur der Teil "get_action ()" unterscheidet sich.

スクリーンショット 2020-11-15 15.30.10.png

-Für die obige Funktion berechnen Sie zuerst "epsilon" mit der obigen Formel. Wenn dieses Epsilon kleiner oder gleich der einheitlichen Zufallszahl "np.random.uniform (0,1)" ist, __ bestimmen Sie die nächste Aktion basierend auf dem Maximalwert der Q-Funktion wie im vorherigen Abschnitt __, andernfalls. __ Entscheide dich zufällig für die nächste Aktion __.

・ Ausführungsteil![Screenshot 2020-11-15 15.53.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/d575a11e-ce96-9d67 -856a-34d2e8d31eb9.png)

Q Lernen

-Es gibt eine TD-Methode namens __ "Q learning" __, die sich von Sarsa unterscheidet. Es ist im Grunde dasselbe wie Sarsa, aber der Unterschied besteht darin, dass bei der Verarbeitung jedes Zeitschritts die __Q-Funktion die Q-Funktion aktualisiert, nachdem die nächste Aktion __ bestimmt wurde. Q-Lernen ist __, das die nächste Aktion nach dem Update entscheidet.

スクリーンショット 2020-11-15 16.19.52.png

Zusammenfassung

-Wenn das Modell der Umgebung bei der Bestimmung von Markov vollständig angegeben wird, wird die Methode zur Ermittlung der optimalen Richtlinie unter Verwendung der Belman-Gleichung in Kapitel 2 als "dynamische Planungsmethode (Dynamic Planning Method, DP)" bezeichnet.

Diese Zeit ist vorbei. Vielen Dank für das Lesen bis zum Ende.

Recommended Posts

Verstärkungslernen 3 Dynamische Planungsmethode / TD-Methode
Verstärkungslernen 5 Versuchen Sie, CartPole zu programmieren?
[Einführung] Stärkung des Lernens
Zukünftiges Verstärkungslernen_2
Zukünftiges Verstärkungslernen_1
Dynamische Planungsmethode studieren ①
Aktieninvestitionen durch tiefgreifendes Lernen (Policy Gradient Method) (1)
Erweitertes Lernen 1 Python-Installation
Stärkung des Lernens 3 OpenAI-Installation
Stärkung des Lernens der dritten Zeile
Programmieren des Lernprotokolls 2. Tag
[Lernen stärken] Banditenaufgabe
Python + Unity Enhanced Learning (Lernen)
Stärkung des Lernens 1 Einführungsausgabe
Stärkung des Lernens 18 Colaboratory + Acrobat + ChainerRL
Verbessertes Lernen 7 Protokollieren Sie die Ausgabe von Lerndaten
Stärkung des Lernens 17 Colaboratory + CartPole + ChainerRL
Stärkung des Lernens 28 colaboratory + OpenAI + chainerRL
Stärkung des Lernens 2 Installation von Chainerrl
[Lernen stärken] Tracking durch Multi-Agent
Verbessertes Lernen ab Python
Stärkung des Lernens 20 Colaboratory + Pendulum + ChainerRL
Verstärkungslernen 9 ChainerRL Magic Remodeling
Lernen stärken Lernen Sie von heute
Python Machine Learning Programming> Schlüsselwörter
Stärkung des Lernens 4 CartPole erster Schritt
Tiefe Stärkung des Lernens 1 Einführung in die Stärkung des Lernens
Erster Monat des Programmierlernens
Tiefes Lernen der Verstärkung 2 Implementierung des Lernens der Verstärkung
DeepMind Enhanced Learning Framework Acme
Verstärktes Lernen: Beschleunigen Sie die Wertiteration