Keras LSTM 中的时间步长

机器算法验证 机器学习 lstm 循环神经网络 喀拉斯
2022-04-19 01:11:14

我对时间序列 LSTM训练的理解是,循环单元展开到指定的长度 ( num_steps),并且参数更新沿该长度反向传播。然而,一旦经过训练,LSTM 单元应该能够接受任意数量的时间步并产生输出。

例如,假设我有一个单层 LSTM,它在每个时间步接受 3 个城市(每个时间步 4 * 3 = 12 个特征)的温度、湿度和风向矢量(2D 方向),并预测附近第 4 个城市的温度和湿度(a 的 2 个输出特征t+1)。

假设对于训练,我设置num_steps=10batch_size=16

这意味着它将接受一个形状向量(16, 10, 12)进行训练,并且 Keras LSTM 层将被初始化为input_shape=(10, 12). 我给它输入大量数据并运行几个 epoch,然后训练 LSTM 单元。

一旦受过训练,我应该能够喂食任意数量的时间步长,对吧?就像我可以输入 8 个时间步并获得输出,或者输入 50 个时间步并获得输出。我不应该局限于我为展开训练指定的 10 个。我的理解是,这种固定长度的展开只是训练所必需的,本质上是反向传播算法的一个限制。

我的理解是这就是 RNN 的重点:输入长度是任意的;处理输入的 LSTM 单元与处理输入t的单元相同t-1(唯一的区别是输入和状态将不同)。

我问的原因是因为无论我在哪里看,它似乎都num_steps成为训练有素的网络的内在属性,无法改变。我必须始终输入那么多时间步才能获得输出。此外,通过增加num_steps,参数的数量也会增加。num_steps*num_features如果时间步数必须固定,那么我看不到 RNN/LSTM 相对于具有特征输入节点的标准前馈网络的优势。

我是否对 RNN/LSTM 有错误的理解,或者我误解了 Keras 文档/示例,或者这仅仅是 Keras 的限制?

1个回答

正如Andrey Karpathy 所描述的,基本的循环神经网络单元类似于

ht=tanh(Whhht1+Wxhxt)

所以它需要先前的隐藏状态和当前输入来产生隐藏状态请注意没有按时间索引,我们对每个时间步使用相同的权重。在简化的python 代码中,前向传递基本上是一个 for 循环:ht1xthtWhhWxht

for t in range(timesteps):
    h[t] = np.tanh(np.dot(Wxh, x[t]) + np.dot(Whh, h[t-1]))

所以不管有多少时间步长,它只是如何实现的问题。人们经常使用固定数量的时间步来简化代码并使用更简单的数据结构。

Keras 中,RNN 单元格作为输入张量 shape (batch_size, timesteps, input_dim),但如果您想使用不同的 size ,您可以将它们设置为None例如,如果您使用(None, None, input_dim),那么它将接受任意大小的批次和任意数量的时间步长,以及input_dim特征数量(这需要修复)。这是可能的,因为这是一个 for 循环,我们对每个时间步都应用相同的函数。在其他情况下会更复杂,因为不同的大小需要我们使用不同大小的参数向量(比如在密集连接层中)。