2017-05-09 36 views
0

我對Tensorflow PTB RNN教程代碼ptb_word_lm.py有兩個問題。下面的代碼塊來自代碼。是不是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(通過時間反向傳播),我們應該在先前數據完成的地方進行步驟的外部(非零)狀態輸入,如有狀態RNN(在Keras中)。

    我發現重置起始狀態爲零實際上起作用。但是,有什麼理論背景(或論文)說明爲什麼這會起作用?

  2. 可以像這樣測量測試困惑嗎?

    eval_config = get_config() 
    eval_config.batch_size = 1 
    eval_config.num_steps = 1 
    

    與上一個問題相關...該模型將每個批次的初始狀態都固定爲零。但是,在第337〜338行中,我們將批量大小設置爲1,對於測試配置,將步驟1設置爲1。然後,對於測試數據,我們將每次放入單個數據,並預測下一個沒有上下文(!)的因爲每個批次的狀態將爲零(僅有一個步驟)。

    這是測試數據的正確測量方法嗎?每個其他的語言模型文件是否將測試困惑度測量爲預測下一個沒有上下文的單詞?

我運行這段代碼,得到了類似的結果,如代碼所示,也是原始文件說的。如果這個代碼是錯誤的,我不希望,你有任何想法如何複製紙張結果?如果我修改問題,也許我可以提出拉取請求。

回答

0

重新(1),代碼確實是(cell_output, state) = cell(inputs[:, time_step, :], state)。這將下一個時間步的狀態分配爲該時間步的輸出狀態。

當你開始一個新的批處理時,你應該獨立於你迄今爲止所做的計算(注意批處理,完全不同的例子和時間步驟在同一個序列中的區別)。

重新(2),大部分時間使用上下文。

+0

你能給我更多的細節嗎?我認爲代碼在RNN循環之前將狀態初始化爲零,並在num_steps時間運行循環。在循環過程中,狀態將在下一次更新。但循環的初始狀態始終爲零。所以,我在(2)中想問的是,如果我們使用num_step = 1,那麼它總是以零開始,並且只以一步結束。因此,例如,「我有貓」將被計算爲(零初始化 - 獲得「I」的成本),(零初始化 - 獲得「有」的成本),(零初始化,...)我相信狀態不應該初始化至少用於測試集... –

+0

是的,num_steps等於1將在每一步之後始終將狀態重新初始化爲0。這不等同於使用完整模型。 –