轉載自:https://blog.csdn.net/shincling/article/details/49362161
Proclaimation:
第一篇部落格點選打開連結之後,對LSTM進行了一個較為深入的學習。首先從理論入手,深讀了提出模型的原文,大概粗看了二十多篇Paper,關于RNN的問題的産生、LSTM模型的提出和原理,反傳的推導之類,還有最近的LSTM的典型應用和性能分析等等。這個報告在我實驗室内部小組和其他的小組兩次分享過,這邊再做一個總結寫成部落格,跟大家一同探讨。坦率地說,确實是越看越覺得新問題更多。
在這裡感謝之前看LSTM的時候入門的兩篇部落格的作者,
RNN以及LSTM的介紹和公式梳理 以及
LSTM簡介以及數學推導(FULL BPTT) 。
注:這篇部落格側重于對LSTM的理論進行闡述,并不會側重于模型的講解,需要一定的對LSTM和RNN的熟悉可能會更好的閱讀部落格。
LSTM理論推導總結
目錄
1. 傳統RNN的問題:梯度的消失和爆發
2. LSTM對問題的解決方式
3. LSTM對模型的設計
4. LSTM訓練的核心思路和推導
5. 近期LSTM的模型的改進
6. LSTM的工作特性的研究
7. 一些可能存在的問題
8. 總結
9. 參考文獻
1.傳統RNN模型的問題:梯度的消失和爆發

