Engine & platform

Trainieren Sie Ihre Agenten 7 Mal schneller mit ML-Agents

ERVIN TENG / UNITY TECHNOLOGIESContributor
Nov 11, 2019|13 Min.
Trainieren Sie Ihre Agenten 7 Mal schneller mit ML-Agents
Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.

In den Versionen 0.9 und 0.10 von ML-Agents haben wir eine Reihe von Funktionen eingeführt, die darauf abzielen, die Trainingszeit zu verkürzen, nämlich Asynchrone Umgebungen, Generative Adversarial Imitation Learning (GAIL) und Soft Actor-Critic. Mit unserem Partner JamCity haben wir bereits gezeigt, dass die parallele Unity-Instanzfunktion, die in Version 0.8 von ML-Agents eingeführt wurde, es uns ermöglichte, Agenten für ihr Bubble-Shooter-Spiel Snoopy Pop 7,5 Mal schneller zu trainieren als mit einer einzelnen Instanz. In diesem Blog-Beitrag erläutern wir, wie v0.9 und v0.10 auf diesen Ergebnissen aufbauen und zeigen, dass wir die Trainingszeit von Snoopy Pop um das 7-fache reduzieren können, so dass leistungsfähigere Agenten in einer angemessenen Zeit trainiert werden können.

Der Zweck des Unity ML-Agents Toolkit ist es, Spieleentwicklern die Möglichkeit zu geben, komplexe und interessante Verhaltensweisen für spielbare und nicht spielbare Charaktere mit Hilfe von Deep Reinforcement Learning (DRL) zu erstellen. DRL ist ein leistungsfähiges und allgemeines Werkzeug, mit dem eine Vielzahl von Verhaltensweisen erlernt werden kann, von physikbasierten Charakteren bis hin zu Rätselspiellösern. DRL erfordert jedoch eine große Menge an Spieldaten, um effektives Verhalten zu erlernen - ein Problem für echte Spiele, die in der Regel nur begrenzt beschleunigt werden können.

Vor einigen Monaten haben wir mit der Veröffentlichung von ML-Agents v0.8 die Möglichkeit eingeführt, dass ML-Agents mehrere Unity-Instanzen eines Spiels auf einer einzigen Maschine laufen lassen können, was den Durchsatz an Trainingsmustern (d.h. die Beobachtungen, Aktionen und Belohnungen des Agenten), die wir während des Trainings sammeln können, drastisch erhöht. Wir haben uns mit JamCity zusammengetan, um einen Agenten zu schulen, der die Levels ihres Puzzlespiels Snoopy Pop spielt. Durch den Einsatz der parallelen Umgebung von v0.8 konnten wir die Trainingsgeschwindigkeit in den schwierigeren Levels von Snoopy Pop um das 7,5-fache erhöhen.

Parallele Umgebungen sind jedoch nur bis zu einem gewissen Grad möglich - es gibt eine Grenze dafür, wie viele Unity-Instanzen gleichzeitig auf einem einzigen Computer ausgeführt werden können. Um die Trainingszeit auf ressourcenbeschränkten Maschinen zu verbessern, mussten wir einen anderen Weg finden. Im Allgemeinen gibt es zwei Möglichkeiten, die Trainingszeit zu verkürzen: die Anzahl der pro Sekunde gesammelten Proben zu erhöhen(Probendurchsatz) oder die Anzahl der Proben zu reduzieren, die für das Erlernen eines guten Verhaltens erforderlich sind(Probeeffizienz). Daher haben wir in Version 0.9 unseren Paralleltrainer verbessert, um Proben asynchron zu sammeln und so den Probendurchsatz zu erhöhen.

Darüber hinaus haben wir das Generative Adversarial Imitation Learning (GAIL) hinzugefügt, das die Verwendung von menschlichen Demonstrationen zur Steuerung des Lernprozesses ermöglicht und so die Effizienz der Stichproben verbessert. Schließlich haben wir in Version 0.10 Soft Actor-Critic (SAC) eingeführt, einen Trainer, der eine wesentlich höhere Effizienz bei der Stichprobenziehung aufweist als der Proximal Policy Optimization Trainer in Version 0.8. Diese Änderungen führten zu einer weiteren Verbesserung der Trainingszeit um das 7-fache auf einer einzigen Maschine. Für Snoopy Pop bedeutete dies, dass wir nicht nur in der Lage waren, Agenten zu entwickeln, die Levels lösen, sondern auch Agenten, die sie in der gleichen Anzahl von Schritten lösen wie ein menschlicher Spieler. Dank des höheren Probendurchsatzes und der höheren Effizienz konnten wir mehrere Stufen von Snoopy Pop auf einer einzigen Maschine trainieren, was zuvor mehrere Tage Training auf einem Cluster von Maschinen erforderte. In diesem Blog-Beitrag werden die Verbesserungen, die in jeder nachfolgenden Version von ML-Agents vorgenommen wurden, und ihre Auswirkungen auf die Ergebnisse in Snoopy Pop im Detail beschrieben.

