了解具有 LSTM 单元的循环神经网络的功能
Understanding the functioning of a recurrent neural network with LSTM cells
上下文:
- 我有一个包含 LSTM 单元的循环神经网络
- 在我的例子中,网络的输入是一批大小为 (batch_size、number_of_timesteps、one_hot_encoded_class) (128, 300, 38)
- 批次(1-128)的不同行不一定相关
彼此
- 一个时间步的目标由下一个时间步的值给出
时间步长。
我的问题:
当我使用 (128,300,38) 的输入批次和相同大小的目标批次训练网络时,
网络是否总是只考虑最后一个时间步t来预测下一个时间步的值t+1?
或者它是否考虑了从序列开始到时间步 t 的所有时间步?
或者 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 延续,依此类推。这样你不断向前传递的状态才有意义
上下文:
- 我有一个包含 LSTM 单元的循环神经网络
- 在我的例子中,网络的输入是一批大小为 (batch_size、number_of_timesteps、one_hot_encoded_class) (128, 300, 38)
- 批次(1-128)的不同行不一定相关 彼此
- 一个时间步的目标由下一个时间步的值给出 时间步长。
我的问题: 当我使用 (128,300,38) 的输入批次和相同大小的目标批次训练网络时,
网络是否总是只考虑最后一个时间步t来预测下一个时间步的值t+1?
或者它是否考虑了从序列开始到时间步 t 的所有时间步?
或者 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 延续,依此类推。这样你不断向前传递的状态才有意义