web-dev-qa-db-fra.com

Utilisation de Dropout avec Keras et une cellule LSTM / GRU

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")

11
BigBadMe

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:

  • Vos entrées (une étape de votre séquence)
  • Entrées internes (peuvent être des états et la sortie de l'étape précédente, par exemple)

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:

  • Un noyau est appliqué à "vos entrées" pour le traiter et le transformer dans une dimension compatible
  • Un autre (appelé noyau récurrent par keras) est appliqué aux entrées de l'étape précédente.

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)

  • Un abandon pour la première conversion de vos entrées
  • Un abandon pour l'application du noyau récurrent

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ées
  • recurrent_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.

11
Daniel Möller