ML-Agents Toolkit + Snoopy Pop

Wir haben unsere Integration von ML-Agents mit Snoopy Pop erstmals in unserem Blogbeitrag ML-Agents v0.8 vorgestellt. Die folgende Abbildung fasst zusammen, was der Agent sehen kann, was er tun kann und welche Belohnungen er erhalten hat. Im Vergleich zu unseren früheren Experimenten mit Snoopy Pop haben wir die Höhe der positiven Belohnung verringert und die Strafe für das Benutzen einer Blase erhöht, um den Agenten zu zwingen, seine Aufmerksamkeit weniger darauf zu richten, das Level einfach zu beenden, sondern mehr darauf, die Blasen in möglichst wenigen Schritten zu entfernen, so wie es ein menschlicher Spieler tun würde. Dies ist ein viel schwierigeres Problem, als den Level nur knapp zu gewinnen, und es dauert wesentlich länger, eine gute Strategie zu lernen.

Das Bild fasst zusammen, was der Agent sehen kann, was er tun kann und welche Belohnungen er erhalten hat
ML-Agenten 0.8: Ausführen mehrerer, gleichzeitiger Instanzen von Snoopy Pop

In ML-Agents v0.8 haben wir die Möglichkeit eingeführt, mehrere Unity-Instanzen gleichzeitig zu trainieren. Während wir eine einzelne Instanz von Snoopy Pop nur begrenzt beschleunigen können, können wir mit Multi-Core-Prozessoren mehrere Instanzen auf einem einzigen Rechner ausführen. Da jeder Durchlauf des Spiels unabhängig ist, können wir die Sammlung unserer Trainingsdaten trivialerweise parallelisieren.

Jede Simulationsumgebung speist Daten in einen gemeinsamen Trainingspuffer ein, die dann vom Trainer verwendet werden, um seine Strategie zu aktualisieren, damit er das Spiel besser spielen kann. Dieses neue Paradigma ermöglicht es uns, viel mehr Daten zu sammeln, ohne die Zeitskala oder andere Spielparameter ändern zu müssen, was sich negativ auf die Spielmechanik auswirken könnte.

ML-Agenten v0.9: Asynchrone Umgebungen und Imitationslernen

In ML-Agents v0.9 haben wir zwei Verbesserungen in Bezug auf die Probeneffizienz bzw. den Probendurchsatz eingeführt.

Asynchrone Umgebungen

In der v0.8-Implementierung von parallelen Umgebungen macht jede Unity-Instanz einen Schritt synchron mit den anderen, und der Trainer empfängt alle Beobachtungen und sendet alle Aktionen zur gleichen Zeit. In einigen Umgebungen, wie z. B. den mit dem ML-Agents-Toolkit bereitgestellten, treffen die Agenten Entscheidungen mit etwa der gleichen konstanten Häufigkeit, und die Ausführung im Gleichschritt ist kein Problem. Bei echten Spielen kann es jedoch vorkommen, dass bestimmte Aktionen länger dauern als andere. Bei Snoopy Pop beispielsweise dauert es länger, eine große Anzahl von Blasen abzuräumen, als keine abzuräumen, und es dauert länger, das Spiel zu gewinnen und das Level zurückzusetzen, als einen Schuss abzugeben. Das bedeutet, dass, wenn auch nur eine der parallelen Umgebungen eine dieser längeren Aktionen ausführt, die anderen warten müssen.

In ML-Agents v0.9 haben wir asynchrone parallele Umgebungen aktiviert. Solange mindestens eine der Umgebungen ihre Aktion beendet hat, kann der Trainer eine neue Aktion senden und den nächsten Schritt ausführen. In Umgebungen mit unterschiedlichen Schrittzeiten kann dies den Probendurchsatz erheblich verbessern.

Bild des Ausbilders, der eine neue Aktion sendet und den nächsten Schritt macht

Generatives adversariales Nachahmungslernen (GAIL)

