Comprendre l'état LSTM

je vais à travers ce tutoriel sur RNNs / LSTMs et j'ai du mal à comprendre les LSTMs. Mes questions sont les suivantes :

1. Taille des lots d'entraînement

Dans le Keras docs sur RNNs, j'ai trouvé que l'état caché de l'échantillon i-ème position dans le lot sera alimenté en entrée cachée de l'etat pour l'exemple i-ème place dans le prochain lot. Est-ce que cela signifie que si nous voulons passer le état caché de l'échantillon à l'échantillon nous devons utiliser des lots de taille 1 et donc effectuer en ligne descente gradient? Y a-t-il un moyen de passer l'état caché dans un lot de taille >1 et d'effectuer une descente en pente sur ce lot ?

2. Problèmes De Cartographie À Une Seule Carte

Dans le tutoriel du paragraphe "Stateful LSTM pour un Char, Un Char Cartographie" ont donné un code qui utilise batch_size = 1 et stateful = True apprendre à prédire la lettre suivante de l'alphabet donné une lettre du alphabet. Dans la dernière partie du code (ligne 53 à la fin du code complet), le modèle est testé en commençant par une lettre aléatoire ("K") et prédit "B", "B", il prédit que "C", etc. Ça a l'air de bien marcher sauf pour "K". Cependant, j'ai essayé de modifier le code comme suit (la dernière partie aussi, j'ai gardé les lignes 52 et au-dessus):

    # demonstrate a random starting point
    letter1 = "M"
    seed1 = [char_to_int[letter1]]
    x = numpy.reshape(seed, (1, len(seed), 1))
    x = x / float(len(alphabet))
    prediction = model.predict(x, verbose=0)
    index = numpy.argmax(prediction)
    print(int_to_char[seed1[0]], "->", int_to_char[index])
    letter2 = "E"
    seed2 = [char_to_int[letter2]]
    seed = seed2
    print("New start: ", letter1, letter2)
    for i in range(0, 5):
        x = numpy.reshape(seed, (1, len(seed), 1))
        x = x / float(len(alphabet))
        prediction = model.predict(x, verbose=0)
        index = numpy.argmax(prediction)
        print(int_to_char[seed[0]], "->", int_to_char[index])
        seed = [index]
    model.reset_states()

and these outputs:

    M -> B
    New start: M E
    E -> C
    C -> D
    D -> E
    E -> F

It looks like the LSTM did not learn the alphabet but just the positions of the letters, and that regardless of the first letter we feed in, the LSTM will always predict B since it's the second letter, then C and so on.

par conséquent, comment le fait de garder l'état caché précédent comme état caché initial pour l'état caché actuel nous aide-t-il avec l'apprentissage étant donné que pendant le test si nous commençons par la lettre " K " par exemple, les lettres A à J n'auront pas été introduites auparavant et l'état caché initial ne sera pas le même que pendant la formation ?

3. Formation D'un LSTM sur un livre pour la génération de phrase

je veux former mon LSTM sur un livre entier pour apprendre à générer des phrases et peut-être apprendre le style des auteurs aussi, comment puis-je naturellement former mon LSTM sur ce texte (Entrer le texte entier et laisser le LSTM comprendre les dépendances entre les mots) au lieu d'avoir "artificiellement" créer des lots de phrases de ce livre moi-même pour former mon LSTM? Je crois que je devrais utiliser des LSTMs stateful pourrait aider, mais je ne sais pas comment.

14
demandé sur Seanny123 2017-01-17 13:48:57

1 réponses

  1. avoir un LSTM stateful dans Keras signifie qu'une variable Keras sera utilisée pour stocker et mettre à jour l'état, et en fait vous pouvez vérifier la valeur du ou des vecteurs d'État à tout moment (c'est-à-dire jusqu'à ce que vous appeliez reset_states()). Un modèle non-stateful, d'un autre côté, utilisera un état zéro initial chaque fois qu'il traite un lot, donc c'est comme si vous appeliez toujours reset_states() après train_on_batch, test_on_batch et predict_on_batch. L'explication de l'état d'être réutilisé pour le prochain lot modèles stateful est à peu près cette différence avec non-stateful; bien sûr, l'état va toujours circuler dans le lot et vous faites besoin d'avoir des lots de taille 1 pour que cela se produise. Je vois deux scénarios où les dynamiques modèles sont utiles:

    • vous voulez vous entraîner sur des séquences de données fractionnées parce que celles-ci sont très longues et qu'il ne serait pas pratique de s'entraîner sur toute leur longueur.
    • sur le temps de prédiction, vous voulez récupérer la sortie pour chaque le point de temps dans la séquence, pas seulement à la fin (soit parce que vous voulez le renvoyer dans le réseau ou parce que votre application en a besoin). Je le fais personnellement dans les modèles que j'exporte pour intégration ultérieure (qui sont des "copies" du modèle de formation avec une taille de lot de 1).
  2. je suis d'accord que l'exemple d'une RNN de l'alphabet ne semble vraiment pas très utile dans la pratique; il ne fonctionne que lorsque vous commencez avec la lettre A. Si vous voulez apprendre à reproduire l'alphabet à partir de n'importe quelle lettre, vous auriez besoin de former le réseau avec ce genre d'exemples (suite ou rotations de l'alphabet). Mais je pense qu'un réseau de feed-forward régulier pourrait apprendre à prédire la prochaine lettre de l'entraînement de l'alphabet sur les paires comme (A, B), (B, C), etc. Je pense que l'exemple est destiné à des fins de démonstration plus qu'autre chose.

  3. vous avez probablement déjà lu, mais le post populaire Le Déraisonnable L'efficacité des Réseaux de Neurones Récurrents montre quelques résultats intéressants dans le sens de ce que vous voulez faire (bien qu'il ne plonge pas vraiment dans les détails de la mise en œuvre). Je n'ai pas d'expérience personnelle formation RNN avec des données textuelles, mais il ya un certain nombre d'approches que vous pouvez rechercher. Vous pouvez construire des modèles basés sur des personnages (comme ceux dans le post), où votre entrée et recevoir un caractère à la fois. Une approche plus avancée consiste à procéder à un prétraitement des textes et des transformez-les en séquences de nombres; Keras inclut certains fonctions de prétraitement du texte pour le faire. Avoir un seul numéro comme espace de fonctionnalité ne va probablement pas fonctionner tout cela bien, de sorte que vous pourriez simplement transformer chaque mot en un vecteur avec un encodage à chaud ou, plus intéressant, avoir le réseau apprendre la meilleure représentation vecteur pour chacun pour, qui est ce qu'ils appellent en intégration. Vous pouvez aller encore plus loin avec le prétraitement et regarder dans quelque chose comme NLTK, surtout si vous voulez supprimer les mots d'arrêt, la ponctuation et des choses comme ça. Enfin, si vous avez des séquences de différentes tailles (par exemple, vous utilisez des textes complets au lieu d'extraits de taille fixe, ce qui peut ou non être important pour vous), vous devrez être un peu plus prudent et utiliser masquage et/ou pondération de l'échantillon. Selon le problème exact, vous pouvez configurer la formation en conséquence. Si vous voulez apprendre à générer des texte, Le "Y" serait similaire au " X " (encodé une fois), seulement décalé d'une (ou plusieurs) positions (dans ce cas, vous devrez peut-être utiliser return_sequences=True et couches distribuées dans le temps). Si vous voulez déterminer l'auteur, la sortie pourrait être un softmax couche Dense.

j'Espère que vous aide.

19
répondu jdehesa 2017-01-17 16:03:17