Buffl

Kartenstapel

MD
von Marcel D.

Problem – non-i.i.d.

Was ist die Ausgangslage und das Ziel?

Was ist der Nachteil davon?


Wie funktioniert es grob?

Beim beim Trainieren von NNs gehen wir von der Grundannahme aus, dass die Trainingsdaten „i.i.d“ (independent & identically distributed) sind. Dies ist insofern nicht der Fall, da die observations bzw. states von einer episode mit sehr hoher Wahrscheinlichkeit miteinander korrelieren. Wenn z.b. der Agent nur im Kreis fährt, dann sind alle states – die der agent in dieser episode encountered hat - stark voneinander abhängig.


Ziel:

Stichwort: Buffer. Wir speichern alle States (aus allen Episoden) in einem Buffer und ziehen dann fürs Training eine best. Anzahl davon zufällig daraus (= batch). Somit bekommen wir (mehr oder weniger) states die voneinander unabhängig sind. Ein State könnte dann von Episode 1 sein, während der nächste dann von Episode 10 ist. Der Buffer hat eine gewisse Größe, welche im Vorhinein festgelegt wird (weiterer Hyperparameter – yeah^^). Ist der Buffer voll, überschreiben sich die states darin -> Vorteil, dass ich mit besserem Training auch immer bessere Ergebnisse bekomme, auf welche ich dann weitertrainiere, und die alten, nicht so guten States werden überschrieben.


Nachteil:

  • Weiterer Schritt zum Berechnen = mehr Rechenleistung notwendig

  • Wenn Buffer Größe zu klein gewählt wird, dann ist die Wsh größer, dass die states noch miteinander korrelieren.

  • Wenn Buffer Größe zu groß, dann habe ich noch immer viel „alten bullshit“ drin, welcher fürs training gesampelt werden könnte, obwohl ich schon viel bessere States hätte. (Grundlage für „Prioritzied Replay Buffer DQN“)


Was ist das Problem – Update des NNs

Dafür müssen wir nun ein bisschen weiter ausholen:


Unser NN soll ja alle action-values für einen gewissen state berechnen (aus denen wir dann den besten nehmen). Um den Besten ausfindig zu machen, wird jeder action-value mit dem „maximum Q-value“ verglichen (= Subtraktion) und jener Wert der dem „maximum Q-value“ am nähesten ist (= kleinste Differenz) ist dann somit der beste Wert.


[Wird mit der Bellman Equation gemacht -> siehe Basic Recap]

Um diesen „maximum Q-value“ in einem NN zu berechnen, müssen wir einen zweiten Durchlauf in NN machen, bei welchen wir den nächsten state als input reingeben, um die möglichen aktionen des nächsten states zu bekommen Dann alles in die bellman equation rein und – TADAA (lol)


Es gibt dabei jedoch ein Problem! Wir verwenden hier bei beiden Durchläufen dasselbe neuronale Netz mit denselben Gewichten. Wenn wir nun unser NN und somit unsere Gewichte updaten, daten wir damit in weiterer Folge unsere Q-Values (action-values) ab, da wir diese ja nun präziser berechnen können, UND gleichzeitig damit aber auch unsere „maximum Q-values“ (oder auch „target Q-values“ genannt).


Jetzt kommt wieder das SGD hinein, da man sich das alles als eine „Gradienten-Landschaft“ vorstellen muss. Wie ein Gebirge, wo die Gipfel eine hohe Fehlerrate und ein Tal eine geringe Fehlerrate darstellt. Unser Q-Value ist dabei unsere Ausgangslage (wo man sich auf der Landschaft befindet) und unser „target Q-Value“ ist der tiefste Punkt. Es ist wichtig im Hinterkopf zu behalten, dass wir hier ja bei den „Approximation Methods“ sind -> bedeutet wir schätzen hier so gut wie alles.

Was ist die Ausgangslage & das Ziel Double DQN?


Wir verwenden beim Berechnen des Action-Values (Q-Value) den max Q-Operator (-> Fragen? -> siehe Basics Recap). Damit fangen wir uns einen Bias ein, welcher zu Problemen während des Trainings führen kann. Ein kleines Beispiel:


Der Agent kann in Zustand A die Aktionen links oder rechts auswählen und bekommt dafür jedoch jeweils nur einen Reward von 0. Im Zustand B bekommt er einen gesampelten Reward (nach Normalverteilung -> N), welcher im durchschnitt jedoch bei -0,1 liegt (mit einer Varianz von 1). Eigentlich wäre es ja gescheit, wenn der Agent nach rechts geht, weil dort bekommt er im Durchschnitt „insgesamt“ einen besseren Reward, als wenn er nach links gehen wird. Es kann aber sein, dass der Agent, wenn er nach links geht, zufällig einen Reward von max. 0.9 bekommt (durchschnitt -0,1 + Varianz 1 = 0,9). Daher denkt der Agent „Oh links ist ja ziemlich nice“, auch wenn diese Entscheidung (links gehen) im Durchschnitt nicht so gut ist (als rechts zu gehen). Dies ist der max Q-Funktion geschuldet, welche ja immer den besten Q-Value sucht. Im Endeffekt müsste der Agent dann so oft die Erfahrung machen, dass er im Durchschnitt beim Rechts gehen einen besseren Reward als nach links gehen bekommt. Dieser „positive Bias“ verzögert damit das Lernen sehr stark. Wie gesagt liegt das Problem in der max Q-Funktion. Diese wählt nämlich sowohl den höchsten Q-Value aus UND evaluiert gleichzeitig die beste Aktion.


Ziel:

Wir müssen die Funktion in zwei Schritte aufteilen:

  • Den höchsten Q-Value finden (argmax-Funktion)

  • Evaluation der Aktion, welche den höchsten Q-Value hat.




Was ist die Detailierte vorgehensweise bei PBR DQN’s?

  1. Berechnen des TD-Errors

  2. Auf Basis derer eine Wahrscheinlichkeit berechnen

  3. Darüber ein „Stochastic Proportional Sampling“ laufen lassen Wir berechnen uns den Temporary Difference Error (TD). Dafür rechnen wir hier den geschätzten Q-Value für eine bestimmte Aktion im aktuellen Zustand gegen den geschätzten Q-Value für die beste Aktion im nächsten Zustand.


Da wir aber jetzt nicht einfach immer nur die Erfahrung mit der höchsten Priorität nehmen (deterministisches Prioritization), sondern anderen Erfahrungen auch eine Chance geben wollen, müssen wir eine Wahrscheinlichkeit aufbauen.

Das Ziel ist hierbei eine Wahrscheinlichkeit aufzubauen, welche proportional zur Priorität (also TD-Error) steht.

Das bedeutet, dass Erfahrungen mit höherer Priorität eine höhere Wahrscheinlichkeit haben, ausgewählt zu werden, während Erfahrungen mit weniger Priorität weniger Wsh haben. Zunächst müssen wir dafür alle TD-Error Werte normalisieren. Dafür wir die Priorität einer Erfahrung durch die Gesamtsumme aller Prioritäten dividiert.

Alpha ist dabei ein Parameter, welcher angibt wie glatt/gleichverteilt die Verteilung aussehen soll. Bsp.: Ein Alpha von 0 bedeutet, dass alle Werte gleichverteilt sind (was ja eig nicht Sinn der Sache ist) und je höher, desto mehr die Verteilung bei P(i) (also TD-Error).

Nun wird ein stochastic proportional sampling angewandt. Dabei wird eine Zufallszahl zwischen 0-1 generiert und dann jene Erfahrung ausgewählt, deren kumulative Wahrscheinlichkeit diesen Wert überschreitet.


Die ganze Geschichte hat jedoch noch einen weiteren Hacken:

Wir führen uns damit einen neuen Bias ein. Dieser kommt daher, dass unsere Wahrscheinlichkeit proportional zur Priorität der einzelnen Erfahrung ist. Dadurch ist sie jedoch nicht mehr direkt proportional zu ihrer tatsächlichen Wahrscheinlichkeit (da wären ja quasi alle gleich). Und dies kann zu Verzerrungen führen.


Diesem können wir aber entgegen gehen, indem wir „importance sampling weights“ einführen. Diese werden verwendet, um den Verlust bei der Aktualisierung der Netzwerkparameter zu gewichten, wodurch der Einfluss des Bias reduziert wird.

Hierbei ist N die Gesamtanzahl der Erfahrungen im Replay Buffer und Pi die Priorität der Erfahrung i. Wenn β=0, werden die Importance Sampling Gewichte auf 1 gesetzt, was bedeutet, dass keine Korrektur vorgenommen wird. Je größer der Wert von β, desto stärker werden die Prioritäten korrigiert.