In einem typischen DRL-Trainingsprozess wird der Agent mit einem zufälligen Verhalten initialisiert, führt zufällige Aktionen in der Umgebung aus und kann auf einige Belohnungen stoßen. Es verstärkt dann Verhaltensweisen, die zu höheren Belohnungen führen, und mit der Zeit tendiert das Verhalten zu einem Verhalten, das die Belohnung in der Umgebung maximiert und weniger zufällig ist.

Allerdings ist nicht jedes optimale Verhalten leicht durch zufälliges Verhalten zu finden. Zum Beispiel kann die Belohnung spärlich sein, d.h. der Agent muss viele richtige Aktionen ausführen, bevor er eine Belohnung erhält. Oder die Umgebung kann viele lokale Optima aufweisen, d. h. Orte, an denen sich der Agent aufhalten könnte, die ihn scheinbar zur maximalen Belohnung führen, in Wirklichkeit aber einen falschen Weg darstellen. Beide Probleme lassen sich möglicherweise mit einer rohen Zufallssuche lösen, doch sind dafür viele, viele Stichproben erforderlich. Sie tragen zu den Millionen von Proben bei, die für die Ausbildung von Snoopy Pop erforderlich sind. In manchen Fällen kann es sein, dass es nie das optimale Verhalten findet.

Aber was wäre, wenn wir den Agenten noch ein bisschen besser anleiten könnten, indem wir ihm menschliche Demonstrationen des Spiels zur Verfügung stellen? Dieser Forschungsbereich wird als Imitationslernen bezeichnet und wurde in Version 0.3 zu ML-Agents hinzugefügt. Einer der Nachteile des Nachahmungslernens bei ML-Agenten war, dass es nur unabhängig vom Verstärkungslernen eingesetzt werden konnte, d. h. ein Agent wurde nur auf der Grundlage von Demonstrationen, aber ohne Belohnungen aus der Umgebung trainiert.

In Version 0.9 haben wir GAIL eingeführt, das diese beiden Probleme auf der Grundlage der Forschung von Jonathan Ho und seinen Kollegen angeht. Weitere Informationen über den Algorithmus finden Sie in der Veröffentlichung.

Um Imitation Learning mit ML-Agents zu verwenden, lassen Sie zunächst einen menschlichen Spieler (oder einen Bot) das Spiel mehrmals durchspielen und die Beobachtungen und Aktionen in einer Demonstrationsdatei speichern. Während des Trainings kann der Agent wie gewohnt in der Umgebung agieren und eigene Beobachtungen sammeln. Auf einer hohen Ebene funktioniert GAIL, indem ein zweiter Lernalgorithmus(der Diskriminator, implementiert mit einem neuronalen Netz) trainiert wird, um zu klassifizieren, ob eine bestimmte Beobachtung (und Aktion, falls gewünscht) vom Agenten oder von den Demonstrationen stammt. Für jede Beobachtung, die der Agent sammelt, wird er danach belohnt, wie nah seine Beobachtungen und Handlungen an denen der Demonstrationen liegen. Der Agent lernt, wie er diese Belohnung maximieren kann. Der Diskriminator wird mit den neuen Beobachtungen des Agenten aktualisiert und wird besser in der Unterscheidung. Auf diese Weise wird der Diskriminator immer härter - aber der Agent wird immer besser darin, den Diskriminator auszutricksen und die Demonstrationen zu imitieren.

Da GAIL dem Agenten einfach eine Belohnung gibt und den Lernprozess unverändert lässt, können wir GAIL mit belohnungsbasiertem DRL kombinieren, indem wir die GAIL-Belohnung einfach mit den vom Spiel selbst gegebenen Belohnungen gewichten und addieren. Wenn wir sicherstellen, dass die Spielbelohnung größer ist als die GAIL-Belohnung, hat der Agent einen Anreiz, dem Pfad des menschlichen Spielers durch das Spiel zu folgen, bis er in der Lage ist, eine große Umweltbelohnung zu finden.

Beispielbild
ML-Agenten v0.10: Soft Actor-Kritiker

Seit seiner ersten Veröffentlichung verwendet das ML-Agents Toolkit Proximal Policy Optimization (PPO) - einen stabilen, flexiblen DRL-Algorithmus. In v0.10 haben wir einen zweiten DRL-Algorithmus, SAC, veröffentlicht, der auf der Arbeit von Tuomas Haarnoja und seinen Kollegen basiert, um das Training mit echten Spielen zu beschleunigen. Eines der entscheidenden Merkmale von SAC, das ursprünglich für das Lernen an echten Robotern entwickelt wurde, ist die Stichproben-Effizienz. Für Spiele bedeutet dies, dass wir die Spiele nicht so lange laufen lassen müssen, um eine gute Politik zu lernen.

