Ein japanischer Nachdruck des Blog-Artikels in englischer Sprache.
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)
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
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.
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.
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:
Uniform
: Wird zufällig aus allen Artikeln mit gleichmäßiger Verteilung ausgewähltPriorisiert
: Nach Priorität zufällig ausgewähltFifo
: Wählen Sie die ältesten Daten ausLifo
: Wählen Sie die neuesten Daten ausMinHeap
: Wählen Sie die Daten mit der niedrigsten Priorität ausMaxHeap
: Wählen Sie die Daten mit der höchsten Priorität ausrate_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
MinSize
: Legen Sie die Mindestanzahl von Elementen fest, die abgetastet werden könnenSampleToInsertRatio
: Legt das durchschnittliche Verhältnis von Dateneinfügung (Aktualisierung) und Datenprobe festQueue
: Wird genau einmal extrahiert, bevor es überschrieben wird (für FIFO)Stack
: Wird genau einmal extrahiert, bevor es überschrieben wird (für LIFO)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.
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))
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)
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