Generell macht es Sinn β<1 zu initialisieren und dann über die Zeit β->1 gehen zu lassen.

Wie berechnet man die Proximal Policy Optimization genau?

  1. Berechnung der r (ration) Es wird eine neue Größe r (ratio) eingeführt, welche das Verhältnis zwischen neuer und alter policy darstellt. Genauer genommen wird hier berechnet, um wie viel sich die Wahrscheinlichkeit der ausgewählten Aktion (dass sie ausgewählt wird) unter der neuen policy – im Vergleich zu alten policy – geändert hat.

  1. Multiplikation mit Advantage-Value

    Meistens wird für die alte policy ein Wert von 1 angegeben. Ist die neue Policy-Wert nun größer wird die ratio über 1 liegen, ansonsten unter 1. Zusätzlich wird die ratio noch mit dem Advantage-Value multipliziert, um miteinzubinden, wie vorteilhaft diese Aktion nun mit der neuen policy im Gegensatz zur alten ist. Somit wird neben der Auswahlwahrscheinlichkeit, auch der Vorteil der Aktion miteinbezogen.

Im Endeffekt kann das Endergebnis dann gemessen werden, ob diese über 1 oder unter 1 liegt. Liegt der Wert über 1 (= die Wsh, dass die Aktion ausgewählt wird hat sich erhöht und hat mehr Nutzen), dann wird ein Update gemacht. Hat sich die Wsh jedoch nicht erhöht und hat weniger Nutzen als in der alten policy, dann wird nicht einmal ein Update gemacht. Somit begeben wir uns nicht erst in die Gefahr, dass man sich aus der Trust-Region herausbewegt.

  1. Einfügen des Clip-Values

    Der Clip wird nun in die Berechnung miteingefügt, um den Loss zu kappen.

Hierbei ist clip(x,a,b) eine Funktion, die den Wert von x auf den Bereich [a,b] klippert. Somit wird der ratio-Value zwischen den Bereichen 1 - ε, sowie 1 + ε gekippet.

  1. Berechnung des finalen Losses + Entropie

Somit haben wir 2 Losses:

  • Loss der Value-Function

  • Loss der ceclippt wird Diese müssen wir nun noch miteinander kombinieren.


Wie man hier sieht wird hier noch das Maß der Entropie eingeführt – Warum?

Entropie ist ein Maß der „Unordnung“ (oder pures Chaos (wenn Wert 1)). Durch diese Optimierung kann man in die Gefahr laufen, dass die policy am Schluss zu deterministisch wird, was man um jeden Preis verhindern will. Deswegen wird im Loss noch ein gewisses Maß an Unordnung hineingenommen, um mit der Entropie ein gewisses Maß an Exploration hochzuhalten. Die Entropie kann somit als Gegenkraft verstanden werden, welche schaut, dass die policy nicht zu deterministisch wird.

Die Entropie kann dabei Werte von 0-1 annehmen.

  • 0 = kein Chaos -> es kann nur ein Wert ausgewählt werden (deterministisch)

  • 1 = pures Chaos -> alle Werte sind gleichverteilt


Was ist die Vorgehensweise beim MCTS? (einfach)

Vorgehensweise – grob:

  • States = nodes / Knoten

  • actions = edges / Kanten

  • Der MCTS wird in deterministischen Environments angewandt!

Die Monte-Carlo-Tree-Search (MCTS) ist wie ein schlauer Spieler, der in einem Spiel entscheiden muss, welcher Zug der Beste ist. Hier ist eine vereinfachte Erklärung:

  1. Baum aufbauen:

    1. Stell dir vor, du beginnst mit einem leeren Baum, der den Startzustand des Spiels darstellt. Das ist wie ein leeres Blatt Papier.

    2. Dieser Startzustand ist wie der Samen, aus dem der Baum wächst. Er ist der Anfang.

  2. Den Baum erkunden und erweitern:

    1. Der schlaue Spieler beginnt, den Baum zu füllen, Schritt für Schritt. Er wählt Aktionen aus und sieht, wohin sie ihn führen.

    2. Jedes Mal, wenn er eine Aktion wählt, wächst der Baum um einen neuen Ast. Es ist wie das Zeichnen eines Bildes, während man neue Ideen erkundet.

  3. Simulationen durchführen:

    1. Nachdem der Baum gewachsen ist, macht der Spieler sich eine Vorstellung davon, wie das Spiel verlaufen könnte. Er spielt das Spiel in seiner Vorstellung durch, um zu sehen, wie gut seine Züge sein könnten.

    2. Es ist wie das Träumen von verschiedenen Möglichkeiten, wie das Spiel ausgehen könnte.

  4. Bewertung und Lernen:

    1. Der Spieler denkt darüber nach, wie gut seine Vorstellungen waren. Er bewertet, wie gut oder schlecht seine Züge waren und was er daraus lernen kann.

    2. Diese Bewertungen helfen ihm, besser zu werden und klügere Entscheidungen zu treffen.

  5. Wiederholung des Prozesses:

    1. Der Spieler wiederholt diesen Prozess immer wieder. Er fügt neue Ideen hinzu, denkt über sie nach, spielt sie durch und lernt daraus.

    2. Mit jedem Durchgang wird der Baum größer und der Spieler klüger.


Nenne die MCTS übersicht?

  1. Selektion:

    1. Die Selektion beginnt am Wurzelknoten des Baumes.

    2. Von dort aus wird iterativ eine Knoten im Baum ausgewählt, der die Auswahlkriterien erfüllt, normalerweise basierend auf dem UCB1-Algorithmus (Upper Confidence Bound).

    3. Der UCB1-Algorithmus berücksichtigt dabei sowohl die Güte des Pfades (durchschnittliche Belohnung) als auch die Exploration (wie oft der Pfad besucht wurde) und führt zu einem Trade-off zwischen Ausbeutung bekannter Pfade und Exploration neuer Pfade.

    4. Zu Beginn wird der Wurzelknoten verwendet.

  2. Expansion:

    1. Sobald ein Knoten erreicht ist, der noch nicht vollständig expandiert wurde (d.h. er hat unbesuchte Kindknoten), wird er erweitert.

    2. Neue Kindknoten werden hinzugefügt, um mögliche zukünftige Spielzüge zu repräsentieren.

    3. Es ist wichtig zu beachten, dass MCTS nur diejenigen Kindknoten expandiert, die im Spiel tatsächlich erreichbar sind, basierend auf den aktuellen Regeln und Zuständen.

  3. Simulation:

    1. Für die neu hinzugefügten Kindknoten werden Simulationen durchgeführt, um mögliche Spielverläufe zu bewerten.

    2. Jede Simulation führt zu einem bestimmten Endzustand und einer zugehörigen Belohnung oder Bewertung.

  4. Rückwärtsdurchlauf (Backpropagation):

    1. Nachdem die Simulationen abgeschlossen sind, werden die Ergebnisse auf die Elternknoten zurückgeführt.

    2. Die Belohnungen oder Bewertungen werden aufsummiert und die Statistiken der Knoten (wie Anzahl der Besuche, kumulierte Belohnung) entsprechend aktualisiert.

    3. Diese Aktualisierung der Statistiken ermöglicht es dem Algorithmus, im Laufe der Zeit eine bessere Schätzung der Spielzüge und ihrer potenziellen Belohnungen zu erhalten.


Wie ist die Vorgehensweise im detail (+ Formeln) - im MCTS?

Uns interessieren primär die Kanten, weil am Schluss eines jeden Trees ja die beste Aktion gewählt werden soll.


Für jede Aktion (= Kante) speichern wir folgende 4 Metriken:



1. Durchgang - „Aller Anfang ist schwer“

1.1 Select

Wir haben unseren Wurzelknoten / Anfangsstate. Dementsprechend ist beim select ziemlich klar welcher state genommen wird – ansonsten würde ein Suchalgorithmus (bsp.: UCB1) dafür verwendet (siehe 2.1.)


1.2 Expand:

  • Dieser State wird mal in das Model gegeben, um alle möglichen daraus resultierenden Folge-States (bsp.: a3) zu ermitteln.

  • Gleichzeitig werden alle Aktionen (Kanten, die zu den Knoten führen) durch ein NN geschickt, um die prio probabilites zu erstellen (bsp.: 0.52). Man kann sich das wie ein erstes „Bauchgefühl“ vorstellen, mit welcher die Aktionen zunächst einmal bewertet werden.


1.3 Evaluate

Nun evaluieren wir den Ausgangs-State, indem jeder Folge-State weitergespielt wird, bis es das Spiel zu Ende geht. Dabei bekommt man in der Regel einen Reward von 1,0,-1 je nachdem ob das Spiel dann gewonnen, unentschieden oder verloren ausging.


