Dans Keras, vous pouvez spécifier une couche d'abandon comme celle-ci:
model.add(Dropout(0.5))
Mais avec une cellule GRU, vous pouvez spécifier le décrochage en tant que paramètre dans le constructeur:
model.add(GRU(units=512,
return_sequences=True,
dropout=0.5,
input_shape=(None, features_size,)))
Quelle est la différence? Est-ce que l'un est préférable à l'autre?
Dans documentation de Keras il l'ajoute en tant que couche de suppression séparée (voir "Classification de séquence avec LSTM")
Les couches récurrentes effectuent la même opération répétée encore et encore.
À chaque pas de temps, il faut deux entrées:
Notez que les dimensions de l'entrée et de la sortie peuvent ne pas correspondre, ce qui signifie que les dimensions "votre entrée" ne correspondront pas aux dimensions "de l'entrée récurrente (étape/états précédents)".
Ensuite, à chaque pas de temps récurrent, il y a deux opérations avec deux noyaux différents:
Pour cette raison, keras utilise également deux opérations de décrochage dans les couches récurrentes. (Décrocheurs qui seront appliqués à chaque étape)
Donc, en fait, il existe deux paramètres de décrochage dans les couches RNN:
dropout
, appliqué à la première opération sur les entréesrecurrent_dropout
, Appliqué à l'autre opération sur les entrées récurrentes (sortie précédente et/ou états)Vous pouvez voir cette description codée soit dans GRUCell
et dans LSTMCell
par exemple dans le code source .
Qu'est-ce qui est correct?
C'est ouvert à la créativité.
Vous pouvez utiliser un calque Dropout(...)
, ce n'est pas "faux", mais cela laissera peut-être aussi des "pas de temps"! (Sauf si vous définissez correctement noise_shape
Ou utilisez SpatialDropout1D
, Qui n'est pas encore documenté pour le moment)
Peut-être que vous le voulez, peut-être pas. Si vous utilisez les paramètres de la couche récurrente, vous appliquerez des décrochages uniquement aux autres dimensions, sans abandonner une seule étape. Cela semble sain pour les couches récurrentes, sauf si vous voulez que votre réseau apprenne à gérer les séquences contenant des lacunes (cette dernière phrase est une supposition).
De plus, avec les paramètres d'abandon, vous supprimerez vraiment des parties du noyau lorsque les opérations sont abandonnées "à chaque étape", tandis que l'utilisation d'une couche distincte permettra à votre RNN d'effectuer des opérations non abandonnées en interne, car votre abandon n'affectera que le sortie finale.