DRL-Algorithmen lassen sich in zwei Kategorien einteilen: "on-policy" und "off-policy". Ein On-Policy-Algorithmus wie PPO sammelt eine gewisse Anzahl von Stichproben, lernt daraus, wie er seine Strategie verbessern kann, und aktualisiert dann seine Strategie entsprechend. Durch das Sammeln von Stichproben mit seiner aktuellen Strategie lernt es, sich selbst zu verbessern, indem es die Wahrscheinlichkeit erhöht, lohnende Aktionen zu unternehmen und die nicht lohnenden zu verringern. Die meisten modernen On-Policy-Algorithmen, wie z.B. PPO, lernen auch eine Form von Bewertungsfunktion, wie z.B. eine Wertschätzung (die erwartete diskontierte Summe der Belohnungen bis zum Ende der Episode, wenn sich der Agent in einem bestimmten Zustand befindet) oder eine Q-Funktion (die erwartete diskontierte Summe der Belohnungen, wenn eine bestimmte Aktion in einem bestimmten Zustand ausgeführt wird). Bei einem Algorithmus, der sich auf eine bestimmte Politik bezieht, schätzen diese Bewerter die Reihe der Belohnungen unter der Annahme, dass die aktuelle Politik verfolgt wird. Ohne zu sehr ins Detail zu gehen, hilft diese Schätzung dem Algorithmus, stabiler zu trainieren.

Algorithmen, die nicht auf Richtlinien basieren, wie z. B. SAC, funktionieren ein wenig anders. Unter der Annahme, dass die Umwelt eine feste Dynamik und Belohnungsfunktion hat, gibt es eine optimale Beziehung zwischen der Durchführung einer bestimmten Handlung in einem bestimmten Zustand und dem Erhalt einer kumulativen Belohnung (d. h. was würde die bestmögliche Politik erreichen können?) Wenn wir diese Beziehung kennen würden, wäre es wirklich einfach, eine wirksame Politik zu entwickeln! Anstatt zu lernen, wie gut die aktuelle Strategie ist, lernen Off-Policy-Algorithmen diese optimale Bewertungsfunktion für alle Strategien. Dies ist ein schwierigeres Lernproblem als im Fall von "on-policy" - die reale Funktion könnte sehr komplex sein. Da Sie jedoch eine globale Funktion erlernen, können Sie alle Stichproben, die Sie seit Beginn der Zeit gesammelt haben, zum Erlernen Ihres Evaluators verwenden, wodurch Off-Policy-Algorithmen wesentlich stichprobeneffizienter sind als On-Policy-Algorithmen. Diese Wiederverwendung alter Proben wird als Erfahrungswiederholung bezeichnet, und alle Proben werden in einem großen Erfahrungswiederholungspuffer gespeichert, der Daten von Hunderten (wenn nicht Tausenden) von Spielen speichern kann.

Für unser Toolkit haben wir den ursprünglichen SAC-Algorithmus, der für Bewegungsaufgaben mit kontinuierlichen Aktionen entwickelt wurde, so angepasst, dass er alle Funktionen unterstützt, die Sie von ML-Agenten gewohnt sind - rekurrente neuronale Netze (Gedächtnis), verzweigte diskrete Aktionen, Neugierde, GAIL und mehr.

Diagramm mit und ohne Politik
Leistungsergebnisse in Snoopy Pop

In unseren früheren Experimenten haben wir gezeigt, dass wir für ein komplexes Level von Snoopy Pop (Level 25) eine 7,5-fache Verringerung der Trainingszeit feststellen konnten, wenn wir von einer einzigen Umgebung (d. h. v0.7 von ML-Agents) auf 16 parallele Umgebungen auf einer einzigen Maschine übergehen. Dies bedeutete, dass eine einzige Maschine verwendet werden konnte, um eine grundlegende Lösung für Level 25 in weniger als 9 Stunden zu finden. Mit dieser Fähigkeit haben wir unsere Agenten trainiert, weiter zu gehen und die Stufe 25 zu meistern, d. h. die Stufe 25 nach menschlichem Ermessen zu lösen. Beachten Sie, dass dies wesentlich mehr Zeit in Anspruch nimmt als das einfache Lösen des Levels - im Durchschnitt etwa 33 Stunden.

Hier erklären wir einen Agenten als "gemeistert", wenn er in 1000 Schritten die durchschnittliche menschliche Leistung erreicht (das Level mit oder unter der Anzahl von Blasen löst, die ein Mensch verwendet). Für Level 25 entspricht dies 25,14 Schritten/Blasen, gemittelt aus 21 menschlichen Spielen desselben Levels.

