为什么我的 LSTM 的误差在 10 个 epoch 后没有减少?

人工智能 长短期记忆 收敛
2021-10-19 00:47:41

尽管问题非常简单,但我想知道为什么 LSTM 网络无法收敛到一个像样的解决方案。

import numpy as np
import keras

X_train = np.random.rand(1000)
y_train = X_train
X_train = X_train.reshape((len(X_train), 1, 1))

model= keras.models.Sequential()
model.add(keras.layers.wrappers.Bidirectional(keras.layers.LSTM(1, dropout=0., recurrent_dropout=0.)))
model.add(keras.layers.Dense(1))

optimzer = keras.optimizers.SGD(lr=1e-1)

model.build(input_shape=(None, 1, 1))
model.compile(loss=keras.losses.mean_squared_error, optimizer=optimzer, metrics=['mae'])
history = model.fit(X_train, y_train, batch_size=16, epochs=100)

在 10 个 epoch 之后,该算法似乎已达到其最优解(1e-4RMSE 附近),并且无法进一步改进结果。

然而,具有相似参数的简单 Flatten + Dense 网络能够实现 1e-13 RMSE。

我很惊讶 LSTM 单元并没有简单地让值通过,我的参数有什么遗漏吗?LSTM 仅适用于分类问题吗?

1个回答

我认为您的方法存在一些问题。

首先,查看 Keras 文档,LSTM 期望输入 shape (batch_size, timesteps, input_dim)您正在传递 shape 的输入(1000, 1, 1),这意味着您拥有 1 个时间步长的“序列”。

RNN 已经被提出来捕获时间依赖关系,但是当每个序列的长度为 1 并且数字是随机生成的时,就不可能捕获这种依赖关系。如果您想创建一个更真实的场景,我建议您生成一个正弦波,因为它具有平滑的周期性振荡。之后,从 1 开始增加时间步长,您可以测试以下时间戳(以进行预测)。

对于第二部分,如果您考虑一个普通的 RNN(我将解释一个简单的 RNN,但您可以想象 LSTM 的类似流程)和一个Dense应用于 1 个时间戳的层,并没有那么多差异。致密层将有Y=f(XW+b), 在哪里X是输入,W是权重矩阵,b是偏差和f是激活函数。而 RNN 将有Y=f(XW1+W2h0+b), 因为是第一个时间戳h00,所以我们可以将其简化为Y=f(XW1+b),与Dense图层相同。我怀疑结果差异是由激活函数引起的,默认Dense层没有激活函数,而LSTM有tanh和sigmoid。