Beispiel für Reinforcement Learning in der Spieleentwicklung

Gerade bei Spielen ist es unbefriedigend, wenn sich Abläufe wiederholen oder wenn vom Computer gesteuerte Spielfiguren (NPCs) unpassend agieren. Hier kann Machine Learning helfen, damit diese Spielfiguren eigene und zum Spiel passende Eigenschaften entwickeln. In einem Blog-Beitrag bei Unity, der Spiel-Engine, geht es genau um das Thema „Maschinell lernende Figuren in einem echten Spiel“.

Reinforcement Learning

Der hierbei gewählte Ansatz ist der des „Reinforcement Learning“. Hierbei erklären die Entwicklerinnen und Entwickler dem Machine-Learning-Model (ML-Model) nicht, was zu tun ist, sondern nur, was richtig und was falsch ist. Somit vollführt das System zufällige Aktionen und die Entwicklerinnen und Entwickler belohnen das ML-Model beziehungsweise bestrafen es, je nach dem, was gerade gewünscht ist. Nach vielen Versuchen beginnt das System, statistisch zu antizipieren, welche Aktionen die gewünschten sind. Das Ganze erinnert ein wenig an die Dressur eines Hundes: Das Tier weiß nicht, was „Sitz!“ bedeutet, erst nach vielen Versuchen und dem Verteilen einer Belohnung, wenn der Hund die gewünschte Handlung vollzogen hat, verbindet das Tier mit der Aufforderung „Sitz!“ die entsprechende Handlung.

Mithilfe des „Reinforcement Learning“-Ansatzes wird ein künstliches neuronales Netz trainiert. Das Training beim Unity-Beispiel erfolgt in einer Lernumgebung, in der die Spielfigur Aktionen ausführt und von der Umgebung sofort Rückmeldung erhält, ob die Aktion erwünscht oder unerwünscht war. Technisch basiert das auf einer an Unity angeschlossenen Python-Umgebung, die mithilfe der Tensorflow-Machine-Learning-Bibliothek die Trainingsdaten auswertet und übernimmt.

Das Trainingskonzept

Damit es sinnvolle Ergebnisse gibt, braucht es ein Trainingskonzept, das festhält, welche Aktionen überhaupt möglich sind und welche in der Lernumgebung zu Belohnungen respektive Bestrafungen führen. In unserem Beispiel sind folgende Aktionen möglich: Bewegung nach oben, unten, links und rechts sowie Angriff und Stillstand. Diese Möglichkeiten übersetzen wir für die Maschine in numerische Daten:

  • 0 = Stillstand
  • 1–4 = jeweilige Bewegung
  • 5 = Angriff

Zu Beginn war der Algorithmus so aufgebaut, dass die Spielfigur eine Belohnung erhielt, wenn sie den Abstand von einer Gefahrenquelle vergrößerte, also weglief. Bestraft wurde die Figur, wenn sie den Abstand von einer Gefahrenquelle verringerte, also angriff. Der Algorithmus änderte sich nach und nach, denn nicht nur die Maschine lernte hinzu, sondern auch die Entwicklerinnen und Entwickler, weil sie feststellten, dass die Maschine anfing, die kürzesten Wege nach der Belohnung zu suchen, was nicht immer das gewünschte Verhalten war – die Maschine begann den Belohnungsmechanismus zu missbrauchen, sie wurde quasi süchtig nach Belohnungen.

Es gab vier Trainingsräume, die unterschiedlich groß waren, damit sich das Modell nicht von einer bestimmten Größe eines Raums leiten lässt. Dabei stellte es sich heraus, dass es für die Qualität des ML-Models besser ist, wenn man es parallel in mehreren Räumen trainiert, anstatt hintereinander in einem einzelnen. Zu Beginn werden die Spielfiguren immer nur kurzzeitig trainiert, um schnell zu erkennen, falls das Erlernte in eine unerwünschte Richtung gehen sollte. Mit der Zeit und vielen Korrekturen später können die Trainingszeiten verlängert werden. Dass ein Training erfolgreich war und beendet werden kann, lässt sich daran erkennen, dass ein Gleichgewicht entsteht und die Elemente nicht mehr lernen.

Demo

Wer Interesse an einer Demo hat, kann sich im entsprechenden GitHub-Repository umsehen und das Projekt einmal zum Laufen bringen.