状态rnn的时间反向传播



如果我在Keras中使用有状态RNN来处理长度为N的序列,该序列分为N个部分(每个时间步分别处理),

  1. 反向传播是如何处理的?它只影响最后一个时间步,还是反向传播到整个序列?
  2. 如果它不通过整个序列传播,有办法做到这一点吗?

反向传播视界仅限于输入序列的第二次元。例如,如果您的数据类型为(num_sequences, num_time_steps_per_seq, data_dim),则在价值num_time_steps_per_seq的时间范围内进行back prop。查看

https://github.com/fchollet/keras/issues/3669

关于Keras中的rnn,您需要了解几件事。在默认情况下,参数return_sequences=False在所有递归神经网络。这意味着在默认情况下,只有处理完整个输入序列后RNN的激活才会作为输出返回。如果您希望每个时间步都有激活并分别优化每个时间步,则需要将return_sequences=True作为参数传递(https://keras.io/layers/recurrent/#recurrent)。

下一件重要的事情是,有状态RNN所做的就是记住最后一次激活。因此,如果您有一个大的输入序列并将其分解为较小的序列(我相信您正在这样做),那么在处理第一个序列之后,网络中的激活将保留在网络中,因此在处理第二个序列时影响网络中的激活。这与如何优化网络无关,网络只是最小化输出和您给出的目标之间的差异。

到Q1: 反向传播是如何处理的?(因为RNN不仅像在basic_NN中那样垂直完全连接,而且在隐藏层中也被认为是深度的,并且具有水平反向连接)

假设batch_input_shape=(num_seq, 1, data_dim) - Backprop将被截断为1个时间步长,因为第二个维度是1。在第二次元的值之前不会执行任何梯度更新。"-见这里

因此,如果有time_step>1 there - gradient将在input_shape的second_dim中分配的time_steps中进一步更新

  • set return_sequences=True适用于所有循环层,除了最后一层(作为需要的输出使用或进一步密集到需要的输出)—需要在sliding_window中以+1滚动从上一层到下一层的传输序列—以便能够根据已经估计的权重 backprop

  • return_state=True用于获取返回的状态——LSTM [output, state_h, state_c = layers]中的2个状态张量。LSTM(64, return_state=True, name="encoder"]或GRU[包括. in shapes]中的1状态张量可用于编码器-解码器序列到序列模型,其中编码器的最终状态用作解码器的初始状态。"…

但请记住(任何情况下):有状态训练不允许变换,并且与无状态训练相比更耗时

注。

正如你所看到的, (c、h) tf (h, c) keras , h ,c是输出元素,因此在批处理或多线程训练中都变得紧迫

相关内容

  • 没有找到相关文章

最新更新