Unity Machine Learning: Unterrichten von MO-Agenten, über Wände zu springen

In den letzten Jahren gab es große Durchbrüche beim Reinforcement Learning (RL): vom ersten erfolgreichen Einsatz im Rohpixel-Training bis zum Training von Open AI Roborists, und für weitere Fortschritte sind immer ausgefeiltere Umgebungen erforderlich, die helfen Einheit kommt.

Das Unity ML-Agents-Tool ist ein neues Plugin in der Unity-Spiel-Engine, mit dem Sie Unity als Umgebungskonstruktor für die Schulung von MO-Agenten verwenden können.

Das Unity ML-Agents Toolkit bietet eine Vielzahl von Bedingungen für Trainingsagenten, vom Fußballspielen über das Gehen, Springen von Wänden bis hin zum Trainieren von KI-Hunden zum Spielen von Stöcken.

In diesem Artikel werden wir uns die Funktionsweise von Unity MO-Agenten ansehen und dann einem dieser Agenten beibringen, über Wände zu springen.

Bild


Was sind Unity ML-Agenten?


Unity ML-Agents ist ein neues Plugin für die Unity-Game-Engine, mit dem Sie vorgefertigte Umgebungen für die Schulung unserer Agenten erstellen oder verwenden können.

Das Plugin besteht aus drei Komponenten:



Die erste - eine Lernumgebung ( die Lernumgebung ), die Szenen der Einheit und Umgebungselemente enthält.

Die zweite ist die Python-API , die die RL-Algorithmen enthält (z. B. PPO - Proximal Policy Optimization und SAC - Soft Actor-Critic). Wir verwenden diese API, um Schulungen, Tests usw. zu starten. Sie ist über die dritte Komponente - einen externen Kommunikator - mit der Lernumgebung verbunden .


Woraus die Lernumgebung besteht


Die Trainingskomponente besteht aus verschiedenen Elementen:



Der erste Agent ist der Bühnenschauspieler. Er ist es, den wir trainieren werden, indem wir eine Komponente namens „Gehirn“ optimieren, in der aufgezeichnet wird, welche Aktionen in jedem der möglichen Zustände ausgeführt werden müssen.

Das dritte Element, die Akademie, verwaltet Agenten und ihre Entscheidungsprozesse und verarbeitet Anforderungen von der Python-API. Um seine Rolle besser zu verstehen, erinnern wir uns an den RL-Prozess. Es kann als ein Zyklus dargestellt werden, der wie folgt funktioniert:



Angenommen, ein Agent muss lernen, wie man einen Plattformer spielt. Der RL-Prozess sieht in diesem Fall folgendermaßen aus:

  • Der Agent erhält den Status S 0 von der Umgebung - dies ist der erste Frame unseres Spiels.
  • Basierend auf dem Zustand S 0 führt der Agent die Aktion A 0 aus und verschiebt sich nach rechts.
  • Die Umgebung geht in einen neuen Zustand S 1 über .
  • Der Agent erhält eine Belohnung von R 1, wenn er nicht tot ist ( positive Belohnung +1).

Dieser RL-Zyklus bildet eine Folge von Zustand, Aktion und Belohnung. Das Ziel des Agenten ist es, die erwartete Gesamtbelohnung zu maximieren.



Daher sendet die Akademie Anweisungen an die Agenten und sorgt für die Synchronisierung ihrer Ausführung, nämlich:

  • Sammlung von Beobachtungen;
  • Die Wahl der Maßnahme gemäß den festgelegten Anweisungen;
  • Aktionsausführung;
  • Zurücksetzen, wenn die Anzahl der Schritte erreicht wurde oder das Ziel erreicht wurde.


Wir bringen dem Agenten bei, durch die Wände zu springen


Jetzt, da wir wissen, wie Unity-Agenten arbeiten, werden wir einen trainieren, durch Wände zu springen.

Bereits trainierte Modelle können auch auf GitHub heruntergeladen werden .

