Dieser Artikel ist eine Fortsetzung des vorherigen Artikels (http://qiita.com/yuishihara/items/0e530e9c0a17a7fa0111). Letztes Mal habe ich Nanchatte DQN (unvollständige Version) eingeführt, das nur mit einfachem Tensorflow (Stand Juli 2016) implementiert werden kann, aber hier [Mnih et al., Artikel 2015] 1 Schreibt darüber, wie die tatsächlich implementierte Methode originalgetreu reproduziert werden kann.
Insbesondere ist 1 ein Problem und wird nicht in normalem Tensorflow implementiert. Sie müssen es daher selbst implementieren. Hier werden wir vorstellen, wie es in Tensorflow implementiert wird und welche Ergebnisse daraus erzielt werden.
Um ein neues Optimierungsprogramm mit Tensorflow zu erstellen, müssen Sie den Tensorflow-Python-Code und den Cpp-Code anpassen. Ändern Sie insbesondere die folgenden Dateien oder fügen Sie Dateien hinzu. Wenn Sie eine vorhandene RMS Drop-Implementierung finden, kopieren und ändern Sie sie grundsätzlich, und die Implementierung selbst ist nicht so schwierig.
(Python) 1.tensorflow/contrib/layers/python/layers/optimizers.py 2.tensorflow/python/training/training_ops.py 3.tensorflow / python / training / rmspropgraves.py (neu) 4.tensorflow / python / training / rmspropgraves_test.py (Nicht erforderlich, aber es ist besser, es zu testen, also bereiten Sie es vor)
(Cpp Seite) 1.tensorflow/core/kernels/training_ops.cc 2.tensorflow/core/kernels/training_ops_gpu.cu.cc 3.tensorflow/core/ops/training_ops.cc
Der implementierte Code wurde auf [GitHub] 3 hochgeladen. Schauen Sie sich dort die spezifische Implementierung an.
Es ist in [Tensorflow offizielle Seite] 4 geschrieben, aber ich war ein wenig süchtig danach, also werde ich mit bestimmten Schritten aufwachen. Die Umgebung wird Ubuntu 14.04 sein.
Es kommt von GitHub. Überprüfen Sie dann den Release-Zweig (hier r0.9), da der Master-Zweig instabil war und möglicherweise nicht erstellt werden konnte.
$ git clone https://github.com/tensorflow/tensorflow
$ cd tensorflow
$ git checkout --track origin/r0.9
Tensorflow wird mit Bazel erstellt. Installieren Sie es also zuerst. [Auf Bazels offizieller Seite beschriebene Methode] Installieren Sie mit 5. Die Tensoflow-Seite ist verwirrend und sollte leicht geschwenkt werden.
Dies ist in Ordnung, wenn Sie es wie offiziell tun.
$ sudo apt-get install python-numpy swig python-dev python-wheel
Führen Sie Configure im Stammverzeichnis von tensorflow aus (das gleiche wie das Stammverzeichnis des von GitHub abgelegten Repositorys), um die Umgebung festzulegen.
$ ./configure
(Abkürzung)
Sie werden auf dem Weg unterschiedlich gefragt, aber wenn Sie eine GPU-Umgebung einrichten möchten, sollten Sie in der Lage sein, durch einfaches Drücken von Basic y und Enter wiederholt zu gehen. Im Fall einer Nur-CPU-Umgebung, nicht einer GPU-Umgebung,
Do you wish to build TensorFlow with GPU support? [y/N] n
Deaktivieren Sie die GPU-Unterstützung.
Es ist etwas mehr, bis zu diesem Punkt zu kommen, aber wenn Sie der Formel folgen, werden Sie gezwungen sein, einen Trainer zu bauen, den Sie nicht gut verstehen. Seien Sie also vorsichtig. Erstellen und installieren Sie unten whl für die Pip-Installation.
(Für die CPU-Umgebung)
$ bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
(Für die GPU-Umgebung)
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
$ sudo pip install /tmp/tensorflow_pkg/(Der Name hängt davon ab, welchen Zweig Sie erstellt haben)
Der Code wurde auch dieses Mal auf [GitHub] 6 hochgeladen. Wenn Sie also interessiert sind, schauen Sie bitte dort nach. In diesem Abschnitt wird die Schlüsselimplementierung von Loss Clipping beschrieben.
LossClipping ist eine Operation zum Festlegen der Steigung auf 1, wenn der Fehler 1 überschreitet. Diesmal wird jedoch die Eigenschaft verwendet, dass eine gerade Linie mit einer Steigung von 1 bei Differenzierung 1 wird. Das Abschneiden wird realisiert, indem eine Funktion erstellt wird, die den Fehler linear macht, wenn er 1 überschreitet. Gehen Sie insbesondere wie folgt vor. Die Implementierung hier wurde in Bezug auf [hier] 7 geringfügig geändert.
def clipped_loss(self, data, target, q_value_filter):
filtered_qs = self.filtered_q_values(data, q_value_filter)
error = tf.abs(target - filtered_qs)
quadratic = tf.clip_by_value(error, 0.0, 1.0)
linear = error - quadratic
return tf.reduce_sum(0.5 * tf.square(quadratic) + linear)
Der Unterschied zu den Implementierungen in anderen Netzen besteht darin, dass sie eher summiert als gemittelt werden. Als ich mir das Papier von Nature ansah, fand ich keine klare Aussage, dass ich den Durchschnitt nehmen musste, und der Durchschnitt hatte keinen Wert, soweit ich experimentierte, sondern verzögerte die Konvergenz nur erheblich.
Wenn Sie es so implementieren, dass es einen Durchschnitt benötigt, wird die Lernrate effektiv reduziert, sodass es zu einer höheren Punktzahl führen kann, wenn das Lernen erheblich voranschreitet, aber Atari-Spiele mit DQN Soweit ich das tue, denke ich nicht, dass es persönlich effektiv sein wird.
Mit Ausnahme der Änderung von ReplayMemory von 1 Million auf 400.000 sind die Parameter dieselben und das Ergebnis von 1,5 Millionen Iterationen wird veröffentlicht.
DQN with tensorflow 2 pic.twitter.com/JRwM0MsTDG
— EpsilonCode (@epsilon_code) August 7, 2016
Das Video hat andere Lernparameter und die Anzahl der Iterationen als die unvollständige Version, sodass die unvollständige Version möglicherweise dieselbe Leistung aufweist. Sie mögen das denken, aber als ich es versuchte, war das nicht der Fall, und diese Einstellung war in der Leistung überwältigend besser. Der Code ist auf GitHub, also probieren Sie es aus.
V.Mnih et al. Human-level control through deep reinforcement learning A.Graves Generating Sequences With Recurrent Neural Networks [Implementiere DQN mit Keras, TensorFlow und OpenAI Gym] 6
Recommended Posts