Wie kann ein eingeschränkter Aktionsraum beim Lernen zur Stärkung implementiert werden?

12

Ich codiere ein Verstärkungslernmodell mit einem PPO-Agenten dank der sehr guten Tensorforce-Bibliothek , die auf Tensorflow basiert.

Die erste Version war sehr einfach und ich tauche jetzt in eine komplexere Umgebung ein, in der nicht alle Aktionen bei jedem Schritt verfügbar sind.

Angenommen, es gibt 5 Aktionen, deren Verfügbarkeit von einem internen Status abhängt (der durch die vorherige Aktion und / oder den neuen Status / Beobachtungsraum definiert wird):

  • Es stehen immer 2 Aktionen (0 und 1) zur Verfügung
  • 2 Aktionen (2 und 3) sind nur verfügbar, wenn der interne_Zustand == 0 ist
  • 1 Aktion (4) ist nur verfügbar, wenn der interne_Zustand == 1 ist

Daher sind 4 Aktionen verfügbar, wenn internal_state == 0 und 3 Aktionen verfügbar, wenn internal_state == 1.

Ich denke über einige Möglichkeiten nach, dies umzusetzen:

  1. Ändern Sie den Aktionsbereich bei jedem Schritt abhängig vom internen Status. Ich nehme an, das ist Unsinn.
  2. Nichts tun: Lassen Sie das Modell verstehen, dass die Auswahl einer nicht verfügbaren Aktion keine Auswirkungen hat.
  3. Tun Sie fast nichts: Beeinflussen Sie die Belohnung leicht negativ, wenn das Modell eine nicht verfügbare Aktion auswählt.
  4. Helfen Sie dem Modell: indem Sie eine Ganzzahl in den Status- / Beobachtungsraum einfügen, die das Modell über den internen_Statuswert + Aufzählungspunkt 2 oder 3 informiert

Gibt es andere Möglichkeiten, dies umzusetzen? Welches wäre aus Ihrer Erfahrung das beste?

Max
quelle

Antworten:

5

Die einfachste Lösung besteht darin, jede Aktion einfach "legal" zu machen, aber eine konsistente, deterministische Zuordnung von potenziell illegalen Aktionen zu verschiedenen rechtlichen Aktionen zu implementieren. Wenn die von Ihnen verwendete PPO-Implementierung eine illegale Aktion auswählt, ersetzen Sie sie einfach durch die rechtliche Aktion, der sie zugeordnet ist. Ihr PPO-Algorithmus kann sich dann immer noch selbst aktualisieren, als ob die illegale Aktion ausgewählt worden wäre (die illegale Aktion wird stattdessen einfach zu ... einem "Spitznamen" für die legale Aktion).

Zum Beispiel in der von Ihnen beschriebenen Situation:

  • Es stehen immer 2 Aktionen (0 und 1) zur Verfügung
  • 2 Aktionen (2 und 3) sind nur verfügbar, wenn der interne_Zustand == 0 ist
  • 1 Aktion (4) ist nur verfügbar, wenn der interne_Zustand == 1 ist

In Fällen, in denen eine internal_state == 0Aktion 4ausgewählt wurde (eine illegale Aktion), können Sie sie jederzeit gegen eine der anderen Aktionen austauschen und stattdessen diese spielen. Es spielt (theoretisch) keine Rolle, welche Sie auswählen, solange Sie konsequent sind. Der Algorithmus muss nicht wissen, dass er eine illegale Aktion ausgewählt hat. Wenn er in Zukunft dieselbe illegale Aktion in ähnlichen Zuständen erneut auswählt, wird er stattdessen konsistent derselben rechtlichen Aktion zugeordnet, sodass Sie nur entsprechend diesem Verhalten verstärken.


Die oben beschriebene Lösung ist sehr einfach, wahrscheinlich die am einfachsten zu implementierende, aber natürlich ... "riecht" ein bisschen "hackig". Eine sauberere Lösung würde einen Schritt im Netzwerk beinhalten, der die Wahrscheinlichkeitsausgaben für illegale Aktionen auf setzt0und normalisiert den Rest neu, um zu summieren 1nochmal. Dies erfordert viel mehr Sorgfalt, um sicherzustellen, dass Ihre Lernupdates immer noch korrekt ausgeführt werden, und ist wahrscheinlich viel komplexer in der Implementierung auf einem vorhandenen Framework wie Tensorforce (sofern dies nicht bereits standardmäßig unterstützt wird).


