看了一些LSTM的博客,都推薦看colah寫的博客《Understanding LSTM Networks》 來學習LSTM,我也找來看了,寫得還是比較好懂的,它把LSTM的工作流程從輸入到輸出整個擼了一遍,清晰地展示了整個流程,不足之處就是那個語言模型的例子不知道到底在表達什么。
But!
我覺得邱錫鵬老師的書寫得更好!我又要開始推薦這本免費的書了:《神經網絡與深度學習》。這本書第六章循環神經網絡的LSTM部分,闡述了為什么要引入門控機制、LSTM的工作流程、LSTM的數學表達式、LSTM它為什么就叫這個名兒以及其他變體,數學公式和圖都清晰明了,全是干貨。粉絲在視頻上看到自己的愛豆會想舔屏,我看這本書的時候想舔書。這本書比那本被吹上天的花書也好太多!真是低調的實力派,強推!
決定按照邱錫鵬老師的書來整理這部分知識點。
一、為什么要在循環神經網絡中引入門控機制?
引入門控機制是為了緩解循環神經網絡中的長期依賴問題。
回顧一下,如果t時刻的預測yt依賴於t-k時刻的輸入xt-k,當時間間隔k比較大時,容易出現梯度消失或梯度爆炸的問題,那么循環神經網絡就難以學習到如此久遠的輸入信息。在這種情況下,當目前的預測又需要用到比較久遠的信息時,就會出現長期依賴問題。
但是如果我們為了學習到非常久遠的信息,而把所有過去時刻輸入的信息都存儲起來的話,會造成隱狀態h上存儲信息的飽和與重要信息的丟失。為此,一種比較好的方案是引入門控機制來控制信息的累積速度,包括有選擇的加入新信息,並有選擇地遺忘之前積累的信息。這一類網絡稱為基於門控的循環神經網絡(Gated RNN)。比較經典的基於門控的循環神經網絡有長短期記憶網絡(LSTM)和門控循環單元網絡(GRU)。
二、長短期記憶網絡(LSTM)
(一)LSTM的網絡結構
在標准的RNN模型中,第t時刻的隱狀態輸出ht是由如下公式計算得到的:
U、W、b是神經網絡的參數,f(•)是非線性的激活函數,假設為Tanh函數。這一切計算是在一個隱藏層中完成的,這個隱藏層里就是用Tanh層做了非線性變換,如下圖所示:
那么,在LSTM中,就是對這個隱藏層A進行了精心設計,添加了除Tanh層以外的東西,來避免長期依賴問題,如下圖所示:
好,那接下來看,LSTM在這個隱藏層中到底添加了什么東西,做了哪些改進。
(二)LSTM的網絡改進
相對於傳統的RNN,LSTM的網絡結構有兩個改進:1是加入了新的內部狀態,2是引入了門機制。下面將用這個圖來解釋LSTM的運作流程,ct就表示當前的內部狀態,三個σ(•)則表示三種門。
1、新的內部狀態
LSTM網絡引入了一個新的內部狀態ct,一方面進行線性的循環信息傳遞,比如圖中的ct-1從左往右傳遞的過程,另一方面非線性地輸出信息給隱藏層的外部狀態ht ,比如圖中ct從上往下的傳遞過程。這個內部狀態ct的作用就是記錄到當前時刻t為止所有的歷史信息。傳遞的過程中會進行哪些計算,這里暫且按下不表。
2、門機制
LSTM網絡引入門機制來控制信息傳遞的路徑,一共有三個門:遺忘門ft,輸入門it,輸出門ot。LSTM網絡中的門不是一個二值變量(即只能取0或1),而是取值在(0,1)之間的“軟門”,表示以一定的比例讓信息通過。
- 三個門的作用為
當ft=0,it=1時,包含歷史信息的內部狀態ct-1被丟棄,歷史信息被清空,此時的內部狀態ct只記錄了t-1時刻的信息,也就是候選狀
態經過輸入 門it控制后留下的信息。
當ft=1,it=0時,內部狀態ct只復制了前一個內部狀態ct-1中的歷史信息,而不寫入由xt帶來的新信息。
當然這三個門是不會取到0或1這種極端值的。
- 三個門的計算公式如下
每個門都選擇sigmoid激活函數σ(•),輸出區間為(0,1),xt為當前時刻的輸出,ht-1為上一時刻的外部狀態。W*,U*,b*表示三個
門(三個神經層)中待學習的參數,*∈{i, f, o}。
(三)LSTM網絡的時間循環單元結構的計算過程
1、首先利用上一時刻的外部狀態ht-1和當前時刻的輸入xt,計算出三個門;
2、然后利用上一時刻的外部狀態ht-1和當前時刻的輸入xt,計算出候選狀態:
3、結合遺忘門ft、輸入門it、上一時刻的內部狀態ct-1和候選狀態,計算當前的內部狀態ct:
4、把當前內部狀態ct扔進tanh激活函數中,結合輸出門ot,將內部狀態的信息傳遞給外部狀態ht。
再次對照下面這個圖,結合上面這四個步驟,那么LSTM網絡的計算過程就比較清楚了。外部狀態ht最終以兩條路徑進行下一步傳遞:一條路徑是跳出了這個框,從下往上輸出給了另一隱藏層或者輸出層;另一條路徑是按時間循環,傳遞給了下一時刻,用來計算ht+1。下面這個圖只表示了第2條路徑。
通過LSTM的內部狀態記錄所有時刻的歷史信息,整個網絡就可以建立較長距離的時序依賴關系。
以上的工作流程可以用簡潔的公式概括為:
(四)什么是長短期記憶?
在循環神經網絡中,記憶能力分為短期記憶、長期記憶和長短期記憶。
1、短期記憶
短期記憶指簡單循環神經網絡中的隱狀態h。因為隱狀態h存儲了歷史信息,但是隱狀態每個時刻都會被重寫,因此可以看做是一種短期記憶(short-term memory)。
2、長期記憶
長期記憶指神經網絡學習到的網絡參數。因為網絡參數一般是在所有“前向”和“后向”計算都完成后,才進行更新,隱含了從所有訓練數據中學習到的經驗,並且更新周期要遠遠慢於短期記憶,所以看做是長期記憶(long-term memory)。
3、長短期記憶
在LSTM網絡中,由於遺忘門的存在,如果選擇遺忘大部分歷史信息,則內部狀態c保存的信息偏於短期,而如果選擇只遺忘少部分歷史信息,那么內部狀態偏於保存更久遠的信息,所以內部狀態c中保存信息的歷史周期要長於短期記憶h,又短於長期記憶(網絡參數),因此稱為長短期記憶(long short-term memory)。
三、LSTM的變體:GRU
對LSTM的門機制進行改進可以得到多種變體,而GRU(Gated Recurrent Unit,門控循環單元網絡)就是其中一種比LSTM網絡更簡單的循環神經網絡。
GRU網絡對LSTM網絡的改進有兩個方面:
1、將遺忘門和輸入門合並為一個門:更新門,此外另一門叫做重置門。
2、不引入額外的內部狀態c,直接在當前狀態ht和歷史狀態ht-1之間引入線性依賴關系。
GRU網絡的結構如下圖所示,第一眼看上去感覺好復雜啊,哪里簡單了,比LSTM復雜多了。
好,那接下來按輸入數據xt和歷史狀態ht-1在GRU網絡中流動的過程,來闡述GRU網絡的工作流程。
1、計算重置門rt和候選狀態
重置門rt用來控制候選狀態的計算是否依賴於上一時刻的狀態ht-1。
當前時刻的候選狀態為:
2、計算更新門zt和當前狀態ht
更新門zt用來控制當前狀態ht需要從歷史狀態ht-1中保留多少信息,以及需要從候選狀態中接收多少新信息。
然后計算出隱狀態ht:
可以看到,當zt=0,rt=1時,隱狀態ht為簡單循環神經網絡中的計算公式,GRU網絡退化為簡單循環神經網絡。
此外,把求隱狀態ht的公式整理如下,可以看到當前狀態ht和歷史狀態ht-1之間存在線性關系,也存在非線性關系,在一定程度上可以緩解梯度消失問題。
參考資料:
1、邱錫鵬:《神經網絡與深度學習》
2、colah:《Understanding LSTM Networks》
網址:http://colah.github.io/posts/2015-08-Understanding-LSTMs/