lstm需要优化的参数_LSTM的物理结构和一些细节
這個是網上看的最多的圖了,但是在理解lstm的應用過程中的時候這個圖帶來了不少麻煩。
展開之后實際的物理結構是這樣的,1、2圖同顏色的點代表了同一個東西;
問題1:
這里的輸入xt和ht是怎么結合的?比如:
這塊兒很多地方都沒講清楚,實際上就是concat,直接concat起來了:
問題2:LSTM的權重到底是啥樣的?
這里直接以tf.keras的代碼為例子看看就造了:
def build_model(look_back: int, batch_size: int=1) -> Sequential:model = Sequential()model.add(LSTM(units=128,activation='relu',batch_input_shape=(batch_size, look_back, 1),stateful=True,return_sequences=False))model.add(Dense(1, activation='linear'))model.compile(loss='mean_squared_error', optimizer='adam')return model model = build_model(28, batch_size=1)首先,當我們的units=128的時候,LSTM的最終輸出(僅考慮最后一個時間步輸出,并且不考慮sequence的輸出)就是128維的向量定下來了,對應的輸出就是:
這里的最后一個ht的部分,注意這個ht既可以作為最終的輸出,也是時間中的hidden state輸入到下一個時間點的前向傳播中去。
model.layers[0].trainable_variablesParam <tf.Variable 'lstm_4/lstm_cell_4/recurrent_kernel:0' shape=(128, 512) dtype=float32, numpy=
array([[ 3.0333996e-03, 1.4155725e-02, -3.9381277e-02, ...,
4.0887762e-02, -3.1605218e-02, -1.7439183e-02],
[-5.2204579e-02, 1.6296864e-02, 4.4382092e-02, ...,
2.1501739e-02, 5.1224865e-02, -5.1180001e-02],
[ 1.9754471e-02, -2.7741276e-02, -3.0992866e-02, ...,
1.8080823e-02, -2.1589132e-02, 8.2989247e-04],
...,
[-2.9214425e-05, -2.5351198e-02, -4.1916996e-02, ...,
-5.0040476e-02, -1.1436570e-02, 4.7302879e-02],
[-4.4846401e-02, 3.3629253e-03, 1.7752033e-02, ...,
-4.5454025e-02, -8.5912934e-03, -1.8942051e-02],
[-1.8914735e-02, -4.9705409e-02, -5.3823508e-02, ...,
3.6144644e-02, -2.1415317e-02, 1.5490238e-02]], dtype=float32)>:
(截圖不知道怎么搞的一直上傳失敗)
可以看到,LSTM層一共有3組參數,第一組是512個參數,我們的LSTM的units設置為128,因此
這里的四個門,每一個門對應一個dense層,將input映射為128維,4個門一共4*128=512個參數,對應的就是第1組權重,注意,這里我們的輸入的維度是1,因為就是簡單的序列數據,沒有其它的,所以這里第一個矩陣權重為(1,512),如果是embedding的話,比如embedding的維度是100,那么就是(100,512),tensorflow.keras這里把多個門的權重合并到一起來了。。。看了半天才看明白,其實嚴格一點應該是 4個 1*128的小矩陣,估計是為了工程上的便利和優化直接合并到一起了;
那么第三組的權重也很好理解,就是bias,
512個bias分別分配到這4個門的計算中;
最后是第二組權重,實際上就是
上一個時間步的ht-1到4個門的映射
我們前面說過上一個時間步的ht-1和這個時刻的輸入xt是concat的,所以應該是(128+1)*128*4 這樣比較好理解,不過tf.keras的權重不是按照這樣保存的就是了,所以看代碼的時候會有一點疑惑,不過總算看明白了shift~
問題3 LSTM的兩個dropout是drop啥?
LSTM中有兩個dropout的參數:
一個是
| dropout: Float between 0 and 1. Fraction of the units to drop for the linear
| transformation of the inputs. Default: 0.
這個dropout實際上就是輸入X的dropout,
也就是這個部分做dropout
一個是
| recurrent_dropout: Float between 0 and 1. Fraction of the units to drop for
| the linear transformation of the recurrent state. Default: 0.
是針對于這個部分做dropout,
常規的dropout層是對LSTM最終的輸出進行dropout。
問題四 :stateful LSTM 和 stateless LSTM有啥區別?
首先我們需要知道的是,我們平常大部分時候使用的LSTM都是屬于stateless LSTM。
舉個例子,比如情感分析:
“我 喜歡 你”當我們把這個句子的每個詞embedding之后進入上面的這個LSTM的結構,到最終的時間步后,輸出結束,此時,ht作為輸出接一個分類層完成任務。
這個時候,tf.keras中的LSTM默認會reset_state,也就是
cell state和 hidden state都沒有消失了。然后進入下一個句子的前向傳播;
stateful LSTM則可以將當前句子的最終的cell state和hidden state的輸出作為下個句子的初始的cell state和hidden state。
stateful LSTM:能讓模型學習到你輸入的samples之間的時序特征,適合一些長序列的預測,哪個sample在前,那個sample在后對模型是有影響的。stateless LSTM:輸入samples后,默認就會shuffle,可以說是每個sample獨立,之間無前后關系,適合輸入一些沒有關系的樣本。詳細可見:尤魚哥:Keras之stateful LSTM全面解析+實例測試?zhuanlan.zhihu.com
很好理解了。
我們在做時間序列預測的時候可以同時考慮stateful LSTM和stateness LSTM看看哪個效果好。
總結
以上是生活随笔為你收集整理的lstm需要优化的参数_LSTM的物理结构和一些细节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python卷子_Python试卷
- 下一篇: c语言10个数如何求最大值,C语言,输入