LSTM 时间序列的单位数

数据挖掘 lstm rnn
2022-02-01 20:50:49

我的问题是关于 LSTM 单元中的单元数。

我遇到了以下示例,该示例是基于其 2 滞后观察来预测系列中的值的模型。我想知道为什么 LSTM 单元中的单元数是 100,这远高于特征数。一般来说,将单元数设置为输入特征数不是更合乎逻辑吗?单元数量多于特征数量有什么好处?它直观地意味着什么?

我的代码:

series = array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

n_features = 1

series = series.reshape((len(series), n_features))

n_input = 2

generator = TimeseriesGenerator(series, series, length=n_input, batch_size=8)

model = Sequential()

model.add(LSTM(100, activation='relu', input_shape=(n_input, n_features)))

model.add(Dense(1))

model.compile(optimizer='adam', loss='mse')
1个回答

很少有资源证明单元格数量与输入成正比。但是,从 colah 的博客中可以清楚地看出这种直觉。您要建模的序列越长,层中需要的单元数就越多。例如,如果您使用 LSTM 对具有 100 个数据点窗口的时间序列数据进行建模,那么仅使用 10 个单元格可能不是最佳选择。任何 RNN (LSTM/GRU) 的目标是能够将整个序列编码为最终的隐藏状态,然后它可以传递到下一层。因此,即使您查看较旧的 NMT 模型(用于语言翻译的序列到序列),在非常基本的层面上,它也有一层 lstm 编码来自传递给它的序列中的所有信息,然后使用它来启动解码。所以基本上,如果单位数量相对较少,

话虽如此,我们经常使用

a)32的倍数(https://svail.github.io/rnn_perf/)所以尽管他们的解释充其量是模糊的,看待它的方式是当你声明输出大小为100时,RNN将生成 100 x 100 的方形矩阵,其中包含权重(将在 back prop 期间进行调整以提供最终模型),并且与 32 倍数的矩阵相比,这种矩阵的矩阵乘法将是笨拙的(这完全是我的直觉,如果我弄错了,请纠正)

b) 此外,如果您使用超过一定数量的隐藏单元,您最终会遇到梯度消失问题(由于 relu 激活函数将激活值保持在 0 和 1 之间,通常不会发生梯度爆炸)。因此,你最好“更深”而不是“更宽”,在那里你可以“垂直”堆叠 2​​-3 层 128 个隐藏单元,而不是在一层中使用 512 个隐藏单元(这个,我实际上经历过几乎所有形式文本和图像数据的实验)

我希望这能澄清一些事情