12 April, 2021
Micha Christ
Florian Wintel

Erfahrungsbericht:
Google Research Football Kaggle Challenge

Warum nicht den beliebtesten Sport der Welt mit einer der bahnbrechendsten Technologien unserer Zeit in Einklang bringen?

Das dachte sich auch das Google Research Team und hat zusammen mit Manchester City F.C. eine neue KI-Challenge ins Leben gerufen.

Fußball ist ein hartes Umfeld, um Leistung zu erbringen, und ein noch härteres Umfeld, um zu lernen. […] Die Arbeit mit der physikbasierten Fußballumgebung von Google Research bietet uns einen neuen Ort, um durch Simulationen zu lernen, und bietet uns die Möglichkeit, taktische Konzepte zu testen und Prinzipien so zu verfeinern” so Brian Prestidge, Direktor für Data Insights & Decision Technology der City Football Group.

Über die Online-Plattform Kaggle duellierten sich knapp zwei Monate lang über 1000 Wettstreiter, darunter Teams aus aller Welt mit erfahrenen Kagglern, Newbies, Ex-Mitarbeitern von Deepmind und dem HdM Team GutKick 🤟. Ermöglicht durch ein CSM3-Innovationsprojekt bot sich uns, Florian Wintel und Micha Christ, die Möglichkeit, erstmalig an einer Challenge dieser Art teilzunehmen. Begleitet wurden wir dabei von Prof. Dr. Maucher und Johannes Theodoridis.

Ziel des Wettbewerbs war die Entwicklung von Agenten, die in einer von Google entwickelten Fußballumgebung (Gfootball) in einem klassischen 11 vs. 11 Szenario gegeneinander antraten und durch das Prinzip des Elo-Ratings in einer Tabelle angeordnet wurden. Dabei gab es keinerlei Beschränkung für das Design solcher Agenten:
Sowohl regelbasierte Ansätze (bestehend aus fest einprogrammierten Regeln, z.B. Spieler soll schießen, wenn er nah genug vor dem Tor steht) als auch KI-basierte (lernen Regeln selbständig) waren grundsätzlich möglich. Da letzteres natürlich um Welten cooler ist, haben wir uns dafür entschieden. 😎

Kurze Einführung in die Gfootball Umgebung ⚽

Google hat mit ihrer Gfootball-Umgebung einen enorm flexiblen und realistischen Fußball-Simulator erschaffen, welchem die üblichen Fußballregeln (gelbe und rote Karte, Abseits, …) und Spielmodi (Anstoß, Freistoß, Einwurf, Elfmeter, …) zugrunde liegen. Die Spielermüdigkeiten werden ebenfalls mit modelliert.

Über 19 verschiedene Aktionen (8 Bewegungen, 3 Pässe, schießen, sprinten, grätschen, …) können je nach Szenario einer oder mehrere Spieler angesteuert werden. Dafür bietet der Simulator eine sehr einfache, zu OpenAI’s Gym Toolkit , äquivalente Schnittstelle. Durch die Interaktion mit dem Simulator erhält man Informationen über das aktuelle Spielfeld, repräsentiert in unterschiedlichen Formaten - so kann die Spielsituation z.B. mittels float-Werten (Spieler-/Ballkoordinaten, Bewegungsrichtungen, Müdigkeitsfaktor, Ballbesitz …) oder über vier vereinfachte räumliche Darstellungen (siehe GIF) beschrieben werden. Unser Agent kann immer nur einen Spieler kontrollieren, nämlich den Ballführenden (Angriff) oder den Ballnächsten (Verteidigung). Der Simulator ermöglicht zwar die Steuerung mehrere Spieler, aber dieser Fall wurde in der Kaggle-Challenge nicht berücksichtigt. Aus diesem Grund zeigt die vierte Animation auch nur einen aktiven Spieler.

