[PYTHON] Lerne beim Machen! Tiefes Verstärkungslernen_1

Deep Reinforcement Learning-Praktisches Programmieren mit Pytorch-

Ich bin Harima, eine Master of Science-Graduiertenschule im ersten Jahr. Ich werde meine Lerninhalte als Memo zusammenfassen. Es tut mir leid, dass es schwer zu sehen ist. Ich würde gerne wissen, was Sie nicht verstehen.


Implementierungscode (GitHub) https://github.com/YutaroOgawa/Deep-Reinforcement-Learning-Book


Kapitel 2 Lassen Sie uns erweitertes Lernen in die Labyrinthaufgabe implementieren

2.1 Verwendung von Python

2.2 Labyrinthe und Agenten implementieren

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
fig=plt.figure(figsize=(5,5))
ax=plt.gca()


plt.plot([1,1],[0,1],color='red',linewidth=2)
plt.plot([1,2],[2,2],color='red',linewidth=2)
plt.plot([2,2],[2,1],color='red',linewidth=2)
plt.plot([2,3],[1,1],color='red',linewidth=2)


plt.text(0.5,2.5,'S0',size=14,ha='center')
plt.text(1.5,2.5,'S1',size=14,ha='center')
plt.text(2.5,2.5,'S2',size=14,ha='center')
plt.text(0.5,1.5,'S3',size=14,ha='center')
plt.text(1.5,1.5,'S4',size=14,ha='center')
plt.text(2.5,1.5,'S5',size=14,ha='center')
plt.text(0.5,0.5,'S6',size=14,ha='center')
plt.text(1.5,0.5,'S7',size=14,ha='center')
plt.text(2.5,0.5,'S8',size=14,ha='center')
plt.text(0.5,2.3,'START',ha='center')

plt.text(2.5,0.3,'GOAL',ha='center')


ax.set_xlim(0,3)
ax.set_ylim(0,3)
plt.tick_params(axis='both',which='both',bottom='off',top='off',
                labelbottom='off',right='off',left='off',labelleft='off')


line, =ax.plot([0.5],[2.5],marker="o",color='g',markersize=60)

Screenshot from 2019-12-18 17-42-22.png

Es ist eine Gesamtansicht des Labyrinths.

・ Die Regel, die definiert, wie sich der Agent verhält, heißt ** Richtlinie **.

・ Ausgedrückt als $ \ pi_ \ theta (s, a) $

・ Die Wahrscheinlichkeit, die Aktion $ a $ im Zustand $ s $ zu übernehmen, folgt der durch den Parameter $ \ theta $ bestimmten Richtlinie $ \ pi $.

theta_0 = np.array([[np.nan, 1, 1, np.nan],
                    [np.nan, 1, np.nan, 1],
                    [np.nan, np.nan, 1, 1],
                    [1, 1, 1, np.nan],
                    [np.nan, np.nan, 1, 1],
                    [1, np.nan, np.nan, np.nan],
                    [1, np.nan, np.nan, np.nan],
                    [1, 1, np.nan, np.nan]
                    ])

・ Konvertieren Sie den Parameter $ \ theta_0 $, um die Richtlinie $ \ pi_ \ theta (s, a) $ zu finden


def simple_convert_into_pi_fron_theta(theta):

     [m,n] = theta.shape
     pi = np.zeros((m,n))
     for i in range(0,m):
         pi[i, :] = theta[i, :] / np.nansum(theta[i, :])

     pi = np.nan_to_num(pi)

     return pi
pi_0 = simple_convert_into_pi_fron_theta(theta_0)

・ Die Wahrscheinlichkeit, zur Wand zu gehen, beträgt 0

・ Bewegen Sie sich mit gleicher Wahrscheinlichkeit in andere Richtungen

pi_0

Screenshot from 2019-12-18 17-43-53.png

・ Bewegen Sie die Agenten weiter, bis Sie das Ziel erreichen

def get_next_s(pi, s):
    direction = ["up", "right", "down", "left"]

    next_direction = np.random.choice(direction, p=pi[s, :])

    if next_direction == "up":
        s_next = s - 3
    elif next_direction == "right":
        s_next = s + 1
    elif next_direction == "down":
        s_next = s + 3
    elif next_direction == "left":
        s_next = s - 1

    return s_next
def goal_maze(pi):
    s = 0
    state_history = [0]

    while (1):
        next_s = get_next_s(pi, s)
        state_history.append(next_s)

        if next_s == 8:
            break
        else:
            s = next_s

    return state_history

・ Überprüfen Sie, welche Art von Flugbahn und wie viele Schritte Sie insgesamt unternommen haben, bis Sie das Ziel erreicht haben

state_history = goal_maze(pi_0)
print(state_history)
print("Die Anzahl der Schritte zur Lösung des Labyrinths" + str(len(state_history) - 1) + "ist")

Screenshot from 2019-12-18 17-45-49.png

・ Visualisieren Sie den Verlauf des Zustandsübergangs

from matplotlib import animation
from IPython.display import HTML


def init():
    line.set_data([], [])
    return (line,)


def animate(i):
    state = state_history[i]
    x = (state % 3) + 0.5
    y = 2.5 - int(state / 3)
    line.set_data(x, y)
    return (line,)


anim = animation.FuncAnimation(fig, animate, init_func=init, frames=len(
    state_history), interval=200, repeat=False)

HTML(anim.to_jshtml())

2_2_maze_random.gif

2.3 Implementierung der iterativen Methode für Richtlinien

・ Überlegen Sie, wie Sie den Agenten so trainieren können, dass er direkt zum Ziel gelangt

(1) Methode zur Wiederholung von Richtlinien

Strategie, die das Verhalten erfolgreicher Fälle betont

(2) Wertwiederholungsmethode

Strategie, um anderen Positionen (Staaten) als dem Ziel einen Mehrwert (Priorität) zu verleihen

def softmax_convert_into_pi_from_theta(theta):

    beta = 1.0
    [m, n] = theta.shape
    pi = np.zeros((m, n))

    exp_theta = np.exp(beta * theta)

    for i in range(0, m):

        pi[i, :] = exp_theta[i, :] / np.nansum(exp_theta[i, :])

    pi = np.nan_to_num(pi)

    return pi

・ Messen Sie $ \ pi_ {{\ theta_0}} $

pi_0 = softmax_convert_into_pi_from_theta(theta_0)
print(pi_0)

Screenshot from 2019-12-18 18-14-44.png

・ Erwerben Sie nicht nur den Staat, sondern auch die verabschiedete Maßnahme

def get_action_and_next_s(pi, s):
    direction = ["up", "right", "down", "left"]
    next_direction = np.random.choice(direction, p=pi[s, :])

    if next_direction == "up":
        action = 0
        s_next = s - 3
    elif next_direction == "right":
        action = 1
        s_next = s + 1
    elif next_direction == "down":
        action = 2
        s_next = s + 3
    elif next_direction == "left":
        action = 3
        s_next = s - 1

    return [action, s_next]

-Fixed "target_maze" Funktion, die den Agenten bewegt, bis das Ziel erreicht ist

def goal_maze_ret_s_a(pi):
    s = 0
    s_a_history = [[0, np.nan]]

    while (1):
        [action, next_s] = get_action_and_next_s(pi, s)
        s_a_history[-1][1] = action

        s_a_history.append([next_s, np.nan])

        if next_s == 8:
            break
        else:
            s = next_s

    return s_a_history
s_a_history = goal_maze_ret_s_a(pi_0)
print(s_a_history)
print("Die Anzahl der Schritte zur Lösung des Labyrinths" + str(len(s_a_history) - 1) + "ist")

Screenshot from 2019-12-18 18-15-43.png

Weggelassen, weil es lang ist ...

Aktualisieren Sie die Richtlinie gemäß der Richtliniengradientenmethode

・ Die Richtliniengradientenmethode aktualisiert den Parameter $ \ theta $ gemäß der folgenden Formel.


\theta_{s_i,a_j}=\theta_{s_i,a_j}+\eta*\Delta\theta_{s,a_j} \\
\Delta\theta{s,a_j}=\{ N(s_i,a_j)-P(s_i,a_j)N(s_i,a) \}/T


def update_theta(theta, pi, s_a_history):
    eta = 0.1
    T = len(s_a_history) - 1

    [m, n] = theta.shape
    delta_theta = theta.copy()

    for i in range(0, m):
        for j in range(0, n):
            if not(np.isnan(theta[i, j])):

                SA_i = [SA for SA in s_a_history if SA[0] == i]

                SA_ij = [SA for SA in s_a_history if SA == [i, j]]

                N_i = len(SA_i)
                N_ij = len(SA_ij)

                delta_theta[i, j] = (N_ij - pi[i, j] * N_i) / T

    new_theta = theta + eta * delta_theta

    return new_theta
  • Ich verstehe das hier wirklich nicht! !! !! !!
new_theta = theta + eta * delta_theta
  • Warum hinzufügen! ??
  • Sollte derjenige mit einer großen Anzahl von Versuchen (der wahrscheinlich nicht der kürzeste Weg ist) gezogen werden?
  • Bitte sag mir ...
new_theta = update_theta(theta_0, pi_0, s_a_history)
pi = softmax_convert_into_pi_from_theta(new_theta)
print(pi)

Screenshot from 2019-12-18 18-16-52.png

・ Wiederholen Sie die Suche im Labyrinth und aktualisieren Sie den Parameter $ \ theta $, bis das Labyrinth in einer geraden Linie gelöscht werden kann.

・ Messen Sie das Ende, wenn die Summe der Absolutwerte der Änderungen in $ \ pi $ kleiner als $ 10 ^ {-4} $ wird

stop_epsilon = 10**-4

theta = theta_0
pi = pi_0

is_continue = True
count = 1
while is_continue:
    s_a_history = goal_maze_ret_s_a(pi)
    new_theta = update_theta(theta, pi, s_a_history)
    new_pi = softmax_convert_into_pi_from_theta(new_theta)

    if np.sum(np.abs(new_pi - pi)) < stop_epsilon:
        is_continue = False
    else:
        theta = new_theta
        pi = new_pi

Eigentlich gab es "Drucken" in der Funktion, aber ich habe es geschnitten, weil es nervt ...

np.set_printoptions(precision=3, suppress=True)
print(pi)

Screenshot from 2019-12-18 18-18-08.png

・ Versuchen Sie zu visualisieren

from matplotlib import animation
from IPython.display import HTML


def init():
    line.set_data([], [])
    return (line,)


def animate(i):
    state = s_a_history[i][0]
    x = (state % 3) + 0.5
    y = 2.5 - int(state / 3)
    line.set_data(x, y)
    return (line,)

anim = animation.FuncAnimation(fig, animate, init_func=init, frames=len(
    s_a_history), interval=200, repeat=False)

HTML(anim.to_jshtml())

2_3_maze_reinforce.gif

-Die Softmax-Funktion kann eine Strategie ableiten, selbst wenn der Parameter $ \ theta $ ein negativer Wert wird.

・ Mit dem Richtliniengradientensatz ist es möglich, die Aktualisierungsmethode des Parameters $ \ theta $ mit der Richtliniengradientenmethode zu lösen.

・ Es gibt einen Algorithmus REINFORCE, der den Satz des Richtliniengradienten ungefähr implementiert.


»Diesmal gab es etwas, das ich nicht verstanden habe. »Ich würde es begrüßen, wenn mir jemand davon erzählen könnte.

Recommended Posts

Lerne beim Machen! Tiefes Verstärkungslernen_1
"Lernen Sie, während Sie machen! Entwicklung tiefes Lernen von PyTorch" auf Colaboratory.
Verbessertes Lernen, um von null bis tief zu lernen
Lernen stärken Lernen Sie von heute
Tiefe Stärkung des Lernens 1 Einführung in die Stärkung des Lernens
Tiefes Lernen der Verstärkung 2 Implementierung des Lernens der Verstärkung
Deep Strengthing Learning 3 Praktische Ausgabe: Block Breaking
Tiefes Lernen
<Kurs> Deep Learning Day4 Stärkung des Lernens / Tensorflusses
[Einführung] Stärkung des Lernens
Deep Learning Memorandum
Starten Sie Deep Learning
Zukünftiges Verstärkungslernen_2
Zukünftiges Verstärkungslernen_1
Deep Learning × Python
Erstes tiefes Lernen ~ Kampf ~
Aktieninvestitionen durch tiefgreifendes Lernen (Policy Gradient Method) (1)
Erweitertes Lernen 1 Python-Installation
Stärkung des Lernens 3 OpenAI-Installation
Python: Deep Learning-Praxis
Deep Learning / Aktivierungsfunktionen
Deep Learning von Grund auf neu
Deep Learning 1 Übung des Deep Learning
Stärkung des Lernens der dritten Zeile
Erstes tiefes Lernen ~ Lösung ~
[AI] Deep Metric Learning
Ich habe versucht, tief zu lernen
Lerne irgendwie maschinelles Lernen
Python: Deep Learning Tuning
Deep Learning Großtechnologie
Python + Unity Enhanced Learning (Lernen)
Deep Learning / Softmax-Funktion
Ein Amateur stolperte über Deep Learning ❷ von Grund auf neu Hinweis: Kapitel 5
Ein Amateur stolperte über Deep Learning ❷ von Grund auf neu Hinweis: Kapitel 2
Ein Amateur stolperte über Deep Learning ❷ von Grund auf neu Hinweis: Kapitel 4
Stärkung des Lernens 18 Colaboratory + Acrobat + ChainerRL
Deep Learning von Grund auf 1-3 Kapitel
Verbessertes Lernen 7 Protokollieren Sie die Ausgabe von Lerndaten
Deep Learning Gaiden ~ GPU-Programmierung ~
<Kurs> Tiefes Lernen: Day2 CNN
Stärkung des Lernens 17 Colaboratory + CartPole + ChainerRL
Stärkung des Lernens 28 colaboratory + OpenAI + chainerRL
Stärkung des Lernens 19 Colaboratory + Mountain_car + ChainerRL
Stärkung des Lernens 2 Installation von Chainerrl
[Lernen stärken] Tracking durch Multi-Agent
Deep Running 2 Tuning von Deep Learning
Stärkung des Lernens 6 First Chainer RL
<Kurs> Tiefes Lernen: Tag 1 NN
Deep Kernel Learning mit Pyro
Versuchen Sie Deep Learning mit FPGA
Verstärkungslernen 5 Versuchen Sie, CartPole zu programmieren?
Verstärkungslernen 9 ChainerRL Magic Remodeling
Deep Learning für die Bildung von Verbindungen?
Einführung in Udacity Deep Learning Nanodegree
Themen> Deep Learning: Tag 3 RNN
Einführung in Deep Learning ~ Lernregeln ~