摘要:而從數學上看的話,更是短時記憶了,因為梯度流經的時候,經歷的是的連環相乘的路徑在輸入輸出門關閉前,顯然如前邊的數學證明中所述,這樣會發生梯度爆炸和
引人入勝的開篇:
想要搞清楚LSTM中的每個公式的每個細節為什么是這樣子設計嗎?想知道simple RNN是如何一步步的走向了LSTM嗎?覺得LSTM的工作機制看不透?恭喜你打開了正確的文章!?
前方核彈級高能預警!本文信息量非常大,文章長且思維連貫性強,建議預留20分鐘以上的時間進行閱讀。
前置知識1:
簡單的循環神經網絡,即無隱藏層的循環神經網絡,起名叫“simple RNN”,公式如下:
這種方式即在每個時刻做決策的時候都考慮一下上一個時刻的決策結果。畫出圖來就是醬的:
?
(其中圓球里的下半球代表兩向量的內積,上半球代表將內積結果激活)
?
雖然通過這種簡單反饋確實可以看出每個時間點的決策會受前一時間點決策的影響,但是似乎很難讓人信服這竟然能跟記憶扯上邊!
?
想一下,人的日常行為流程是這樣的。比如你在搭積木,那么每個時間點你的行為都會經歷下面的子過程:
1、眼睛看到現在手里的積木。
2、回憶一下目前較高層的積木的場景。
3、結合1和2的信息來做出當前時刻積木插到哪里的決策。
?
相信聰明的小伙伴已經知道我要表達的意思啦。第1步手里的積木就是當前時刻的外部輸入X;第2步就是調用歷史時刻的信息/記憶;第3步就是融合X和歷史記憶的信息來推理出決策結果,即RNN的一步前向過程的輸出y(t)。
?
有沒有更加聰明的小伙伴驚奇的注意到第2步?。?!我們在回憶歷史的時候,一般不是簡單的回憶上一個積木的形狀,而是去回憶一個更加模糊而宏觀的場景。在這個例子中,這個場景就是最近幾次行為所產生出的抽象記憶——即“積木較高層的地形圖”!
?
也就是說,人們在做很多時序任務的時候,尤其是稍微復雜的時序任務時,潛意識的做法并不是直接將上個時刻的輸出y(t-1)直接連接進來,而是連接一個模糊而抽象的東西進來!這個東西是什么呢?
當然就是神經網絡中的隱結點h??!也就是說,人們潛意識里直接利用的是一段歷史記憶融合后的東西h,而不單單是上一時間點的輸出。而網絡的輸出則取自這個隱結點。所以更合理的刻畫人的潛意識的模型應該是這樣的:
(記憶在隱單元中存儲和流動,輸出取自隱單元)
?
這種加入了隱藏層的循環神經網絡就是經典的RNN神經網絡!即“standard RNN”。
?
RNN從simple到standard的變動及其意義對于本文后續內容非常重要哦。
?
前置知識2:?
由于在誤差反向傳播時,算出來的梯度會隨著往前傳播而發生指數級的衰減或放大!而且這是在數學上板上釘釘的事情。因此,RNN的記憶單元是短時的。
好啦,那我們就借鑒前輩設計RNN的經驗,從simple版本開始,即無隱藏層的、簡單完成輸出到輸入反饋的網絡結構開始,去設計一個全新的、可以解決梯度爆炸消失問題從而記住長距離依賴關系的神經網絡吧!
?
那么如何讓梯度隨著時間的流動不發生指數級消失或者爆炸呢?
好像想起來挺難的,但是這個問題可能中學生會解答!那就是讓算出來的梯度恒為1!因為1的任何次方都是1嘛( ̄? ̄)
?
所以按照這個搞笑的想法,我們把要設計的長時記憶單元記為c(以下全部用c指代長時記憶單元),那么我們設計出來的長時記憶單元的數學模型就是這樣子嘍:
?
c(t) = c(t-1)
?
這樣的話,誤差反向傳播時的導數就恒定為1啦~誤差就可以一路無損耗的向前傳播到網絡的前端,從而學習到遙遠的前端與網絡末端的遠距離依賴關系。
?
不要急不要急,反正假設我們的c中存儲了信息,那么c就能把這個信息一路帶到輸出層沒問題吧?在T時刻算出來的梯度信息存儲在c里后,它也能把梯度一路帶到時刻0而無任何損耗也沒問題吧?對吧( ̄? ̄)
?
所以信息的運輸問題解決了,那么就要解決對信息進行裝箱和卸車的問題。
??
先來看裝箱問題,即如何把新信息寫入c里面去呢?
?
1、乘進去!
2、加進去!
?
那么這兩種哪種可行呢?
其實稍微一想就很容易判斷:乘法操作更多的是作為一種對信息進行某種控制的操作(比如任意數與0相乘后直接消失,相當于關閉操作;任意數與大于1的數相乘后會被放大規模等),而加法操作則是新信息疊加舊信息的操作。
?
下面我們深入的討論一下乘性操作和加性操作,這在理解LSTM里至關重要。當然,首先,你要掌握偏導的概念和方法、復合函數的求導法則、鏈式求導法則。有了這三點微積分基礎后才能看懂哦。
(害怕數學和基礎不夠的童鞋可以跳過這里的論乘法和論加法小節。)
噫?也有指數項~不過由于v加了一個偏置1,導致爆炸的可能性遠遠大于消失。不過通過做梯度截斷,也能很大程度的緩解梯度爆炸的影響。
嗯~梯度消失的概率小了很多,梯度爆炸也能勉強緩解,看起來比RNN靠譜多了,畢竟控制好爆炸的前提下,梯度消失的越慢,記憶的距離就越長嘛。
?
因此,在往長時記憶單元添加信息方面,加性規則要顯著優于乘性規則。也證明了加法更適合做信息疊加,而乘法更適合做控制和scaling。
?
由此,我們就確定應用加性規則啦,至此我們設計的網絡應該是這樣子的:
那么有沒有辦法讓信息裝箱和運輸同時存在的情況下,讓梯度消失的可能性變的更低,讓梯度爆炸的可能性和程度也更低呢?
你想呀,我們往長時記憶單元添加新信息的頻率肯定是很低的,現實生活中只有很少的時刻我們可以記很久,大部分時刻的信息沒過幾天就忘了。因此現在這種模型一股腦的試圖永遠記住每個時刻的信息的做法肯定是不合理的,我們應該只記憶該記的信息。
?
顯然,對新信息選擇記或者不記是一個控制操作,應該使用乘性規則。因此在新信息前加一個控制閥門,只需要讓公式【3.1】變為
?
嗯~由于輸入門只會在必要的時候開啟,因此大部分情況下公式【4】可以看成
C(t)=C(t-1),也就是我們最理想的狀態。由此加性操作帶來的梯度爆炸也大大減輕啦,梯度消失更更更輕了。
?
等等,愛思考的同學可能會注意到一個問題。萬一神經網絡讀到一段信息量很大的文本,以致于這時輸入門欣喜若狂,一直保持大開狀態,狼吞虎咽的試圖記住所有這些信息,會發生什么呢?
?
顯然就會導致c的值變的非常大!
要知道,我們的網絡要輸出的時候是要把c激活的(參考公式【0.3】),當c變的很大時,sigmoid、tanh這些常見的激活函數的輸出就完全飽和了!比如如圖tanh:
?
當c很大時,tanh趨近于1,這時c變得再大也沒有什么意義了,因為飽和了!腦子記不住這么多東西!
?
這種情況怎么辦呢?顯然relu函數這種正向無飽和的激活函數是一種選擇,但是我們總不能將這個網絡輸出的激活函數限定為relu吧?那也設計的太失敗啦!
?
那怎么辦呢?
其實想想我們自己的工作原理就知道啦。我們之所以既可以記住小時候的事情,也可以記住一年前的事情,也沒有覺得腦子不夠用,不就是因為我們。。。愛忘事嘛。所以還需要加一個門用來忘事!這個門就叫做“遺忘門”吧。這樣每個時刻到來的時候,記憶要先通過遺忘門忘掉一些事情再考慮要不要接受這個時刻的新信息。
?
顯然,遺忘門是用來控制記憶消失程度的,因此也要用乘性運算,即我們設計的網絡已進化成:
?
好啦~解決了如何為我們的長時記憶單元可控的添加新信息的問題,又貼心的考慮到并優雅解決了信息輸入太過豐富導致輸入控制門“合不攏嘴”的尷尬情況,那么是時候考慮我們的長時記憶單元如何輸出啦~
?
有人說,輸出有什么好考慮的,當前的輸出難道不就僅僅是激活當前的記憶嗎?難道不就是最前面說的y(t)=f(c(t))?(其中f(·)為激活函數)
?
試想,假如人有1萬個長時記憶的腦細胞,每個腦細胞記一件事情,那么我們在處理眼前的事情的時候是每個時刻都把這1萬個腦細胞里的事情都回憶一遍嗎?顯然不是呀,我們只會讓其中一部分跟當前任務當前時刻相關的腦細胞輸出,即應該給我們的長時記憶單元添加一個輸出閥門!也就是說應該輸出:
?
?
嗯~終于看起來好像沒有什么問題了。
?
然而,作為偉大的設計者,怎么能止步于simple呢!我們要像simple RNN推廣出standard RNN的做法那樣,推廣出我們的standard版本!即加入隱藏層!
?
為什么要加隱藏層已經在本文開頭提到了,這也是simpleRNN到standardRNN的核心區別,這也是RNN及其變種可以作為深度學習的主角之一的原因。模仿RNN的做法,我們直接用隱藏層單元h來代替最終輸出y:
?
?
顯然,由于h隨時都可以被輸出門截斷,所以我們可以很感性的把h理解為短時記憶單元。
而從數學上看的話,更是短時記憶了,因為梯度流經h的時候,經歷的是h(t)->c(t)->h(t-1)的連環相乘的路徑(在輸入輸出門關閉前),顯然如前邊的數學證明中所述,這樣會發生梯度爆炸和消失,而梯度消失的時候就意味著記憶消失了,即h為短時記憶單元。
同樣的思路可以再證明一下,由于梯度只從c走的時候,存在一條無連環相乘的路徑,可以避免梯度消失。又有遺忘門避免激活函數和梯度飽和,因此c為長時記憶單元。
好啦,我們standard版本的新型網絡也完成了!有沒有覺得信息量超級大,又亂掉了呢?不要急,貼心的小夕就再帶你總結一下我們這個網絡的前饋過程:
?
新時刻t剛剛到來的時候,
1、首先長時記憶單元c(t-1)通過遺忘門g_forget去遺忘一些信息。
2、其中g_forget受當前時刻的外部輸入x(t)、上一時刻的輸出(短時記憶)h(t-1)、上一時刻的長時記憶c(t-1)的控制。
3、然后由當前時刻外部輸入x(t)和上一時刻的短時記憶h(t-1)計算出當前時刻的新信息hat c(t)。
4、然后由輸入門g_in控制,將當前時刻的部分新信息hat c(t)寫入長時記憶單元,產生新的長時記憶c(t)。
5、其中g_in受x(t)、h(t-1)、c(t-1)的控制。
6、激活長時記憶單元c(t),準備上天(輸出)。
7、然后由輸出門g_out把控,將至目前積累下來的記憶c(t)選出部分相關的記憶生成這一時刻我們關注的記憶h(t),再把這部分記憶進行輸出y(t)。
8、其中輸出門g_out受x(t)、h(t-1)和當前時刻的長時記憶c(t)的控制。
?
前饋的過程寫完了,梯度反傳的過程就讓深度學習平臺去自動求導來完成吧~有M傾向的同學可以嘗試對上述過程進行手動求導。
?
好啦,最后對全文的設計過程總結一下:
1、我們為了解決RNN中的梯度消失的問題,為了讓梯度無損傳播,想到了c(t)=c(t-1)這個樸素卻沒毛病的梯度傳播模型,我們于是稱c為“長時記憶單元”。
2、然后為了把新信息平穩安全可靠的裝入長時記憶單元,我們引入了“輸入門”。
3、然后為了解決新信息裝載次數過多帶來的激活函數飽和的問題,引入了“遺忘門”。
4、然后為了讓網絡能夠選擇合適的記憶進行輸出,我們引入了“輸出門”。
5、然后為了解決記憶被輸出門截斷后使得各個門單元受控性降低的問題,我們引入了“peephole”連接。
6、然后為了將神經網絡的簡單反饋結構升級成模糊歷史記憶的結構,引入了隱單元h,并且發現h中存儲的模糊歷史記憶是短時的,于是記h為短時記憶單元。
7、于是該網絡既具備長時記憶,又具備短時記憶,就干脆起名叫“長短時記憶神經網絡(Long Short Term Memory Neural Networks,簡稱LSTM)“啦。
?
參考文獻:
1. Hochreiter S, Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8): 1735-1780.
2. Gers F A, Schmidhuber J, Cummins F, et al.Learning to Forget: Continual Prediction with LSTM[J]. Neural Computation,2000, 12(10): 2451-2471.
3. Gers F A, Schraudolph N N, Schmidhuber J, etal. Learning precise timing with lstm recurrent networks[J]. Journal of MachineLearning Research, 2003, 3(1): 115-143.
4. A guide to recurrent neural networks and backpropagation. Mikael Bod ?en.
5. http://colah.github.io/posts/2015-08-Understanding-LSTMs/
6. 《Supervised Sequence Labelling with Recurrent Neural Networks》Alex Graves
7. 《Hands on machine learning with sklearn and tf》Aurelien Geron
8. 《Deep learning》Goodfellow et.
聲明:文章收集于網絡,如有侵權,請聯系小編及時處理,謝謝!
歡迎加入本站公開興趣群商業智能與數據分析群
興趣范圍包括各種讓數據產生價值的辦法,實際應用案例分享與討論,分析工具,ETL工具,數據倉庫,數據挖掘工具,報表系統等全方位知識
QQ群:81035754
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/4797.html
摘要:本文將詳細解析深度神經網絡識別圖形圖像的基本原理。卷積神經網絡與圖像理解卷積神經網絡通常被用來張量形式的輸入,例如一張彩色圖象對應三個二維矩陣,分別表示在三個顏色通道的像素強度。 本文將詳細解析深度神經網絡識別圖形圖像的基本原理。針對卷積神經網絡,本文將詳細探討網絡 中每一層在圖像識別中的原理和作用,例如卷積層(convolutional layer),采樣層(pooling layer),...
摘要:因為在每一時刻對過去的記憶信息和當前的輸入處理策略都是一致的,這在其他領域如自然語言處理,語音識別等問題不大,但并不適用于個性化推薦,一個用戶的聽歌點擊序列,有正負向之分。 在內容爆炸性增長的今天,個性化推薦發揮著越來越重要的作用,如何在海量的數據中幫助用戶找到感興趣的物品,成為大數據領域極具挑戰性的一項工作;另一方面,深度學習已經被證明在圖像處理,計算機視覺,自然語言處理等領域都取得了不俗...
閱讀 1181·2021-09-22 15:24
閱讀 2285·2019-08-30 15:44
閱讀 2614·2019-08-30 10:55
閱讀 3354·2019-08-29 13:25
閱讀 1638·2019-08-29 13:09
閱讀 1391·2019-08-26 14:05
閱讀 1379·2019-08-26 13:58
閱讀 1984·2019-08-26 11:57