Aidemy 2020/11/16
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
・ 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 __.
-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=
-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
・ 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)
-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.
・ 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 ()" __.
-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)
-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" __.
-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.
・ 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.)
-__ "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:
・ 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)
-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)
-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.
-Der spezifische Code lautet wie folgt: Nur der Teil "get_action ()" unterscheidet sich.
-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)
-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.
-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