本文中采用的同樣的RNN的模型可以如圖,其中net通常是激活函數之前的各個層的輸入與權重的線性組合。
注:在LSTM原文(97年)中,以及相應一大批文獻中,角标的順序與現在我們通常寫的相反。如:Wij代表從 j到i 。
接下來的推導主要源自LSTM的作者的論文《THE VANISHING GRADIENT PROBLEM DURING recurrent neural networks and problem solutions》
以及作者在提出LSTM的論文的前半部分也有一樣的内容。
先看一下比較典型的BPTT(Back propgation through time)一個展開的結構,如下圖,這裡隻考慮了部分圖。
對于t時刻的誤差信号計算如下:
推導公式如下:
上面的公式在整個BPTT乃至整個BP網絡裡都是非常常見的了。具體推導如下,做個示範:
那麼如果這個誤差信号一直往過去傳呢,假設任意兩個節點u, v他們的關系是下面這樣的:
那麼誤差傳遞信号的關系可以寫成如下的遞歸式:
(這裡有一個問題是一個師兄給我提出的,最前面的微分符号是不是根本沒有必要?按照之前相鄰兩層的推導,似乎不用微分,隻用比值就可以。
關于這個問題我想了下,其實由于全微分的推導,導緻各個微分之間的關系,不論怎麼傳遞,總是彼此之間的線性組合,是以寫不寫微分符号,似乎确實都是一樣的。)
繼續說上面的公式,n表示圖中一層神經元的個數,這個公式不難了解,要求從t時刻某節點u傳遞到t-q時刻某節點v的誤差,那麼就需要先求出u傳遞到t-q+1時刻所有節點的誤差之後,再進行相鄰兩層之前的回傳(也就是之前那個公式)。
這顯然是一個遞歸的過程,把裡面連乘展開看:
看起來比較複雜,事實上可以這麼說:
前面的q-1個加和符号,就是在誤差回傳過程中,從u到v周遊了所有中間層的可能的連結起來的路徑。
後面的連乘法就是其中一條路徑的誤差表示,總共經曆了q個層,每一層都要經過一個激活函數的導數和權值相乘。
展開來看,把後面的這個連乘的式子叫做T的話:
整個結果式對T求和的次數是n^(q-1), 即T有n^(q-1)項
而每一個T經過了q次這樣的系數的乘法:
如果上式> 1, 誤差就會随着q的增大而呈指數增長,那麼網絡的參數更新會引起非常大的震蕩。
如果上式< 1, 誤差就會消失,導緻學習無效,一般激活函數用sigmoid函數,它的倒數最大值是0.25, 權值最大值要小于4才能保證不會小于1。
誤差呈指數增長的現象比較少,誤差消失在BPTT中很常見。
到這裡,我們大緻應該可以明白了,由于經過每一層誤差反傳,就會引入一個激活函數的導數的乘子,是以導緻經過多步之後,這個乘子的連乘會導緻一系列麻煩,即我們所謂的梯度消失和爆發的問題。
事實上,上面這個式子結果的分析是非常複雜的,因為我們可以調節w和增加每一層的節點數n來對結果進行調節。但是事實上這些做法都不能完善的解決,因為w是每一層都共享的參數,它會影響net的值,而net值的變化會對激活函數的導數有影響。
舉個例子,即便把w變成無限大,那麼導緻net也會無限大,導緻激活函數的導數為0。
事實上原文也對這些問題進行了分析,并且驗證了上面說道的兩個問題,但是更深入的分析是一個非常複雜的情況,涉及到高階無窮小和w的調節等一系列動态的問題。作者在原文中都沒有繼續說清楚。
更加深入的了解這個問題可以參照這篇論文,
《On the difficulty of training Recurrent Neural Networks》Razvan Pascanu,Tomas Mikolov,Yoshua Bengio
這裡面深入讨論了vanishing and the exploding gradient 的本質(w矩陣特征值等複雜的原理),和他們帶來的一些現象。
梯度消失和爆發不是這篇文章的重點,是以我暫時寫到這裡,總結一下,對于常見的梯度消失問題來說:
傳統的RNN模型,在訓練的過程中的梯度下降過程中,更加傾向于按照序列結尾處的權值的正确方向進行更新。也就是說,越遠的序列輸入的對權值的正确變化所能起到的“影響”越小,是以訓練的結果就是往往出現偏向于新的資訊,即不太能有較長的記憶功能。
2.LSTM對問題的解決方式
為了克服誤差消失的問題,需要做一些限制,先假設僅僅隻有一個神經元與自己連接配接,簡圖如下:
根據上面的,t時刻的誤差信号計算如下:
為了使誤差不産生變化,可以強制令下式為1:
根據這個式子,可以得到:
這表示激活函數是線性的,常常的令fj(x) = x, wjj = 1.0,這樣就獲得常數誤差流了,也叫做CEC(constant error carrousel)。
3.LSTM對模型的設計
到上面為止,提出的最簡單的結構其實可以大緻用這樣一個圖表述:
但是光是這樣是不行的,因為存在輸入輸出處權值更新(原文作者的原話,本段末尾後面進行一些解釋)的沖突,是以加上了兩道控制門,分别是input gate, output gate,來解決這個沖突,圖如下:
圖中增加了兩個控制門,所謂控制的意思就是計算cec的輸入之前,乘以input gate的輸出,計算cec的輸出時,将其結果乘以output gate的輸出,整個方框叫做block, 中間的小
圓圈是CEC, 裡面是一條y = x的直線表示該神經元的激活函數是線性的,自連接配接的權重為1.0
輸入輸出權值沖突,作者的原文中這樣描述的:
說實話,僅就這一段,我讀了不下幾十次,跟幾個師兄也探讨過很多次,依然沒有找到一個很好的解釋來達成共識。
從我個人角度的了解這個加了Gate的動機,我簡單這樣闡述一下:
(1)加入了門,其實是一種多層次的特征的選擇方式。
舉個不恰當的例子,例如我去面試百度,首先我可能需要經過一個技術面,看看我是否具備相應的技術素質來進入公司。
通過之後,我又經曆了一個人力面,看看我其他的素質是否滿足。當然,原則上我們隻需要一次面試同時測試我的技術和人力素質都可以了。
但是,這就對面試官提出了更高的要求,這個面試官又得懂技術,又得很懂人力。顯然這樣綜合的素質我們很難滿足,而用兩個層次不同的面試,我們比較容易做到。
這個技術面我們可以類比成圖上的 netcj ,人力面我們可以類比成為input gate。
我們當然可以在進入cell核心單元之前,用一套w得到我們想要的資訊。
但是這個難度就非常地大,想要訓練出來這個W就比用兩個層次的來篩選難得多。
(2)各個Gate功能有些重複,作者也提到了輸入輸出Gate有時候不需要同時出現,可以隻用其中一個。
4.LSTM訓練的核心思路和推導
到此為止,我們大緻有了這樣的印象,作者還是比較“任性”地創造了這麼一個模型,在理論上堅定了一個叫CEC的恒定誤差流,在這個核心思想上又加入了一些Gate,在這裡帶來了另外一個問題,加入了Gate之後的結構,已經與之前的核心簡單結構不符,在訓練過程中,必然地在一個Block裡面,誤差會發生傳播,彌散作用于不同的Gate,導緻梯度被分散,可能依然會帶來梯度消失的問題。如何解決?
作者給出的解決方法是:設計與結構相适應的訓練算法,來保持CEC功能的完整。這裡用到的想法是截斷梯度回傳(truncated backprop version of the LSTM algorithm)。
這個算法的思想是:為了保證在Memory cell的内部的誤差不會衰減,所有到達這個Block的輸入誤差,包括(netcj , netinj, netoutj ) , 不會繼續朝更前一個時間狀态進行反向傳播。
形象化地描述這個過程:當一個誤差信号到達一個Block的output時(通過隐層和輸出層的回傳),首先被輸出門的激活函數和導數 h’進行尺度變換(scaled), 之後成為了CEC狀态的值往之前的時刻進行傳遞,當這個誤差要通過Input gate和g離開這個某個時刻的Block的時候,它再次經過激活函數和g’的變換,然後此刻的誤差在進入到前一個時間狀态的Block之前(實際上按照算法的設計,這個誤差根本不會從這裡進入下一個Block),對與它連結的一些權重進行更新。具體的實作過程,來進行一下推導。
在這裡有個小細節需要注意下,原文中使用的h和g都不是現在廣為使用的tanh和sigmoid,而是sigmoid的一些變種,如:
個人經驗:
對于有遞歸的結構的某些單元,使用有正負差異的激活函數效果更好一點。
之後對LSTM的截斷回傳算法進行一個細緻的推導,參見原文的附錄。
PS: 這部分的推導,我在兩次報告中,都是按照LSTM原文中附錄的推導進行完整的講解,這中間的公式非常多(40個),是以在這裡不推了。主要的幾個重要的公式在這裡列出來:
(1)截斷梯度法的近似
簡單解釋一下,誤差回傳到 input / output gate 和一個Block的輸入(netcj)之後,不會向上一個時刻回傳誤差,而隻用來在這裡更新各個部分的權值w。
根據上式的推導,可以得到的另外幾個關鍵公式如下:
在Memory cell中的各個t時刻的誤差,保持一緻。
最後整個梳理一下誤差回傳的過程,誤差通過輸出層,分類器,隐層等進入某個時刻的Block之後,先将誤差傳遞給了Output Gate和Memory Cell兩個地方。
到達輸出門的誤差,用來更新了輸出門的參數w,到達Memory Cell之後,誤差經過兩個路徑,
1是通過這個cell向前一個時刻傳遞或者更前的時刻傳遞,
2是用來傳遞到input gate和block的輸入,用來更新了相應的權值(注意!不會經過這裡向前一個時刻傳遞誤差)。
最關鍵最關鍵的問題再重複一遍就是,這個回傳的算法,隻通過中間的Memory Cell向更前的時刻傳遞誤差。
5.近期LSTM的模型的改進
接下來進入我們熟悉的這兩年大熱的LSTM的改進結構:
(注意這裡角标順序回歸正常,從前到後)
與97年LSTM的原型想必,主要改動的幾點:
1. 引入了Forget門,有些文獻也叫做Keep Gate(其實這個叫法我覺得更好)。
2. 激活函數的選擇有所改變,通常就是sigmoid和tanh。
3. 加入了Peephole,即Celll對各個Gate的連結。
4. 訓練過程不再使用截斷算法,而是用FULL BPTT+一些trick進行算法,且獲得的更好效果。
(The original LSTM algorithm used a custom designed approximategradient calculation that allowed the weights to be updated after everytimestep .However the full gradient can instead be calculated withbackpropagation through time , the method used in this paper. One difficultywhen training LSTM
with the full gradient is that the derivatives sometimes becomeexcessively large, leading to numerical problems. To prevent this, allthe experiments in this paper clipped the derivative of the loss with respectto the network inputs to the LSTM layers (before the sigmoid and tanh functionsare applied) to lie within a predefined range)
新的一些模型主要可以參考的文獻有:
A. Alex Graves. Supervised Sequence Labelling with Recurrent Neural Networks. Textbook, Studies inComputational Intelligence, Springer, 2012.
B. Alex Graves ,Generating Sequences With RNN
(PS: Alex Graves 是 Hinton的學生,他前些年主要的工作就是對RNN和LSTM進行研究和應用,可以說是LSTM方面的最頂級的專家。)
具體的前向和後向推導如下:
- wij表示從神經元i到j的連接配接權重(注意這和很多論文的表示是反着的)
- 神經元的輸入用a表示,輸出用b表示
- 下标 ι, φ 和 ω分别表示input gate, forget gate,output gate
- c下标表示cell,從cell到 input, forget和output gate的peephole權重分别記做 wcι , wcφ and wcω
- Sc表示cell c的狀态
- 控制門的激活函數用f表示,g,h分别表示cell的輸入輸出激活函數
- I表示輸入層的神經元的個數,K是輸出層的神經元個數,H是隐層cell的個數
前向的計算:
誤差反傳更新:
(以上的公式取自Alex的論文,我懶得從原文裡截圖了,借用下之前提到的部落格裡的圖。)
這塊的公式的推導,比原文裡要簡單的多,說白了就是鍊式法則的反複應用,我覺得想在原理上更深入的話這個反傳的推導不妨試試。其實一點都不難。
具體可以參考之前提到的部落格裡的内容。
6.LSTM的工作特性的研究
事實上,到目前為止,大部分的LSTM的模型和語言模型、手寫體識别、序列生成、機器翻譯、語音、視訊分析等多種任務中取得了一些成功的應用,但是很少有人去研究到底是什麼原因導緻了這些情況的發生,以及哪些設計是切實有效的。
《Visualizing and Understanding Recurrent Networks》 Andrej Karpathy,Justin Johnson,Li Fei-Fei
這篇文章是斯坦福的李菲菲老師指導的她的學生的一片文章,提供了一些思路。(這個文章的各類圖表真的非常炫目,畢竟李菲菲老師團隊的前端的功力了得)。
對各個門之間的狀态,在字母級别的語言序列和語言模型中做了一系列實驗,并且對RNN和GRU模型也做了對比實驗。
這裡簡單說一下比較有趣的一點,如下,這篇文章的實驗是用了《戰争與和平》和LINUX的源碼(!!!)兩個資料集上做的。
作者非常驚喜地發現,LSTM的記憶單元中的某些Units有着令人驚喜的功能,比如它們可能會标志着段落的結束、或者引用内容,或者linux的源碼中的一些條件語句的内容。
當然,大部分都是我們難以解釋的一些隐層狀态。
另外這篇文章也提到如,
K. Greff, R. K. Srivastava, J. Koutn´ık, B. R. Steunebrink, and J.Schmidhuber. LSTM: A search space
odyssey. CoRR, abs/1503.04069, 2015.
這篇文章也做了一些實驗,并提出了這樣的結論:
“The forget gates are its most criticalcomponents”
遺忘門,起到了最為關鍵的作用。(而LSTM原型中壓根就沒有遺忘門......)
另外這篇文章也提到了各個門的狀态的一些統計資訊,
大緻情況可以這樣表述,forget門傾向于為不激活狀态(偏向0),即頻繁忘記東西。
Input Gate傾向于通常出于打開的狀态。
Output gate則有開有閉,基本平衡。
7.一些可能存在的問題
1. Theano LSTM 例程裡的梯度回傳算法,由于Theano自動求導的功能,在回傳時候應該是采用的是FULL BPTT,這個是不是會帶來一些如之前所說的問題?
答:這個問題我在之前其實已經說明了Alex的一些Trick的做法。仔細思考下,确實FULL BPTT帶來的梯度的問題,由于Memory Cell功能的完整性,而被緩解了。也就是說誤差回傳的主力還是通過了Memory Cell而保持了下來。是以我們現在用的LSTM模型,依然有比較好的效果。
2. LSTM的Input、Output、Forget門之間的功能是不是其實有重複?有沒有更簡單的結構可以改進。
答:沒錯,例如已經出現的GRU (Gated Recurrent Unit)
8. 總結
兩個關鍵問題:
1. 為什麼具有記憶功能?
這個是在RNN就解決的問題,就是因為有遞歸效應,上一時刻隐層的狀态參與到了這個時刻的計算過程中,直白一點呢的表述也就是選擇和決策參考了上一次的狀态。
2. 為什麼LSTM記的時間長?
因為特意設計的結構中具有CEC的特點,誤差向上一個上一個狀态傳遞時幾乎沒有衰減,是以權值調整的時候,對于很長時間之前的狀态帶來的影響和結尾狀态帶來的影響可以同時發揮作用,最後訓練出來的模型就具有較長時間範圍内的記憶功能。
9.參考文獻
1. Visualizing and UnderstandingRecurrent Networks
2. on the difficulty of trainingrecurrent network
3. Hochreiter97_lstm
4. Oxford , Rnn & LSTM
5. THE VANISHING GRADIENT PROBLEMDURING RNN
6. RECURRENT NEURAL NETWORKREGULARIZATION
7. A. Graves. Supervised SequenceLabelling with Recurrent Neural Networks.
8. A guide to recurrent neuralnetworks and back-propagation
9. An Empirical Exploration ofRecurrent Network Architectures
10. A survey on the application ofrecurrent neural networks to statistical language modeling
11. Generating Sequences With RNN _Alex graves
12. On the Properties of NeuralMachine Translation Encoder–Decoder 1409 1259v2
13. Encodere mechaine translationuse CNN 1503.01838v5
Proclaimation:
第一篇部落格點選打開連結之後,對LSTM進行了一個較為深入的學習。首先從理論入手,深讀了提出模型的原文,大概粗看了二十多篇Paper,關于RNN的問題的産生、LSTM模型的提出和原理,反傳的推導之類,還有最近的LSTM的典型應用和性能分析等等。這個報告在我實驗室内部小組和其他的小組兩次分享過,這邊再做一個總結寫成部落格,跟大家一同探讨。坦率地說,确實是越看越覺得新問題更多。
在這裡感謝之前看LSTM的時候入門的兩篇部落格的作者,
RNN以及LSTM的介紹和公式梳理 以及
LSTM簡介以及數學推導(FULL BPTT) 。
注:這篇部落格側重于對LSTM的理論進行闡述,并不會側重于模型的講解,需要一定的對LSTM和RNN的熟悉可能會更好的閱讀部落格。