是不是Tensorflow RNN PTB教程测试测量和状态重置错了?

时间:2017-05-09 01:39:00

标签: tensorflow recurrent-neural-network perplexity

我对Tensorflow PTB RNN教程代码ptb_word_lm.py有两个问题。下面的代码块来自代码。

  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和num步骤1用于测试配置。然后,对于测试数据,我们将每次放置单个数据并预测下一个没有上下文(!),因为每个批次的状态将为零(只有一个时间步长)。

    这是测试数据的正确度量吗?是否所有其他语言模型论文都将测试困惑视为在没有上下文的情况下预测下一个词?

  3. 我运行了这段代码并得到了与代码所说的相似的结果,原始论文也说了。如果这段代码错了,我希望不会,你知道如何复制纸质结果吗?如果我修改问题,也许我可以提出拉取请求。

1 个答案:

答案 0 :(得分:0)

Re(1),代码(cell_output, state) = cell(inputs[:, time_step, :], state)。这会将下一个时间步的状态指定为此时间步的输出状态。

当你开始一个新的批处理时,你应该独立于你迄今为止完成的计算(注意批处理之间的区别,这是完全不同的例子,以及相同序列中的时间步骤)。

Re(2),大部分时间使用上下文。