Tensorflow RNN PTB tutorial test measure and state reset 不是错了吗?

Isn't Tensorflow RNN PTB tutorial test measure and state reset wrong?

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

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

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

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

当你开始一个新的批次时,你应该独立于你到目前为止所做的计算(注意批次之间的区别,它们是完全不同的例子,和时间步长在同一序列中)。

Re(2),大部分时候使用context