[PYTHON] Ich möchte mit verstärkendem Lernen einen Berg besteigen

51988414-脳のギア。ai-人工知能の概念。.jpg

Reinforcement Learning ist cool, nicht wahr? Dieses Mal habe ich mit "Mountain Car" der Python-Umgebung "OpenAI Gym" gespielt, also werde ich es vorstellen. Ich verwende übrigens Google Colab </ font>.

Ich habe ziemlich viel auf diesen Artikel verwiesen. Einführung in OpenAI Gym

Reibungsloses Q-Lernen

Rückblick auf Q-Lernen als Lernmethode. Egal was! Wenn ja, überspringen Sie es bitte.

Beim Q-Lernen wird $ Q \ left (s_ {t}, a_ {t} \ right) $ als Statusaktionswert </ font> und in einem bestimmten Status $ st $ als Aktion $ bezeichnet Repräsentiert den Wert von a_ {t} $. Die hier verwendete Notation $ t $ bedeutet nicht Zeit, sondern einen einzelnen Zustand eines Zustands. Der Wert hier ist nicht die vorübergehende Belohnung, die Sie erhalten, wenn Sie den Status ändern, sondern die kumulative Belohnung, die Sie erhalten, wenn Sie die Episode bis zum Ende abschließen.

Daher sollten Sie als Maß $ a $ auswählen, das in einem bestimmten Zustand $ s_ {t} $ zu $ \ max_ {a \ in At} (Q (s_ {t}, a)) $ wird. Wird sein.

Aktualisierung des Statusaktionsstatus

Im Allgemeinen wird das Verfahren zum Aktualisieren des Zustandsverhaltenswerts wie folgt ausgedrückt.

$\begin{aligned}Q\left( s_{t},a_{t}\right) \\ \leftarrow Q\left( s_{t},a_{t}\right) \\ +\alpha \left( G_{t}-Q\left( s_{t},a_{t}\right) \right) \end{aligned}$ Hier ist im Fall des Q-Lernens $ G_ {t} $

$G_{t}=r_{t+1}+\gamma\max_{a\in At}[Q(s_{t+1},a)]$ Sie können sehen, dass der nächste Status anstelle des aktuellen Status berücksichtigt wird, z. B. $ s_ {t + 1} $. Sie können sehen, dass dies auch die Belohnungen berücksichtigt, die in Zukunft erhalten werden. $ r_ {t + 1} $ heißt sofortige Belohnung </ font>, und die Belohnung, die Sie unmittelbar nach dem Übergang erhalten, $ \ alpha $ ist Lernrate < Mit dem Namen / font> wird festgelegt, um wie viel der Wert in einem Lernprogramm aktualisiert wird. $ \ Gamma $ heißt Abzinsungssatz </ font> und bestimmt, wie viel Sie auf zukünftige Belohnungen verweisen möchten.

Es ist dieses $ Q $ -Lernen, das diese Statuswertfunktion durch Wiederholen von Episoden (Spielen) aktualisiert und die optimale Strategie sucht.

Mountain Car Regeln

スクリーンショット 2020-09-10 22.31.19.png

In dieser Umgebung endet das Spiel, wenn die Position des Autos die Position der Flagge auf der rechten Seite erreicht. Wenn Sie es nicht erreichen, erhalten Sie für jede Aktion, die Sie ausführen, eine Belohnung von -1. Wenn Sie das Ziel nach 200 Aktionen nicht erreichen, ist das Spiel beendet. In diesem Fall haben Sie eine Belohnung von -200 erhalten. Mit anderen Worten, Sie werden darauf trainiert, eine Belohnung von mehr als -200 zu erhalten.

Die Aktionen sind auf drei begrenzt: nach links bewegen: 0, nicht bewegen: 1, nach rechts bewegen: 2.

Vorbereitung

Ich habe verschiedene Dinge in Google Colab eingefügt, um den Zustand zu beschreiben, aber am Ende muss ich nur noch ins Fitnessstudio.

bash


#Installation im Fitnessstudio
$ pip install gym
#Nicht benötigt(Empfohlen bei Verwendung von Colab)
$apt update
$apt install xvfb
$apt-get -qq -y install libcusparse8.0 libnvrtc8.0 $ibnvtoolsext1 > /dev/null
$ln -snf /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.8.0 /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so