Wall Jumping Lernumgebung


Das Ziel dieser Umgebung ist es, dem Agenten beizubringen, auf die grüne Kachel zu gelangen.

Betrachten Sie drei Fälle:

1. Es gibt keine Wände, und unser Agent muss nur zur Kachel gelangen.

Bild

2. Der Agent muss lernen, wie man springt, um das grüne Plättchen zu erreichen.

Bild

3. Der schwierigste Fall: Die Wand ist zu hoch, als dass der Agent darüber springen könnte, also muss er zuerst auf den weißen Block springen.

Bild

Wir werden dem Agenten zwei Verhaltensszenarien in Abhängigkeit von der Höhe der Wand beibringen:

  • SmallWallJump in Fällen ohne Wände oder in niedrigen Wandhöhen;
  • BigWallJump bei hohen Mauern.

So wird das Belohnungssystem aussehen:



In unseren Beobachtungen verwenden wir keinen regulären Rahmen, sondern 14 Reykast, von denen jeder 4 mögliche Objekte erkennen kann. In diesem Fall kann Reykast als Laserstrahl wahrgenommen werden, der bestimmen kann, ob sie ein Objekt passieren.

Wir werden auch die globale Agentenposition in unserem Programm verwenden.

Bild

In unserem Raum sind vier Optionen möglich:



Das Ziel ist es, ein grünes Plättchen mit einer durchschnittlichen Belohnung von 0,8 zu erreichen .

Also lasst uns anfangen!


Öffnen Sie zunächst das UnitySDK- Projekt .

Unter den Beispielen müssen Sie die WallJump- Szene finden und öffnen .

Wie Sie sehen können, befinden sich viele Agenten auf der Bühne, von denen jeder aus demselben Fertighaus stammt und alle dasselbe „Gehirn“ haben.

Bild

Wie im Fall des klassischen Deep Reinforcement Learning kopieren wir nach dem Start mehrerer Instanzen des Spiels (z. B. 128 parallele Umgebungen) die Agenten nur noch und fügen sie ein, um mehr unterschiedliche Zustände zu erhalten. Und da wir unseren Agenten von Grund auf neu trainieren wollen, müssen wir zuerst das „Gehirn“ vom Agenten entfernen. Gehen Sie dazu in den Prefabs-Ordner und öffnen Sie Prefab.

Als Nächstes müssen Sie in der Prefab-Hierarchie den Agenten auswählen und zu den Einstellungen wechseln.

In den Verhaltensparametern müssen Sie das Modell löschen. Wenn wir über mehrere GPUs verfügen, können Sie das Inferenzgerät von der CPU als GPU verwenden.

Bild

In der Komponente Wall Jump Agent müssen Sie das Gehirn für einen Fall ohne Wände sowie für niedrige und hohe Wände entfernen.

Bild

Danach können Sie Ihren Agenten von Grund auf neu trainieren.

Bei unserem ersten Training ändern wir einfach die Gesamtzahl der Trainingsschritte für zwei Verhaltensszenarien: SmallWallJump und BigWallJump. So können wir das Ziel in nur 300.000 Schritten erreichen. Ändern Sie dazu in config / Trainer config.yaml max_steps für die Fälle SmallWallJump und BigWallJump in 3e5.

Bild

Um unseren Agenten zu schulen, verwenden wir PPO (Proximal Policy Optimization). Der Algorithmus umfasst die Anhäufung von Erfahrungen bei der Interaktion mit der Umgebung und deren Verwendung zur Aktualisierung von Entscheidungsrichtlinien. Nach der Aktualisierung werden die vorherigen Ereignisse verworfen, und die nachfolgende Datenerfassung wird bereits gemäß den Bestimmungen der aktualisierten Richtlinie durchgeführt.

