1. 程式人生 > >深度學習---迴圈神經網路RNN詳解(LSTM)

深度學習---迴圈神經網路RNN詳解(LSTM)

上一節我們詳細講解了RNN的其中一個學習演算法即BPTT,這個演算法是基於BP的,只是和BP不同的是在反向傳播時,BPTT的需要追溯上一個時間的權值更新,如下圖,當前時刻是s(t),但是反向傳播時,他需要追溯到上一個時間狀態即s(t-1),s(t-2),....直到剛開始的那個時間,但是根據BP我們知道存在一個梯度消失的問題,因此追溯的層數越深,梯度消失的越厲害,基本上追溯到5個時間段時梯度就為0了,另外這裡需要再次強調的是每一次追溯上一個時間狀態權值更新時是更新所有的u和v的即聯動的,因此這裡的u和v 的更新是累加的,原因就體現在這裡,他每追溯上一層權值更新,其他的層的更新也會跟著變化,簡單來說,就是每追溯一層權值就會疊加更新即上一層的疊加。這裡需要大家理解,也就是說,雖然RNN實際就三層,但是隨著RNN的時序展開機會變得很深,也因此會出現梯度消失的現象,一旦出現梯度消失帶來的問題是什麼的呢?

我們都知道RNN的強項是針對時間序列的進行處理,在自然語言處理中我們判斷一句話往往需要上下檔案資訊進行判斷,如果上下文間隔很長,因為RNN存在梯度消失的情況,因此可能很遠的上下文就無法起到用處了,怎麼辦呢?具體如下圖:

 從上圖我們可以看到,隨著追溯的時間越長,其梯度消失 的越厲害,直到完全消失,如何解決呢?LSTM可以很好的解決這個問題,下面我們看看到底怎麼解決的:

我們知道了BPTT的缺點是梯度消失,他是由什麼引起的呢?下面我們詳細看看:我們知道引起梯度消失是因為誤差反向傳播,下面簡單的把BPTT的公式拿過來:

                           其中                 

 

                                                   

                                                 

上面是標準的BP的反向傳播誤差,最後一個公式是隱層的權值更新,即當前時刻需要下一時刻的誤差(這裡和上面的表達可能有點衝突,不過道理是一樣的,大家需要適應),這樣才叫誤差反向傳播,這裡我們看一次的傳播:

通過上式我們發現誤差訊號即梯度取決於三個量即\large f'(\bullet )\large \upsilon\large w,那麼梯度的 消失直接由這三個引數決定,消失的原因是每次乘積小於1,從這個公式中如何解決問題呢?

Naive Approach

這裡我們知道其中\large \upsilon是後面的時間序列傳過來的數,這裡無法改變,那麼我們能不能讓\large f'(\bullet )w做恆等對映的天真想法呢?即如下:

很天真的想法,這樣做當然可以了,怎麼實現呢?這裡\large w_{ii}是隱層的延遲疊加的引數即追溯時間的引數,這裡大家別暈了,如何實現呢?我們可以使\large w_{ii}=1,而\large f(x)=x為恆等對映和我們前面的深度殘差網路類似的對映,這樣才能保證乘積為1,因此這樣可行即:           

 帶進去上面的式子得到:

                                             

使 \large w_{ii}=1\large f(x)=x會帶來什麼問題呢?問題很嚴重,主要表現在兩方面即輸入權值衝突和輸出權值衝突:

1.輸入權值衝突:

加入上式就是RNN的輸入和隱層,\large w_{ij}就是輸入到隱層的權值,\large w_{jj}就是隱層延遲一個單元反饋給隱層的權值,這裡給恆值為1,同時啟用函式為恆等對映即\large f(x)=x,這樣做會帶來什麼問題呢?加入我們輸入的是句子,那麼當前時刻t的詞受到前面的某一個t-a時刻的狀態影響,其他時刻的狀態和當前時刻沒影響,現在我們想要的效果是t-a的那個狀態對當前時刻的影響大一點即\large w_{ij}儘量大一點,其他狀態的權值儘量的小,這樣才能體現之前的時刻影響當前時刻的要求,但是按照我們上的設定,很明顯是有衝突的,因為他是恆等對映而且\large w_{ij}=1,也就是說無論前面的哪一個時刻的狀態我都讓他影響當前時刻輸入的狀態,這樣明顯不是我們想要的,因此矛盾就出現了。出現矛盾的原因是我們把權值設定為1了,但是我們設定權值為1的目的是為了解決梯度消失問題,因此第一矛盾就是這樣形成的。

2.輸出權值衝突:

輸出和輸入是類似的,這裡我們需要通過調整\large w_{kj}來調整輸出的大小,這樣才能篩選輸出的大小,然而輸出的權值\large w_{kj}取決於隱層的輸出的大小進行調節的,這裡我們就需要隱層的大小可大可小,這樣調整調整的目的就是我們希望相鄰時間序列對當前的神影響大一些,很長時間的對其影響小一點,但是想達到這樣的效果需要就需要隱層權值\large w_{ij}可變化調整,但是我們設定的是為1,啟用函式為恆等對映所有無論什麼時間的他都會影響輸出的權值,這不是我們想要的,這也是衝突的根源的了。

因此因為上面的兩個缺點才導致RNN沒有什麼具體的使用價值,但是後面出現了LSTM才很好的解決了這個問題,也因此RNN得到了大範圍的使用,尤其在時間序列的場合如自然語言處理更是發揮巨大的作用,下面我們就詳細的看看LSTM是如何解決這個問題的。

 LSTM(LONG SHORT-TERM MEMORY)

原始LSTM:

這裡我們根據原始論文的圖進行講解,雖然現在的LSTM和原先的有所不同,但是它還是在原始的LSTM的基礎上進行演變,大家只要深入理解這個原始的LSTM 的原理,在學習新的LSTM就會覺得很簡單,上面我們討論了為了解決RNN的梯度消失問題,我們引入了天真的方法即Naive Approach,但是帶來了更多的問題,即無法解決我們想要達到的效果,為了解決這個問題,研究者們又引入了新的解決方法即原始的LSTM,下面我們就來看看到底是如何解決的:

這裡大家千萬別被圖嚇到了,其實很簡單的,這裡我會相信的介紹的,上圖被正方形覆蓋的就是“隱層”了,我們現在從左向又看,首先輸入乘上\large W_{c_ji}代表的輸入權值(\large c_j表示第j個記憶細胞,就是說上面的方塊內是一個記憶細胞),然後輸入到啟用函式\large g(\bullet ) ,然後輸出,此時通過黑點(相乘)即\large gy^{in_j},這裡的g大家知道是輸入值,而\large y^{in^j}是一個開關即門函式,他輸出一個0到1的數,然後和g相乘,作用等會解釋。相乘以後就進入了核心區即紅線畫的地方,這裡其實就是我們上面說的天真方法即恆等對映和權值為1(從這一步我們可以看出原始的LSTM還是希望解決梯度消失的問題),經過天真處理後,開始通過隱層的啟用函式h然後繼續向後傳,此時會到達一個黑點(相乘)即\large hy^{out_j},同樣的這裡的\large y^{out_j}也是一個門函式,稍後解釋。通過門函式以後就乘上權值輸出了,整體是這樣工作的,從上面的工作方式我們可以看到,LSTM是在天真的方法的基礎上進行改進的,即還是希望解決梯度消失問題,但是這樣做會引入我們上面討論的兩個衝突,為了解決這兩個衝突,又引入了們函式即\large y^{in^j}\large y^{out_j},這兩個函式有什麼用呢?這兩個函式主要是決定是否允許資料通過的作用,這裡以\large y^{in^j}為例講解,我們輸入的有沒有效果取決於\large y^{in^j}的大小,如果\large y^{in^j}=0,則輸入完全被斷開了即不允許輸入進來,如果\large y^{in^j}=1,則輸入完全通過,如果取值在0,1之間說明允許部分通過,同理輸出\large y^{out_j}也是這樣的功能,引入這兩個門有什麼好處呢?其實大家可以想想,若果RNN的隱層反向傳播,此時當前時刻的輸入和前一時刻的輸入一起進來,通過這裡的門就可以控制上一時刻進入的量,這樣就解決了我們最初的想法即我希望前某一時刻對當前影響大就讓其通過,影響小使其不通過,同時梯度不會消失,很巧妙的解決了難題,同時達到我們想要的效果,這裡大家需要好好理解一下,那大家會不會困惑就怎麼設定他什麼時候開啟什麼時候關閉呢?這個只需要通過資料訓練即可,使其自動調整好,只有怎麼訓練就是我們下面需要詳細說的,這裡大家需要先整體理解他的工作原理。

    到這裡我們找到了解決方面即設定兩個門,控制這兩個門的大小就可以完美解決問題,現在的問題是如何設定這兩個門?門和什麼有關?如何訓練呢?

