吳恩達深度學習筆記(116)-LSTM單元介紹

長短期記憶(LSTM(long short term memory)unit)

在上一個筆記中你已經學了GRU(門控循環單元)。它能夠讓你可以在序列中學習非常深的連接。其他類型的單元也可以讓你做到這個,比如LSTM即長短時記憶網絡,甚至比GRU更加有效,讓我們看看。

吳恩達深度學習筆記(116)-LSTM單元介紹

這裡是上個筆記中的式子,對於GRU我們有a^()=c^()。

還有兩個門:

更新門Γ_u(the update gate)

相關門Γ_r(the relevance gate)

̃c^(),這是代替記憶細胞的候選值,然後我們使用更新門Γ_u來決定是否要用̃c^() 更新c^()。

LSTM是一個比GRU更加強大和通用的版本,這多虧了 Sepp Hochreiter和 Jurgen Schmidhuber,感謝那篇開創性的論文,它在序列模型上有著巨大影響。感覺這篇論文是挺難讀懂的,雖然我認為這篇論文在深度學習社群有著重大的影響,它深入討論了梯度消失的理論,我感覺大部分的人學到LSTM的細節是在其他的地方,而不是這篇論文。

吳恩達深度學習筆記(116)-LSTM單元介紹

這就是LSTM主要的式子(上圖編號2所示),我們繼續回到記憶細胞c上面來,使用̃c^()=tanh(W_c [a^(),x^() ]+b_c來更新它的候選值̃c^()(上圖編號3所示)。

注意了,在LSTM中我們不再有a^()=c^()的情況,這是現在我們用的是類似於左邊這個式子(上圖編號4所示),但是有一些改變,現在我們專門使用a^()或者a^(),而不是用c^(),我們也不用Γ_r,即相關門。

雖然你可以使用LSTM的變體,然後把這些東西(左邊所示的GRU公式)都放回來,但是在更加典型的LSTM裡面,我們先不那樣做。

我們像以前那樣有一個更新門Γ_u和表示更新的參數W_u,Γ_u=σ(W_u [a^(),x^(

) ]+b_u)(上圖編號5所示)。一個LSTM的新特性是不只有一個更新門控制,這裡的這兩項(上圖編號6,7所示),我們將用不同的項來代替它們,要用別的項來取代Γ_u和1-Γ_u,這裡(上圖編號6所示)我們用Γ_u。

然後這裡(上圖編號7所示)用遺忘門(the forget gate),我們叫它Γ_f,所以這個Γ_f=σ(W_f [a^(),x^() ]+b_f)(上圖編號8所示);

然後我們有一個新的輸出門,Γ_o=σ(W_o [a^(),x^() ]+>b_o)(上圖編號9所示);

於是記憶細胞的更新值c^()=Γ_u*̃c^()+Γ_f*c^()(上圖編號10所示);

所以這給了記憶細胞選擇權去維持舊的值c^()或者就加上新的值̃c^(),所以這裡用了單獨的更新門Γ_u和遺忘門Γ_f,

然後這個表示更新門(Γ_u=σ(W_u [a^(),x^() ]+b_u)上圖編號5所示);

遺忘門(Γ_f=σ(W_f [a^(),x^() ]+b_f)上圖編號8所示)和輸出門(上圖編號9所示)。

最後a^()=c^()的式子會變成a^()=Γ_o*c^()。這就是LSTM主要的式子了,然後這裡(上圖編號11所示)有三個門而不是兩個,這有點複雜,它把門放到了和之前有點不同的地方。

吳恩達深度學習筆記(116)-LSTM單元介紹

再提一下,這些式子就是控制LSTM行為的主要的式子了(上圖編號1所示)。像之前一樣用圖片稍微解釋一下,先讓我把圖畫在這裡(上圖編號2所示)。如果圖片過於複雜,別擔心,我個人感覺式子比圖片好理解,但是我畫圖只是因為它比較直觀。

這個右上角的圖的靈感來自於Chris Ola的一篇博客,標題是《理解LSTM網絡》(Understanding LSTM Network),這裡的這張圖跟他博客上的圖是很相似的,但關鍵的不同可能是這裡的這張圖用了a^()和x^()來計算所有門值(上圖編號3,4所示),在這張圖裡是用a^(), x^()一起來計算遺忘門Γ_f的值,還有更新門Γ_u以及輸出門Γ_o(上圖編號4所示)。然後它們也經過tanh函數來計算̃c^()(上圖編號5所示),這些值被用複雜的方式組合在一起,比如說元素對應的乘積或者其他的方式來從之前的c^()(上圖編號6所示)中獲得c^()(上圖編號7所示)。

這裡其中一個元素很有意思,如你在這一堆圖(上圖編號8所示的一系列圖片)中看到的,這是其中一個,再把他們連起來,就是把它們按時間次序連起來,這裡(上圖編號9所示)輸入x^(<1>),然後x^(<2>),x^(<3>),然後你可以把這些單元依次連起來,這裡輸出了上一個時間的a,a會作為下一個時間步的輸入,c同理。

在下面這一塊,我把圖簡化了一下(相對上圖編號2所示的圖有所簡化)。然後這有個有意思的事情,你會注意到上面這裡有條線(上圖編號10所示的線),這條線顯示了只要你正確地設置了遺忘門和更新門,LSTM是相當容易把c^(<0>)的值(上圖編號11所示)一直往下傳遞到右邊,比如c^(<3>)=c^(<0>)(上圖編號12所示)。

這就是為什麼LSTM和GRU非常擅長於長時間記憶某個值,對於存在記憶細胞中的某個值,即使經過很長很長的時間步。

這就是LSTM,你可能會想到這裡和一般使用的版本會有些不同,最常用的版本可能是門值不僅取決於a^()和x^(),有時候也可以偷窺一下c^()的值(上圖編號13所示),這叫做“窺視孔連接”(peephole connection)。

雖然不是個好聽的名字,但是你想,“偷窺孔連接”其實意思就是門值不僅取決於a^()和x^(),也取決於上一個記憶細胞的值(c^()),然後“偷窺孔連接”就可以結合這三個門(Γ_u、Γ_f、Γ_o)來計算了。

如你所見LSTM主要的區別在於一個技術上的細節,比如這(上圖編號13所示)有一個100維的向量,你有一個100維的隱藏的記憶細胞單元,然後比如第50個c^()的元素只會影響第50個元素對應的那個門,所以關係是一對一的,於是並不是任意這100維的c^()可以影響所有的門元素。相反的,第一個c^()的元素只能影響門的第一個元素,第二個元素影響對應的第二個元素,如此類推。但如果你讀過論文,見人討論“偷窺孔連接”,那就是在說c^()也能影響門值。

LSTM前向傳播圖:

吳恩達深度學習筆記(116)-LSTM單元介紹

吳恩達深度學習筆記(116)-LSTM單元介紹

LSTM反向傳播計算:

門求偏導:

吳恩達深度學習筆記(116)-LSTM單元介紹

參數求偏導 :

吳恩達深度學習筆記(116)-LSTM單元介紹

為了計算db_f,db_u,db_c,db_o 需要各自對dΓ_f^(⟨t⟩),dΓ_u^(⟨t⟩),d̃c^(⟨t⟩),dΓ_o^(⟨t⟩) 求和。

最後,計算隱藏狀態、記憶狀態和輸入的偏導數:

吳恩達深度學習筆記(116)-LSTM單元介紹

這就是LSTM,我們什麼時候應該用GRU?什麼時候用LSTM?這裡沒有統一的準則。

而且即使先講解了GRU,在深度學習的歷史上,LSTM也是更早出現的,而GRU是最近才發明出來的,它可能源於Pavia在更加複雜的LSTM模型中做出的簡化。研究者們在很多不同問題上嘗試了這兩種模型,看看在不同的問題不同的算法中哪個模型更好,所以這不是個學術和高深的算法,我才想要把這兩個模型展示給你。

GRU的優點是這是個更加簡單的模型,所以更容易創建一個更大的網絡,而且它只有兩個門,在計算性上也運行得更快,然後它可以擴大模型的規模。

但是LSTM更加強大和靈活,因為它有三個門而不是兩個

如果你想選一個使用,我認為LSTM在歷史進程上是個更優先的選擇,所以如果你必須選一個,我感覺今天大部分的人還是會把LSTM作為默認的選擇來嘗試。雖然我認為最近幾年GRU獲得了很多支持,而且感覺越來越多的團隊也正在使用GRU,因為它更加簡單,而且還效果還不錯,它更容易適應規模更加大的問題。

所以這就是LSTM,無論是GRU還是LSTM,你都可以用它們來構建捕獲更加深層連接的神經網絡。

(Hochreiter S, Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8):1735-1780.)


分享到:


相關文章: