web-dev-qa-db-fra.com

Quand keras réinitialise-t-il un état LSTM?

J'ai lu toutes sortes de textes à ce sujet et aucun ne semble répondre à cette question très fondamentale. C'est toujours ambigu:

Dans une couche stateful = False LSTM, keras réinitialise-t-il les états après:

  • Chaque séquence; ou 
  • Chaque lot?

Supposons que j'ai X_train en forme (1000,20,1), ce qui signifie 1000 séquences de 20 étapes d'une valeur unique. Si je fais:

model.fit(X_train, y_train, batch_size=200, nb_Epoch=15)

Est-ce qu'il réinitialisera les états pour chaque séquence (réinitialise les états 1000 fois)?
Ou réinitialisera-t-il les états pour chaque lot (réinitialise les états 5 fois)?

22
Daniel Möller

Après quelques tests, je suis arrivé à la conclusion suivante, qui est conforme à la documentation et à la réponse de Nassim:

Premièrement, il n'y a pas un seul état dans une couche, mais un état par échantillon dans le lot. Il y a batch_size états parallèles dans une telle couche. 

Stateful = False

Dans un cas stateful=False, tous les les états sont réinitialisés ensemble après chaque lot

  • Un lot avec 10 sequences créerait 10 states et les 10 états sont automatiquement réinitialisés après leur traitement. 

  • Le prochain lot avec 10 sequences créera 10 new states, qui sera également réinitialisé après le traitement de ce lot.

Si toutes ces séquences ont length (timesteps) = 7, le résultat pratique de ces deux lots est le suivant:

20 séquences individuelles, chacune d'une longueur de 7

Aucune des séquences n'est liée. Mais bien sûr: les poids (et non les états) seront uniques pour la couche et représenteront ce que la couche a appris de toutes les séquences. 

  • Un état est: Où suis-je maintenant dans une séquence? Quel est le pas de temps? Comment cette séquence particulière se comporte-t-elle depuis ses débuts jusqu'à maintenant? 
  • Un poids est: Que sais-je sur le comportement général de toutes les séquences que j'ai vues jusqu'à présent?

Stateful = True

Dans ce cas, il y a aussi le même nombre d'états parallèles, mais ils ne seront tout simplement pas réinitialisés.

  • Un lot avec 10 sequences va créer 10 states qui restera tel quel à la fin du lot. 

  • Le prochain lot avec 10 sequences (il doit obligatoirement être 10, car le premier était 10) sera réutiliser le même 10 states qui avait été créé auparavant. 

Le résultat pratique est le suivant: les 10 séquences du second lot ne font que poursuivre les 10 séquences du premier lot, comme s'il n'y avait pas eu d'interruption du tout. 

Si chaque séquence a length (timesteps) = 7, alors la signification réelle est la suivante:

10 séquences individuelles, chacune d'une longueur de 14

Quand vous voyez que vous avez atteint la longueur totale des séquences, vous appelez model.reset_states(), ce qui signifie que vous ne continuerez plus les séquences précédentes. Vous allez maintenant commencer à alimenter de nouvelles séquences. 

31
Daniel Möller

Dans le doc du code RNN vous pouvez lire ceci:

Note sur l’utilisation de l’état d’affichage dans les RNN:

Vous pouvez définir les couches RNN sur 'stateful', ce qui signifie que les états calculés pour les échantillons d'un lot seront réutilisés comme états initiaux pour les échantillons du prochain lot. Cela suppose un mappage un à un entre échantillons de différents lots successifs.

Je sais que cela ne répond pas directement à votre question, mais pour moi cela confirme ce que je pensais: lorsqu'un LSTM n'est pas avec état, l'état est réinitialisé après chaque échantillon. Ils ne fonctionnent pas par lots. L’idée d’un lot est que chaque échantillon est indépendant les uns des autres. 

Donc, vous avez 1000 réinitialisations de l'état pour votre exemple.

6
Nassim Ben

Dans Keras, il existe deux modes de gestion des états: 1) Le mode par défaut (stateful = False), où l’état est réinitialisé après chaque lot. Autant que je sache, l'état sera toujours maintenu entre différents échantillons d'un même lot. Donc, pour votre exemple, l'état serait réinitialisé 5 fois à chaque époque.

2) Le mode avec état où l'état n'est jamais réinitialisé. Il appartient à l'utilisateur de réinitialiser l'état avant une nouvelle époque, mais Keras lui-même ne réinitialisera pas l'état. Dans ce mode, l'état se propage de l'échantillon "i" d'un lot à l'échantillon "i" du lot suivant. En général, il est recommandé de réinitialiser l'état après chaque époque, car l'état peut se développer trop longtemps et devenir instable. Cependant, selon mon expérience avec des jeux de données de petite taille (20 000 à 40 000 échantillons), réinitialiser ou non l'état après une époque ne change pas grand-chose au résultat final. Pour de plus grands ensembles de données, cela peut faire la différence.

Le modèle avec état sera utile si vous avez des modèles qui couvrent plus de 100 pas de temps. Sinon, le mode par défaut est suffisant. Dans mon expérience, définir la taille du lot à peu près équivalente à la taille (pas de temps) des modèles dans les données aide également. 

La configuration avec état pourrait être assez difficile à comprendre au début. On pourrait s'attendre à ce que l'état soit transféré entre le dernier échantillon d'un lot et le premier échantillon du prochain lot. Mais l'état se propage en réalité par lots entre les mêmes échantillons numérotés. Les auteurs avaient deux choix et ils ont choisi le dernier. Lisez à ce sujet ici . Consultez également la section Keras FAQ sur les RNN avec état 

3
artemis

En développant la réponse de @ Nassim_Ben, il est vrai que chaque séquence est considérée comme indépendante pour chaque instance du lot. Cependant, vous devez garder à l'esprit que l'état caché des RNN et la mémoire de la cellule sont transmis à la cellule suivante en 20 étapes. L'état et la mémoire de cellules masqués sont généralement définis sur zéro pour la toute première cellule parmi les 20 cellules.

Après la 20e cellule, et après que l'état caché (uniquement, pas la mémoire de cellule) soit passé sur les couches situées au-dessus du RNN, l'état est réinitialisé. Je vais supposer qu'ils signifient la mémoire cellulaire et l'état caché ici.

Donc, oui, il est réinitialisé pour les 1 000 instances, cependant, compte tenu de votre batch_size=200, il est réinitialisé 5 fois, chaque lot étant réinitialisé une fois l’information transmise passée. J'espère que vous avez compris cela. 

Voici un projet que j'ai fait où j'avais la même question. Portez une attention particulière à la cellule 15 et à son explication dans le blob après la cellule 11. J'ai continué à ajouter des lettres car l'état était réinitialisé autrement.

0
sachinruk

Tout le monde semble faire trop de confusion. Keras LSTM réinitialise l'état après chaque lot. 

Voici un bon blog: https://machinelearningmastery.com/understanding-stateful-lstm-recurrent-neural-networks-python-keras/

Lisez les rubriques LSTM State Within A Batch et Stateful LSTM for a One-Char to One-Char Mapping dans ce blog. Il montre pourquoi il doit le réinitialiser après lot uniquement.

0
sn.anurag