1.4 Backup

Jetzt werden unsere Informationen, die wir im vorangegangenen Schritt gesammelt haben, verarbeitet. Dafür gehen wir zunächst von jedem State - den wir durchevaluiert haben – und gehen zur dazugehörigen Aktion und daten die restlichen 3 Metriken ab (N, Q, W). Diese brauchen wir dann wieder im nächsten Durchgang. Außerdem bewerten wir nun den darüber liegenden state, von welchem die aktionen ausgingen, auf Basis unserer gesammelten Informationen (auch wieder diese 3 Metriken).


2. Durchgang – „We’re gonna build this city”


Nun soll der nächste State gewählt werden, welche dann wieder expanded wird, etc. Die Frage ist nur: „Wie entscheiden wir, welchen state wir nehmen?“. In Punkt 1.1. wurde ein Suchalgorithmus angesprochen. Dieser sieht sich nämlich die durchschnittliche Belohnung für die aktion an, sowie einen neuen Wert U an. Exkurs: Was ist der Wert U? Der Wert U beschreibt den „Exploration Bonus“ und ist ein echt interessantes Konzept! Im Grunde gibt dieser Wert uns aus, wie viel Information wir uns von diesem State erhoffen. Wie kann man das definieren? Dazu schauen wir uns mal die Formel dazu an:


Neben der eindeutigen USA Referenz (lol) haben wir hier 3 Teile:


C(put) = Skalierfaktor, welche den Trade-off zwischen Exploration und Exploitation steuert (ist hier aber nicht so wichtig!)

P(s|a) = Prior Probability. Da dieser mit dem Exploration Bonus-Kern (hintere Teil - mir fällt kein besserer Name ein) multipliziert wird, kann gesagt werden, dass wenn die Prior Probability höher ist, ist auch der Exploration Bonus höher und umgekehrt. „Exploration Bonus-Kern“ = Wir haben hier zwei Teile:

  • Über den Bruch haben wir die Summe wie viele Aktion insgesamt schon genommen wurden.

  • Unter dem Bruch steht die Anzahl wie oft diese konkrete Aktion schon genommen wurde.


Je mehr Aktionen wir generell nehmen, desto höher wird allgemein der “Exploration Bonus-Kern“, da die Zahl über dem Bruch größer wird. ABER: wenn wir uns dann einmal für eine bestimmte Aktion entscheiden, rasselt bei dieser der jeweilige „Exploration Bonus-Kern“ in den Keller, da sich für die best. Aktion die Zahl unter dem Bruch erhöht. Somit verringert sich der Exploration Bonus für diese Aktion generell. Vom Prinzip her ist dies wegen 3 Punkten echt genial:

  • Wenn wir diese Aktion einmal genommen haben, kann man davon ausgehen, dass wir genug Informationen bekommen haben und dass nun andere Aktionen mehr Informationen bereithalten.

  • Davon ausgehend, dass der Exploration Bonus (U) mit den gemittelten Rewards (Q) addiert wird, kann es aber trotzdem sein, dass eine bestimmte Aktion so einen hohen durchschnittlichen Reward hat. Wenn die Summe eines hohen durchschnitts Rewards + geringer Exploration Bonus (da ja schon einmal gewählt) trotzdem noch der höchste Wert ist, dann wird nochmal diese Aktion gewählt. Da man ja davon ausgehen kann, dass die Aktion so übelst nice ist, dass man diese nochmal nehmen sollte. Prinzipiell favorisiert der Exploration Bonus somit neue, unerforschte Aktionen, hält aber immer noch die Möglichkeit offen, dass übelst gute Aktionen ausgenutzt werden.

  • Wurde eine Aktion mal ausgewählt und ist nun der Exploration Bonus sehr low. Über die Zeit wird sich diese jedoch wieder erhöhen, da mit ansteigender Zahl der gesamt gewählten Aktionen, ja die Zahl über den Bruch wieder höher wird. Somit steigt mit der Zeit auch wieder die Wahrscheinlichkeit, dass eine zuvor gewählte Aktion, im späteren Verlauf wieder ausgewählt werden kann.

All in all ist die Einführung des Exploration Bonus echt smart, weil man innerhalb des MCTS priorisiert, was man durchgehen will und was nicht (man hat ja auch nicht ewig Zeit).


Author

Marcel D.

Informationen

Zuletzt geändert