[PYTHON] Ich lernte die Grundlagen des intensiven Lernens und spielte mit Cart Pole (Implementierung von einfachem Q-Lernen).

Einführung

Ich habe maschinelles Lernen und Statistik studiert. Unter ihnen habe ich das Lernen zur Stärkung des Lernens nicht sehr gut studiert, deshalb habe ich mein Verständnis mit der Implementierung vertieft.   Die Referenzmaterialien sind wie folgt.

Überblick über verbessertes Lernen

Reinforcement Learning (RL) ist eine der Methoden des maschinellen Lernens, die die optimale Systemsteuerung durch Ausprobieren durch das System selbst realisiert.

Alpha Go ist berühmt.

In Bezug auf die Klassifizierung wird es als ** anders als das Lernen mit / ohne Lehrer ** positioniert. Es ist sinnlich, ohne Lehrer zu lernen, aber es scheint anders zu sein.

Die folgende Abbildung ist eine schematische Darstellung. In einer bestimmten Umgebung lernen wir die Optimierung der Maßnahmen zur Maximierung der Zielbelohnung (Punktzahl) als Modell.

image.png

Diese Aktion

Es hängt von dem Spiel ab, das Sie lernen möchten.

Obwohl die Forschung selbst in den 1990er Jahren aktiv betrieben wurde, war es schwierig auszudrücken, wie man "Zustand" ausdrückt und wie man ihn mit "Verhalten" auf der Grundlage dieses "Zustands" verbindet, und die Dynamik der Forschung nahm in den 2000er Jahren ab. Es scheint.

Tiefes Verstärkungslernen

Als Antwort auf dieses Problem führte DeepMind 2013 Block Breaking by Enhanced Learning ** in Kombination mit einem Convolutional Neural Network (CNN) ein. Es wurde veröffentlicht und erhielt eine große Resonanz.

Es heißt DQN (Deep Q-Network), weil es ** Q-Lernen (Q-Lernen) ** und Deep Learning mit der hier verwendeten Methode des verstärkenden Lernens kombiniert.   ** In dieser Implementierung werden wir dies jedoch mit einfachem Q-Lernen tun. ** Ab dem nächsten Mal möchte ich eine Implementierungsversion mit DQN erstellen. ..

Wagenstange implementieren

Dieses Mal werden wir uns mit ** Cart Pole ** befassen, einer MNIST-ähnlichen Existenz des verstärkenden Lernens. Es hat einen Stab auf einer Riemenscheibe, der eindimensionale Bewegungen ausführt (links und rechts). Es ist ein Inhalt, die Bewegung der Riemenscheibe zu lernen, damit dieser Stab nicht herunterfällt.

001.png

Es ist sehr einfach. ** Die Statusparameter sind die folgenden 4 **.

Andererseits sind ** Verhaltensparameter ** die folgenden zwei.

Sie erhalten 1 Belohnung, solange der Ball nicht fällt. Eine Episode ist auch der Zeitraum bis zum Ende eines Spiels. Und

Wird besorgt.

Wenn Sie es einfach bewegen

Machen Sie einfach "np.random.choice ([0,1])", ohne sich um irgendetwas zu kümmern, und bewegen Sie "0" oder "1" nach dem Zufallsprinzip. Was passiert dann?

import gym
import numpy as np

env = gym.make('CartPole-v0')

goal_average_steps = 195
max_number_of_steps = 200
num_consecutive_iterations = 100
num_episodes = 200
last_time_steps = np.zeros(num_consecutive_iterations)

for episode in range(num_episodes):
    #Umgebungsinitialisierung
    observation = env.reset()

    episode_reward = 0
    for t in range(max_number_of_steps):
        #CartPole zeichnen
        env.render()
        if env.viewer == None:
            env.render()
        #Zufällige Auswahl der Aktion
        action = np.random.choice([0, 1])

        #Handeln Sie und erhalten Sie Feedback
        observation, reward, done, info = env.step(action)
        episode_reward += reward

        if done:
            print('%d Episode finished after %d time steps / mean %f' % (episode, t + 1,
                last_time_steps.mean()))
            last_time_steps = np.hstack((last_time_steps[1:], [episode_reward]))
            break

    if (last_time_steps.mean() >= goal_average_steps): #Erfolg, wenn die letzten 100 Folgen 195 oder höher sind
        print('Episode %d train agent successfuly!' % episode)
        break

Dann wird es wie folgt angezeigt.

185 Episode finished after 21 time steps / mean 21.350000
186 Episode finished after 23 time steps / mean 21.390000
187 Episode finished after 22 time steps / mean 21.510000
188 Episode finished after 39 time steps / mean 21.420000
189 Episode finished after 13 time steps / mean 21.320000
190 Episode finished after 9 time steps / mean 21.160000
191 Episode finished after 26 time steps / mean 20.980000
192 Episode finished after 17 time steps / mean 21.100000
193 Episode finished after 94 time steps / mean 21.120000
194 Episode finished after 15 time steps / mean 21.870000
195 Episode finished after 26 time steps / mean 21.880000
196 Episode finished after 13 time steps / mean 21.970000
197 Episode finished after 13 time steps / mean 21.940000
198 Episode finished after 31 time steps / mean 21.760000
199 Episode finished after 23 time steps / mean 21.950000

