1. 程式人生 > >迴圈神經網路(RNN)的改進——長短期記憶LSTM

迴圈神經網路(RNN)的改進——長短期記憶LSTM

 

 

 一:vanilla RNN

   使用機器學習技術處理輸入為基於時間的序列或者可以轉化為基於時間的序列的問題時,我們可以對每個時間步採用遞迴公式,如下,We can process a sequence of vector x by applying a recurrence formula at every time step:   

                  h= fW( ht-1,x)

   其中xt 是在第t個時間步的輸入(input vector at time step t);h

是新狀態量(new state),蘊含著前t個時間步的資訊,在處理完xt後產生;ht-1 是前一個狀態量(old state),蘊含著前t-1個時間步的資訊,在處理完xt-1後產生;f是引數為W的從輸入到輸出的連線,在每個時間步都相同,反向傳播對它的引數W進行優化。

  original的RNN是這樣的(以下簡稱vanilla RNN):

  對於每個時間步:

    ht = tanh(Whh • ht-1 + Wxh • xt)  或者用矩陣表示——ht = tanh( W • [ht-1,xt]

)

    yt= Why • ht

    圖示:(當然描述它的圖有很多,我自己畫的這個比較直觀易懂)

 

 

  訓練模型優化引數的時候通過基於時間的反向傳播(BPTT)進行優化,這裡不廢話了,一個圖就說明白了:(來自斯坦福Lecture 10 | Recurrent Neural Networks)

  當時間步數大的時候也就是時間步數多的時候,vanillaRNN便不可避免的遇到了梯度爆炸(gradient exploding)與梯度消失(gradient vanishing)。如果引數大於1,backprop累乘下去,就會導致梯度很大——>+∞;如果引數小於1,backprop累乘下去,就會導致梯度很小——>0。為了對付這個問題,有人基於vanillaRNN設計了新的結構,LSTM與GRU相繼被提出來。

 

 二:LSTM

 

  先看LSTM,vanillaRNN只有一個時序狀態h,而LSTM有兩個分別是h和c。LSTM將vanillaRNN的每個時序塊改成一個cell,對於每個cell輸入分別是xt,ht-1,ct-1,輸出是ct和h。結構圖如下:

 

 

  在LSTM的cell內部有四個門(gate)分別是f,i,g,o,

 

    f:whether to erase cell

 

    i:whether to write to cell

 

    g:how much to write to cell

 

    o:how much to reveal cell

 

  數學表達是這樣的:

     

    ct = fꙨ ct-1 + i Ꙩ g

    ht = o Ꙩ  tan(ct

  反正讓我看一眼結構圖就記住LSTM結構,呃,懸,但是這個矩陣式子一扔立馬就印刻在腦子裡了。

  前向傳播弄明白了,那反向傳播呢?

  xxxxxxxxxxxxxxxxxxxxx

 三:讀論文《long short term memory》

>>hochriter做了六個實驗,分別是:(不好意思我只看了其中1,2,4三個實驗QAQ)

  實驗1,the embedded Reber grammar。聚焦於遞迴單元的標準基準測試(a standard benchmark test for recurrent nets)。Reber grammar是字串生成器,實驗要用LSTM來學習它。如果不知道什麼是Reber grammar可以看這裡:https://willamette.edu/~gorr/classes/cs449/reber.html,實驗使用了7 input units & 7 output units,除了h門[-1,1]和g門[-2,2],其他的sigmoid啟用後都在[0,1]的範圍。除了output門的bias分別初始成-1,-2,-3,其他權重初始都是[-0.2,0.2]。學習率嘗試了0.1,0.2,0.5。訓練集和測試集分別有256個字串樣本,均是隨機生成且免重。實驗使用了三組不同的訓練測試集。該實驗說明了output門的重要性。Learning to store the first T or P should not perturb activations representing the more easily learnable transitions of the original Reber grammar。

  實驗2,noise-free and noisy sequences。

——"noise-free sequences with long time lags".有p+1個可能的輸入符號,我們用a1,......,ap-1,ap=x,ap+1=y來表示。每個元素用p+1維的one_hot向量表示。有著p+1個輸入單元和p+1個輸出單元的網路模型序列地每個時間步讀一個符號,並預測下一個符號。每個時間步都產生誤差訊號error signal。訓練集僅由兩個非常相似的序列(y , a1,......,ap-1 , y)和(x , a1,......,ap-1 , x)組成,每個序列被選擇的概率相等。為了預測出最後一個元素,網路模型必須學會經過p個時間步依舊儲存著第一個元素的資訊。作者把LSTM與RTRL和BPTT以及Neural Sequence Chunker作比較,權重初始化[-0.2,0.2],訓練使用了5百萬個sequence presentations。訓練好之後,當序列很長時,BPTT和RTRL都失敗了,只有LSTM和CH成功。p=100的時候,2 -net sequence chunker成功了三分之一的嘗試,而LSTM完美通過測試。

——"no local regularities",作者說,上面的實驗中chunker有時成功預測了序列的最後元素,是因為學到了一些可預測的區域性規則。那我給換個更難的訓練集,看看誰還能繼續牛逼。We remove compressibility by replacing the deterministic subsequence() by a random subsequence of length p-1 over the alphabet a1,a2,...,ap-1. We obtain 2 sets of sequences {(y , ai1,......,aip-1 , y)|1<=i1,i2,...,ip-1<=p-1} and {(x , ai1,......,aip-1 , x)|1<=i1,i2,...,ip-1<=p-1} 。 結果chunker敗下陣來,LSTM笑到了最後(此處滑稽臉.jpg)。說明了LSTM的成功根本就不需要local regularities。

——"very long time lags——no local regularities".這個是實驗2的極限測試了。在LSTM出現之前還沒有迴圈神經網路的模型能完美通過這個測試。有p+4個可能的輸入符號,分別為a1,......,ap ,ap+1=e,ap+2=b,ap+3=x,ap+4=y。我們把a1,......,a稱為"distractor symbols"。網路模型有p+4個輸入,2個輸出。訓練樣本序列從 這兩個集合中隨機選取。隨機生成長度q+2的序列字首,後續元素有9/10的可能性隨機生成(不包括b,e,x,y),1/10的可能性為e。誤差訊號只在序列末尾產生。為了預測最後一個元素,網路模型必須要學會儲存第二個符號經過至少q+1個時間步,直到它遇到trigger symbol e。如果訓練好的模型在處理10000個連續的隨機選擇的輸入序列時,兩個輸出單元對於最後元素的預測偏差都小於0.2,那麼就認為成功通過測試。模型權重初始化[-0.2,0.2]。引數無bias。h和g門的sigmoid輸出分別歸一到[-1,1]和[-2,2]。學習率為0.01。小的time lag設為q+1,因為短的訓練序列對長的測試序列的歸類無益。當然實驗結果肯定是nice,要不也不拿來吹逼了。實驗總結時說了"干擾因素的影響“——increasing this frequency decreases learning speed, an effect due to weight oscillations caused by frequently observed input symbols。

  實驗3,noise and signal on same channel。

  實驗4,adding problem。處理離散表示的連續值的時延問題。

    

  實驗5,multiplication problem

  實驗6,temporal order

 

>>作者本人所闡述的LSTM的侷限性:

 

 

Reference:

1.《long short term memory》,Hochreiter&Schmidhuber,1997

2.  Stanford  CS231n<