Basierend auf den gewählten Aktionen enthält das Feedback des Simulators neben der Spielrepräsentation einen Belohnungswert - den Reward. Am offensichtlichsten ist natürlich ein Reward von +1 für eine geschossenes und ein Reward von -1 für ein gegnerisches Tor. Apropos Gegner - Der Simulator enthält einen in der Schwierigkeit regulierbaren Bot, gegen den man entweder selbst über Tastatureingaben oder durch einen eigens entwickelten Agenten antreten kann. Die hohe Konfigurierbarkeit erlaubt es neben speziellen Szenarien (z.B. nur Angriff oder Abwehr) und Gegnern auch eigene Belohnungsfunktionen (z.B. zzg. zum Tor-Reward noch +0.1 wenn man in Ballbesitz ist) zu definieren.


Faszination Reinforcement Learning 😍

Das Innovationsprojekt, verbunden mit der Kaggle Challenge, hat uns durchaus einiges abverlangt. Neben viel Einarbeitung und Selbstorganisation hatten wir aber auch die Möglichkeit uns mit einem der aktuell interessantesten Bereiche der Künstlichen Intelligenz auseinanderzusetzen - dem Reinforcement Learning.

Das grundlegende Prinzip dieser Art des Lernens kennt jeder, denn es ist wie so vieles im KI-Bereich von den Prozessen des menschlichen Gehirns inspiriert. Lernen durch Verstärkung ist ein grundlegender kognitiver Mechanismus, der nicht nur von Menschen sondern auch von Tieren verwendet wird, um die Auswahl von Aktionen oder Handlungen als Reaktion auf Änderungen in der Umgebung zu steuern. Tagtäglich nutzen wir unsere Erfahrung, um die Ergebnisse zukünftiger Ereignisse zu verbessern. Wir haben also im Vergleich zum klassischen Supervised-Learning keinen Lehrer, der uns genau sagt was zu tun ist, sondern viel mehr einen Kritiker der unser vergangenes Handeln durch ein Feedback (Reward) bewertet. Das bedeutet, dass das Verhalten unseres Spielers weder auf fest programmierten Regeln, noch auf einem historischen Datensatz basiert. Viel mehr interagiert unser Agent selbständig mit der Umgebung und sammelt Erfahrung, indem er für Aktionen eine positive oder negative Rückmeldung erhält. Wichtig ist hierbei zu erwähnen, dass immer der langfristige Reward entscheidend ist - Ein Tor ist nur das Ende einer Kette an aufeinanderfolgenden Aktionen - Hätte Andre Schürrle nicht diese geniale Flanke auf Mario Götze gespielt, wer weiß ob wir dann Weltmeister geworden wären? 😏

Es gibt sehr viele unterschiedliche Reinforcement Learning Algorithmen, die sich vor allem darin unterscheiden, was letztendlich gelernt wird und wie Erfahrung gesammelt wird. Wir haben unsere Agenten mit der Proximal Policy Optimization (PPO) Methode trainiert. Vorteil dieser Methode ist es, dass während des Trainings direkt die Aktionswahrscheinlichkeiten gelernt werden. D.h. für den aktuellen Zustand in dem sich unser Spieler befindet, liefert uns das Modell eine Verteilung über die 19 Aktionen, sodass direkt davon gewählt werden kann. Aber da sagt ein Bild mehr als tausend Worte:


Let’s go 🥳

Wir mussten den PPO-Algorithmus zum Glück nicht von Grund auf selbst implementieren. Das Unternehmen OpenAI stellt nämlich auch ein Framework für Reinforcement Learning zur Verfügung - die OpenAI Baselines. Auch der PPO Algorithmus ist dort implementiert, auf dem wir unser Vorgehen aufgebaut haben. So konnten wir relativ schnell unsere ersten Agenten trainieren. Dabei haben wir zunächst pro Training nur eine Schwierigkeitsstufe des eingebauten Bots verwendet. Nach ca. 4-5 Tagen Training hat unser Agent den einfachen Bot im Schnitt mit +10, den Schweren mit +2 Toren platt gemacht. Die unten stehenden Animationen zeigen jeweils Ausschnitte der Begegnungen zwischen unserem fertig trainierten Agenten und der eingebauten-KI (Level entspricht immer dem des Trainings). Während unser Agent im linken Spiel noch eher die Ich schnapp mir den Ball und renn einfach durch Taktik verwendet, sieht man beim rechten Agenten schon eine richtig schöne Passstafette. Aber sind wir mal ehrlich - eigentlich gehört der Spieler der im rechten Clip den Ball über das Tor schießt direkt ausgewechselt! 😂

Die guten Trainingsergebnisse haben sich dann aber doch nicht ganz in der Wettbewerbstabelle widergespiegelt. Nicht selten mussten wir uns gegen (unserer Meinung nach) regelbasierte, hart programmierte Agenten kläglich geschlagen geben, da diese sehr simple Taktiken anwendeten. Dagegen hatten unsere Agenten schlicht keine Antwort parat. Woher auch? Wir hatten sie lediglich trainiert, um gegen einen bestimmten Typ Gegner zu gewinnen - der Agent ist also auf diesen spezifischen Gegner overfitted (über-angepasst) und hat an sich kein umfassendes Spielverständnis. Wir haben den Rest der Challenge sehr viel Zeit und Arbeit investiert, um mithilfe verschiedener Ansätze diese Generalisierungslücke zu schließen. Neben zusätzlichen Belohnung für Ballbesitz oder Ballgewinn, haben wir grundsätzlich zwei Ansätze verfolgt:

  • Durch die Veröffentlichung von einigen regelbasierten Agenten auf Kaggle bot sich uns die Gelegenheit einen Pool an Gegnern anzulegen, gegen die unser Agent während des Trainings antreten musste. Zusätzlich haben wir eine Art kumulatives Training angewendet, um die Schwierigkeit der Gegner mit dem Trainingsfortschritt anwachsen zu lassen. Der Prozess ist vergleichbar mit dem menschlichen Erlernen einer Sportart: Man verbessert sein Badminton-Spiel wohl kaum, wenn man direkt von Beginn an gegen den Weltmeister antritt. Ebenfalls wird langfristig der sportliche Erfolg ausbleiben, wenn man immer gegen den selben Gegner antritt und damit unweigerlich die eigene Spielweise an die des Gegners anpasst*.
  • Seit ein paar Jahren ruft vor allem eine RL-Technik immer wieder Begeisterung und Faszination hervor und ist maßgeblich für die übermenschliche Leistung von KI-Agenten (z.B. AlphaZero) verantwortlich - Self-Play. Anstelle von vorprogrammierten Gegnern spielt der Agent gegen ältere Versionen von sich selbst. Dadurch wird automatisch ein Gegner-Pool erzeugt und sichergestellt, dass dar Schwierigkeitsgrad immer dem Level des aktuellen Agenten entspricht.

Das oben gezeigte Trainings-Schema wird nun also folgendermaßen erweitert:

Auch die Kombination aus beiden Ansätzen haben wir umgesetzt, indem wir in $20\%$ der Fälle auf einen festprogrammierten und in den restlichen $80\%$ auf eine ältere Version unseres Agenten während des Trainings zurückgegriffen haben.


Zumindest der Klassenerhalt 😁

Nach Ablauf der 2 Monate mussten wir uns trotz der vielen Bemühungen ca. der Hälfte unserer Mittstreiter geschlagen gegeben. Der beste GutKick🤟 Agent landete nach Saisonende auf dem 558. Platz von insgesamt 1138 Teams - zwar keine Champions League, aber zumindest nicht abgestiegen!😋 Außerdem sind wir zwischenzeitlich für unsere Leistung mit $1000$ Dollar Google Cloud Credits belohnt worden, die wir direkt für das Training unserer Agenten verwenden konnten - sehr cool! 🥳

