Dans les exemples MNIST LSTM, je ne comprends pas ce que signifie "couche cachée". Est-ce la couche imaginaire formée lorsque vous représentez un RNN déroulé au fil du temps?
Pourquoi le num_units = 128
dans la plupart des cas?
Je sais que je devrais lire le blog de colah en détail pour comprendre cela, mais avant cela, je voudrais juste obtenir du code qui fonctionne avec un exemple de série chronologique que j'ai.
Le nombre d'unités cachées est une représentation directe de la capacité d'apprentissage d'un réseau de neurones - il reflète le nombre de paramètres appris. La valeur 128
a probablement été choisie de manière arbitraire ou empirique. Vous pouvez modifier cette valeur à titre expérimental et relancer le programme pour voir comment il affecte la précision de l'entraînement (vous pouvez obtenir une précision de test supérieure à 90% avec beaucoup moins d'unités cachées). L'utilisation d'un plus grand nombre d'unités rend plus probable la mémorisation parfaite de l'ensemble d'entraînement complet (bien que cela prenne plus de temps et que vous couriez le risque d'une surcharge).
La chose clé à comprendre, qui est quelque peu subtile dans le célèbre le blog de Colah (find "chaque ligne porte un vecteur entier"), est que X
est un tableau of data (de nos jours souvent appelé un tenseur ) - il n'est pas censé être une valeur {scalaire} _. Lorsque, par exemple, la fonction tanh
est affichée, cela signifie que la fonction est broadcast sur tout le tableau (une boucle implicite for
) - et non simplement exécutée une fois par pas de temps.
Ainsi, les unités cachées représentent le stockage tangible dans le réseau, qui se manifeste principalement par la taille du tableau pondération. Et puisqu'un LSTM possède en réalité un peu de son stockage interne distinct des paramètres de modèle appris, il doit savoir combien d'unités il y a - ce qui doit finalement correspondre à la taille des poids. Dans le cas le plus simple, un RNN n’a pas de mémoire interne - il n’a donc même pas besoin de savoir à l’avance le nombre «d’unités cachées» auxquelles il est appliqué.
Note latérale: Cette notation est très courante dans les statistiques et l’apprentissage automatique, ainsi que dans d’autres champs qui traitent des lots volumineux de données avec une formule courante (les graphiques 3D en sont un autre exemple). pour les personnes qui s'attendent à voir leurs boucles for
écrites explicitement.
num_units
peut être interprété comme l’analogie de la couche cachée du réseau neuronal à retransmission. Le nombre de noeuds dans la couche cachée d’un réseau de neurones à répétition est équivalent au nombre num_units d’unités LSTM dans une cellule LSTM à chaque pas de temps du réseau.
Voir le image là aussi!
L'argument n_hidden
de BasicLSTMCell
est le nombre d'unités cachées du LSTM.
Comme vous l'avez dit, vous devriez vraiment lire le article de blog de Colah pour comprendre LSTM, mais voici un petit avertissement.
Si vous avez une entrée x
de forme [T, 10]
, vous alimenterez le LSTM avec la séquence de valeurs de t=0
à t=T-1
, chacune de taille 10
.
À chaque pas de temps, multipliez l'entrée avec une matrice de forme [10, n_hidden]
et obtenez un vecteur n_hidden
.
Votre LSTM obtient à chaque heure t
:
h_{t-1}
, de taille n_hidden
(à t=0
, l'état précédent est [0., 0., ...]
)n_hidden
h_t
de taille n_hidden
Si vous voulez juste que le code fonctionne, gardez simplement avec n_hidden = 128
et tout ira bien.
Un LSTM conserve deux informations lorsqu’elles se propagent dans le temps:
Un état hidden
; qui est la mémoire que LSTM accumule en utilisant ses portes (forget, input, and output)
dans le temps et La sortie de pas de temps précédente.
num_units
de Tensorflow est la taille de l’état caché du LSTM (qui est également la taille de la sortie si aucune projection n’est utilisée).
Pour rendre le nom num_units
plus intuitif, vous pouvez le considérer comme le nombre d'unités cachées dans la cellule LSTM ou le nombre d'unités de mémoire dans la cellule.
Regardez ceci post génial pour plus de clarté
Je pense qu'il est déroutant pour les utilisateurs de TF par le terme "num_hidden". En réalité, cela n’a rien à voir avec les cellules LSTM non déroulées, c’est simplement la dimension du tenseur, qui est transformée à partir du tenseur d’entrée de pas de temps dans la cellule LSTM et introduite dans ce dernier.
Ce terme num_units
ou num_hidden_units
parfois noté en utilisant le nom de variable nhid
dans les implémentations, signifie que l'entrée dans la cellule LSTM est un vecteur de dimension nhid
(ou, dans le cas d'une implémentation en batch, une matrice de forme batch_size
x nhid
). En conséquence, la sortie (de la cellule LSTM) aurait également la même dimensionnalité puisque la cellule RNN/LSTM/GRU ne modifie pas la dimensionnalité du vecteur ou de la matrice en entrée.
Comme indiqué précédemment, ce terme a été emprunté à la littérature sur les réseaux neuronaux Feed-Forward (FFN) et a semé la confusion lorsque utilisé dans le contexte des RNN. Mais, l’idée est que même les RNN peuvent être visualisés en tant que FFN à chaque pas de temps. Dans cette vue, la couche masquée contiendrait en effet des unités num_hidden
comme illustré dans cette figure:
Source: Comprendre LSTM
Plus concrètement, dans l'exemple ci-dessous, num_hidden_units
ou nhid
serait 3 puisque la taille de l'état masqué (couche intermédiaire) est un vecteur 3D.
Depuis que j'ai eu quelques problèmes pour combiner les informations provenant de différentes sources, j'ai créé le graphique ci-dessous, qui montre une combinaison du message de blog ( http://colah.github.io/posts/2015-08-Understanding-LSTMs/ ) et ( https://jasdeep06.github.io/posts/Understanding-LSTM-in-Tensorflow-MNIST/ ) où, à mon avis, les graphiques sont très utiles mais constituent une erreur d’explication du nombre_unités.
Plusieurs cellules LSTM forment une couche LSTM. Ceci est montré dans la figure ci-dessous. Étant donné que vous traitez principalement avec des données très volumineuses, il n’est pas possible de tout intégrer en une seule fois dans le modèle. Par conséquent, les données sont divisées en petits lots en lots, qui sont traités les uns après les autres jusqu'à ce que le lot contenant la dernière partie soit lu. Dans la partie inférieure de la figure, vous pouvez voir l'entrée (gris foncé) où les lots sont lus. l'un après l'autre du lot 1 au lot batch_size. Les cellules cellule LSTM 1 à cellule LSTM time_step ci-dessus représentent les cellules décrites du modèle LSTM ( http://colah.github.io/posts/2015-08-Understanding- LSTMs/ ). Le nombre de cellules est égal au nombre de pas de temps fixes. Par exemple, si vous prenez une séquence de texte de 150 caractères au total, vous pouvez la diviser en 3 (batch_size) et créer une séquence de longueur 50 par lot (nombre de pas de temps et donc de cellules LSTM). Si vous encodiez ensuite chaque caractère à chaud, chaque élément (cases gris foncé de l’entrée) représenterait un vecteur qui aurait la longueur du vocabulaire (nombre d’entités). Ces vecteurs iraient dans les réseaux neuronaux (éléments verts des cellules) dans les cellules respectives et changeraient leur dimension en fonction de la longueur du nombre d'unités cachées (number_units). Donc, l’entrée a la dimension (batch_size x time_step x features). Les mémoires longue durée (état de la cellule) et courte (état masqué) ont les mêmes dimensions (batch_size x number_units). Les blocs gris pâle issus des cellules ont une dimension différente car les transformations dans les réseaux de neurones (éléments verts) ont eu lieu à l'aide des unités cachées (batch_size x time_step x number_units). La sortie peut être renvoyée à partir de n’importe quelle cellule mais seules les informations du dernier bloc (bordure noire) sont pertinentes (pas dans tous les problèmes) car elles contiennent toutes les informations des pas de temps précédents .
La plupart des diagrammes LSTM/RNN montrent uniquement les cellules cachées mais jamais les unités de ces cellules. Par conséquent, la confusion. Chaque couche masquée a des cellules cachées, autant que le nombre de pas de temps . Et de plus, chaque cellule cachée est composée de plusieurs unités cachées, comme dans le diagramme ci-dessous. Par conséquent, la dimensionnalité d'une matrice de couche masquée dans RNN est la suivante (nombre de pas de temps, nombre d'unités masquées).