1. 程式人生 > >長短期記憶(LSTM)系列_LSTM的建模方法(2)——如何堆疊多層LSTM網路

長短期記憶(LSTM)系列_LSTM的建模方法(2)——如何堆疊多層LSTM網路

導讀:

堆疊式LSTM屬於深度學習,通過新增網路的深度,提高訓練的效率,獲得更高的準確性。

文中介紹了堆疊式LSTM的架構和實現方法

在堆疊式LSTM中,層與層的輸數出通過return_sequences = True引數修改成3D資料,以便供下一層網路使用。

為什麼要增加深度?

堆疊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]]]