Sie können sehen, dass es nach etwa Dutzenden von Zeitschritten bricht. Ich verstehe, dass die Anzahl nicht steigt, weil ich nicht gelernt habe.

Lernen Sie mit Q Learning

Jetzt lernen wir mit Q Learning.

Die Schlüsselidee hierbei ist, einen Index festzulegen, um die nächste Aktion auszuwählen, die in einer bestimmten Situation ausgeführt werden soll. Dieser Wert wird als Q-Wert bezeichnet. Programmatisch ist es als Q_table definiert und hat die folgende Matrix.

image.png

In diesem Fall bilden $ 4 ^ 4 = 256 $ und die linken und rechten Aktionen $ 2 $ bilden eine $ 256 x 2 $ Matrix, da es vier Zustände gibt, in denen die Zustände des Wagens und der Stange unten jeweils in vier unterteilt sind.

Wir werden diesen Q-Wert für jede Aktion verbessern. Je größer der Q-Wert ist, desto einfacher ist die Auswahl. Wenn Sie diesen Q-Wert so erhöhen, dass sich die Belohnung erhöht, wird Ihr Verhalten verbessert.

Die Aktualisierung dieses Q-Wertes ist übrigens wie folgt.

Q(s, a) = (1 - \alpha)Q(s, a) + \alpha(R(s, a) + \gamma max_{a'} E[Q(s', a')])

Hier

Es wird sein.

Wenn dies implementiert ist, wird es wie folgt sein.


def get_action(state, action, observation, reward):
    next_state = digitize_state(observation)
    next_action = np.argmax(q_table[next_state])

    #Q-Tabelle aktualisieren
    alpha = 0.2
    gamma = 0.99
    q_table[state, action] = (1 - alpha) * q_table[state, action] +\
            alpha * (reward + gamma * q_table[next_state, next_action])

    return next_action, next_state

for episode in range(num_episodes):
    #Umgebungsinitialisierung
    observation = env.reset()

    state = digitize_state(observation)
    action = np.argmax(q_table[state])

    episode_reward = 0
    for t in range(max_number_of_steps):
        #CartPole zeichnen
        #env.render()

        #Handeln Sie und erhalten Sie Feedback
        observation, reward, done, info = env.step(action)

        #Aktionsauswahl
        action, state = get_action(state, action, observation, reward)
        episode_reward += reward

Damit konvergiert das Lernen tatsächlich in etwa 100 Versuchen und ist erfolgreich.

das Ende

Ich spielte mit dem Entwurf, das Lernen und Cart Pole zu stärken. Ich möchte auch DQN herausfordern.

Das vollständige Programm finden Sie weiter unten. https://github.com/Fumio-eisan/RL20200527

Recommended Posts

Ich lernte die Grundlagen des intensiven Lernens und spielte mit Cart Pole (Implementierung von einfachem Q-Lernen).
Deep Learning von Grund auf neu Die Theorie und Implementierung des mit Python erlernten Deep Learning Kapitel 3
Lernen Sie während der Implementierung mit Scipy die Grundlagen der logistischen Regression und des mehrschichtigen Perzeptrons
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
[Super-Grundlagen von Python] Ich habe die Grundlagen der Grundlagen gelernt und sie daher kurz zusammengefasst.
Entdecken Sie das Labyrinth mit erweitertem Lernen
Ich habe mit PyQt5 und Python3 gespielt
Ich habe die numerische Berechnung von Python durch Rust ersetzt und die Geschwindigkeit verglichen
Ich habe den Akkord des Songs mit word2vec vektorisiert und mit t-SNE visualisiert
Ich habe GAN mit Keras gemacht, also habe ich ein Video des Lernprozesses gemacht.
Ich habe die Geschwindigkeit der Listeneinschlussnotation für und während mit Python2.7 gemessen.
[Scikit-learn] Ich habe mit der ROC-Kurve gespielt
Ich kannte die Grundlagen von Python nicht
Ich habe die Beleuchtungsstärke des Raumes mit Raspberry Pi, Arduino und einem optischen Sensor getwittert
Ich habe den gleitenden Durchschnitt des IIR-Filtertyps mit Pandas und Scipy verglichen
Die Geschichte des tiefen Lernens mit TPU
Grundlagen des Lernens mit einem Lehrer Teil 1 - Einfache Regression - (Hinweis)
Ein Memorandum zum Studieren und Implementieren von Deep Learning
Ich habe vorerst mit Floydhub gespielt
Ich habe die Varianten von UKR gelesen und implementiert
[Mac] Ich habe versucht, das Lernen mit Open AI Baselines zu stärken
Ich habe versucht, "Grundlagen der Zeitreihenanalyse und des Zustandsraummodells" (Hayamoto) mit Pystan zu implementieren
[Beispiel für eine Python-Verbesserung] In 2 Wochen wurden die Grundlagen von Python auf einer kostenlosen Website erlernt
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Ich wollte nur die Daten des gewünschten Datums und der gewünschten Uhrzeit mit Django extrahieren
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen