试图理解 Keras 中的编码器-解码器顺序模型?

数据挖掘 神经网络 喀拉斯 时间序列 lstm rnn
2021-09-15 18:44:53

我的理解是,对于某些类型的 seq2seq 模型,你训练一个编码器和一个解码器,然后你将编码器放在一边,只使用解码器进行预测步骤。例如来自 Uber 的这个 seq2seq 时间序列预测模型:

在此处输入图像描述

现在我正在尝试在 Keras 中实现一个 to 版本。

这是香草 LSTM 的 Keras 代码:

# define model
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
# train model
model.fit(X, y, epochs=200, verbose=0)
# predict
x_input = array([70, 80, 90])
x_input = x_input.reshape((1, n_steps, n_features))
yhat = model.predict(x_input, verbose=0)

这是堆叠 LSTM 模型的 Keras 代码:

# define model
model = Sequential()
model.add(LSTM(50, activation='relu', return_sequences=True, input_shape=(n_steps, n_features)))
model.add(LSTM(50, activation='relu'))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
# train model
model.fit(X, y, epochs=200, verbose=0)
# predict
x_input = array([70, 80, 90])
x_input = x_input.reshape((1, n_steps, n_features))
yhat = model.predict(x_input, verbose=0)
print(yhat)

这是编码器-解码器模型的 Keras 代码:

# define model
model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(n_steps_in, n_features)))
model.add(RepeatVector(n_steps_out))
model.add(LSTM(100, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(optimizer='adam', loss='mse')
# train model
model.fit(X, y, epochs=100, verbose=0)
# predict
x_input = array([70, 80, 90])
x_input = x_input.reshape((1, n_steps_in, n_features))
yhat = model.predict(x_input, verbose=0)

问题是,我看不出编码器-解码器代码与香草和堆叠 LSTM 之间有太大区别。特别是,我没有看到我们如何在预测步骤中仅使用解码器,以及 Keras 中的哪个变量或方法对应于我们将用作预测新时间序列的输入的嵌入?

如何使用 Keras 实现类似于插图中的模型的代码?

2个回答

首先,我个人认为您提供的代码是不必要的,因为您正在寻找模型之间的架构比较。为简单起见,包含香草和堆叠 LSTM 网络的图形会更容易(而且体积更小)。您可以按照此处keras.utils.plot_model()的说明进行操作

回答您的问题:

我看不出我们如何在预测步骤中仅使用解码器......

Uber 的模型不使用自动编码器的解码器组件。从提供的图表来看,它使用单独的顺序 LSTM 模型。

... Keras 中的哪个变量或方法对应于我们将用作预测新时间序列的输入的嵌入?

预测模型的输入只是自动编码器的潜在空间。特别是,潜在空间构成了过去观察的浓缩表示,因此您不需要包含完整的时间序列,因为它可能很长并且包含冗余信息、重复、噪声等。相反,您可以将其压缩为类似于“zip”文件的东西,它的大小更小,但仍包含所有基本信息。然后,您训练“预测”网络以根据“压缩”的过去信息预测未来值,而不是在原始时间序列上进行训练。

如何使用 Keras 实现类似于插图中的模型的代码?

检查此自动编码器示例的第 4 个模型。首先,训练自动编码器。只有在经过适当的训练和优化后,才能训练一个简单的 LSTM 预测模型,就像您提供的代码中的模型一样。

关键是使用自动编码器的潜在空间来训练预测模型,在当前示例中是第一个 LSTM 层的输出。为此,您需要首先使用已训练的编码器将完整的数据集编码为潜在表示,然后在第二步中使用这些编码来训练预测模型

这取决于您想要达到的目标。最大的区别在于,在自动编码器(encoder-decoder)中,隐藏空间(“中间 LSTM”)的输出通常应该以某种方式使用,并且隐藏空间的维度通常比输入和输出低(或高)得多.

这样,您首先将信息“编码”为非常少量的数据,希望它仅包含您正在寻找的基本信息(要点)。

我会首先在 goodfellows deeplearningbook.org甚至在wikipedia上学习自动编码器。

您上面的实现似乎是正确的,但是,重要的是要知道为什么要使用自动编码器?是对数据进行降噪还是创建某种压缩算法?也许在隐藏空间做算术?