Skip to content

Deep-Reinforcement-Learning with A3C in 'Super Mario Bros' (NES, 1985)

License

Notifications You must be signed in to change notification settings

JanGaida/super-mario-bros-with-a3c

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Licence Actively Maintained Python 3.8 Ask Me Anything last commit GitHub repo size


Student Research Project:

Deep-Q-Learning mit 'Super Mario Bros' und A3C.

Seminararbeit der Vorlesung Angewandtes Maschinelles Lernen an der Hochschule für angewande Wissenschaften Hof des Sommersemesters 2020.


Paper

Hier


Ziele

  • Entwicklen, Traninern und Testen eines Neuronalen Netzes zum absovlieren von Super Mario Bros. (1985)
  • Verständnis von Neuronalen Netzten und RL-Algorithmen (insbesondere Deep-Q-Learning) ausbilden

Installation

Benötigt:

  • lauffähige Python-3-Installtion (Anleitung)
  • lauffähiges Pip3-Paketemanager (in Python-3.4 und später bereits enthalten)
  • CUDA-Treiber für die Gpu-Unterstützung¹ (Anleitung)

Repository clonen:

Laden Sie sich eine Kopie dieses Projektes lokal herunter, hier bspw. mit Git:

cd <destination>
git clone https://github.com/JanGaida/super-mario-bros-with-a3c.git

Dependencies installieren:

Installieren Sie anschließend die benötigten Pakete:

Für Gpu-Unterstützung¹:

cd <destination>/super-mario-bros-with-a3c
pip3 install tensorflow-gpu==2.2.0
pip3 install -r requirements.txt

Für Cpu-Unterstützung:

cd <destination>/super-mario-bros-with-a3c
pip3 install tensorflow==2.2.0
pip3 install -r requirements.txt

¹ für das Trainiern empfohlen; Gpu-Empfehlung: Nvidia-Gpu, GTX 9XX oder neuer, 6GB NVRAM für 5 parallel laufende Trainings-Prozesse


Starten

Das Progamm selbst ist darauf ausgelegt, dass mit diversen Parametern experimentiert werden kann und verfügt deshalb um eine große Anzahl an Start-Argumenten. Desweitern verfügt es über viele Kommentare im Code um bspw. die Netzwerkarchitektur zuändern, wie etwa das LSTM-Modul mit einem GRU-Modul auszutauschen.

Start-Argumente:

Für eine Auflistung aller Start-Argumente:

cd <destination>/super-mario-bros-with-a3c
python3 main.py --help

Trainieren:

Für das Starten des Training-Vorgangs des Super-Mario-Bros Level 1 in Welt 1 von 10000 Episoden mit 5 Trainingsthreads:

cd <destination>/super-mario-bros-with-a3c
# Ausführliche Schreibweise:
python3 main.py --mode training --world 1 --stage 1 --absolute_max_training_steps 10000 --num_parallel_trainings_threads 5
# Kurze Schreibweise:
python3 main.py -m training -w 1 -s 1 -max 10000 -ttr 5

Testen:

Für das Starten des Testing-Vorgangs des Super-Mario-Bros Level 1 in Welt 1:

cd <destination>/super-mario-bros-with-a3c
# Ausführliche Schreibweise:
python3 main.py --mode testing --world 1 --stage 1
# Kurze Schreibweise:
python3 main.py -m testing -w 1 -s 1

Ergebnisse

DCN vs. CNN mit LSTM vs. GRU

Zunächst wurde in der Welt-1-Stage-1 unterscheidliche Modelle getestet (vgl. nachfolgendes Kapitel). Die gezeigten Gifs sind entsprechen hierbei 1500, 2000, 2500 und 3500 Episoden bei 5 Trainingsthreads.

DCN + LSTM

DCN + GRU

CN + LSTM

CN + GRU

Statistiken

Nachfolgende Graphen basieren auf folgender Legende:

Letzte erreichte X-Position

Insgesamt erreichter Reward

Erreichte Flagge

Weitere Trainings mit DCN + LSTM

Die nachfolgenden Ergebnisse beziehen sich speziell auf die Modelversion mit Deep-CNN und LSTM-Cell.

Welt 1 Level 3:

Von links nach rechts: 0.5k Episoden, 1k Episoden, 2k Episoden und 2.5k Episoden bei jeweils 5 Workern

Welt 1 Level 4:

Von links nach rechts: 1k Episoden, 2k Episoden, 3k Episoden und 7.5k Episoden bei jeweils 5 Workern

Model-Files:

Vortrainierte PyTorch-Model-Files befinden sich hier (Anleitung).

Aufnahmen:

Weitere Aufnahmen zu abgeschlossenen Trainings befinden sich hier


Neuronales-Netzwerk

Neuronales-Netzwerk-Context:

Nachfolgend ist der Context des Neuronalen-Netzwerkes zusehen.

Neuronales-Netzwerk-Architektur:

Nachfolgend sind die genauen Architekturen der Neuronalen-Netzwerkes zusehen die implemtiert wurden.

Naive-CNN-Ansatz:

Deep-CNN-Ansatz:

LSTM-RNN-Ansatz:

GRU-RNN-Ansatz:


Frame-Preprocessing

Nachfolgend ist das Frame-Preprocessing in einer Graphik kurz erklärt.


Reward-Funktion

Der Reward selbst wurde als sog. 'Reward Shaping' implementiert und besteht aus vier Bestandteilen:

- Delta-X-Position

Formula: delta_x = x_1 - x_0

- Delta-Time

Formula: delta_time = min( (t_1 - t_0), 0 )

- R-Ziel

Formula: r_ziel = 45 if flag_reached else 0

- R-Life

Formula: r_life = -45 if life_lost else 0

→ Reward

Insgesammt bildet sich der Reward schließlich nach nachfolgenden Formular:

Formula: reward = (delta_x + delta_time + r_ziel + r_life) / 10


Credits & Special Thanks