lstm需要优化的参数_LSTM的物理结构和一些细节
這個(gè)是網(wǎng)上看的最多的圖了,但是在理解lstm的應(yīng)用過(guò)程中的時(shí)候這個(gè)圖帶來(lái)了不少麻煩。
展開(kāi)之后實(shí)際的物理結(jié)構(gòu)是這樣的,1、2圖同顏色的點(diǎn)代表了同一個(gè)東西;
問(wèn)題1:
這里的輸入xt和ht是怎么結(jié)合的?比如:
這塊兒很多地方都沒(méi)講清楚,實(shí)際上就是concat,直接concat起來(lái)了:
問(wèn)題2:LSTM的權(quán)重到底是啥樣的?
這里直接以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)首先,當(dāng)我們的units=128的時(shí)候,LSTM的最終輸出(僅考慮最后一個(gè)時(shí)間步輸出,并且不考慮sequence的輸出)就是128維的向量定下來(lái)了,對(duì)應(yīng)的輸出就是:
這里的最后一個(gè)ht的部分,注意這個(gè)ht既可以作為最終的輸出,也是時(shí)間中的hidden state輸入到下一個(gè)時(shí)間點(diǎn)的前向傳播中去。
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組參數(shù),第一組是512個(gè)參數(shù),我們的LSTM的units設(shè)置為128,因此
這里的四個(gè)門,每一個(gè)門對(duì)應(yīng)一個(gè)dense層,將input映射為128維,4個(gè)門一共4*128=512個(gè)參數(shù),對(duì)應(yīng)的就是第1組權(quán)重,注意,這里我們的輸入的維度是1,因?yàn)榫褪呛?jiǎn)單的序列數(shù)據(jù),沒(méi)有其它的,所以這里第一個(gè)矩陣權(quán)重為(1,512),如果是embedding的話,比如embedding的維度是100,那么就是(100,512),tensorflow.keras這里把多個(gè)門的權(quán)重合并到一起來(lái)了。。。看了半天才看明白,其實(shí)嚴(yán)格一點(diǎn)應(yīng)該是 4個(gè) 1*128的小矩陣,估計(jì)是為了工程上的便利和優(yōu)化直接合并到一起了;
那么第三組的權(quán)重也很好理解,就是bias,
512個(gè)bias分別分配到這4個(gè)門的計(jì)算中;
最后是第二組權(quán)重,實(shí)際上就是
上一個(gè)時(shí)間步的ht-1到4個(gè)門的映射
我們前面說(shuō)過(guò)上一個(gè)時(shí)間步的ht-1和這個(gè)時(shí)刻的輸入xt是concat的,所以應(yīng)該是(128+1)*128*4 這樣比較好理解,不過(guò)tf.keras的權(quán)重不是按照這樣保存的就是了,所以看代碼的時(shí)候會(huì)有一點(diǎn)疑惑,不過(guò)總算看明白了shift~
問(wèn)題3 LSTM的兩個(gè)dropout是drop啥?
LSTM中有兩個(gè)dropout的參數(shù):
一個(gè)是
| dropout: Float between 0 and 1. Fraction of the units to drop for the linear
| transformation of the inputs. Default: 0.
這個(gè)dropout實(shí)際上就是輸入X的dropout,
也就是這個(gè)部分做dropout
一個(gè)是
| recurrent_dropout: Float between 0 and 1. Fraction of the units to drop for
| the linear transformation of the recurrent state. Default: 0.
是針對(duì)于這個(gè)部分做dropout,
常規(guī)的dropout層是對(duì)LSTM最終的輸出進(jìn)行dropout。
問(wèn)題四 :stateful LSTM 和 stateless LSTM有啥區(qū)別?
首先我們需要知道的是,我們平常大部分時(shí)候使用的LSTM都是屬于stateless LSTM。
舉個(gè)例子,比如情感分析:
“我 喜歡 你”當(dāng)我們把這個(gè)句子的每個(gè)詞embedding之后進(jìn)入上面的這個(gè)LSTM的結(jié)構(gòu),到最終的時(shí)間步后,輸出結(jié)束,此時(shí),ht作為輸出接一個(gè)分類層完成任務(wù)。
這個(gè)時(shí)候,tf.keras中的LSTM默認(rèn)會(huì)reset_state,也就是
cell state和 hidden state都沒(méi)有消失了。然后進(jìn)入下一個(gè)句子的前向傳播;
stateful LSTM則可以將當(dāng)前句子的最終的cell state和hidden state的輸出作為下個(gè)句子的初始的cell state和hidden state。
stateful LSTM:能讓模型學(xué)習(xí)到你輸入的samples之間的時(shí)序特征,適合一些長(zhǎng)序列的預(yù)測(cè),哪個(gè)sample在前,那個(gè)sample在后對(duì)模型是有影響的。stateless LSTM:輸入samples后,默認(rèn)就會(huì)shuffle,可以說(shuō)是每個(gè)sample獨(dú)立,之間無(wú)前后關(guān)系,適合輸入一些沒(méi)有關(guān)系的樣本。詳細(xì)可見(jiàn):尤魚哥:Keras之stateful LSTM全面解析+實(shí)例測(cè)試?zhuanlan.zhihu.com
很好理解了。
我們?cè)谧鰰r(shí)間序列預(yù)測(cè)的時(shí)候可以同時(shí)考慮stateful LSTM和stateness LSTM看看哪個(gè)效果好。
總結(jié)
以上是生活随笔為你收集整理的lstm需要优化的参数_LSTM的物理结构和一些细节的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python卷子_Python试卷
- 下一篇: c语言10个数如何求最大值,C语言,输入