2017-05-09 1 views
0

J'ai une question sur Tensorflow PTB RNN tutoriel code ptb_word_lm.py. Les blocs de code ci-dessous proviennent du code.Est-ce que la mesure de test tutoriel RNN PTB Tensorflow et réinitialisation d'état n'est pas correcte?

  1. Est-il acceptable de réinitialiser l'état pour chaque lot?

    self._initial_state = cell.zero_state(batch_size, data_type()) 
    
    with tf.device("/cpu:0"): 
        embedding = tf.get_variable(
         "embedding", [vocab_size, size], dtype=data_type()) 
        inputs = tf.nn.embedding_lookup(embedding, input_.input_data) 
    
    if is_training and config.keep_prob < 1: 
        inputs = tf.nn.dropout(inputs, config.keep_prob) 
    outputs = [] 
    state = self._initial_state 
    with tf.variable_scope("RNN"): 
        for time_step in range(num_steps): 
        if time_step > 0: tf.get_variable_scope().reuse_variables() 
        (cell_output, state) = cell(inputs[:, time_step, :], state) 
        outputs.append(cell_output) 
    

    En ligne 133, nous définissons l'état initial comme zéro. Ensuite, ligne 153, nous utilisons l'état zéro comme état de départ des étapes rnn. Cela signifie que chaque état de départ du lot est défini sur zéro. Je crois que si nous voulons appliquer BPTT (rétropropagation dans le temps), nous devrions faire une entrée d'état externe (non nulle) de l'étape où les données précédentes sont terminées, comme RNN avec état (dans Keras).

    J'ai trouvé que le rétablissement de l'état initial à zéro fonctionne pratiquement. Mais y a-t-il un arrière-plan théorique (ou un papier) expliquant pourquoi cela fonctionne? Est-il acceptable de mesurer la perplexité du test comme ceci? En relation avec la question précédente ... Le modèle fixe l'état initial à zéro pour chaque lot. Cependant, à la ligne 337 ~ 338, nous faisons les étapes 1 et num 1 du lot pour la configuration de test. Ensuite, pour les données de test, nous allons mettre des données uniques à chaque fois et prédire la suivante sans contexte (!) Car l'état sera nul pour chaque lot (avec une seule pas de temps).

    Cette mesure est-elle correcte pour les données de test? Est-ce que tous les autres documents de modèle de langue mesurent la perplexité des tests comme prédisant le mot suivant sans contexte?

J'ai exécuté ce code et obtenu un résultat similaire à celui indiqué par le code, ainsi que le document original. Si ce code est faux, ce que j'espère ne pas, avez-vous une idée de la façon de reproduire le résultat papier? Peut-être que je peux faire une demande de traction si je modifie les problèmes.

Répondre

0

Re (1), le code est (cell_output, state) = cell(inputs[:, time_step, :], state). Cela affecte l'état pour le pas de temps suivant à l'état de sortie de ce pas de temps. Lorsque vous démarrez un nouveau lot, vous devez le faire indépendamment du calcul que vous avez fait jusqu'à présent (notez la distinction entre le lot, qui sont des exemples complètement différents, et les pas de temps dans la même séquence).

Re (2), la plupart du temps le contexte est utilisé.

+0

Pouvez-vous me donner plus de détails? Je pense que le code initialise l'état à zéro avant la boucle RNN et exécute la boucle pour les heures num_steps. Pendant la boucle, l'état est mis à jour pour le suivant. Mais l'état initial de la boucle est toujours nul. Donc, ce que je voulais demander dans (2) était que si nous utilisons num_step = 1, alors il commencera toujours par zéro et se terminera par un seul pas. Ainsi, par exemple, "j'ai un chat" sera calculé comme (initialisation zéro - obtenir le coût de "je"), (initialisation zéro - obtenir le coût de "avoir"), (initialisation zéro, ...) Je crois que le l'état ne doit pas être initialisé au moins pour l'ensemble de test ... –

+0

Oui, num_steps égal à 1 conservera toujours la réinitialisation de l'état à 0 après chaque étape. Ceci n'est pas équivalent à l'utilisation d'un modèle complet. –