了解具有 LSTM 单元的循环神经网络的功能

Understanding the functioning of a recurrent neural network with LSTM cells

上下文:

我的问题: 当我使用 (128,300,38) 的输入批次和相同大小的目标批次训练网络时,

  1. 网络是否总是只考虑最后一个时间步t来预测下一个时间步的值t+1?

  2. 或者它是否考虑了从序列开始到时间步 t 的所有时间步?

  3. 或者 LSTM 单元是否在内部记住所有以前的状态?

我对功能感到困惑,因为网络是在多个时间步长上模拟训练的,所以我不确定 LSTM 单元如何仍然了解以前的状态。

我希望有人能提供帮助。提前致谢!

讨论代码:

            cells = []

            for i in range(self.n_layers):
                cell = tf.contrib.rnn.LSTMCell(self.n_hidden)
                cells.append(cell)

            cell = tf.contrib.rnn.MultiRNNCell(cells)
            init_state = cell.zero_state(self.batch_size, tf.float32)

            outputs, final_state = tf.nn.dynamic_rnn(
                cell, inputs=self.inputs, initial_state=init_state)

            self.logits = tf.contrib.layers.linear(outputs, self.num_classes)

            softmax_ce = tf.nn.sparse_softmax_cross_entropy_with_logits(
                labels=labels, logits=self.logits)

            self.loss = tf.reduce_mean(softmax_ce)
            self.train_step = tf.train.AdamOptimizer(self.lr).minimize(self.loss)

以上是一个简单的 RNN 展开到神经元级别,具有 3 个时间步长。

如您所见,时间步长 t 的输出取决于从一开始的所有时间步长。网络使用 back-propagation through time 进行训练,其中权重根据所有误差梯度随时间的贡献进行更新。权重跨时间共享,因此在所有时间步长上都没有 simultaneous update 之类的东西。

先前状态的知识通过状态变量 s_t 传递,因为它是先前输入的函数.因此,在任何时间步长,预测都是基于当前输入以及状态变量捕获的先前输入(的函数)进行的。

注意:为了简单起见,使用了基本的 rnn 而不是 LSTM

针对您的情况,请特别记住以下几点:

给定输入形状 [128, 300, 38]

  • 一次调用 dynamic_rnn 将传播所有 300 个步骤,如果您使用 LSTM 之类的东西,状态也将通过这 300 个步骤传播
  • 但是,对 dynamic_rnn 的每个后续调用都不会自动记住上一次调用的状态。通过第二次调用,weights/etc。将因第一次调用而更新,但您仍需要将第一次调用产生的状态传递到第二次调用。这就是为什么 dynamic_rnn 有一个参数 initial_state,这就是为什么它的输出之一是 final_state(即在一个调用中处理完所有 300 个步骤后的状态)。因此,您应该从调用 N 获取最终状态并将其作为调用 N+1 的初始状态传递回 dynamic_rnn。这都与 LSTM 相关,因为这正是您要求的
  • 您注意到一个批次中的元素在同一批次中不一定相互关联,这是对的。这是你需要仔细考虑的事情。因为连续调用 dynamic_rnn,输入序列中的批处理元素必须与 previous/following 序列中的对应元素相关,但彼此之间不相关。 IE。第一次调用中的元素 3 可能与同一批次中的其他 127 个元素无关,但 NEXT 调用中的元素 3 必须是 PREVIOUS 调用中元素 3 的 temporal/logical 延续,依此类推。这样你不断向前传递的状态才有意义