2017-02-28 6 views
1

Wann sollte ich das eine oder andere verwenden? Tutorials und Beispiele verwenden entweder Sequential([Stabilizer(), Recurrence(LSTM(hidden_dim))]) oder LSTMP_component_with_self_stabilization aus Examples/common/nn.py. Ich habe versucht, ersteres durch Recurrence(LSTM(hidden_dim, enable_self_stabilization=True)) im char_rnn.py Beispiel zu ersetzen, aber die Ergebnisse sind wesentlich schlechter.Was ist der Unterschied zwischen dem Block "Stabilizer()" und dem Parameter "enable_self_stabilization"?

Antwort

3

Die Schicht Stabilizer multipliziert ihre Eingabe mit einem lernbaren Skalar. Dieser einfache Trick hat gezeigt, dass er Konvergenz und Stabilität deutlich verbessert. Es hat eine gewisse Ähnlichkeit mit BatchNormalization. Im Allgemeinen, wenn Sie BatchNormalization verwenden können, sollten Sie das zuerst versuchen. Wo das nicht möglich ist, was speziell in wiederkehrenden Loops ist, empfehle ich stattdessen Stabilizer.

Normalerweise müssen Sie es explizit in Ihr Modell injizieren. Ein Spezialfall sind die wiederkehrenden Schrittfunktionen (z. B. LSTM), die innen Stabilizer enthalten. Verwenden Sie enable_self_stabilization=True, um das zu aktivieren. Die eingebauten Stabilizer s gelten nur für interne Variablen. Für die Haupteingabe müssen Sie selbst eine Stabilizer einfügen.

Wenn Sie explizite Stabilizer s aber gesetzt enable_self_stabilization=False (beispielsweise als default_option), dann werden diese explizit Stabilizer s no-ops.

Es ist nicht meine Erfahrung, dass Stabilizer die Dinge schlechter macht. Es ist generell eine sichere Sache, die Konvergenz zu verbessern. Es ändert jedoch numerische Bereiche. Wenn also die Konvergenz schlechter wird, schlage ich vor, mit verschiedenen Hyperparametereinstellungen zu experimentieren, z. reduzieren Sie die Lernrate.

Verwandte Themen