Einstieg in Deep Reinforcement Learning - KI-Agenten mit Python und PyTorch programmieren

Alexander Zai, Brandon Brown

Einstieg in Deep Reinforcement Learning

KI-Agenten mit Python und PyTorch programmieren

2020

400 Seiten

Format: PDF, ePUB

E-Book: €  31,99

E-Book kaufen

E-Book kaufen

ISBN: 9783446466081

 

2 Modellierung von Reinforcement-Learning-Problemen: Markov Decision Processes

Dieses Kapitel beinhaltet:

       String-Diagramme und unsere Lehrmethoden

       das PyTorch Deep-Learning-Framework

       die Lösung von n-Armed-Bandit-Problemen

       den Ausgleich zwischen Erkundung und Ausnutzung

       die Modellierung eines Problems als Markov Decision Process (MDP)

       die Implementierung eines neuronalen Netzes zur Lösung eines Problems bei der Anzeigenauswahl

Dieses Kapitel behandelt einige der grundlegendsten Konzepte des gesamten Reinforcement Learning und wird die Grundlage für den Rest des Buches bilden. Doch bevor wir uns damit befassen, wollen wir zunächst einige der wiederkehrenden Lehrmethoden durchgehen, die wir in diesem Buch anwenden werden – vor allem die String-Diagramme, die wir im vorhergehenden Kapitel erwähnt haben.

2.1 String-Diagramme und unsere Lehrmethoden

Unserer Erfahrung nach neigen die meisten Menschen, wenn sie versuchen, etwas Kompliziertes zu lehren, dazu, es in der umgekehrten Reihenfolge zu unterrichten, in der das Thema selbst entwickelt wurde. Sie geben Ihnen einen Haufen Definitionen, Begriffe, Beschreibungen und vielleicht Theoreme, und dann sagen sie: „Toll, jetzt, wo wir die ganze Theorie behandelt haben, lassen Sie uns ein paar Praxisprobleme durchgehen“. Unserer Meinung nach ist das genau die umgekehrte Reihenfolge, in der die Dinge präsentiert werden sollten.

Die meisten guten Ideen entstehen als Lösungen für Probleme aus der Praxis oder zumindest für imaginäre Probleme. Der Problemlöser stolpert über eine mögliche Lösung, testet sie, verbessert sie und formalisiert und mathematisiert sie schließlich. Die Begriffe und Definitionen entstehen, nachdem die Lösung für das Problem entwickelt wurde.

Wir sind der Meinung, dass Lernen am motivierendsten und effektivsten ist, wenn man den Platz des ursprünglichen Ideengebers einnimmt, der darüber nachdachte, wie ein bestimmtes Problem zu lösen ist. Erst wenn sich die Lösung herauskristallisiert, rechtfertigt sie eine Formalisierung, die in der Tat notwendig ist, um ihre Richtigkeit festzustellen und sie anderen gewissenhaft zu vermitteln.

Es besteht ein starker Drang, sich auf diesen umgekehrt chronologischen Lehrmodus einzulassen, aber wir werden unser Bestes tun, um dem zu widerstehen und das Thema weiterzuentwickeln. In diesem Sinne werden wir neue Begriffe, Definitionen und mathematische Notationen einführen, wenn wir sie brauchen. Wir werden zum Beispiel Kästen wie diesen verwenden:

Definition

Ein neuronales Netz ist eine Art Machine-Learning-Modell, das aus mehreren „Schichten“ besteht, die eine Matrix-Vektor-Multiplikation durchführen, gefolgt von der Anwendung einer nichtlinearen „Aktivierungsfunktion“. Die Matrizen des neuronalen Netzes sind die erlernbaren Parameter des Modells und werden oft als die „Gewichte“ des neuronalen Netzes bezeichnet.

Sie werden diese Kästen für jeden Begriff nur einmal sehen, aber wir werden die Definition im Text oft auf verschiedene Weise wiederholen, um sicherzustellen, dass Sie sie wirklich verstehen und sich daran erinnern. Dies ist ein Kurs über Reinforcement Learning und kein Lehrbuch oder Nachschlagewerk, sodass wir nicht davor zurückschrecken werden, uns zu wiederholen, wenn wir denken, dass es wichtig ist, sich an etwas zu erinnern.

Wann immer wir etwas Mathematik einführen müssen, verwenden wir normalerweise einen Kasten, der die mathematische Notation und eine Pseudo-Python-Version desselben zugrunde liegenden Konzepts zeigt. Manchmal ist es einfacher, in Form von Code, ein anderes Mal mathematisch zu denken, und wir denken, es ist gut, sich mit beidem vertraut zu machen. Als supereinfaches Beispiel: Wenn wir die Gleichung einer Zeile einführen würden, würden wir es so machen:

Tabelle 2.1 Beispiel für das in diesem Buch verwendete Nebeneinander von mathematischer Notation und Pseudocode

Mathematische Notation

Pseudocode

y = mx + b


  return m*x + b