Daher müssen wir zunächst mithilfe der Python-API einen externen Kommunikator aufrufen, damit dieser die Akademie anweist, Agenten zu starten. Öffnen Sie dazu das Terminal, in dem sich ml-agent-master befindet, und geben Sie Folgendes ein: Mit

mlagents-learn config/trainer_config.yaml — run-id=”WallJump_FirstTrain” — train

diesem Befehl werden Sie aufgefordert, die Unity-Szene zu starten. Drücken Sie dazu ► oben im Editor.

Bild

Mit dem folgenden Befehl können Sie die Schulung Ihrer Agenten in Tensorboard verfolgen:

tensorboard — logdir=summaries

Wenn das Training beendet ist, müssen Sie die gespeicherten Modelldateien in ml-agent-master / models nach UnitySDK / Assets / ML-Agents / examples / WallJump / TFModels verschieben . Öffnen Sie dann den Unity-Editor erneut und wählen Sie die WallJump- Szene aus , in der das fertige WallJumpArea- Objekt geöffnet wird . Wählen

Sie danach den Agenten aus und ziehen Sie in seinen Verhaltensparametern die Datei SmallWallJump.nn in den Modellplatzhalter.

Bild

Bewegen Sie sich auch:

  1. SmallWallJump.nn bei No Wall Brain Placeholder.
  2. SmallWallJump.nn bei Small Wall Brain Placeholder.
  3. BigWallJump.nn bei No Wall Brain Placeholder.

Bild

Drücken Sie danach die Taste ► oben im Editor und fertig! Der Konfigurationsalgorithmus für das Agententraining ist jetzt abgeschlossen.

Bild

Experimentierzeit


Der beste Weg zu lernen ist, ständig zu versuchen, etwas Neues zu bringen. Nachdem wir bereits gute Ergebnisse erzielt haben, werden wir versuchen, einige Hypothesen aufzustellen und zu testen.


Reduzierung des Abzinsungskoeffizienten auf 0,95


Also wissen wir das:

  • Je größer das Gamma, desto geringer der Rabatt. Das heißt, der Agent ist mehr besorgt über langfristige Belohnungen.
  • Andererseits ist der Rabatt umso größer, je kleiner das Gamma ist. In diesem Fall ist die Priorität des Agenten die kurzfristige Vergütung.

Die Idee dieses Experiments ist, dass, wenn wir den Rabatt durch Verringern des Farbumfangs von 0,99 auf 0,95 erhöhen, die kurzfristige Belohnung für den Agenten eine Priorität darstellt - was ihm helfen kann, sich schnell der optimalen Verhaltensrichtlinie zu nähern.



Interessanterweise strebt der Agent bei einem Sprung durch eine niedrige Wand das gleiche Ergebnis an. Dies kann durch die Tatsache erklärt werden, dass dieser Fall recht einfach ist: Der Agent muss nur zur grünen Kachel gehen und gegebenenfalls springen, wenn sich eine Wand vor ihm befindet.



Auf der anderen Seite funktioniert dies im Fall von Big Wall Jump schlechter, da sich unser Agent mehr um die kurzfristige Belohnung kümmert und daher nicht versteht, dass er auf den weißen Block klettern muss, um über die Mauer zu springen.

Erhöhte Komplexität des neuronalen Netzwerks


Schließlich stellen wir die Hypothese auf, ob unser Agent intelligenter wird, wenn wir die Komplexität des neuronalen Netzwerks erhöhen. Erhöhen Sie dazu die Größe der verborgenen Ebene von 256 auf 512.

In diesem Fall funktioniert der neue Agent schlechter als unser erster Agent. Dies bedeutet, dass es für uns keinen Sinn macht, die Komplexität unseres Netzwerks zu erhöhen, da sich sonst auch die Lernzeit erhöht.



Also haben wir den Agenten geschult, über die Mauern zu springen, und das ist alles für heute. Denken Sie daran, dass zum Vergleich der Ergebnisse trainierte Modelle hier heruntergeladen werden können .

Bild

All Articles