下面先給出上圖的數學描述:

先給出兩個門的表示式:

這裡大家應該都能看懂的,門函式也是需要啟用函式的,上圖沒標明,下面繼續:

 上式的求和是什麼意思呢?就是說門函式的輸入可能來源輸入單元、門單元、記憶細胞、還有可能是‘隱層’單元。下面我們具體來看一下他們的輸入到底來源哪些:

這就是基於LSTM的神經網路,上面我們說了他們是一個整體即一個記憶細胞,如上圖,這裡也有輸入門和輸出門,這裡我以in1為例進行講解他的輸入來源哪裡(看不清的下面我出論文,大家看原始論文),in1的輸入來源輸入和in1的輸出、out1的輸出、以及cell1的輸出和cell2的輸出,如上面的紅線標註。這裡大家還有繼續看LSTM的圖,需要繼續討論:

我們看到:

 這個是什麼意思呢?這個就是追溯上一時刻的寫法,其實就是累加(上一節討論了),上一時刻的累加取決於門函式,因此起到控制作用,下面給出詳細的公式:

 這個大家應該能看懂了,就不詳細解釋了,好,上面就是最初的LSTM,我們看看現代版的LSTM:

現代LSTM

我們發現和我們上面的很像,不同的是這裡多了一個忘記門,這個門是直接對細胞操作的,他有什麼作用呢?他是模擬人腦提出的,即短時間的我們記住他,時間太長的我們選擇忘記他,應該是根據這個思想吧(我猜的),反正這是後面新增上去的,那我們看看這三個門的輸入是那些?我就不詳細說了,大家看看就可以了:

 上面的輸入很類似,不同的是作用的地點不同,至於他們什麼時候開什麼時候關,就是通過訓練他們的權值進行確定了,下面再給出一個訓練好的圖:

下面把學習演算法說一下,大家看下面的公式時需要時刻看上面的那個輸入輸出忘記門是來源哪幾個,這裡我急不詳細介紹了,直接把原始論文的公式搬來了,大家也可以看看原始論文,學習演算法是基於梯度的即:

前項傳播

輸入門:

忘記門:

細胞:

輸出門:

細胞輸出:

 反向傳播:

細胞輸出:

輸出門:

states(狀態) :

細胞:

忘記門:

輸入門:

 參考論文有:

BackPropagation Through Time、Learning_Long-Term_Dependencies_with_Gradient_Descent_is_Difficult

LONG SHORT-TERM MEMORY、Supervised-Sequence-Labelling-with-Recurrent-Neural-Networks

寫吐了,本節結束,深度學習也結束了,下面寫寫這段時間的總結,然後開始自然語言處理的總結。