$apt-get -qq -y install xvfb freeglut3-dev ffmpeg> /dev/null
$pip install pyglet
$pip install pyopengl
$pip install pyvirtualdisplay

Bibliotheksimport

Einige von ihnen werden nicht benötigt, daher können Sie sie entsprechend auswählen.

import gym
from gym import logger as gymlogger
from gym.wrappers import Monitor
gymlogger.set_level(40) #error only
import tensorflow as tf
import numpy as np
import random
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
import math
import glob
import io
import base64
from IPython.display import HTML

Q Lernimplementierung

Ich beziehe mich auf Github für die Arten von Aktionen und die Verwendung der Umgebung. GitHub MountainCar


class Q:
    def __init__(self, env):
        self.env = env
        self.env_low = self.env.observation_space.low #Minimale Position und Geschwindigkeit
        self.env_high = self.env.observation_space.high #Maximale Position und Geschwindigkeit
        self.env_dx = (self.env_high - self.env_low) / 40 #In 50 gleiche Teile teilen
        self.q_table = np.zeros((40,40,3))
        
    def get_status(self, _observation):
        position = int((_observation[0] - self.env_low[0])/self.env_dx[0])
        velocity = int((_observation[1] - self.env_low[1])/self.env_dx[1])
        return position, velocity
    
    def policy(self, s, epsilon = 0.1):
        if np.random.random() <= epsilon:
            return np.random.randint(3)
        else:
            p, v = self.get_status(s)
            if self.q_table[p][v][0] == 0 and self.q_table[p][v][1] == 0 and self.q_table[p][v][2] == 0:
                return np.random.randint(3)
            else:
                return np.argmax(self.q_table[p][v])
    
    def learn(self, time = 5000, alpha = 0.4, gamma = 0.99):
        log = []
        for j in range(time):
            total = 0
            s = self.env.reset()
            done = False
            
            while not done:
                a = self.policy(s)
                next_s, reward, done, _ = self.env.step(a)
                total += reward

                p, v = self.get_status(next_s)
                G = reward + gamma * max(self.q_table[p][v])
                
                p,v = self.get_status(s)
                self.q_table[p][v][a] += alpha*(G - self.q_table[p][v][a])
                s = next_s

            log.append(total)
            if j %100 == 0:
              print(str(j) + " ===total reward=== : " + str(total))
        return plt.plot(log)

    def show(self):
        s = self.env.reset()
        img = plt.imshow(env.render('rgb_array'))
        done = False
        while not done:
          p, v = self.get_status(s)
          s, _, done, _ = self.env.step(self.policy(s))
          display.clear_output(wait=True)
          img.set_data(env.render('rgb_array'))
          plt.axis('off')
          display.display(plt.gcf())
                
        self.env.close()

Der Handhabungszustand $ s $ enthält die aktuelle Position des Fahrzeugs (Position) und die aktuelle Geschwindigkeit (Geschwindigkeit). Da beide kontinuierliche Werte annehmen, werden sie mit der Funktion get_status auf diskrete Werte (40, 40) gesetzt. q_table ist der Speicherort der Zustandswertfunktion, die das Produkt jedes Zustands (40, 40) nach Art der Aktion (3) ist.

env = gym.make('MountainCar-v0')
agent = Q(env)
agent.learn()

スクリーンショット 2020-09-10 22.38.42.png

Nachdem ich ungefähr 5.000 Mal gelernt habe, hat sich die Anzahl der Male, die ich mein Ziel erreichen kann, erhöht.

Übrigens, wenn Sie die Animation mit Google Colab überprüfen möchten,

from IPython import display
from pyvirtualdisplay import Display
import matplotlib.pyplot as plt

d = Display()
d.start()

agent.show()

Sie können es in sehen. 車を走らせる.gif

Impressionen

Dieses Mal ist die Erklärung ziemlich kompliziert, daher werde ich sie schrittweise aktualisieren. Wir werden weiterhin Informationen verbreiten, während wir mehr mit Gym spielen. wir sehen uns!

Recommended Posts