Dies ist eine Erklärung der Hyperparameter. Ich habe jeden Parameter zusammengefasst.
Klicken Sie hier für den Inhaltsalgorithmus [Stärkung des Lernens] R2D2-Implementierung / Erklärung Rache Erklärung (Keras-RL)
Der Zielcode für diesen Artikel befindet sich auf Github.
Dieser Parameter ist für Rainbow (DQN) und R2D2 gleich.
Überblick | Schimmel | Beispiel | Bemerkungen | |
---|---|---|---|---|
input_shape | Form eingeben | tuple | (84,84) | env.observation_space.shape |
input_type | Geben Sie das Eingabeformat an | InputType | InputType.GRAY_2ch | Ursprüngliche Implementierung |
image_model | Bildebenenmodellformat | ImageModel(Ursprüngliche Implementierung) | DQNImageModel() | |
nb_actions | Anzahl der Aktionen(Anzahl der Ausgänge) | int | 4 | env.action_space.n |
processor | Klassen, die benutzerdefinierte Fitnessfunktionen bieten | Processor(Keras-rl) | None |
input_shape Geben Sie das Eingabeformat mit Tupel an. Wenn es sich um ein Bild handelt, liegt es im Format (Breite, Höhe) vor. Im Fall von Gym ist dies das Format, das von env.observation_space.shape abgerufen werden kann.
input_type Es ist eine Spezifikation, die die obige input_shape ergänzt. Es wird unabhängig implementiert. Die folgenden vier Typen werden angenommen und entsprechend dem Inhalt von input_shape angegeben.
InputType
class InputType(enum.Enum):
VALUES = 1 #Kein Bild
GRAY_2ch = 3 # (width, height)
GRAY_3ch = 4 # (width, height, 1)
COLOR = 5 # (width, height, ch)
image_model Dies ist der Inhalt, der in Vorheriger Artikel erläutert wurde. Derzeit gibt es jedoch nur zwei Typen: Wenn es sich nicht um ein Bild handelt, geben Sie None an, und wenn es sich um ein Bild handelt, geben Sie DQNImageModel () an.
nb_actions Geben Sie das Ausgabeformat mit int an. Dies entspricht der Anzahl der Aktionen, die der Agent auswählen kann. Wenn Sie beispielsweise links und rechts anhalten, werden 3 Aktionen ausgeführt, wenn 3 Operationsmethoden vorhanden sind. Für Gym können Sie es mit env.action_space.n erhalten. (Nur diskretes Format)
processor Eine Klasse, die Anpassungsfunktionen für Env bietet, die von Gym bereitgestellt werden. (Prozessor (Keras-rl-Beamter))
Überblick | Schimmel | Beispiel | Bemerkungen | |
---|---|---|---|---|
batch_size | Chargengröße | int | 32 | |
optimizer | Optimierungsalgorithmus | Optimizer(Keras) | Adam(lr=0.0001) | Keras-Implementierung |
metrics | Bewertungsfunktion | array | [] | Keras-Implementierung |
input_sequence | Anzahl der Eingaberahmen | int | 4 | |
dense_units_num | Anzahl der Einheiten in der dichten Ebene | int | 512 | |
enable_dueling_network | Ob Dueling Network verwendet werden soll | bool | True | |
dueling_network_type | Im Duell-Netzwerk verwendete Algorithmen | DuelingNetwork | DuelingNetwork.AVERAGE | |
lstm_type | Typen bei Verwendung von LSTM | LstmType(Ursprüngliche Implementierung) | LstmType.NONE | |
lstm_units_num | Anzahl der Einheiten in der LSTM-Schicht | int | 512 | |
lstm_ful_input_length | Anzahl der Eingabelernen pro Lernen | int | 4 | Wird nur für STATEFUL verwendet |
batch_size Die für das Mini-Batch-Lernen verwendete Stapelgröße. (Für Batch hier (Keras offiziell)) Es wird gesagt, dass das Erhöhen der Stapelgröße die Lerneffizienz und Lerngeschwindigkeit erhöht. Im Gegensatz zum überwachten Lernen unterliegt das verstärkte Lernen jedoch keinen Einschränkungen hinsichtlich der Trainingsdaten, sodass eine Erhöhung der Stapelgröße die Lernkosten erhöht (die Konvergenzgeschwindigkeit bei einem Lernen erhöht sich, es dauert jedoch einige Zeit, sodass die Suche nach neuen Erfahrungen so oft durchgeführt wird (Reduziert), daher denke ich, dass es besser ist, nicht zu viel zu erhöhen. Außerdem sollte die Chargengröße 2 ^ n betragen.
optimizer Gibt das Keras-Optimierungsprogramm an, das Sie beim Kompilieren des NN-Modells angeben. Weitere Informationen finden Sie unter Verwendung des Optimierers (Optimizer) (Keras offiziell).
metrics Gibt die Keras-Auswertungsfunktion an. Ich weiß nicht viel, weil ich es nicht benutzt habe ... Weitere Informationen finden Sie unter Verwendung der Bewertungsfunktion (Keras-Formel).
input_sequence (früher window_length) Die Anzahl der Beobachtungen, die für die Eingabe verwendet werden sollen. 1 verwendet nur den letzten 1 Frame als Eingabe und 4 verwendet den neuesten bis 4 Frame als Eingabe. Das Erhöhen dieses Werts erhöht die Ausdruckskraft der Eingabe, erhöht jedoch die Lernkosten.
dense_units_num Die Anzahl der Einheiten in der dichten Ebene. Das Erhöhen dieses Werts erhöht die Ausdruckskraft von NN, erhöht jedoch die Lernkosten.
enable_dueling_network Gibt an, ob [Duell-Netzwerk] aktiviert werden soll (https://qiita.com/pocokhc/items/fc00f8ea9dca8f8c0297#dueling-network). Dueling Network zielt darauf ab, die Lerneffizienz zu verbessern, indem NN durch die Trennung von Zuständen und Aktionen lernen lässt.
dueling_network_type Dies ist der Algorithmus zum Trennen von Zuständen und Aktionen in DuelingNetwork. Sie können aus den folgenden drei Typen angeben. Das Papier gab an, dass Durchschnitt die besten Ergebnisse lieferte.
DuelingNetwork
class DuelingNetwork(enum.Enum):
AVERAGE = 0
MAX = 1
NAIVE = 2
LstmType
class LstmType(enum.Enum):
NONE = 0
STATELESS = 1
STATEFUL = 2
Überblick | Schimmel | Beispiel | Bemerkungen | |
---|---|---|---|---|
memory/remote_memory | Speicher zu verwenden | Memory(Ursprüngliche Implementierung) | ReplayMemory(10000) | Siehe unten |
Gibt den Speichertyp an, in dem die Erfahrung gespeichert werden soll. In DQN werden die erlebten Daten einmal im Speicher gespeichert. Danach wird die Erfahrung zufällig aus dem Gedächtnis extrahiert und gelernt. Es gibt verschiedene Arten, je nachdem, wie aus dem Speicher abgerufen werden soll, daher werde ich sie erläutern.
ReplayMemory Es ist ein einfacher Speicher, der in DQN verwendet wird. (Vorheriger Artikel) Ruft empirische Daten nach dem Zufallsprinzip ab.
ReplayMemory(
capacity=10_000
)
PERGreedyMemory [Wiedergabe vorrangiger Erfahrungen](https://qiita.com/pocokhc/items/fc00f8ea9dca8f8c0297#priority-experience-reply%E5%84%AA%E5%85%88%E9%A0%86%E4%BD% 8D% E4% BB% 98% E3% 81% 8D% E7% B5% 8C% E9% A8% 93% E5% 86% 8D% E7% 94% 9F) ist eine einfache Implementierung. Dies ist eine Methode, um die Erfahrung mit dem größten TD-Fehler (der höchsten Reflexionsrate beim Lernen) und nicht zufällig zu extrahieren. Da es jedoch keine zufälligen Elemente gibt, habe ich das Gefühl, sofort eine lokale Lösung zu finden, sodass ich nicht gut lernen kann ... (Warum implementiert)
PERGreedyMemory(
capacity=10_000
)
PERProportionalMemory [Priority Experience Replay](https://qiita.com/pocokhc/items/fc00f8ea9dca8f8c0297#priority-experience-reply%E5%84%AA%E5%85%88%E9%A0%86%E4%BD% 8D% E4% BB% 98% E3% 81% 8D% E7% B5% 8C% E9% A8% 93% E5% 86% 8D% E7% 94% 9F) Proportionaler Priorisierungsspeicher .. Dies ist eine Methode zum Extrahieren von Erfahrungen anhand der Wahrscheinlichkeitsverteilung des TD-Fehlers und nicht anhand der Zufälligkeit. (Erfahrungen mit mehr TD-Fehlern werden eher abgerufen)
Es fühlt sich viel effizienter an als Replay Memory (zufällige Auswahl).
PERGreedyMemory(
capacity=100000,
alpha=0.9,
beta_initial,
beta_steps,
enable_is,
)
Die Parameter werden später beschrieben.
PERRankBaseMemory [Priority Experience Replay](https://qiita.com/pocokhc/items/fc00f8ea9dca8f8c0297#priority-experience-reply%E5%84%AA%E5%85%88%E9%A0%86%E4%BD% RankBase-Speicher in 8D% E4% BB% 98% E3% 81% 8D% E7% B5% 8C% E9% A8% 93% E5% 86% 8D% E7% 94% 9F). Nehmen Sie Erfahrung im Verhältnis zum Rang des TD-Fehlers und nicht zufällig. Wenn Sie beispielsweise drei Erfahrungen gemacht haben, beträgt der erste Platz 50%, der zweite 33% und der dritte 17%.
Es fühlt sich viel effizienter an als ReplayMemory (zufällige Auswahl), Ich verstehe den Unterschied zu Proportional nicht wirklich. Dies sollte in Bezug auf die Geschwindigkeit etwas schneller sein ...
PERRankBaseMemory(
capacity=100000,
alpha=0.9,
beta_initial,
beta_steps,
enable_is,
)
Die Parameter werden später beschrieben.
Überblick | Schimmel | Beispiel | Bemerkungen | |
---|---|---|---|---|
capacity | Maximale Speicherkapazität | int | 1_000_000 | |
alpha | Wahrscheinlichkeitsreflexionsrate | float | 0.9 | 0.0~1.0 |
beta_initial | Anfangswert der IS-Reflexionsrate | float | 0.0 | 0.0~1.0 |
beta_steps | IS Reflexionsrate 1.Anzahl der Schritte bis 0 | int | 100_000 | Hängt von der Anzahl der Lernvorgänge ab |
enable_is | Gibt an, ob IS aktiviert werden soll | bool | True |
capacity Maximale Speicherkapazität.
alpha Reflexionsrate von Priority / RankBase. (0,0-1,0) 0.0 ist völlig zufällig (ähnlich wie Replay Memory), 1.0 folgt vollständig der Wahrscheinlichkeitsverteilung.
Hier [Importance Sampling (IS)](https://qiita.com/pocokhc/items/fc00f8ea9dca8f8c0297#%E9%87%8D%E8%A6%81%E5%BA%A6%E3%82%B5% E3% 83% B3% E3% 83% 97% E3% 83% AA% E3% 83% B3% E3% 82% B0 ist eine wichtige Stichprobe. Wenn Erfahrungen gemäß der Wahrscheinlichkeitsverteilung gegeben werden, gibt es eine Verzerrung in der Häufigkeit, mit der jede Erfahrung ausgewählt wird. Wenn die Anzahl der Erfahrungsauswahlen verzerrt ist, ist das Lernen voreingenommen, und es ist wichtig, dies bei der Stichprobenerhebung zu vermeiden.
Insbesondere hat eine mit hoher Wahrscheinlichkeit ausgewählte Erfahrung eine niedrige Reflexionsrate zum Aktualisieren des Q-Werts, und eine mit niedriger Wahrscheinlichkeit ausgewählte Erfahrung hat eine hohe Reflexionsrate zum Aktualisieren des Q-Werts.
Das Lernen scheint durch die Einführung von IS stabil zu sein. Darüber hinaus wird IS glühen (allmählich reflektieren).
beta_initial Dies ist der Anfangswert der IS-Reflexionsrate. (0.0 verwendet kein IS, 1.0 spiegelt IS wider)
beta_steps Dies ist die Anzahl der Schritte, die erforderlich sind, um die IS-Reflexionsrate auf 1,0 einzustellen. Bitte geben Sie anhand der Anzahl der Lernvorgänge an.
enable_is Gibt an, ob IS aktiviert werden soll.
Überblick | Schimmel | Beispiel | Bemerkungen | |
---|---|---|---|---|
memory_warmup_size/ remote_memory_warmup_size | Größe, die erst lernt, wenn Erfahrung im Gedächtnis gesammelt wird | int | 1000 | |
target_model_update | Aktualisierungsintervall für das Zielmodell | int | 10000 | |
gamma | Q Lernrabatt | float | 0.99 | 0.0~1.0 |
enable_double_dqn | Gibt an, ob DoubleDQN verwendet werden soll | bool | True | |
enable_rescaling | Gibt an, ob die Neuskalierungsfunktion verwendet werden soll | bool | True | |
rescaling_epsilon | Konstanten, die in der Neuskalierungsfunktion verwendet werden | float | 0.001 | |
priority_exponent | Verhältnis bei der Berechnung der Erfahrungsprioritäten | float | 0.9 | Verwenden Sie nur LESTFUL |
burnin_length | burn-in der Periode | int | 2 | Verwenden Sie nur LESTFUL |
reward_multisteps | Anzahl der Schritte in MultiStep Reward | int | 3 |
memory_warmup_size / remote_memory_warmup_size Im Ausgangszustand gibt es keine Erfahrung im Gedächtnis und Lernen ist nicht möglich. Erstellen Sie daher eine Zeit, in der Sie nicht lernen, bis sich die Erfahrung im Gedächtnis angesammelt hat. Geben Sie hier den Zeitraum an. Ich denke, ein Wert größer als batch_size und nicht zu klein ist gut. (Wenn Sie es zu stark reduzieren, können Sie in eine lokale Lösung geraten, wenn zu Beginn voreingenommene empirische Daten vorliegen.)
target_model_update Aktualisierungsintervall für Zielnetzwerk in DQN. DQN-Updates über ein dediziertes Q-Netzwerk namens Target Network. TargetNetwork lernt das aktuelle Q-Netzwerk nicht und kopiert es nicht in regelmäßigen Abständen. Auf diese Weise wird im Q-Netzwerk, das für die Aktualisierung verwendet wird, eine Zeitverzögerung erzeugt, und die Aktualisierung ist besser.
gamma [Q Learning Discount Rate](https://qiita.com/pocokhc/items/8ed40be84a144b28180d#q%E5%AD%A6%E7%BF%92%E3%81%AB%E3%81%A4%E3% 81% 84% E3% 81% A6). Gibt an, wie viel die Belohnung weitergegeben wird. Nun, ich denke ein Wert nahe 1,0 ist in Ordnung.
enable_double_dqn DoubleDQN lernte durch Auswahl des maximalen Q-Werts zum Zeitpunkt des Lernens, kann jedoch aufgrund des Einflusses von Rauschen usw. überschätzt werden. Es ist eine Methode vorgeschlagen, weil es Sex hat und nicht gut ist. Ich bin der Meinung, dass die Lerneffizienz steigen wird, wenn DoubleDQN verwendet wird.
enable_rescaling Gibt an, ob die Neuskalierungsfunktion (https://qiita.com/pocokhc/items/408f0f818140924ad4c4#rescaling-%E9%96%A2%E6%95%B0) für die Belohnung verwendet werden soll. Wenn Sie die Neuskalierungsfunktion verwenden, wird die Belohnung bis zu einem gewissen Grad gerundet, sodass Sie die Lernschwankungen aufgrund der Belohnung verringern können.
rescaling_epsilon Eine Konstante, die in der Neuskalierungsfunktion verwendet wird. Es scheint eine Konstante zu sein, die verhindert, dass es 0 wird, und ich denke, es sollte ein Wert nahe 0 sein. (0,001 ist die im Papier verwendete Zahl)
priority_exponent [Berechnung der Priorität (Priorität der Erfahrung)], die beim LSTM-Lernen (LSTMFUL) verwendet wird und R2D2 entspricht (https://qiita.com/pocokhc/items/3b64d747a2f36da559c3#priority%E3%81%AE%E8%A8% 88% E7% AE% 97% E6% 96% B9% E6% B3% 95). LSTMFUL bestimmt die endgültige Priorität (Erfahrungspriorität) basierend auf mehreren Prioritäten. Die Berechnungsmethode ist der Maximalwert von $ Priority + der Durchschnittswert von Priority $. Das Verhältnis, wie stark sich dieser Maximalwert und der Durchschnittswert widerspiegeln, ist priority_exponent. Im Fall von 0,9 ist der Maximalwert von $ Priorität * 0,9 + der Durchschnittswert von Priorität * 0,1 $. In der Zeitung wurde geschrieben, dass etwa 0,9 ein gutes Ergebnis war.
burnin_length Dies ist die Anzahl von Burn-in, die beim LSTM-Lernen (LSTMFUL) verwendet wird und R2D2 entspricht. Grob gesagt gibt es einen Unterschied zwischen dem vergangenen Zustand (beim Speichern von Erfahrungsdaten) und dem aktuellen Zustand in LST MFUL. Daher ist es eine Methode, einen Zeitraum für fließende Erfahrungsdaten ohne Lernen festzulegen, um vor dem Lernen näher an den aktuellen Zustand heranzukommen. Wenn Sie burnin_length erhöhen, wird das Lernen genauer, aber die Lernkosten werden erhöht.
reward_multisteps Dies ist die Anzahl der Schritte in Mehrstufiges Lernen. Normalerweise wird die Belohnung für 1 Schritt verwendet, aber die Belohnung für n-Schritt wird verwendet. Es fühlt sich an, als würde man mit einer kleinen zukünftigen Belohnung lernen (?) 3step ist der im Papier verwendete Wert.
Überblick | Schimmel | Beispiel | Bemerkungen | |
---|---|---|---|---|
action_interval | Aktionsausführungsintervall | int | 1 | 1 oder mehr |
action_policy | Maßnahmen zur Ausführung von Aktionen | Policy(Ursprüngliche Implementierung) | Siehe unten |
action_interval Das Aktualisierungsintervall der Aktion. Wenn Sie beispielsweise 4 festlegen, wird die Aktion alle 4 Frames aktualisiert. (Führt dieselbe Aktion aus, wenn sie nicht aktualisiert wird.)
action_policy Gibt die Strategie zum Ausführen der Aktion an. Einzelheiten zu jeder Strategie finden Sie in Vorheriger Artikel.
ε-greedy ε-gierig wirkt zufällig, wenn es für Zufallszahlen (0,0 bis 1,0) weniger als $ epsilon $ beträgt. Wenn es größer als das ist, wählen Sie die Aktion aus, die den Q-Wert maximiert.
EpsilonGreedy(
epsilon
)
ε-greedy(Annealing) [DQN](https://qiita.com/pocokhc/items/125479c9ae0df1de4234#%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3 Die in% 81% AE% E6% B1% BA% E5% AE% 9A) verwendete Methode. Eine Technik, um $ epsilon $ in ε-gierig (entsprechend dem Q-Wert) im Verlauf des Lernens zu senken.
AnnealingEpsilonGreedy(
initial_epsilon=1,
final_epsilon=0.1,
exploration_steps=1_000_000
)
initial_epsilon Anfangs $ epsilon $.
final_epsilon Der Endzustand ist $ epsilon $.
exploration_steps Geben Sie die Anzahl der Schritte vom Anfangszustand bis zum Endzustand an.
ε-greedy(Actor) In [Ape-X] verwendete Methode (https://qiita.com/pocokhc/items/980640c6a7b5dc9d524e#%CE%B5-greedy%E3%81%AE%E5%9B%BA%E5%AE%9A) ist. $ Epsilon $ in ε-gierig wird basierend auf der Anzahl der Schauspieler berechnet.
EpsilonGreedyActor(
actor_index,
actors_length,
epsilon=0.4,
alpha=7
)
actor_index Geben Sie den Index des Akteurs an.
actors_length Die Gesamtzahl der Schauspieler.
epsilon Geben Sie die Referenz $ epsilon $ an.
alpha Es ist eine Konstante, die bei der Berechnung verwendet wird.
Softmax Es ist eine Methode, um die Aktion durch die Wahrscheinlichkeitsverteilung der Softmax-Funktion des Q-Werts zu bestimmen. Kurz gesagt, je höher der Q-Wert ist, desto einfacher ist die Auswahl, und je niedriger der Q-Wert ist, desto schwieriger ist die Auswahl.
SoftmaxPolicy()
Es gibt keine Argumente.
UCB(Upper Confidence Bound)1 UCB1 ist eine Methode zum Auswählen einer Aktion, bei der nicht nur der Q-Wert, sondern auch die Häufigkeit der Auswahl der Aktion berücksichtigt wird. Die Idee ist, nach Aktionen zu suchen, die nicht sehr ausgewählt sind, weil die Suche nicht so weit fortgeschritten ist und es möglicherweise unbekannte Belohnungen gibt.
UCB1()
Es gibt keine Argumente. Darüber hinaus erhöhen sich die Schulungskosten, da das NN-Modell im Inneren gehalten und trainiert wird.
UCB1-Tuned UCB1-Tuned ist ein verbesserter Algorithmus für UCB1, der auch die Verteilung berücksichtigt. Es liefert bessere Ergebnisse als UCB1, es gibt jedoch keine theoretische Garantie.
UCB1_Tuned()
Es gibt keine Argumente. Darüber hinaus erhöhen sich die Schulungskosten, da das NN-Modell im Inneren gehalten und trainiert wird.
UCB-V Es ist ein Algorithmus, der verteilungsbewusster ist als UCB1-Tuned.
UCBv()
Es gibt keine Argumente. Darüber hinaus erhöhen sich die Schulungskosten, da das NN-Modell im Inneren gehalten und trainiert wird.
KL-UCB Es ist ein Algorithmus, der den theoretischen optimalen Wert des Such- und Belohnungsdilemmas findet. Die Implementierung kann jedoch etwas seltsam sein ...
KL_UCB()
Es gibt keine Argumente. Darüber hinaus erhöhen sich die Schulungskosten, da das NN-Modell im Inneren gehalten und trainiert wird.
Thompson Sampling ist ein Algorithmus, der auf der Basisschätzung basiert. Dies ist auch das theoretische Optimum für das Explorations- und Belohnungsdilemma.
Die Beta-Verteilung ist eine Verteilung, die angewendet werden kann, wenn ein Binärwert von 0 oder 1 angenommen wird. Wenn in der Implementierung die Belohnung größer als 0 ist, wird sie als 1 behandelt, und wenn sie 0 oder weniger ist, wird sie als 0 behandelt.
ThompsonSamplingBeta()
Es gibt keine Argumente. Darüber hinaus erhöhen sich die Schulungskosten, da das NN-Modell im Inneren gehalten und trainiert wird.
Thompson Sampling ist ein Algorithmus, der auf der Basisschätzung basiert. Dies ist auch das theoretische Optimum für das Explorations- und Belohnungsdilemma.
Der Algorithmus wird unter der Annahme angewendet, dass die Belohnung einer Normalverteilung folgt.
ThompsonSamplingGaussian()
Es gibt keine Argumente. Darüber hinaus erhöhen sich die Schulungskosten, da das NN-Modell im Inneren gehalten und trainiert wird.
Überblick | Schimmel | Beispiel | Bemerkungen | |
---|---|---|---|---|
train_interval | Lernintervall | int | 1 | 1 oder mehr |
Sie können das Trainingsintervall verlängern, indem Sie train_interval erhöhen.
Überblick | Schimmel | Beispiel | Bemerkungen | |
---|---|---|---|---|
actors | Geben Sie die Actor-Klasse an | Actor(Ursprüngliche Implementierung) | Siehe unten | |
actor_model_sync_interval | Intervall zum Synchronisieren des NN-Modells vom Lernenden | int | 500 |
Actor Es ist eine Klasse, die Actor durch ihre eigene Implementierung ausdrückt. Es erbt dies und definiert die Richtlinie und Umgebung, die jeder Akteur ausführt.
Dies ist ein Definitionsbeispiel.
from src.r2d2 import Actor
from src.policy import EpsilonGreedy
ENV_NAME = "xxx"
class MyActor(Actor):
def getPolicy(self, actor_index, actor_num):
return EpsilonGreedy(0.1)
def fit(self, index, agent):
env = gym.make(ENV_NAME)
agent.fit(env, visualize=False, verbose=0)
env.close()
getPolicy gibt die von diesem Akteur verwendete Aktionsrichtlinie an. Lassen Sie agetn, ein Argument in fit, fit ausführen, um zu lernen.
Seien Sie vorsichtig, wenn Sie an R2D2 übergeben, übergeben Sie die Klasse selbst (nicht instanziieren)
from src.r2d2 import R2D2
kwargs = {
"actors": [MyActor] #Übergeben Sie die Klasse selbst
(Kürzung)
}
manager = R2D2(**kwargs)
Wenn Sie die Anzahl der Akteure erhöhen möchten, erhöhen Sie die Anzahl der Elemente im Array.
Beispiel von 4 Schauspielern
from src.r2d2 import R2D2
kwargs = {
"actors": [MyActor, MyActor, MyActor, MyActor]
(Kürzung)
}
manager = R2D2(**kwargs)
MovieLogger(Rainbow/R2D2)
Rückruf, der ein Video ausgibt. Es kann sowohl mit Rainbow als auch mit R2D2 verwendet werden.
from src.callbacks import MovieLogger
#Fügen Sie es dem Argument callcacks von test hinzu.
movie = MovieLogger()
agent.test(env, nb_episodes=1, visualize=False, callbacks=[movie])
#du sparst.
movie.save(
start_frame=0,
end_frame=0,
gifname="pendulum.gif",
mp4name="",
interval=200,
fps=30
):
start_frame Geben Sie den Startrahmen an.
end_frame Geben Sie den Endrahmen an. Wenn es 0 ist, werden alle Frames bis zum Ende als Ziel ausgewählt.
gifname Dies ist der Pfad bei der Ausgabe im GIF-Format. Als Matplotlib-Animation speichern. Wenn es "" ist, wird es nicht ausgegeben.
mp4name Dies ist der Pfad bei der Ausgabe im MP4-Format. Als Matplotlib-Animation speichern. Wenn es "" ist, wird es nicht ausgegeben.
interval Ein Intervall, das in matplotlib an FuncAnimation übergeben werden soll.
fps Dies ist die fps beim Speichern eines Videos mit matplotlib.
・ Ausgabebeispiel
Rückruf für die Visualisierung der Conv-Ebene, der erweiterten Ebene und der Wertebene, eingeführt in Vorheriger Artikel. Es kann sowohl mit Rainbow als auch mit R2D2 verwendet werden.
from src.callbacks import ConvLayerView
#Geben Sie den Agenten in der Initialisierung an.
conv = ConvLayerView(agent)
#Führen Sie einen Test durch.
#Geben Sie das ConvLayerView-Objekt im Rückrufargument an
agent.test(env, nb_episodes=1, visualize=False, callbacks=[conv])
#Speichern Sie das Ergebnis.
conv.save(
grad_cam_layers=["conv_1", "conv_2", "conv_3"],
add_adv_layer=True,
add_val_layer=True,
start_frame=0,
end_frame=200,
gifname="tmp/pendulum.gif",
interval=200,
fps=10,
)
grad_cam_layers Geben Sie die Ziel-Conv-Ebene an. Der Name ist der im ImageModel angegebene Name.
add_adv_layer Gibt an, ob eine erweiterte Ebene hinzugefügt werden soll
add_val_layer Gibt an, ob eine Wertebene hinzugefügt werden soll
start_frame Geben Sie den Startrahmen an.
end_frame Geben Sie den Endrahmen an. Wenn es 0 ist, werden alle Frames bis zum Ende als Ziel ausgewählt.
gifname Dies ist der Pfad bei der Ausgabe im GIF-Format. Als Matplotlib-Animation speichern. Wenn es "" ist, wird es nicht ausgegeben.
mp4name Dies ist der Pfad bei der Ausgabe im MP4-Format. Als Matplotlib-Animation speichern. Wenn es "" ist, wird es nicht ausgegeben.
interval Ein Intervall, das in matplotlib an FuncAnimation übergeben werden soll.
fps Dies ist die fps beim Speichern eines Videos mit matplotlib.
Außerdem funktioniert ConvLayerView nur, wenn die Eingabe ein Bild ist (InputType ist GRAY_2ch, GRAY_3ch, COLOR).
・ Ausgabebeispiel
Logger2Stage(Rainbow) Es bietet die folgenden zwei Funktionen.
from src.rainbow import Rainbow
from src.callbacks import Logger2Stage
#Erstellen Sie einen separaten Agenten und eine Umgebung zum Testen
kwargs = (Kürzung)
test_agent = Rainbow(**kwargs)
test_env = gym.make(ENV_NAME)
#verschiedene Einstellungen
log = Logger2Stage(
logger_type=LoggerType.STEP,
warmup=1000,
interval1=200,
interval2=20_000,
change_count=5,
savefile="tmp/log.json",
test_agent=test_agent,
test_env=test_env,
test_episodes=10
)
#Fügen Sie Rückrufe beim Lernen hinzu
#Logger2Stage gibt das Protokoll aus, also ausführlich=0
agent.fit(env, nb_steps=1_750_000, visualize=False, verbose=0, callbacks=[log])
#Sie können die Protokolle mit der Funktion getLogs abrufen(Sie müssen savefile angeben)
history = log.getLogs()
#Es ist einfach, aber Sie können auch Diagramme ausgeben(Sie müssen savefile angeben)
log.drawGraph()
logger_type Das Protokollaufzeichnungsformat. LoggerType.TIME: Get by time. LoggerType.STEP: Ermitteln Sie die Anzahl der Schritte.
warmup Während der ersten Aufwärmzeit werden keine Protokolle abgerufen. LoggerType.TIME ist die Anzahl der Sekunden und LoggerType.STEP ist die Anzahl der Schritte.
interval1 Dies ist das erste Intervall für die Protokollerfassung. LoggerType.TIME ist die Anzahl der Sekunden und LoggerType.STEP ist die Anzahl der Schritte.
interval2 Dies ist das Protokollerfassungsintervall der zweiten Stufe. LoggerType.TIME ist die Anzahl der Sekunden und LoggerType.STEP ist die Anzahl der Schritte.
change_count Die Anzahl der Übergänge von der ersten zur zweiten Stufe. Wenn die erste Stufe diese Anzahl von Protokollen erhält, geht sie zur zweiten Stufe über.
savefile Dies ist die Datei, in der das Protokoll gespeichert wird.
test_agent Geben Sie an, ob Sie getrennt von der Lernumgebung testen möchten. Wenn Keine, wird nur das Ergebnis der Lernumgebung ausgegeben.
test_env Geben Sie an, ob Sie getrennt von der Lernumgebung testen möchten. Wenn Keine, wird nur das Ergebnis der Lernumgebung ausgegeben.
test_episodes Die Anzahl der Episoden in der Testumgebung.
・ Ausgabebeispiel
--- start ---
'Ctrl + C' is stop.
Steps 0, Time: 0.00m, TestReward: 21.12 - 92.80 (ave: 51.73, med: 46.99), Reward: 0.00 - 0.00 (ave: 0.00, med: 0.00)
Steps 200, Time: 0.05m, TestReward: 22.06 - 99.94 (ave: 43.85, med: 31.24), Reward: 108.30 - 108.30 (ave: 108.30, med: 108.30)
Steps 1200, Time: 0.28m, TestReward: 40.99 - 73.88 (ave: 52.41, med: 47.69), Reward: 49.05 - 141.53 (ave: 87.85, med: 90.89)
(Kürzung)
Steps 17200, Time: 3.95m, TestReward: 167.68 - 199.49 (ave: 184.34, med: 188.30), Reward: 166.29 - 199.66 (ave: 181.79, med: 177.36)
Steps 18200, Time: 4.19m, TestReward: 165.84 - 199.53 (ave: 186.16, med: 188.50), Reward: 188.00 - 199.50 (ave: 190.64, med: 188.41)
Steps 19200, Time: 4.43m, TestReward: 163.63 - 188.93 (ave: 186.15, med: 188.59), Reward: 165.56 - 188.45 (ave: 183.75, med: 188.23)
done, took 4.626 minutes
Steps 0, Time: 4.63m, TestReward: 188.37 - 199.66 (ave: 190.83, med: 188.68), Reward: 188.34 - 188.83 (ave: 188.63, med: 188.67)
SaveManager(R2D2) R2D2 verwendet Multiprocessing und die Implementierungsmethode ist etwas ganz Besonderes. Insbesondere hat sich dies auf das Speichern / Laden des Modells erheblich ausgewirkt, sodass ich es separat vorbereitet habe.
from src.r2d2 import R2D2
from src.r2d2_callbacks import SaveManager
#R2D2 erstellen
kwargs = (Kürzung)
manager = R2D2(**kwargs)
#Erstellen eines SaveManager
save_manager = SaveManager(
save_dirpath="tmp",
is_load=False,
save_overwrite=True,
save_memory=True,
checkpoint=True,
checkpoint_interval=2000,
verbose=0
)
#Beginnen Sie mit dem Lernen und fügen Sie das Argument für Rückrufe hinzu.
manager.train(
nb_trains=20_000,
callbacks=[save_manager],
)
#Rufen Sie Folgendes auf, um einen Agenten zum Testen zu erstellen
# save_dirpath/last/learner.Bitte geben Sie dat an.
agent = manager.createTestAgent(MyActor, "tmp/last/learner.dat")
#Führen Sie einen Test durch.
agent.test(env, nb_episodes=5, visualize=True)
save_dirpath Das Verzeichnis zum Speichern der Ergebnisse. Da unter dem Verzeichnis ein Verzeichnis für Prüfpunkte erstellt wird, liegt es im Verzeichnisformat vor.
is_load Gibt an, ob frühere Lernergebnisse geladen werden sollen
save_overwrite Gibt an, ob das gespeicherte Ergebnis überschrieben werden soll
save_memory Möchten Sie auch den Inhalt des Antwortspeichers speichern? Wenn Sie es speichern, können Sie das Lernen aus genau der gleichen Situation wie beim letzten Mal fortsetzen, aber die Dateigröße des Speichers ist groß (einige GB). Da es separat als .mem-Datei gespeichert wird, kann es später gelöscht werden.
checkpoint Gibt an, ob der Fortschritt gespeichert werden soll
checkpoint_interval Dies ist ein Intervall zum Speichern des Fortschritts. Die Einheit ist die Anzahl der Lernerfahrungen.
verbose Wenn es 0 ist, wird kein Druck ausgegeben. Wenn es 1 ist, gibt es eine Druckausgabe.
Logger2Stage(R2D2)
Es bietet die folgenden zwei Funktionen.
Im Gegensatz zum Regenbogen gibt es nur ein zeitliches Erfassungsintervall.
from src.r2d2 import R2D2
from src.r2d2_callbacks import Logger2Stage
#R2D2 erstellen
kwargs = (Kürzung)
manager = R2D2(**kwargs)
#Erstellen Sie eine Umgebung zum Testen
test_env = gym.make(ENV_NAME)
#Erstellen Sie Logger2 Stage
log = Logger2Stage(
warmup=0,
interval1=10,
interval2=60,
change_count=20,
savedir="tmp",
test_actor=MyActor,
test_env=test_env,
test_episodes=10,
verbose=1,
)
#Beginnen Sie mit dem Lernen und fügen Sie das Argument für Rückrufe hinzu.
manager.train(
nb_trains=20_000,
callbacks=[log],
)
#Sie können die Protokolle mit getLogs abrufen.(Wenn savedir angegeben ist)
history = log.getLogs()
#Sie können auch einfach ein Diagramm anzeigen.(Wenn savedir angegeben ist)
log.drawGraph()
warmup Es ist an der Zeit, die Akquisition zum ersten Mal zu starten. (Sekunden)
interval1 Dies ist das erste Intervall für die Protokollerfassung. (Sekunden)
interval2 Dies ist das Protokollerfassungsintervall der zweiten Stufe. (Sekunden)
change_count Die Anzahl der Übergänge von der ersten zur zweiten Stufe. Wenn die erste Stufe diese Anzahl von Protokollen erhält, geht sie zur zweiten Stufe über.
savedir Das Verzeichnis zum Speichern des Protokolls. Es gibt separate Prozesse für Lernende und Schauspieler, und jeder Prozess trennt Dateien, um Werte zu speichern und Konflikte zu vermeiden.
test_actor Gibt die Actor-Klasse an, die beim Testen verwendet werden soll. Wenn Keine, wird kein Test durchgeführt.
test_env Geben Sie an, ob Sie getrennt von der Lernumgebung testen möchten. Wenn Keine, wird kein Test durchgeführt.
test_episodes Die Anzahl der Episoden in der Testumgebung.
・ Ausgabebeispiel
--- start ---
'Ctrl + C' is stop.
Learner Start!
Actor0 Start!
Actor1 Start!
actor1 Train 1, Time: 0.24m, Reward : 27.80 - 27.80 (ave: 27.80, med: 27.80), nb_steps: 200
learner Train 1, Time: 0.19m, TestReward: 29.79 - 76.71 (ave: 58.99, med: 57.61)
actor0 Train 575, Time: 0.35m, Reward : 24.88 - 133.09 (ave: 62.14, med: 50.83), nb_steps: 3400
learner Train 651, Time: 0.36m, TestReward: 24.98 - 51.67 (ave: 38.86, med: 38.11)
actor1 Train 651, Time: 0.41m, Reward : 22.15 - 88.59 (ave: 41.14, med: 35.62), nb_steps: 3200
actor0 Train 1249, Time: 0.51m, Reward : 22.97 - 61.41 (ave: 35.24, med: 31.99), nb_steps: 8000
(Kürzung)
learner Train 16476, Time: 4.53m, TestReward: 165.56 - 199.57 (ave: 180.52, med: 177.73)
actor1 Train 16880, Time: 4.67m, Reward : 128.88 - 188.45 (ave: 169.13, med: 165.94), nb_steps: 117600
Learning End. Train Count:20001
learner Train 20001, Time: 5.29m, TestReward: 175.72 - 188.17 (ave: 183.21, med: 187.48)
Actor0 End!
Actor1 End!
actor0 Train 20001, Time: 5.34m, Reward : 151.92 - 199.61 (ave: 181.68, med: 187.48), nb_steps: 0
actor1 Train 20001, Time: 5.34m, Reward : 130.39 - 199.26 (ave: 170.83, med: 167.99), nb_steps: 0
done, took 5.350 minutes
from src.rainbow import Rainbow
from src.processor import AtariProcessor
from src.image_model import DQNImageModel
from src.memory import ReplayMemory
from src.policy import AnnealingEpsilonGreedy
nb_steps = 1_750_000
#Was AtariProcessor macht
#· Bildgröße anpassen(84,84)
#・ Belohnungsausschnitt
processor = AtariProcessor(reshape_size=(84, 84), is_clip=True)
kwargs={
"input_shape": processor.image_shape,
"input_type": InputType.GRAY_2ch,
"nb_actions": env.action_space.n,
"optimizer": Adam(lr=0.0001),
"metrics": [],
"image_model": DQNImageModel(),
"input_sequence": 4, #Anzahl der Eingaberahmen
"dense_units_num": 256, #Anzahl der Einheiten in der dichten Schicht
"enable_dueling_network": False,
"lstm_type": LstmType.NONE, #Zu verwendender LSTM-Algorithmus
# train/handlungsbezogen
"memory_warmup_size": 50_000, #Anzahl der Schritte für die anfängliche Speicherzuweisung(Lerne nicht)
"target_model_update": 10_000, #Zielnetzwerk-Aktualisierungsintervall
"action_interval": 4, #Intervall zur Ausführung der Aktion
"train_interval": 4, #Intervall zum Lernen
"batch_size": 32, # batch_size
"gamma": 0.99, #Q Lernrabatt
"enable_double_dqn": False,
"enable_rescaling": False, #Gibt an, ob die Neuskalierung aktiviert werden soll
"reward_multisteps": 1, # multistep reward
#Andere
"processor": processor,
"action_policy": AnnealingEpsilonGreedy(
initial_epsilon=1.0, #Anfängliches ε
final_epsilon=0.05, #Ε im Endzustand
exploration_steps=1_000_000 #Anzahl der Schritte vom Anfangs- bis zum Endzustand
),
"memory": ReplayMemory(capacity=1_000_000),
}
agent = Rainbow(**kwargs)
from src.rainbow import Rainbow
from src.memory import ReplayMemory
from src.policy import SoftmaxPolicy
env = gym.make('CartPole-v0')
kwargs={
"input_shape": env.observation_space.shape,
"input_type": InputType.VALUES,
"nb_actions": env.action_space.n,
"optimizer": Adam(lr=0.0001),
"metrics": [],
"image_model": None,
"input_sequence": 1, #Anzahl der Eingaberahmen
"dense_units_num": 16, #Anzahl der Einheiten in der dichten Schicht
"enable_dueling_network": False,
"lstm_type": LstmType.NONE,
# train/handlungsbezogen
"memory_warmup_size": 10, #Anzahl der Schritte für die anfängliche Speicherzuweisung(Lerne nicht)
"target_model_update": 1, #Zielnetzwerk-Aktualisierungsintervall
"action_interval": 1, #Intervall zur Ausführung der Aktion
"train_interval": 1, #Intervall zum Lernen
"batch_size": 32, # batch_size
"gamma": 0.99, #Q Lernrabatt
"enable_double_dqn": False,
"enable_rescaling": False,
#Andere
"processor": processor,
"action_policy": SoftmaxPolicy(),
"memory": ReplayMemory(capacity=50000)
}
agent = Rainbow(**kwargs)
from src.rainbow import Rainbow
from src.processor import AtariProcessor
from src.image_model import DQNImageModel
from src.memory import PERProportionalMemory
from src.policy import AnnealingEpsilonGreedy
nb_steps = 1_750_000
#Was AtariProcessor macht
#· Bildgröße anpassen(84,84)
#・ Belohnungsausschnitt
processor = AtariProcessor(reshape_size=(84, 84), is_clip=True)
kwargs={
"input_shape": processor.image_shape,
"input_type": InputType.GRAY_2ch,
"nb_actions": env.action_space.n,
"optimizer": Adam(lr=0.0000625, epsilon=0.00015),
"metrics": [],
"image_model": DQNImageModel(),
"input_sequence": 4, #Anzahl der Eingaberahmen
"dense_units_num": 512, #Anzahl der Einheiten in der dichten Schicht
"enable_dueling_network": True,
"dueling_network_type": DuelingNetwork.AVERAGE, #Algorithmus im Duell-Netzwerk
"lstm_type": LstmType.NONE,
# train/handlungsbezogen
"memory_warmup_size": 80000, #Anzahl der Schritte für die anfängliche Speicherzuweisung(Lerne nicht)
"target_model_update": 32000, #Zielnetzwerk-Aktualisierungsintervall
"action_interval": 4, #Intervall zur Ausführung der Aktion
"train_interval": 4, #Intervall zum Lernen
"batch_size": 32, # batch_size
"gamma": 0.99, #Q Lernrabatt
"enable_double_dqn": True,
"enable_rescaling": False,
"reward_multisteps": 3, # multistep reward
#Andere
"processor": processor,
"action_policy": AnnealingEpsilonGreedy(
initial_epsilon=1.0, #Anfängliches ε
final_epsilon=0.05, #Ε im Endzustand
exploration_steps=1_000_000 #Anzahl der Schritte vom Anfangs- bis zum Endzustand
),
"memory": PERProportionalMemory(
capacity=1_000_000,
alpha=0.5, #Wahrscheinlichkeitsreflexionsrate von PER
beta_initial=0.4, #Anfangswert der IS-Reflexionsrate
beta_steps=1_000_000, #Anzahl der Schritte zur Erhöhung der IS-Reflexionsrate
enable_is=True, #Gibt an, ob IS aktiviert werden soll
)
}
agent = Rainbow(**kwargs)
from src.r2d2 import R2D2, Actor
from src.processor import AtariProcessor
from src.image_model import DQNImageModel
from src.memory import PERProportionalMemory
from src.policy import EpsilonGreedyActor
ENV_NAME = "xxxxx"
class MyActor(Actor):
def getPolicy(self, actor_index, actor_num):
return EpsilonGreedyActor(actor_index, actor_num, epsilon=0.4, alpha=7)
def fit(self, index, agent):
env = gym.make(ENV_NAME)
agent.fit(env, visualize=False, verbose=0)
env.close()
#Was AtariProcessor macht
#· Bildgröße anpassen(84,84)
#・ Belohnungsausschnitt
processor = AtariProcessor(reshape_size=(84, 84), is_clip=True)
kwargs={
"input_shape": processor.image_shape,
"input_type": InputType.GRAY_2ch,
"nb_actions": env.action_space.n,
"optimizer": Adam(lr=0.0001, epsilon=0.001),
"metrics": [],
"image_model": DQNImageModel(),
"input_sequence": 4, #Anzahl der Eingaberahmen
"dense_units_num": 512, #Anzahl der Einheiten in der dichten Ebene
"enable_dueling_network": True, # dueling_Netzwerk gültige Flagge
"dueling_network_type": DuelingNetwork.AVERAGE, # dueling_Netzwerkalgorithmus
"lstm_type": LstmType.STATEFUL, #LSTM-Algorithmus
"lstm_units_num": 512, #Anzahl der Einheiten in der LSTM-Schicht
"lstm_ful_input_length": 40, #Stateful LSTM-Eingänge
# train/handlungsbezogen
"remote_memory_warmup_size": 50_000, #Anzahl der Schritte für die anfängliche Speicherzuweisung(Lerne nicht)
"target_model_update": 10_000, #Zielnetzwerk-Aktualisierungsintervall
"action_interval": 4, #Intervall zur Ausführung der Aktion
"batch_size": 64,
"gamma": 0.997, #Q Lernrabatt
"enable_double_dqn": True, #DDQN gültiges Flag
"enable_rescaling": enable_rescaling, #Gibt an, ob die Neuskalierung aktiviert werden soll(priotrity)
"rescaling_epsilon": 0.001, #Neuskalierungskonstante
"priority_exponent": 0.9, #Priorität Priorität
"burnin_length": 40, # burn-in der Periode
"reward_multisteps": 3, # multistep reward
#Andere
"processor": processor,
"actors": [MyActor for _ in range(256)],
"remote_memory": PERProportionalMemory(
capacity= 1_000_000,
alpha=0.6, #Wahrscheinlichkeitsreflexionsrate von PER
beta_initial=0.4, #Anfangswert der IS-Reflexionsrate
beta_steps=1_000_000, #Anzahl der Schritte zur Erhöhung der IS-Reflexionsrate
enable_is=True, #Gibt an, ob IS aktiviert werden soll
),
#Schauspieler Beziehung
"actor_model_sync_interval": 400, #Intervall zum Synchronisieren des Modells vom Lernenden
}
manager = R2D2(**kwargs)
Es gibt zu viele Parameter ... Es scheint, dass etwas namens R2D3 angekündigt wurde, und wir werden es bald implementieren.
Recommended Posts