上一節(jié)我們介紹了RNN網(wǎng)絡(luò)層的記憶性原理,同時(shí)使用了keras框架聽過的SimpleRNN網(wǎng)絡(luò)層到實(shí)際運(yùn)用中狡忙。然而使用的效果并不理想荐糜,主要是因?yàn)閟impleRNN無法應(yīng)對過長單詞串的輸入局服,在理論上,當(dāng)它接收第t個(gè)輸入時(shí)袍嬉,它應(yīng)該能把前面好幾個(gè)單詞的處理信息記錄下來,但實(shí)際上它無法把前面已經(jīng)處理過的單詞信息保留到第t個(gè)單詞輸入的時(shí)刻。
出現(xiàn)這種現(xiàn)象的原因叫"Vanishing gradian problem"伺通,我們以前說要更新某個(gè)鏈路權(quán)重中箍土,需要對它求偏導(dǎo)數(shù),但在某種情況下罐监,我們求得的偏導(dǎo)數(shù)可能接近于0吴藻,這樣一來鏈路權(quán)重就得不到有效更新,因?yàn)楫?dāng)權(quán)重加上一個(gè)很接近于0的偏導(dǎo)數(shù)時(shí)弓柱,它不會產(chǎn)生顯著的變化沟堡。這種現(xiàn)象也會出現(xiàn)在feed forward網(wǎng)絡(luò),當(dāng)網(wǎng)絡(luò)有很多層時(shí)矢空,我們會把誤差進(jìn)行回傳航罗,但層次過多時(shí),回傳的誤差會不斷的被“沖淡”屁药,直到某個(gè)神經(jīng)元接收到回傳的誤差是粥血,該誤差的值幾乎與0差不多大小,這樣求出的偏導(dǎo)數(shù)也接近與0酿箭,因此鏈路權(quán)重就得不到有效的更新复亏。
這種現(xiàn)象被人工置頂?shù)娜淮笈ochreiter,Schmidhuber,Bengio深入研究后缭嫡,他們提出一種新型網(wǎng)絡(luò)層叫LSTM和GRU以便接近偏導(dǎo)數(shù)接近于0使得鏈路權(quán)重得不到有效更新的問題缔御。LSTM的全稱是Long Short term memory,也就是長短程記憶,它其實(shí)是我們上節(jié)使用的simpleRNN變種妇蛀,設(shè)想當(dāng)單詞一個(gè)個(gè)輸入網(wǎng)絡(luò)時(shí)耕突,旁邊還有一條傳送帶把相關(guān)信息也輸入網(wǎng)絡(luò),如下圖:
這里我們多增加一個(gè)變量C來記錄每一個(gè)單詞被網(wǎng)絡(luò)處理后遺留下來的信息讥耗,網(wǎng)絡(luò)的激活函數(shù)還是不變有勾,但是我們要增加多幾個(gè)變量來計(jì)算變量C:
i_t = activation(dot(state_t, Ui) + dot(input_t, wi) + bi)
f_t =activation(dot(state_t, Uf) + dot(input_t, wf) + bf)
k_t=activation(dot(state_t, Uk) + dot(input_t, wk) + bk)
那么C的更新方式為:
C = i_t * k_t + Cf_t
初看起來,邏輯很難理解古程,為何我們要增加這些不知所云的步驟呢蔼卡,它蘊(yùn)含著較為復(fù)雜的設(shè)計(jì)原理和數(shù)學(xué)原理,簡單來說Cf_t目的是增加一些噪音挣磨,讓網(wǎng)絡(luò)適當(dāng)?shù)摹巴洝币郧坝?jì)算留下了的信息雇逞,i_t*k_t是讓網(wǎng)絡(luò)增強(qiáng)最近幾次計(jì)算所遺留下來的信息 ,這里我們不深究茁裙,只要囫圇吞棗塘砸,知道新增加的變量C是用來幫助網(wǎng)絡(luò)增強(qiáng)對以前信息處理的記憶,并指導(dǎo)該變量如何更新就好晤锥,接下來我們看看LSTM網(wǎng)絡(luò)的具體應(yīng)用實(shí)例:
from keras.layers import LSTM
model = Sequential()
model.add(Embedding(max_features, 32))
model.add(LSTM(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
history = model.fit(input_train, y_train, epochs=10, batch_size=128, validation_split=0.2)
我們繼續(xù)使用上一節(jié)的數(shù)據(jù)作為網(wǎng)絡(luò)輸入掉蔬,上面代碼運(yùn)行后廊宪,我們再將它的訓(xùn)練結(jié)果繪制出來,結(jié)果如下:
上一節(jié)我們使用SimpleRNN網(wǎng)絡(luò)層時(shí)女轿,網(wǎng)絡(luò)對校驗(yàn)數(shù)據(jù)的判斷準(zhǔn)確率為85%左右箭启,這里我們使用LSTM網(wǎng)絡(luò)層,網(wǎng)絡(luò)對校驗(yàn)數(shù)據(jù)的準(zhǔn)確率可以提升到89%蛉迹,這是因?yàn)長STM比SimpleRNN對網(wǎng)絡(luò)以期出來過的數(shù)據(jù)有更好的“記憶”功能傅寡,更能將以前處理過的單詞與現(xiàn)在處理的單詞關(guān)聯(lián)起來。
更詳細(xì)的講解和代碼調(diào)試演示過程北救,請點(diǎn)擊鏈接
更多技術(shù)信息荐操,包括操作系統(tǒng),編譯器珍策,面試算法托启,機(jī)器學(xué)習(xí),人工智能膛壹,請關(guān)照我的公眾號: