Moderne KI-Agenten handeln – immer auf maximale Belohnung aus – intuitiv und rational

ChatGPT hat der Künstlichen Intelligenz im vergangenen Jahr einen enormen Popularitätsschub beschert. Ohne nennenswerte Einstiegshürden kann heute jeder mit einer belesenen KI auf sehr menschliche Art und Weise kommunizieren. Die KI wurde dafür im Wesentlichen auf zwei Ebenen trainiert [1]: Auf der unteren Ebene arbeitete sie sich durch riesige Textmengen und lernte dabei, das jeweils nächste Wort so gut wie möglich zu erraten. Auf höherer Ebene wurde ihr mit Methoden des Reinforcement Learning (RL) beigebracht, im aktuellen Gesprächskontext möglichst gute Antworten zu geben. Wir tauchen nun in die Welt des RL ein und erfahren, wie die bereits mächtigen KIs dort funktionieren, insbesondere wie sie es schaffen, sowohl rational als auch intuitiv zu handeln. Anhand eines einfachen Beispiels schauen wir uns die Implementierung in Java an und bringen sie in Ihrem Browser zum Laufen.
Hintergrund

Lassen Sie uns mit natürlicher Intelligenz starten. Ich möchte Sie dazu mit zwei Situationen konfrontieren. Für Situation 1 schauen Sie sich bitte nebenstehende Abbildung an. Ihnen wird wahrscheinlich im Bruchteil einer Sekunde bewusst, dass Sie eine wütende Person anschauen. Nachdenken ist dafür nicht erforderlich.
In Situation 2 werden Sie aufgefordert, eine Rechenaufgabe ohne Hilfsmittel (auch nicht Papier und Bleistift) zu lösen. Möglicherweise ergeht es Ihnen hier wie mir. Das Einzige, was intuitiv direkt da ist: ein unangenehmes Gefühl aus Grundschulzeiten. Der Situation ausgeliefert, krame ich mit einiger Mühe den Algorithmus aus einer angestaubten Schublade meiner Erinnerungen. Dann noch ein kleiner Kniff, um mein spärliches Kurzzeitgedächtnis nicht zu sehr zu belasten und los geht's in Zeitlupe: 10*49=490, 490 merken, 3*50=150, 490+150=640 merken, 640-3=637 … geschafft.
Im gut zehn Jahre alten Bestseller "Thinking, Fast and Slow" geht es genau um diese beiden sehr menschlichen Arten des Denkens [2]: Auf der einen Seite "intuitiv, schnell und direkt", ohne, dass wir es willentlich besonders beeinflussen könnten, und auf der anderen Seite "rational, langsam, meist eher mühsam". Diese Quintessenz seiner jahrzehntelangen Forschung stellt der Psychologe Daniel Kahneman so lebendig dar, dass die Seiten nur so dahinfliegen. Was werbewirksam auf dem Cover platziert ist, wird beim Genuss der Lektüre unwichtig: Daniel Kahneman wurde 2002 mit dem Nobelpreis ausgezeichnet [3] – genaugenommen dem für Wirtschaftswissenschaften – einer eher ungewöhnlichen Auszeichnung für einen Psychologen.
Apropos Nobelpreis: Der für Chemie könnte demnächst an ein Team gehen, das die beiden eben beschriebenen menschlichen Denkmuster auf Rechenmaschinen übertragen hat. Es gehört zu DeepMind, einer Londoner Schmiede für künstliche Intelligenz, die 2014 von Google aufgekauft wurde. Vor wenigen Jahren gelang dem Team mit seiner KI der Durchbruch bei der Vorhersage von Proteinstrukturen, was neue Wege in der Medizin, insbesondere bei der Suche nach Medikamenten, eröffnet [4].
Einen Moment – kurz zurück im Text: Wenn Sie beim Wort "Rechenmaschine" gestutzt haben – das war völlig berechtigt. Die mechanischen Kurbelgeräte aus der ersten Hälfte des letzten Jahrhunderts, die eigentlich diesen Namen tragen, und erst recht die ersten Taschenrechner als "iPhone der 70er Jahre" hätten zwar locker ausgereicht, um die kleine Rechenaufgabe von eben zu lösen. Wenn es aber darum geht, das Maximum aus KI herauszuholen, bewegen wir uns in ganz anderen Sphären – gefühlt ein Unterschied wie zwischen einer Stehleiter und einer Marsrakete. Der Kampf um die leistungsfähigsten KI-Rechenmaschinen findet in den Rechenzentren statt. Angeführt wird er vom Grafikkartenhersteller NVIDIA, der gerade eine Marktkapitalisierung von einer Billion US-Dollar hinter sich gelassen hat – mehr als ein Drittel des Börsenwerts von Apple. Zur Einordnung: Apple steht zurzeit auf Platz 1 der weltweiten Börsenwert-Rangliste, NVIDIA auf Platz 5 und SAP als wertvollstes deutsches Unternehmen auf Platz 65 [5]. NVIDIAs neueste KI-Rechenmaschine im Rechenzentrum gleicht einem riesigen Verbund aus Computer- und Grafikprozessoren, die jeweils superschnell auf einen gemeinsamen Arbeitsspeicher zugreifen [6]. Die Grafikprozessoren übernehmen die Parallelisierung der neuronalen Grundoperationen, die denen der Neuronen in unserem Gehirn nachempfunden sind. Soviel zum Begriff "Rechenmaschine".
Erinnern Sie sich noch? Als der Schachweltmeister Kasparov vor gut 25 Jahren vom IBM-Computer Deep Blue besiegt wurde, war das ein Meilenstein, der durch die Presse ging [7]. Mit KI im heutigen Sinne hatte das Match allerdings wenig zu tun. Der damalige Ansatz war, mit brachialer Gewalt eine riesige Anzahl von Zügen auszuprobieren – viel, viel mehr, als ein menschlicher Spieler im Kopf durchspielen könnte. Dieser Ansatz galt und gilt beim Brettspiel Go im Gegensatz zum Schach als wenig erfolgversprechend, weil es dort zu viele Zugmöglichkeiten gibt. Hier hat der Mensch, sofern er ein begnadeter Profi ist, mit seinen trainierten intuitiven Fähigkeiten die Nase vorn. Bis 2016 DeepMind mit seiner KI, selbst für die Fachwelt völlig überraschend, den legendären GO-Spieler Lee Sedol besiegte [8]. Was war passiert? Wie sich herausstellte, war es DeepMind gelungen, eine KI zu entwickeln, die das für Computer klassische, algorithmisch-rationale Denken mit einem auf künstlichen neuronalen Netzen basierenden Ansatz des intuitiven Denkens verbindet. Beide eingangs skizzierten Denkmuster der natürlichen Intelligenz standen nun auch der Künstlichen Intelligenz in praktikabler Form zur Verfügung.
Selbst Kasparov zeigt sich von dem Spiel der neuen KI begeistert: "I can’t disguise my satisfaction that it plays with a very dynamic style, much like my own!" [9]
Inzwischen hat DeepMind den Ansatz weiterentwickelt. Im Jahr 2020 kann die KI unter dem Namen MuZero sowohl Schach, Shogi (japanisches Schach) als auch Go auf dem übermenschlichen Niveau der Vorgängerversion AlphaZerospielen [10]. Darüber hinaus schlägt sie alle existierenden Algorithmen in Atari-Videospielen. Und das, ohne von den Spielen anderer Menschen oder Computer lernen zu müssen und ohne, dass man ihr die Spielregeln explizit beibringen muss. In den letzten drei Jahren hat sie gelernt, mit beliebig komplexen Aktionsmöglichkeiten umzugehen und in Umgebungen mit nicht-deterministischen Spielregeln zu agieren. Sie hat inzwischen die reinen Spielumgebungen verlassen: Sie hat die für YouTube relevante Kompression von Videostreams verbessert [11], grundlegende Matrix-Multiplikationen durch das Finden besserer Algorithmen beschleunigt [12] und neue, schnellere Varianten maßgeblicher Algorithmen (z. B. Sortier-Algorithmus) auf maschinennaher Ebene gefunden [13].
Auch die Effizienz der KI hat sich in vielerlei Hinsicht verbessert. So kann sie inzwischen durch Reflektion der bereits erlebten Episoden Atari-Videospiele wie ein Mensch in 2 Stunden realer Interaktionszeit mit der Umgebung erlernen [14]. Kein Wunder also, dass Google unter dem durch ChatGPT ausgelösten Konkurrenzdruck der letzten Monate das DeepMind-Team mit dem ursprünglichen GoogleBrain-KI-Team zu Google DeepMind zusammengelegt hat – unter DeepMind-Leitung versteht sich.
Man darf gespannt sein, was nach einer guten Garzeit aus dem KI-Kochtopf der Google DeepMinds herauskommt. Die Zutaten jedenfalls sind vom Feinsten: Google Brain, das die Transformer-Architektur entworfen hat, die unter dem an die Beatles erinnernden Slogan "attention is all you need" im Jahr 2017 veröffentlicht wurde [15] und den Kern des Konkurrenzprodukts ChatGPT bildet [16], steuert die Text-KI bei, die streng genommen nicht nur mit Text, sondern multimodal mindestens auch mit Bildern umgehen kann. DeepMind gibt die belohnungsgesteuerte, intuitiv und rational denkende KI mit dem Slogan "reward is enough" hinzu [9;10;17]. Die Konkurrenz von ChatGPT bringt Druck auf den Kessel – für Google geht es ums Überleben. Unter dem Projektnamen Gemini wird derzeit bei Google heftig gekocht [18]. Wir werden uns bald selbst ein Bild machen können, ob das Google Chat-Programm Bard mit Hilfe von Gemini besser wird als ChatGPT [19]. Bis dahin bleibt es spannend!
Umsetzung in Java
Vielleicht interessiert Sie, wie die DeepMind-KI intuitives und rationales Denken im Inneren zusammenbringt. Lassen Sie uns gemeinsam in DeepMinds Alpha-XY-Welt eintauchen und eine Umsetzung anschauen, bei der wir nur in Java implementieren. Damit wir für das Training der KI mit Consumer-Hardware auskommen und ihre Ausführung auch direkt auf dem Handy funktioniert, nehmen wir uns ein ganz einfaches konkretes Problem vor: das Spiel Tic-Tac-Toe. Bei der Umsetzung bleiben wir aber so allgemein, dass die KI für kompliziertere Probleme skaliert, die entsprechende Hardware vorausgesetzt.
Das Grundproblem, das wir betrachten, lässt sich so formulieren: Ein Agent interagiert mit seiner Umgebung, indem er beobachtet, handelt und Belohnungen – positive wie negative – erhält. Der Agent optimiert seine Handlungen so, dass er die größtmögliche Belohnung bekommt. Das ist alles! Diese Art des Lernens nennt man Reinforcement Learning (RL).
Mit den Grundkomponenten kann sich der Agent von zufälligen Entscheidungen zu übermenschlichem Verhalten verbessern.
Wie muss man nun den Agenten konstruieren, damit er ohne fremde Hilfe quasi von 0 auf 100 lernt? Schauen wir uns an, welche Grundkomponenten enthalten sein müssen.
- Komponente 1: Der Agent benötigt ein Gedächtnis, mit dessen Hilfe er sich daran erinnert, was er in den erlebten Episoden in der Umwelt beobachtet hat, wie er sich verhalten hat und welche Belohnungen er erhalten hat.
- Komponente 2: Unter der Annahme, dass sich der Agent in der Umgebung etwas besser verhält, als es sein Modell der Umgebung (environment) intuitiv vorschlägt, kann er das Modell aus seinen im Gedächtnis gespeicherten Erfahrungen trainieren. Das Modell soll intuitiv Vorschläge liefern, was der Agent in einer Situation tun kann (policy), wie die Situation hinsichtlich aller später zu erwartenden Belohnungen zu bewerten ist (value) und welche Belohnung direkt auf eine Handlung zu erwarten ist (reward). Damit der Agent auch über zukünftige Situationen nachdenken kann, muss er eine innere Repräsentation einer Situation haben (state representation) und aus einer aktuellen Situation und seinem Handeln die Repräsentation möglicher zukünftiger Situationen ableiten können (next state generation).
- Komponente 3: Mit Hilfe des Modells kann der Agent rational planen, indem er den Entscheidungsbaum beim Nachdenken mittels des Modells intelligent entfaltet und dadurch eine gegenüber dem Modell genau für die anstehende Handlungsentscheidung verbesserte Policy erhält. "Clever" bedeutet, dass der Entscheidungsbaum in der Breite durch die Policy und in der Tiefe durch den Value beschnitten wird, und zwar genau so, dass jeder weitere Entfaltungsschritt eine potentielle Verbesserung der Policy hinsichtlich der erwarteten Belohnungen bringt [20].
- Komponente 4: Mit der durch Planung verbesserten Policy kann der Agent die Entscheidung für die nächste Aktion passender treffen, als er es mit der Policy seines Modells könnte. Damit ergibt sich genau das in "Komponente 2" angenommene verbesserte Verhalten in der Umgebung. Bei der Entscheidung für die nächste Aktion kann aber auch eine Portion Neugier helfen: Entweder Neugier auf "Known Unknowns" [21], etwa wenn die Vorhersagen des Agenten für erlebte Situationen im Laufe des Trainings zu stark schwanken, oder durch Neugier auf "Unknown Unknowns", beispielsweise wenn er sich im Rahmen seiner modellgetriebenen Entscheidungen langweilt und einfach mal etwas Neues in der Umgebung erleben will.
Mit den skizzierten Grundkomponenten kann sich der Agent – ähnlich wie Münchhausen sich an den Haaren aus dem Sumpf zieht – von zufälligen Entscheidungen zu übermenschlichem Verhalten verbessern. Dass tatsächlich übermenschliches Verhalten erreicht werden kann, liegt auch daran, dass der Agent lernt, ohne sich durch die Orientierung an menschlichen Verhaltensmustern einschränken zu lassen.
Wie setzt man das nun konkret um? Vom Ansatz her wollten wir so wenig wie möglich selbst programmieren und so viel wie möglich von den besten Stack-Komponenten auf dem Markt verwenden. Für das Training haben wir gesagt, dass wir einen Consumer-PC verwenden wollen. Eine High-End-Consumer-Grafikkarte des führenden KI-Rechenmaschinenherstellers NVIDIA sollte aber schon drin sein, also dann zum Beispiel Hardware wie auf dem hier skizzierten Training-Stack (Abb. 4).
Fast der gesamte Stack stammt von den größten (KI-)Playern (blau) auf dem Markt. Nur ein relativ kleiner Teil (rot) ist in der aktuellen Java-Version implementiert, wobei auch hier etablierte Bibliotheken wie Spring Boot den Grundsatz "das Rad nicht neu zu erfinden" unterstützen.
So überlassen wir das Ausführen von KI-Rechenoperationen künstlicher neuronaler Netzwerke einer der großen führenden Programmbibliotheken für maschinelles Lernen. Wir verwenden die aktuelle Version von PyTorch, die 2022 von der Firma Meta – ehemals Facebook – an die Linux Foundation übertragen wurde [22]. PyTorch ist zwar ursprünglich für die Ansteuerung aus Python gedacht, der eigentliche Laufzeitcode ist aber in C geschrieben und lässt sich wunderbar über Amazons Deep Java Library (DJL) aus Java ansteuern [23]. Dabei schlägt DJL unter der Haube über das Java Native Interface (JNI) die Brücke zum C-Code. Mit diesen Details hat man als Programmierer aber nichts zu tun. DJL abstrahiert die darunter liegende Programmbibliothek und arbeitet im Prinzip auch mit TensorFlow [24], also der KI-Bibliothek vom Google-Brain-Team (am Rande: DeepMind nutzt JAX [25]). Was die DeepMind-KI betrifft, so setzen wir von den Patterns her im Wesentlichen auf DeepMinds Gumbel MuZero auf [20].
Das Zusammenspiel der Komponenten im Agenten beim Training schaut wie in Abb. 5 aus. Während des Trainings iteriert eine Schleife über Epochen, wobei eine Epoche einen Trainingszeitschritt darstellt. Jede Epoche besteht aus zwei Phasen: Eine zum Sammeln von Erfahrungen (experience episodes phase) in der Umgebung und eine zum Trainieren des neuronalen Netzmodells aus den gesammelten Erfahrungen (train model phase).
In der experience episodes phase werden die Episoden parallel ausgeführt. Jede Episode iteriert diskrete Zeitschritte in der Umgebung. Jeder Zeitschritt beginnt mit einer Beobachtung der Umgebung. Danach wird entschieden, welche Aktion ausgeführt werden soll. Dies wird von einer Entscheidungskomponente übernommen, die die Planung für die Baumsuche aufruft, aber in der Art und Weise, wie sie die Planung verwendet, frei ist. Die Planung ruft das Modell für die Inferenzergebnisse auf. Der Agent führt dann eine Aktion aus und speichert die Erfahrungen, die er in diesem Zeitschritt gemacht hat.
Während der train model phase werden zufällig einzelne Erfahrungen ausgewählt und daraus Trainingsziele für das Modelltraining abgeleitet. Das Training der Modellkomponente erfolgt als Batch-Training. Alle Aufrufe des Modells erfolgen asynchron. Dadurch werden die Aufrufer vom Modell entkoppelt. Die Modellkomponente kapselt alle Operationen des neuronalen Netzes. Die Entkopplung betrifft nicht nur die Funktionalität, sondern auch die Parallelisierung. Die Modellkomponente erzeugt Batchjobs und sendet diese über DJL an PyTorch, wo sie mit NVIDIA CUDA hochparallel auf dem Grafikprozessor bearbeitet werden [27].
Das Build-Tool ist Gradle, das die Anwendung mit allen Java-Abhängigkeiten zur Kompilierzeit in eine einzige jar-Datei packt. C-basierte Abhängigkeiten für PyTorch und CUDA werden dynamisch mit dem Standard-DJL-Ansatz geladen. Alle verwendeten Hyperparameter können vollständig von der Spring-Boot-Anwendung über eine einzige YAML-Datei oder als Kommandozeilenparameter konfiguriert werden.
Wie schaut eigentlich das Modell im Detail aus, also das für die Intuition zuständige Neuronale Netzwerk? Das Modell besteht im Wesentlichen aus zwei Funktionen (blau):
- Die Funktion initial inference erzeugt aus den jüngsten Beobachtungen als Input eine Vorhersage für Value und Policy. Sie liefert auch einen internen Zustand (hidden state).
- Dieser interne Zustand liefert zusammen mit einer Aktion (action) des Agenten über die Funktion recurrent inference Vorhersagen für Reward, Value und Policy sowie einen neuen internen Zustand.
Um ein genaues Bild der beiden Funktionen zu erhalten, machen wir uns zunutze, dass die Java-Implementierung eine Exportfunktionalität bietet, die das Modell im Austauschformat ONNX exportiert [29]. ONNX steht für "Open Neural Network Exchange" und ist quasi ein Braindump des Modells in einer plattformübergreifenden Formulierung. Dies kann z. B. mit Hilfe des Open-Source-Tools Netron wunderbar visualisiert werden [30]. Sie können es direkt selbst an einem Beispiel ausprobieren, nämlich dem Braindump des Modells, das für "Tic-Tac-Toe" trainiert wurde: "MuZero TicTacToe InitialInference" und "MuZero TicTacToe Recurrent Inference". Der Braindump enthält neben der Struktur des neuronalen Netzwerks auch die trainierten Parameter.
Hinweis ... damit Sie sich nicht wundern: Beim Tic-Tac-Toe gibt es wie bei den Brettspielen Schach und Go nur eine Belohnung am Ende des Spiels. Das Modell ist daher dort etwas vereinfacht. Die Reward-Vorhersage ist in der Value-Vorhersage enthalten und es gibt keine separate Reward-Vorhersage in der Low-Level-Darstellung der Recurrent-Inference-Funktion.
Laufen lassen in Ihrem Browser
Der Braindump im Austauschformat ONNX kann auch verwendet werden, um das Modell auf einer anderen Plattform auszuführen. Beispielsweise kann das Modell auf WebAssembly direkt in einem Browser ausgeführt werden. Dazu wird das Modell, wie andere Ressourcen auch, von einem kleinen JavaScript- bzw. TypeScript-Programm vom Server geladen und über die ONNX Runtime JavaScript API ONNX JS API via WebAssembly auf der CPU des Endgeräts ausgeführt [31]. Dieser Ansatz funktioniert gut, wenn der Braindump klein genug ist für eine akzeptable Downloadzeit und die Leistung des Endgeräts die Ausführung in einer angemessenen Zeit erlaubt. Das Modell für Tic-Tac-Toe hat nur einige Millionen Parameter. Der Initial-Inference-Modellteil, der für die rein intuitive Ausführung benötigt wird, ist daher nur knapp vier MB groß.
Wie schnell Ihr Endgerät eine Aktion intuitiv auf Basis des Braindumps ausführt, können Sie selbst ausprobieren [32]. Den Quellcode zur Java-Implementierung für Training und Inference und den zur gesamten Webseite mit der JavaScript/TypeScript-Implementierung für Inference finden Sie auf GitHub [33].
- OpenAI: Introducing ChatGPT
- Wikipedia: Daniel Kahneman: Thinking, Fast and Slow
- Nobel Prize: Nobelpreis an Daniel Kahnemann
- Google DeepMind: AlphaFold reveals the structure of the protein universe
- Finanzen100: Die Top100 größten börsennotierten Unternehmen der Welt
- Nvidia: NVIDIA DGX GH200
- Garry Kasparov: Deep Blue versus Garry Kasparov
- Youtube: AlphaGo - The Movie | Full award-winning documentary
- Google DeepMind: AlphaZero: Shedding new light on chess, shogi, and Go
- Google DeepMind: MuZero: Mastering Go, chess, shogi and Atari without rules
- Google DeepMind: MuZero’s first step from research into the real world
- Google DeepMind: Discovering novel algorithms with AlphaTensor
- Google DeepMind: AlphaDev discovers faster sorting algorithms
- Cornell University: Mastering Atari Games with Limited Data
- Google Paper: Attention Is All You Need
- OpenAI: ChatGPT
- Google DeepMind: Reward is Enough
- Google: PaLM 2 and Gemini
- Google: Bard
- Google DeepMind: Policy improvement by planning with Gumbel
- Wikipedia: There are known knowns
- Linux Foundation: PyTorch
- Github: DJL
- Google: TensorFlow
- Github: JAX
- arXiv.org: Agents Explore the Environment Beyond Good Actions to Improve Their Model for Better Decisions
- Nvidia: CUDA Toolkit
- enpasos.ai: Model
- ONNX: Open Neural Network Exchange
- Github: Netron
Netron, enpasos.ai: MuZero TicTacToe InitialInference
Netron, enpasos.ai: MuZero TicTacToe RecurrentInference - ONNX: Get started with ORT for JavaScript
WebAssembly - enpasos.ai: Here - Tic-Tac-Toe
- Github: enpasos/MuZero
Github: enpasos/aiwebsite
Neuen Kommentar schreiben