LSTM 模型建立與參數介紹,以天氣預測為例

Qi Fong
9 min readApr 24, 2021

--

本篇介紹LSTM在Tensorflow內的參數,和一些些運作原理。適合已經大致了解LSTM記憶機制,但是在建立模型上有困惑的人。

將會包含

  1. LSTM Units, input_shape, return_sequences的意思,
  2. Parameters數目的計算
  3. 實例分享

These article will introduce the key parameters of LSTM model in Tensorflow, and a little working mechanism.

Including

  1. The meaning of “units”,”input_shape”,”return_sequences” in LSTM layer.
  2. Calculation for the total parameters in LSTM Model.
  3. Case sharing

一、案例

因為有個案例當作思考的依據,會對LSTM比較好想像,所以直接介紹一個例子。

假設我有一整年的氣象資料,同時包含了15個特徵,我們的目標是訓練一個模型,從這些數據中學習一些隱含的關係,之後我想要用這個模型去預測某個時間點後的天氣狀況。

先看一下資料和紀錄頻率

從資料發現,紀錄頻率是每10分鐘取一次,包含了壓力,溫度及相對濕度等等。

我現在的目標是觀察某時間點(checkpoint)前五天所有feature的歷史資料,去預測後12小時的溫度(T)趨勢,其中T也是feature內的一個特徵。

為了方便講解,先介紹幾個之後會用的變數

dataset: log資料,假設已經做完正規劃(standard normalization)

history_size: 某時間點前我觀測的資料長度,本例子是5天

target_size: 某時間點後我想預測的資料長度,本例是12小時

start_index:起始的checkpoint,因為要往前看,所以最小要是history_size

end_index:最終的checkpoint,因為要向後看,所以最大是len(dataset)-target_size

data:由好幾個訓練sample組成的三維陣列(sample數,向前觀察的筆數,特徵數目),是被切分後的訓練資料

predict:每一組sample對應的預測值(T),是一個二維向量(sample數,向後預測的筆數),是被切分後的預測資料

step: 取樣的頻率,假設是step=3的話,就是30分鐘取樣一次,因為原始資料是10分鐘紀錄一次。

接下來我要把資料轉成等等要進入LSTM Model的型態,也就是要分成好幾組歷史資料(5天),預測資料(12小時), 所以可以預期轉換後的資料型態會是

(Num. of Samples, Num. of history data, Num. of features)

在實作上,是透過滑動窗口(moving window)來實現資料的分割,簡單講一下流程

step1: 從start_index向前看history_size的長度

step2: 在這個範圍內,每一個step取樣一次,把這一組data視為一組sample,並加入data陣列內

step3: 在目標欄位的,某時間點i,向後看一個target_size長度,將這個區間內的溫度視為sample的預測值(是一個向量),並加入predict 陣列內

step4: i←i+1,重複做step1~step3直到i=end_index-1

實例:

在剛剛講的案例,各變數的數值如下

history_size=5(day)*24(hour/day)*6(sample/hour)=720

target_size=12(hour)*6(sample/hour)=72

step=3, represents extracting a sample per half hour

start_index=0+history_size=720

end_index=N-target_size=N-72, where N represents the length of dataset

i=range(start_index,end_index)

這樣就拿到訓練data和每組sample對應的預測向量,接著就開始建立LSTM Model.

二、LSTM Model建立,參數討論

這邊一邊介紹重要參數和建立model。

我想要建立一個三層的LSTM Model

在Tensorflow內你只需要透過tf.keras.layers.LSTM就可以建立一層LSTM

這邊只討論三個參數,分別是units, input_shapereturn_sequences,必要且容易混淆。

a. units

就是一層有幾個LSTM cell。其實這邊的units和MLP內的神經元沒有什麼兩樣,一個unit就是一個LSTM cell,而一個LSTM cell長的樣子如下圖

如果units=2那就是兩個上方的cell左右排(想像成MLP的神經元換成上方的cell),彼此沒有連接,對比關係就是長下面這樣,LSTM的weights在block裡面。但是因為LSTM另外有input gate, output gate, forget gate,所以多了另外3組weights,所以parameters數目粗略就至少是MLP的四倍,至於為什麼會多這三組,及仔細的運作機制,可以去看李宏毅老師的機器學習線上課程

b. input_shape

這裡講的input_shape是指,每一組sample,他有幾筆資料以及feature數目是多少

在本例中就是=(history_size(720)/step(3),15)=(240,15)

如果去查keras的官方文件,會看到input_shape=(None, input_dim)

其中input_dim就是我們上方的(240,15)。

c. return_sequences

代表你輸出是不是一個序列(sequences),預設情況是False,那就是他只會輸出最後一個output,如果設成True,那就是整個序列都會輸出。原始描述可見官網,擷取如下

return_sequencesBoolean. Whether to return the last output. in the output sequence, or the full sequence. Default: False.

來源:https://www.tensorflow.org/api_docs/python/tf/keras/layers/LSTM

如果是True的話,後面不能接一般的Dense,但是可以繼續接LSTM。

通常最後的輸出,會設成False,因為只想知道最後長什麼樣。

三、最後來計算Parameters數目

個人覺得,雖然你可以什麼都不管,套句李宏毅老師說的,硬train一發,直接看loss或是跟testing data像不像。但是如果能夠知道怎麼計算parameters數目,對於了解網路的架構非常有幫助。擷取一個model的summary如下

最右方的6144, 3136, 25632及最下方的34912怎麼來的呢?

34912很好理解,就是把右邊的全部加起來就是了。

第一層的6144呢?

這層的input_shape是(240,15),units是32,計算上不用管240,因為他只是連續輸入相同dimension向量的次數,換句話說是你連續要觀察幾個向量。

所以每個時間點你都會放入一個Xt,他的長度是feature的數目,所以等於15。

但是根據LSTM運作的原理他會把上一次的state(h),一起合併到Xt再送入LSTM cell,這個h內的element是紀錄了不同units,上一個時間點的數值(scale),所組成的向量,比方說h=[a1,a2,a3,a4],代表這一層有4個units,a1~a4是cell1~cell4上一個時刻output gate的狀態。

至於h怎麼跟Xt連起來,實作上就是concat,也就是直接接在Xt的後面,所以進入LSTM cell的長度是len(Xt)+units,但是跟MLP一樣還有bias,所以是len(Xt)+units+1。

最後因為進去LSTM cell的向量,要經過四個線性轉換(通過三個gate),所以根據剛剛討論,weights的數目就要變成4倍。

以上是一個unit的參數數量,看你有幾個unit,再乘上unit數目,就是這一層的parameters數量,整理如下:

num. of parameters at first layer=[(15+32)+1]*4*32=6144

15: Feature length

32: Units

1:Bias

4:There are four times linear transform

第二層依此類推,

輸入向量長度=output length of last layers +units at second layers

Bias=1

Num. of tranform=4

units=16

Num. of parameters at second layer:[(32+16)+1]*4*16=3136

第三層

Num. of parameters at second layer:[(16+72)+1]*4*72=25632

Remark: 至於為什麼都沒有理C,原因是因為他在LSTM Model內沒有做什麼linear transform,都是做向量內積,所以沒有要train的參數。

四、最後分享一下訓練結果

--

--