>我有两个关于Tensorflow PTB RNN教程代码ptb_word_lm.py的问题。下面的代码块来自代码。
-
是否可以重置每个批次的状态?
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 中)。
我发现将起始状态重置为零实际上有效。但是,是否有任何理论背景(或论文)来解释为什么会起作用?
-
可以这样测量测试困惑度吗?
eval_config = get_config() eval_config.batch_size = 1 eval_config.num_steps = 1
与上一个问题相关...该模型将每个批次的初始状态固定为零。但是,在第 337 ~ 338 行中,我们制作了批量大小 1 和 num 步骤 1 用于测试配置。然后,对于测试数据,我们将每次放置单个数据,并在没有上下文(!)的情况下预测下一个数据,因为每个批次的状态将为零(只有一个时间步长)。
这是测试数据的正确度量吗?是否每隔一篇语言模型论文都将测试困惑度衡量为在没有上下文的情况下预测下一个单词?
我运行了这段代码,得到了与代码和原始论文所说的类似的结果。如果这段代码是错误的,我希望不是,你知道如何复制论文结果吗?如果我修改问题,也许我可以发出拉取请求。
Re (1),代码(cell_output, state) = cell(inputs[:, time_step, :], state)
。这会将下一个时间步长的状态指定为此时间步的输出状态。
当你开始一个新的批处理时,你应该独立于你到目前为止所做的计算(注意批处理之间的区别,它们是完全不同的例子,以及同一序列中的时间步长)。
Re (2),大多数时候使用上下文。