Quand dois-je utiliser l'un ou l'autre ? Les tutoriels et les exemples utilisent soit Sequential([Stabilizer(), Recurrence(LSTM(hidden_dim))])
ou LSTMP_component_with_self_stabilization
à partir de Examples/common/nn.py. J'ai essayé de remplacer le premier par Recurrence(LSTM(hidden_dim, enable_self_stabilization=True))
dans l'exemple char_rnn.py, mais les résultats sont nettement moins bons.
Réponse
Trop de publicités?Le site Stabilizer
multiplie son entrée avec un scalaire apprenable. Il a été démontré que cette simple astuce améliore considérablement la convergence et la stabilité. Elle présente certaines similitudes avec BatchNormalization
. En général, lorsque vous pouvez utiliser BatchNormalization
vous devriez essayer d'abord. Lorsque cela n'est pas possible, notamment à l'intérieur de boucles récurrentes, je recommande d'utiliser la méthode suivante Stabilizer
à la place.
Normalement, vous devez l'injecter explicitement dans votre modèle. Un cas particulier est celui des fonctions d'étape récurrentes (par ex. LSTM
), qui comprennent Stabilizer
à l'intérieur. Utilisez enable_self_stabilization=True
pour permettre cela. Ces fonctions intégrées Stabilizer
s'appliquent uniquement aux variables internes. Pour l'entrée principale, vous devez insérer un Stabilizer
vous-même.
Si vous incluez des Stabilizer
s, mais mettre enable_self_stabilization=False
(par exemple, en tant que default_option
), alors ces explicites Stabilizer
sont sans effet.
Ce n'est pas mon expérience que Stabilizer
rend les choses plus difficiles. C'est généralement un moyen sûr d'améliorer la convergence. En revanche, elle modifie les plages numériques. Donc, si cela aggrave la convergence, je suggère d'expérimenter avec différents paramètres d'hyper-paramètres, par exemple en réduisant le taux d'apprentissage.