Für die erste "Lösung" habe ich oben geschrieben, dass es "theoretisch" nicht darauf ankommt, wie Sie Ihr Mapping auswählen. Ich gehe jedoch davon aus, dass Ihre Entscheidungen hier einen Einfluss auf die Lerngeschwindigkeit in der Praxis haben werden. Dies liegt daran, dass Sie in der Anfangsphase Ihres Lernprozesses wahrscheinlich eine nahezu zufällige Aktionsauswahl haben. Wenn einige Aktionen in den Ausgängen "mehrfach angezeigt" werden, besteht eine größere Wahrscheinlichkeit, dass sie mit der anfänglichen Auswahl der Aktion "Close-Tor-Andom" ausgewählt werden. Es wird also einen Einfluss auf Ihr anfängliches Verhalten haben, der sich auf die Erfahrung auswirkt, die Sie sammeln, was sich wiederum auch auf das auswirkt, was Sie lernen.

Ich gehe davon aus, dass es für die Leistung von Vorteil ist, wenn Sie Eingabefunktionen für die internal_stateVariable hinzufügen können.

Wenn einige rechtliche Handlungen identifiziert werden können, die bestimmten illegalen Handlungen irgendwie "semantisch nahe" kommen, kann es für die Leistung auch von Vorteil sein, diese "ähnlichen" Handlungen in der "Zuordnung" von illegalen zu rechtlichen Handlungen spezifisch zu verknüpfen, wenn Sie sich dafür entscheiden diese Lösung. Wenn Sie beispielsweise eine Aktion "Vorwärts springen" ausführen, die in Staaten mit sehr niedriger Obergrenze illegal wird (weil Sie sich den Kopf stoßen würden), ist es möglicherweise besser, diese Aktion einer Aktion "Vorwärts bewegen" zuzuordnen (welche ist immer noch ähnlich, sie gehen beide vorwärts), als es wäre, es einer "rückwärts bewegen" -Aktion zuzuordnen. Diese Idee von "ähnlichen" Aktionen gilt jedoch nur für bestimmte Domänen. In einigen Domänen gibt es möglicherweise keine derartigen Ähnlichkeiten zwischen Aktionen.

Dennis Soemers
quelle
1

Ziel ist es, mithilfe eines Frameworks wie Tensorforce eine Komponente zur Optimierung der proximalen Richtlinien zu entwerfen, die bestimmte Einschränkungen für den Aktionsbereich in Abhängigkeit von zustandsgesteuerten Regeln aufweist.

In der Frage aufgeführte Entwurfsoptionen

Diese Optionen sind hier als Kurzreferenz aufgeführt, wenn Sie die erste Analyse unten lesen.

  • Ändern Sie den Aktionsbereich bei jedem Schritt abhängig vom internen Status. Ich nehme an, das ist Unsinn.
  • Nichts tun: Lassen Sie das Modell verstehen, dass die Auswahl einer nicht verfügbaren Aktion keine Auswirkungen hat.
  • Tun Sie fast nichts: Beeinflussen Sie die Belohnung leicht negativ, wenn das Modell eine nicht verfügbare Aktion auswählt.
  • Helfen Sie dem Modell: indem Sie eine Ganzzahl in den Status- / Beobachtungsraum einfügen, die das Modell über den internen_Statuswert + Aufzählungspunkt 2 oder 3 informiert

Erste Analyse

Es ist in der Tat sinnvoll, den Aktionsraum für jede Bewegung zu ändern. Dies ist in der Tat eine angemessene Darstellung des Problems und der normalen Art und Weise, wie Menschen Spiele spielen und wie Computer Menschen in Chess and Go schlagen.

Die offensichtliche Sinnlosigkeit dieser Idee ist lediglich ein Artefakt des Fortschritts entlang der Roadmap des Tensorforce-Projekts und des Fortschritts entlang der Verstärkungstheorie, die beide im Großen und Ganzen jung sind. Beim Lesen der Tensorforce-Dokumentation und der häufig gestellten Fragen scheint es nicht so zu sein, dass das Framework eine Regelengine einbindet, um den Aktionsbereich zu bestimmen. Dies ist kein Mangel an Open Source. Es scheint keine Artikel zu geben, die Theorie liefern oder Algorithmen für regelkonditionierte Markov-Kettenentscheidungen vorschlagen.