Wir haben dann jede Verbesserung von v0.9 und v0.10 schrittweise getestet und die Zeit gemessen, die benötigt wird, um die menschliche Leistung in dem Level zu übertreffen. Insgesamt summieren sich die Verbesserungen zu einer zusätzlichen 7-fachen Beschleunigung der Level-Bewältigung! Jeder angegebene Wert ist ein Durchschnitt über drei Durchläufe, da die Trainingszeiten zwischen den Durchläufen variieren können. Manchmal hat der Vermittler Glück und findet schnell eine gute Lösung. Alle Läufe wurden auf einem 16-Kern-Rechner durchgeführt, wobei das Training durch eine K80 GPU beschleunigt wurde. Beim Training wurden 16 Instanzen parallel ausgeführt.

Für die GAIL-Experimente haben wir die 21 menschlichen Durchläufe von Snoopy Pop als Demonstrationen verwendet, um die Ergebnisse zu trainieren. Beachten Sie, dass die Blasenfarben in Level 25 zufällig generiert werden, so dass die 21 Spieldurchgänge keineswegs alle möglichen Spielfeldkonfigurationen des Levels abdecken. In diesem Fall würde der Agent sehr schnell lernen, indem er das Verhalten des Spielers auswendig lernt und kopiert. Wir haben dann ein GAIL-Belohnungssignal mit dem des Snoopy-Pop-Spiels gemischt, so dass GAIL das Lernen des Agenten in einem frühen Stadium des Prozesses leiten kann, es ihm aber später erlaubt, seine eigene Lösung zu finden.

Parallele Umgebungen (v0.8) Asynchrone Umgebungen (v0.9) GAIL mit PPO (v0.9) SAC (v0.10) GAIL mit SAC (v0.10) Zeit zum Erreichen der menschlichen Leistung

(Stunden)

34:03 31:08 23:18 5:58 4:44 Probendurchsatz (Proben/Sekunde) 10,83 14,81 14,51 15,04 15,28

Im Folgenden wird die Beschleunigung in einem Diagramm dargestellt. Wir sehen, dass die Erhöhung des Probendurchsatzes durch die Verwendung asynchroner Umgebungen zu einer Verringerung der Trainingszeit führt, ohne dass der Algorithmus geändert werden muss. Die größte Verkürzung der Ausbildungszeit ergibt sich jedoch aus der Verbesserung der Stichprobeneffizienz der Ausbildung. Beachten Sie, dass sich der Probendurchsatz zwischen ML-Agents v0.9 und v0.10 nicht wesentlich verändert hat. Durch das Hinzufügen von Demonstrationen und die Verwendung von GAIL zur Steuerung des Trainings benötigte der Agent 26 % weniger Proben, um das gleiche Trainingsverhalten zu erreichen, und wir sehen eine entsprechende Verringerung der Trainingszeit. Der Wechsel zu Soft Actor-Critic, einem Off-Policy-Algorithmus, bedeutete, dass der Agent das Level mit 81% weniger Stichproben löste als Vanilla PPO, und eine zusätzliche Verbesserung wurde durch das Hinzufügen von GAIL zu SAC erreicht.

Diese Verbesserungen betreffen nicht nur die neue Belohnungsfunktion und das Ziel, die menschliche Leistungsfähigkeit zu erreichen. Wenn wir SAC+GAIL mit der einfachen Lösung des Levels beauftragen, wie wir es in unseren früheren Experimenten getan haben, schaffen wir dies in 1 Stunde und 11 Minuten. 8 Stunden, 24 Minuten.

Das Bild zeigt die Zeit bis zum Erreichen der menschlichen Leistungsfähigkeit, Stufe 25.
Nächste Schritte

Wenn Sie an dieser aufregenden Schnittstelle zwischen maschinellem Lernen und Spielen arbeiten möchten, stellen wir mehrere Stellen ein, bitte bewerben Sie sich!

Wenn Sie eine der Funktionen in dieser Version nutzen, würden wir uns freuen, von Ihnen zu hören. Wenn Sie uns Ihr Feedback zum Unity ML-Agents Toolkit geben möchten, füllen Sie bitte die folgende Umfrage aus und schicken Sie uns direkt eine E-Mail. Wenn Sie auf Probleme stoßen oder Fragen haben, wenden Sie sich bitte an uns auf der ML-Agents GitHub issues Seite.