[PYTHON] [Lernen stärken] Bombe: DeepMind Experience Replay Framework Reverb

Ein japanischer Nachdruck des Blog-Artikels in englischer Sprache.

1. Zuallererst

Am 26. Mai veröffentlichte DeepMind Reverb als Framework für Experience Replay in Enhanced Learning. (Referenz)

Reverb is an efficient and easy-to-use data storage and transport system designed for machine learning research. Reverb is primarily used as an experience replay system for distributed reinforcement learning algorithms but the system also supports multiple data structure representations such as FIFO, LIFO, and priority queues.

Reverb ist ein effizientes und benutzerfreundliches Datenspeicherungs- und Datenübertragungssystem für die Forschung zum maschinellen Lernen. Reverb wird hauptsächlich für die Erfahrungswiedergabe für verteilte erweiterte Lernalgorithmen verwendet, das System unterstützt jedoch Datenstrukturen wie FIFO, LIFO und gewichtete Warteschlangen. (Bis hierher vom Autor übersetzt)

DeepMinds Framework für das Lernen von Verstärkung Acme (ein Forschungsrahmen für das Lernen von Verstärkung) verwendet diesen Reverb. (Für Acme nutzen Sie eine andere Gelegenheit)

2. Installation

Ab dem 26. Juni, zum Zeitpunkt des Schreibens des Artikels, gibt Reverb offiziell an, dass es nur Linux-basierte Betriebssysteme unterstützt und sich nicht auf der Ebene der Produktionsnutzung befindet.

Eine Entwicklungsversion von TensorFlow ist erforderlich und kann mit dem folgenden Befehl von PyPI installiert werden

pip install tf-nightly==2.3.0.dev20200604 dm-reverb-nightly

3. Architektur

Reverb verwendet einen Server-Client-Ansatz, und ich bin der Meinung, dass die Namensregeln den Datenbankbegriffen näher kommen als bei anderen Replay Buffer-Implementierungen.

3.1 Server

Der Beispielcode auf der Serverseite lautet wie folgt.

import reverb

server = reverb.Server(tables=[
    reverb.Table(
        name='my_table',
        sampler=reverb.selectors.Uniform(),
        remover=reverb.selectors.Fifo(),
        max_size=100,
        rate_limiter=reverb.rate_limiters.MinSize(1)),
    ],
    port=8000
)

In diesem Beispiel lauscht ein normaler Wiedergabepuffer mit einer Kapazität von "100" (einheitliches Abtasten, Überschreiben vom ältesten zum neuesten) auf Port "8000". "reverb.rate_limiters.MinSize (1)" bedeutet, alle Abtastanforderungen zu blockieren, bis mindestens "1" Elemente vorhanden sind.

3.1.1 Elementauswahl (Sampler / Remove)

Wie Sie im obigen Beispiel sehen können, können Sie mit Reverb die Logik für das Abtasten und Löschen von Elementen (Überschreiben) unabhängig voneinander festlegen.

Die von Reverb unterstützte Logik ist in "reverb.selectors" implementiert und hat Folgendes:

3.1.2 Einschränkungsspezifikation (rate_limiter)

Das Argument rate_limiter kann die Bedingungen für die Verwendung des Wiedergabepuffers festlegen. Die von Reverb unterstützten Bedingungen sind in reverb.rate_limiters und implementiert Es gibt Folgendes

In den Kommentaren im Quellcode werden "reverb.rate_limiters.Queue" und "reverb.rate_limiters.Stack" nicht für die direkte Verwendung empfohlen, sondern die statischen Methoden "reverb.Table.queue" und "reverb.Table.queue" Es setzt sampler , remove und rate_limiter entsprechend, so dass reverb.Table.stack` ein Replay Buffer mit FIFO- bzw. LIFO-Logik ist.

3.2 Client

Der Beispielcode des Client-Programms ist unten

import reverb

client = reverb.Client('localhost:8000') #Wenn der Server und der Client derselbe Computer sind

# [0,1]Zustand(observation)Priorität 1.Beispiel für das Einfügen eines Wiederholungspuffers mit 0
client.insert([0, 1], priorities={'my_table': 1.0})

#Nach der Probenahme wird der Generator zurückgegeben
client.sample('my_table', num_samples=2))

3.3 Speichern / Laden

Reverb unterstützt Funktionen zum Speichern / Laden von Daten. Durch Ausführen des folgenden Codes vom Client werden die Daten auf dem aktuellen Server in der Datei gespeichert und der gespeicherte Dateipfad kann abgerufen werden.

checkpoint_path = client.checkpoint()

Der Status der Originaldaten kann wiederhergestellt werden, indem mit den gespeicherten Daten ein Server erstellt wird. Es ist zu beachten, dass das Argument "tables" des Konstruktors nicht genau dasselbe angibt wie der ursprüngliche Server, auf dem die Daten auf Verantwortung des Benutzers gespeichert wurden.

checkpointer = reverb.checkpointers.DefaultCheckpointer(path=checkpoint_path)
server = reverb.Server(tables=[...], checkpointer=checkpointer)

Schließlich

Das neue Framework von DeepMind für Experience Replay, Reverb, hat noch keine stabile Version erreicht, aber ich fand es vielversprechend für flexibles, umfangreiches Augmentationslernen.

Für meine Experience Replay-Bibliothek cpprb tauchte plötzlich ein großer Rivale auf, aber in kleineren Experimenten zum verstärkten Lernen cpprb Ich denke, es gibt einige Teile, die bequemer und einfacher zu bedienen sind. (Siehe Frühere Qiita-Artikel)

(Update: 2020.6.29) Ich habe recherchiert und geschrieben Wie man den Client benutzt!

Recommended Posts

[Lernen stärken] Bombe: DeepMind Experience Replay Framework Reverb
[Lernen stärken] Umfrage zur Verwendung der Experience Replay-Bibliothek von DeepMind Reverb [Client Edition]
DeepMind Enhanced Learning Framework Acme
[Einführung] Stärkung des Lernens
Zukünftiges Verstärkungslernen_2