Wir werden auch zahlreiche Inline-Codes (kurze Schnipsel) und Code-Listings (längere Code-Beispiele) sowie den Code für komplette Projekte aufnehmen. Der gesamte Code des Buches wird in Jupyter-Notebooks zur Verfügung gestellt, die nach Kapiteln auf dem GitHub-Repository des Buches kategorisiert sind (http://mng.bz/JzKp). Wenn Sie den Text aktiv verfolgen und die Projekte in diesem Buch nachvollziehen, empfehlen wir Ihnen dringend, dem Code in diesem zugehörigen GitHub-Repository zu folgen, anstatt den Code im Text zu kopieren – wir werden den GitHub-Code aktualisiert und fehlerfrei halten, wohingegen der Code im Buch etwas veraltet sein kann, wenn die von uns verwendeten Python-Bibliotheken aktualisiert werden. Der GitHub-Code ist auch vollständiger (z. B. zeigt er Ihnen, wie Sie die Visualisierungen, die wir einbauen, generieren können), wohingegen der Code im Text so minimal wie möglich gehalten wurde, da wir uns auf die zugrunde liegenden Konzepte konzentrieren.

Da Reinforcement Learning zahlreiche miteinander verbundene Konzepte umfasst, die verwirrend sein können, wenn man sie allein in Worten beschreibt, werden wir viele verschiedene Diagramme und Abbildungen einfügen. Die wichtigste Art von Abbildungen, die wir verwenden werden, ist das String-Diagramm. Es ist vielleicht ein seltsamer Name, aber die Idee dahinter ist wirklich einfach und wurde aus der Kategorientheorie übernommen, einem Zweig der Mathematik, den wir im ersten Kapitel erwähnt haben und in dem viele Diagramme verwendet werden, um die traditionelle symbolische Notation zu ergänzen oder zu ersetzen.

Das in Bild 2.1 dargestellte String-Diagramm kennen Sie bereits aus Kapitel 1, wo wir das allgemeine Framework für das Reinforcement Learning vorgestellt haben. Die Idee ist, dass die Kästchen Nomen oder Nominalphrasen enthalten, während die Pfeile mit Verben oder Verbsätzen beschriftet sind. Diese Darstellung unterscheidet sich etwas von typischen Flussdiagrammen, aber sie vereinfacht es, das String-Diagramm in Prosa zu übersetzen und umgekehrt. Es ist auch sehr klar, was die Pfeile funktionell tun. Diese besondere Art von String-Diagrammen wird auch als ontologisches Log oder Olog („oh-log“) bezeichnet. Sie können sie nachschlagen, wenn Sie mehr darüber wissen wollen.

Bild 2.1 Das Standardmodell des Reinforcement Learning, bei dem ein Agent in einer sich entwickelnden Umgebung Handlungen ausführt, die Belohnungen zur Verstärkung der Handlungen des Agenten erzeugen.

Allgemeiner ausgedrückt sind String-Diagramme (in anderen Quellen manchmal auch als Schaltpläne bezeichnet) flussähnliche Diagramme, die den Fluss typisierter Daten entlang von Strings (d. h. gerichtete oder ungerichtete Pfeile) in Prozesse (Berechnungen, Funktionen, Transformationen, Prozesse usw.) darstellen, die als Kästen veranschaulicht werden. Der entscheidende Unterschied zwischen String-Diagrammen und anderen, ähnlich aussehenden Flussdiagrammen, die Sie vielleicht schon gesehen haben, besteht darin, dass alle Daten auf den Strings explizit typisiert sind (z. B. ein NumPy-Array mit der Form oder vielleicht eine Fließkommazahl), und dass die Diagramme vollständig kompositorisch sind. Mit kompositorisch meinen wir, dass wir in das Diagramm hinein- oder herauszoomen können, um ein größeres, abstrakteres Bild zu sehen oder auf die rechnerischen Details einzugehen.

Wenn wir eine komplexere Darstellung zeigen, sind die Prozesskästen vielleicht nur mit einem Wort oder einem kurzen Satz versehen, der die Art des Prozesses angibt, der abläuft, aber wir könnten auch eine vergrößerte Ansicht dieser Prozessbox zeigen, die alle internen Details darstellt, die aus einer eigenen Gruppe von Teilstrings und Unterprozessen besteht. Der kompositorische Charakter dieser Diagramme bedeutet auch, dass wir Teile eines Diagramms in ein anderes Diagramm einfügen können, wodurch komplexere Diagramme entstehen, solange die Typen aller Strings kompatibel sind. Hier sehen Sie zum Beispiel eine einzelne Schicht eines neuronalen Netzes als String-Diagramm:

Wenn wir von links nach rechts lesen, sehen wir, dass einige Daten vom Typ in einen Prozesskasten mit der Bezeichnung Neuronale Netzschicht fließen und eine Ausgabe vom Typ erzeugen. Da neuronale Netze typischerweise Vektoren als Input nehmen und Vektoren als Output erzeugen, beziehen sich diese Typen auf die Dimensionen der Input- bzw. Outputvektoren. Das heißt, diese Neuronale Netz-Schicht nimmt einen Vektor der Länge oder Dimension n an und erzeugt einen Vektor der Dimension m. Es ist möglich, dass n = m für einige Neuronale Netz-Schichten gilt.

Diese Art der Typisierung der Strings ist vereinfacht, und wir nehmen sie nur vor, wenn aus dem Kontext klar ist, was die Typen bedeuten. In anderen Fällen können wir für die Menge aller reellen Zahlen eine...

 

© 2009-2021 ciando GmbH