导读:
堆叠式LSTM属于深度学习,通过添加网络的深度,提高训练的效率,获得更高的准确性。
文中介绍了堆叠式LSTM的架构和实现方法
在堆叠式LSTM中,层与层的输数出通过return_sequences = True参数修改成3D数据,以便供下一层网络使用。
源码地址
LSTM/长短期记忆(LSTM)/使用LSTM建模/堆叠的长短期记忆网络 at master · yangwohenmai/LSTM · GitHub
为什么要增加深度?
堆叠LSTM隐藏层使模型更深入,更准确地将描述作为深度学习技术获得。
神经网络的深度通常归因于该方法在广泛的具有挑战性的预测问题上的成功
可以将其他隐藏层添加到多层感知器神经网络中以使其更深。附加隐藏层被理解为重新组合来自先前层的学习表示并在高抽象级别创建新表示。例如,从线到形状到对象。
足够大的单个隐藏层多层感知器可用于近似大多数功能。增加网络的深度提供了另一种解决方案,需要更少的神经元和更快的训练。最终,添加深度是一种代表性优化。
堆叠式LSTM架构
LSTM可以利用相同的好处。
鉴于LSTM对序列数据进行操作,这意味着层的添加增加了输入观察随时间的抽象级别。实际上,随着时间的推移分块观察或在不同的时间尺度上表示问题。
在同样的工作中,他们发现网络的深度比给定层中的存储器单元的数量更重要,以模拟技能。
堆叠LSTM现在是用于挑战序列预测问题的稳定技术。堆叠式LSTM架构可以定义为由多个LSTM层组成的LSTM模型。上面的LSTM层提供序列输出而不是单个值输出到下面的LSTM层。具体地说,每个输入时间步长一个输出,而不是所有输入时间步长的一个输出时间步长。
堆叠的长期短期记忆结构
在Keras中实现堆叠LSTM
下面是定义两个隐藏层Stacked LSTM的示例:
model = Sequential()
model.add(LSTM(..., return_sequences=True, input_shape=(...)))
model.add(LSTM(...))
model.add(Dense(...))
只要先前的LSTM层提供3D输出作为后续层的输入,我们就可以继续添加隐藏的LSTM层。例如,下面是一个有4个隐藏层的Stacked LSTM。
model = Sequential()
model.add(LSTM(..., return_sequences=True, input_shape=(...)))
model.add(LSTM(..., return_sequences=True))
model.add(LSTM(..., return_sequences=True))
model.add(LSTM(...))
model.add(Dense(...))
我们可以在Keras Python深度学习库中轻松创建Stacked LSTM模型
每个LSTM存储器单元都需要3D输入。当LSTM处理一个输入时间步长序列时,每个存储器单元将输出整个序列的单个值作为2D阵列。
我们可以使用具有单个隐藏LSTM层的模型来演示以下内容,该LSTM层也是输出层。
# Example of one output for whole sequence
from keras.models import Sequential
from keras.layers import LSTM
from numpy import array
# define model where LSTM is also output layer
model = Sequential()
model.add(LSTM(1, input_shape=(3,1)))
model.compile(optimizer='adam', loss='mse')
# input time steps
data = array([0.1, 0.2, 0.3]).reshape((1,3,1))
# make and show prediction
print(model.predict(data))
输入序列有3个值。运行该示例将输入序列的单个值输出为2D数组。
输出:[[ 0.00031043]]
要堆叠LSTM图层,我们需要更改先前LSTM图层的配置,以输出3D数组作为后续图层的输入。
我们可以通过将图层上的return_sequences参数设置为True(默认为False)来完成此操作。这将为每个输入时间步返回一个输出并提供3D数组。
以下是与return_sequences = True相同的示例。
# Example of one output for each input time step
from keras.models import Sequential
from keras.layers import LSTM
from numpy import array
# define model where LSTM is also output layer
model = Sequential()
model.add(LSTM(1, return_sequences=True, input_shape=(3,1)))
model.compile(optimizer='adam', loss='mse')
# input time steps
data = array([0.1, 0.2, 0.3]).reshape((1,3,1))
# make and show prediction
print(model.predict(data))
运行该示例为输入序列中的每个时间步输出单个值。
[[[-0.02115841]
[-0.05322712]
[-0.08976141]]]