本篇介紹LSTM在Tensorflow內的參數,和一些些運作原理。適合已經大致了解LSTM記憶機制,但是在建立模型上有困惑的人。
將會包含
- LSTM Units, input_shape, return_sequences的意思,
- Parameters數目的計算
- 實例分享
These article will introduce the key parameters of LSTM model in Tensorflow, and a little working mechanism.
Including
- The meaning of “units”,”input_shape”,”return_sequences” in LSTM layer.
- Calculation for the total parameters in LSTM Model.
- 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_shape,return_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_sequences
Boolean. 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的參數。