Die Option "Nichts tun" passt zu den derzeit verfügbaren Strategien in der Literatur. Das Nichtstun ist wahrscheinlich der Ansatz, der zu einem zuverlässigeren und möglicherweise unmittelbareren wünschenswerten Verhalten führt.

Das Problem mit dem Konzept, dem Modell zu helfen, ist, dass es keine so starke Idee ist wie die Erweiterung des Modells. In Open Source würde dies durch Erweitern der Klassen erfolgen, die das Modell darstellen, was einige theoretische Arbeiten vor dem Codieren erfordern würde

    a. Represent rule-conditioned learning in nomenclature
    b. Represent convergence mathematically using the new nomenclature
    c. Determining a method of convergence
    d. Proving convergence
    e. Rechecking
    f. Defining a smooth and efficient algorithm
    g. Providing PAC learning information for planning
    f. Peer review
    g. Extending the classes of the library
    h. Proof of concept with the current problem above
    i. Additional cases and metrics comparing the approach with the others
    j. Extending the library flexibility to support more such dev

Die Erweiterung von Lernsystemen auf den Fall mit eingeschränkten Regeln ist eine großartige Idee für eine Doktorarbeit und könnte als Projektvorschlag mit vielen möglichen Anwendungen in Forschungslabors fliegen. Lassen Sie sich nicht von allen Schritten vom Forscher abbringen. Sie sind im Wesentlichen eine Liste von Schritten für jede Doktorarbeit oder jedes finanzierte KI-Laborprojekt.

Für eine kurzfristige Lösung könnte es funktionieren, dem Modell zu helfen, aber es ist keine vernünftige Strategie, um die Ideen der KI auf dem Weg des verstärkenden Lernens voranzutreiben. Als kurzfristige Lösung für ein bestimmtes Problem kann es gut funktionieren. Die Idee, fast nichts zu tun, ist möglicherweise fundierter, da sie in die Konvergenzbeweise passt, die zu der bestimmten Implementierung geführt haben, die Tensorforce wahrscheinlich verwendet.

Die Umbenennung von "fast nichts tun" in "Konvergenz unterstützen" kann dazu beitragen, die richtige Perspektive zu entwickeln, bevor Sie es versuchen. Möglicherweise müssen Sie die Unterstützung abschwächen, wenn Sie sich der Konvergenz nähern, um ein Überschwingen zu vermeiden, genau wie bei einer Lernrate.

Douglas Daseeco
quelle
3
Was beispielsweise in AlphaGo typischerweise passiert, ist, dass die Darstellung auf niedriger Ebene im neuronalen Netzwerk einen sehr großen Aktionsraum darstellt, von dem die meisten im aktuellen Zustand unmöglich sind (dies geschieht aufgrund der Einschränkungen einfacher NNs, die Vektoren fester Größe ausgeben ). Dann wendet ein anderer Teil des Codes einen Filter an, um Wahrscheinlichkeiten nur für zulässige Bewegungen auszuwählen und zu normalisieren. Das kombinierte NN und der Filter sind Teil des Agenten. Man kann also mit Recht sagen, dass der Agent als Ganzes "den Aktionsraum für jeden Zug ändert" - ich weiß jedoch nicht, wie dies in der Tensorforce-Bibliothek erreicht werden kann.
Neil Slater
1

Normalerweise ändert sich die Anzahl der Aktionen, die der Agent ausführen kann, im Laufe der Zeit nicht, aber einige Aktionen können in verschiedenen Zuständen unmöglich werden (z. B. ist nicht jede Bewegung in einer beliebigen Position des TicTacToe-Spiels möglich).

Schauen Sie sich als Beispiel den Code https://github.com/haje01/gym-tictactoe/blob/master/examples/base_agent.py an :

ava_actions = env.available_actions()
action = agent.act(state, ava_actions)
state, reward, done, info = env.step(action)
madpower2000
quelle