0

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

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

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

4

1 回答 1

0

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

当您开始一个新批次时,您应该独立于您迄今为止所做的计算(注意批次之间的区别,它们是完全不同的示例,以及相同序列中的时间步长)。

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

于 2017-05-09T18:31:01.993 回答