Nach Wettbewerbsende wurden einige der Top-50 Agenten vorgestellt, wodurch wir unsere eigenen Ansätze validieren konnten. Erfreut stellten wir fest, dass sich unsere Ideen auch in den veröffentlichten Agenten wiederfinden ließen. Neben ähnlichen Rewardfunktionen setzten einige der Top-Teams ebenfalls auf eine Mischung aus Self-play und dem Spiel gegen fest programmierte Gegner. Andere Teams verwendeten hingehen vollständig oder teilweise Methoden aus dem klassischen Supervised Learning, indem sie sich zunächst aus vergangenen Spielen einen Datensatz bastelten. Natürlich gab es hier und da ein paar Tricks und Feinheiten, aber der wesentliche Unterschied zu unseren Agenten war wohl die Trainingsdauer: Die GutKick🤟 Agenten trainierten aus Zeitgründen für maximal $150$ Millionen Aktionen - dies entspricht $\frac{150.000.000}{3000} = 5000$ ganzen Spielen (Episoden). Im Vergleich dazu erstreckten sich die Trainingsdauern der veröffentlichten Agenten von $300.000$ bis sogar über $1.000.000$ Episoden 🤯. Das ist natürlich eine ganz andere Größenordnung, welche mit der uns zur Verfügung stehenden Hardware nicht zu stemmen war. Limitierender Faktor war nicht die Grafikkarte, da die Interaktion mit dem Simulator auf der CPU ausgeführt werden musste. Mit unserer besten CPU konnten wir “gerade einmal” 20 Spiele effizient parallel laufen lassen (ergab ca. 800 FPS, bzw. Spielschritten pro Sekunde) - andere Teams erreichten bis zu 20.000 FPS. Ohne die starken HdM Deeplearning-Rechner wären wir aber vermutlich immer noch mit dem ersten Training eines Agenten beschäftigt.

Im Nachhinein war es sehr interessant zu beobachten, dass unser Agent gegen die Top-Gegner trotzdem eine durchaus passable Leistung zeigt und zumindest nicht chancenlos besiegt wird. Probleme gab es eher bei simpleren Taktiken, welche vermutlich einer höheren Platzierung im Wege standen.

Fazit

Wir haben durch die Teilnahme an diesem Wettbewerb unser Wissen in vielerlei Hinsicht vertiefen können - Reinforcement Learning, Umgang mit Docker, Nutzung der Google Cloud Platform und nicht zuletzt, dass eine Kaggle-Challenge unglaublich viel Spaß macht. Zugegeben, unsere anfänglichen Bedenken, dass oft die Hardware-stärkeren Teams das Rennen machen, haben sich für uns bestätigt. Das muss einem vor solch einer Challenge, gerade wenn es um Reinforcement Learning geht, bewusst sein. Wir waren allerdings sehr positiv von der Hilfsbereitschaft und Offenheit anderer Kaggler überrascht. So gab es schon direkt zu Beginn öffentliche Code-Snippets, welche einem den Einstieg in die Thematik erleichtert haben. Auf Fragen im Diskussionsforum kam ebenfalls immer eine hilfreiche Antwort.
Wer also eine Möglichkeit sucht, sein Innovationsprojekt durch einen Wettbewerb aufzupeppen, dem können wir die Teilnahme an einer Kaggle-Challenge wärmstens empfehlen. Nicht weil man definitiv Chancen auf den Gewinn und das damit verbundene Preisgeld bekommt, sondern weil man enorm viel dabei lernt - und mal ehrlich, dabei sein ist alles! 😁.

Teilt ihr unsere Leidenschaft rund um das Thema KI? Sucht ihr ein passendes Studium oder überlegt welche Kurse ihr nächstes Semester belegen sollt? Wenn ja, dann können wir euch das umfassende HdM-Angebot an Bachelor und Master Vorlesungen im Bereich Künstliche Intelligenz ans Herz legen.

Wollt ihr auch an KI Challenges oder oder vielleicht auch an einem KI-Hackathon teilnehmen? Dann solltet ihr euch unbedingt die Master Vorlesung Programming Intelligent Applications anschauen, die uns über viele praktische Aufgaben (auch zum Thema Reinforcement Learning) optimal auf die Kaggle Challenge vorbereitet hat.


Haben wir dein Interesse geweckt? Dann schau doch mal hier vorbei:

Reinforcement Learning
Kaggle
Fußball und KI

Icon made by freepik from www.flaticon.com
Icon made by eucalyp from www.flaticon.com