2017-05-09 6 views
0

Tensorflow PTB RNNチュートリアルコードptb_word_lm.pyに2つの質問があります。以下のコードブロックはコードのものです。Tensorflow RNN PTBチュートリアルのテスト測定値と状態のリセットが間違っていませんか?

  1. バッチごとに状態をリセットしても問題ありませんか?

    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) 
    

    行133では、初期状態をゼロに設定します。次に、行153では、rnnステップの開始状態としてゼロ状態を使用します。つまり、バッチの開始状態はすべてゼロに設定されます。 BPTT(バックプロパゲーション)を適用したい場合は、(Kerasの)ステートフルなRNNのように、以前のデータが終了したステップの外部(非ゼロ)ステート入力を行う必要があります。

    開始状態をゼロにリセットすることは、実際には機能することがわかりました。しかし、これがなぜ機能するのかの理論的背景(または論文)はありますか?

  2. このようなテストパープレキシティを測定するのは大丈夫ですか?

    前の質問に関連する...このモデルでは、すべてのバッチの初期状態がゼロに固定されています。しかし、337〜338行目では、バッチサイズ1とnumステップ1をテスト構成にしています。次に、テストデータについては、毎回単一のデータを配置し、状態(1つのタイムステップのみ)ごとに状態がゼロになるため、コンテキスト(!)なしで次のデータを予測します。

    テストデータの正しい尺度ですか?他のすべての言語モデル論文は、文脈のない次の単語を予測するためのテストの混乱を測定しますか?

私はこのコードを実行し、コードと同じ結果を得ました。このコードが間違っている場合は、私は望んでいませんが、どのように紙の結果を複製するか考えていますか?もし私が問題を修正するなら、私はプルリクエストをすることができます。

答えて

0

Re(1)、コードは(cell_output, state) = cell(inputs[:, time_step, :], state)です。これは、次の時間ステップの状態をこの時間ステップの出力状態に割り当てる。

新しいバッチを開始するときは、これまでに行った計算とは別に実行する必要があります(完全に異なる例であるバッチと同じシーケンス内のタイムステップとの区別に注意してください)。

Re(2)では、ほとんどの場合、コンテキストが使用されます。

+0

詳細を教えていただけますか?私はコードがRNNループの前に状態をゼロに初期化し、num_steps回のループを実行すると思います。ループの間、状態は次のために更新されます。しかし、ループの初期状態は常にゼロです。だから、私が(2)で尋ねたかったのは、num_step = 1を使うと、常にゼロから始まり、1ステップで終了するということでした。たとえば、 "私は猫がいる"と計算されます(ゼロ初期化 - "私"のコストを得る)、(ゼロ初期化 - "取得"のコストを得る)、(ゼロ初期化、...)私は状態は少なくともテストセットのために初期化されるべきではありません... –

+0

はい、num_steps = 1は、すべてのステップの後に常に状態を0に再初期化し続けます。これは完全なモデルを使用するのと同じではありません。 –

関連する問題