[PYTHON] Ich ließ RNN Sin Wave lernen und sagte es voraus: Hyper-Parameter-Anpassung

0. Grob gesagt

1. Konfiguration

Grundsätzlich wird dieselbe Netzwerkkonfiguration wie im vorherigen Artikel verwendet (http://qiita.com/yuyakato/items/ab38064ca215e8750865). Die Grundwerte der Hyperparameter sind die in "3.3. Hyperparameter" gezeigten.

Variablennamen Bedeutung Wert
num_of_input_nodes Anzahl der Knoten in der Eingabeebene 1 Knoten
num_of_hidden_nodes Anzahl der Knoten mit versteckten Ebenen 2 Knoten
num_of_output_nodes Anzahl der Knoten in der Ausgabeschicht 1 Knoten
length_of_sequences RNN-Sequenzlänge 50 Schritte
num_of_training_epochs Anzahl der Wiederholungen des Lernens 2,000 mal
num_of_prediction_epochs Anzahl der Wiederholungen der Vorhersage 100 mal
size_of_mini_batch Anzahl der Proben pro Mini-Charge 100 Proben
learning_rate Lernrate 0.1
forget_bias (Ich bin mir nicht sicher) 1.0 (Standardwert)

2. Quellcode, Notizbuch

Der zum Lernen / Vorhersagen verwendete Quellcode, das Notizbuch, das die Trainingsdaten generiert hat, und das Notizbuch, das zum Aufzeichnen der Ergebnisse verwendet wird, sind auf GitHub verfügbar. Bitte beziehen Sie sich auf diesen für spezifischen Quellcode und Werte.

https://github.com/nayutaya/tensorflow-rnn-sin/tree/20160517/ex2

3. Hyperparameteranpassung

3.1. Num_of_hidden_nodes: Anzahl der Hidden-Layer-Knoten

Die folgende Tabelle zeigt die Vorhersageergebnisse und die Verlustfunktion, wenn die Anzahl der Knoten für verborgene Schichten von 1 auf 4 geändert wird. Wenn die Anzahl der Knoten mit versteckten Ebenen "1" ist, können Sie sehen, dass dies völlig unvorhersehbar ist. Wenn die Anzahl der Knoten in der verborgenen Schicht groß ist, werden anscheinend nicht immer gute Ergebnisse erzielt. Wenn Sie sich das Verlustfunktionsdiagramm ansehen, ist der endgültige Verlust umso geringer, je mehr Knoten sich in der verborgenen Ebene befinden.

No Anzahl der Knoten mit versteckten Ebenen Lernen / geschätzte Zeit
1 1 3m53.845s
2 2 3m30.844s
3 3 4m36.324s
4 4 5m30.537s

output_hidden.png

loss_hidden.png

3.2. Länge_der_Sequenzen: RNN-Sequenzlänge

Die folgende Tabelle zeigt die Vorhersageergebnisse und die Verlustfunktion, wenn die RNN-Sequenzlänge auf "30", "40", "50", "60" und "70" geändert wird. Die Trainingsdaten sind diesmal eine Sinuswelle mit 50 Schritten pro Zyklus, aber es ist ersichtlich, dass selbst wenn es weniger als ein Zyklus ist, es ausreichend vorhergesagt werden kann.

No RNN-Sequenzlänge Lernen / geschätzte Zeit
1 30 2m29.589s
2 40 2m58.636s
3 50 3m30.844s
4 60 4m25.459s
5 70 5m38.550s

output_seq.png

loss_seq.png

3.3. Num_of_training_epochs: Anzahl der Trainingsiterationen

Die folgende Tabelle zeigt die Vorhersageergebnisse und die Verlustfunktion, wenn die Anzahl der Trainingswiederholungen auf 1.000, 2.000 und 3.000 geändert wird. Beim 3.000-fachen schwankt das Ergebnis der Verlustfunktion von rund dem 1.600-fachen. Das Vorhersageergebnis ist auch nicht gut.

No Anzahl der Wiederholungen des Lernens Lernen / geschätzte Zeit
1 1,000 mal 2m10.783s
2 2,000 mal 3m30.844s
3 3,000 mal 6m17.675s

output_epoch.png

loss_epoch.png

3.4. Size_of_mini_batch: Anzahl der Proben pro Mini-Batch

Die folgende Tabelle zeigt die Vorhersageergebnisse und die Verlustfunktion, wenn die Anzahl der Proben pro Mini-Charge auf "50", "100" und "200" geändert wird. Es gibt keinen merklichen Unterschied, aber im Grunde scheint es, dass die Ergebnisse umso besser sind, je größer die Anzahl der Proben ist.

No Anzahl der Proben pro Mini-Charge Lernen / geschätzte Zeit
1 50 4m25.032s
2 100 3m30.844s
3 200 4m59.550s

output_batch.png

loss_batch.png

3.5. Learning_rate: Lernrate

Die folgende Tabelle zeigt die Vorhersageergebnisse und die Verlustfunktion, wenn die an den Optimierer übergebene Lernrate auf "0,02", "0,1" und "0,5" geändert wird. Bei den Lernraten "0,02" und "0,5" kann dies nicht richtig vorhergesagt werden. Auch im Fall der Lernrate "0,5" schwankt das Ergebnis der Verlustfunktion unmittelbar nach dem Lernen.

No Lernrate Lernen / geschätzte Zeit
1 0.02 3m46.852s
2 0.1 3m30.844s
3 0.5 4m39.136s

output_learning.png

loss_learning.png

3.6. forget_bias

Tatsächlich wird das Diagramm der Verlustfunktion und das Vorhersageergebnis, wenn der nicht gut verstandene Parameter "forget_bias" von "BasicLSTMCell" in "0,25", "0,5", "1,0" (Standardwert) geändert wird, unten gezeigt. zeigen. Im Fall von "0,25" ist dies nicht vorhersehbar.

No forget_bias Lernen / geschätzte Zeit
1 0.25 4m27.725s
2 0.5 4m27.089s
3 1.0 3m30.844s

output_forget.png

loss_forget.png

3.7. Optimierer

Die folgende Tabelle zeigt die Vorhersageergebnisse und die Verlustfunktion, wenn der für die Optimierung verwendete Optimierer von "Gradient Descent Optimizer" auf "Adam Optimizer" umgeschaltet wird. Der "Adam Optimizer" hat eine schnellere Verlustreduzierung und der Endwert scheint niedriger zu sein, aber er vibriert heftig. Es ist schwierig, mit dem Lernen aufzuhören.

No Optimierer Lernen / geschätzte Zeit
1 GradientDescentOptimizer 3m30.844s
2 AdamOptimizer 4m46.116s

output_optimizer.png

loss_optimizer.png

3.8. RNN-Zelle

Die folgende Tabelle zeigt die Vorhersageergebnisse und die Verlustfunktion, wenn die RNN-Zelle von "BasicLSTMCell" auf "GRUCell" umgeschaltet wird. Es gab keinen großen Unterschied.

No RNN-Zelle Lernen / geschätzte Zeit
1 BasicLSTMCell 3m30.844s
2 GRUCell 4m53.831s

output_cell.png

loss_cell.png

4. Zukunftspläne

Ich würde gerne versuchen, was passieren würde, wenn ich realistischere Daten (Aktienkurse, Devisen usw.) erfahren und vorhersagen würde.

Recommended Posts

Ich ließ RNN Sin Wave lernen und sagte es voraus: Hyper-Parameter-Anpassung
Ich ließ RNN Sin Wave lernen und versuchte vorherzusagen
〇✕ Ich habe ein Spiel gemacht
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich habe versucht, eine Rangliste zu erstellen, indem ich das Mitgliederteam der Organisation abgekratzt habe
Sinuswellenvorhersage mit RNN in der Deep-Learning-Bibliothek Keras
Ich habe Chatbot mit LINE Messaging API und Python erstellt
Ich habe einen Python-Text gemacht
Ich habe einen Zwietrachtbot gemacht
Ich habe eine einfache Netzwerkkamera hergestellt, indem ich ESP32-CAM und RTSP kombiniert habe.
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
Ich habe einen Chat-Chat-Bot mit Tensor2Tensor erstellt und diesmal hat es funktioniert
Ich habe eine C ++ - Lernseite erstellt
Ich habe einen Line-Bot mit Python gemacht!
Ich habe ein CUI-basiertes Übersetzungsskript erstellt (2)
Ich habe mit Python eine Lotterie gemacht.
Ich habe ein CUI-basiertes Übersetzungsskript erstellt
Vorhersage der Sinuswelle mit Keras
Ich habe mit Python einen Daemon erstellt
Sinuswellenvorhersage (Rückkehr) mit Pytorch
4/22 Vorhersage der Sinuswelle mit Keras
Ich habe ein Netzwerk erstellt, um Schwarzweißbilder in Farbbilder umzuwandeln (pix2pix)
Ich habe ein Programm erstellt, um einzugeben, was ich gegessen habe, und um Kalorien und Zucker anzuzeigen