浅谈LSTM
??前言:網上關于LSTM的介紹實在太多,作為小白一個,自然不能夠與大神相提并論。希望通過寫這篇博客,整理一下自己的收獲,如有錯誤之處,請各位前輩批評指正!因為作者水平有限,只希望能夠向讀者簡單的介紹下LSTM。更為詳細的過程,請再去查閱相關資料。(適合新手!)
??希望通過這篇文章能夠說明以下三個問題:
??1. 為什么要有LSTM?
??2. LSTM是什么?
??3. LSTM的簡單計算過程。
??廢話少說,開始吧!
一、 為什么要有LSTM?
??要想回答這個問題,那就避不開RNN。所以簡單介紹一下RNN吧!
??循環神經網絡RNN(Recurrent Neural Network)
??RNN的出現是基于一種特別的需求:如果當前狀態不僅僅受當前輸入的影響還受上一個狀態的影響,那常規的神經網絡是無法處理的。可將其理解為==“時序”==。舉幾個應用的例子:語音識別,自然語言處理,機器翻譯,天氣預測,故障檢測等等。這些任務的特點都是之前的狀態可能會影響之后的狀態。而RNN就是專門為解決這類問題而設計的。說完了RNN的背景,再來看看RNN的具體結構吧:
??RNN的標準結構如下圖所示:
??從這個圖中不難看到,在隱藏層構成了一個閉環循環,這即是RNN完成特定功能的方法,也是名字中“循環”兩字的由來。
??雖然標準結構比較簡潔,但不是特別易于理解,所以常常使用展開結構作為研究的對象(展開結構就是把循環變成了一個個獨立個體):
??那有一個問題來了:為什么把RNN劃入深度神經網絡模型中呢?我們都知道CNN里面確實有很多層(池化層,卷積層等),比如VGG(19層),ResNet(152層)。那RNN里面的“深度”從何說起呢?
??其實是這樣的:RNN中循環可看作為時序,如果以每一個時鐘作為一個狀態,那在一段時間內就會存在多個狀態,狀態之間可看作為層與層之間的關系,層一多,深度也就產生了。也可簡單的理解為CNN是空間上的深度,RNN是時間上的深度(個人觀點,不知道是否正確)。
??以上簡要介紹了RNN(更為詳細的,請去網上參照更優秀的文章)。但好像還是沒有提到為什么會有LSTM。其實LSTM是RNN的一種改進版本,也就是LSTM也是RNN,不過略有不同。RNN同樣具有深度網絡學習中一個很嚴重的問題:梯度爆炸/梯度消失,下面簡單介紹一下:
梯度爆炸/梯度消失
??神經網絡的模型訓練大致可分為兩部分:前向預測過程和反向訓練過程。梯度爆炸/梯度消失就發生在反向訓練的過程。基于前面的時序結構和神經網絡模型的特性,前面神經元對后面神經元的影響體現在層與層權重乘法上。這種說法沒有得到老師的贊同,說是一種表面的理解,希望有的大神能給我一個更有效地解答
??梯度計算的詳細過程可參考博客:https://zhuanlan.zhihu.com/p/28687529
??最后可得到梯度計算的表達式如下圖:
??梯度可分為兩部分tanh’和W(s)。
??注:tanh是激活函數的一種,此處對其求導。可證明tanh’的取值范圍為[0,1]。W(s)是梯度的輸入。
??梯度消失:
??當W(s)較小時,每一梯度都在[0,1]范圍。當t較大時,得到的結果就會趨近于0。可類比于0.1^100=0
??梯度爆炸:
??當W(s)較大時,每一梯度都大于1。當t較大時,得到的結果就會趨近于無窮大。可類比于10^100=∞
??上面從數學上解釋了一下梯度爆炸和消失。那到底是什么意思呢?看下面這個圖:
??之前介紹到RNN以時序為基礎,前面狀態會影響后面狀態。那影響大小呢?就近似可以理解為梯度大小。在長期依賴(兩個狀態離的較遠)的情況下如果梯度太小,發生了梯度消失現象說明前面狀態對當前狀態因為層數太多/相差太遠影響消失。這種影響消失可能不是我們所期望的,所以問題就產生了!同理,梯度爆炸則是前面狀態對當前狀態的影響過于巨大,相對改變了離當前狀態較近的狀態影響。
??換一種角度理解梯度消失/梯度爆炸:梯度消失就是對于具有長期依賴關系的神經元影響較小,當前狀態被短期依賴關系的神經元所左右。梯度爆炸就是對于具有長期依賴關系的神經元影響太大,當前狀態被長期依賴關系的神經元左右,而忽略掉了短期依賴關系的神經元影響。(有點兒繞,不過意思很直接~)
??LSTM的目的就是為了緩解傳統RNN網絡中梯度爆炸/梯度消失這一現象
二、 什么是LSTM?
??長短期記憶網絡LSTM(Long short-term memory )
??Ps:這里有個點需要注意下:單橫線一定要放在short和term之間,不能放在long和short之間。LSTM本質還是short-term,只不過比較long~
??我們先從功能上理解LSTM,也就是LSTM是怎么緩解梯度消失/梯度爆炸的?
??再次必須明確一個概念:LSTM只是緩解了梯度消失/梯度爆炸,而不是完全解決,原因會在后面進行解釋。
??我簡單將其總結為:乘法變加法。梯度爆炸/梯度消失的原因就是不斷乘法,最終導致參數呈現指數級增長和下降,進而產生了不好影響。而加法則不會有這種問題,加法基本不會改變數量級。下面來更詳細闡述如何實現的:
??下面分析下LSTM的具體結構:
??LSTM在RNN標準模型的基礎上增加了三個門:遺忘門(forget gate),輸入門(input gate),輸出門(output gate)。三個門恰好可以把LSTM分成三部分結構,整個LSTM的實現也是圍繞這三個門來的。
??上面那個圖有點兒抽象,找不到門,我又找了一張更清晰的:
??從兩張圖可以清晰的看到,神經元的核心操作變成了+(也就是最中間的圈加一個+),這個+也是連接逐個模塊的樞紐。
??看到這兒為止!你可能還會說還是不懂LSTM,你也沒說明白LSTM是神馬啊。別急,相信看完LSTM的計算過程后,你會找到答案的。
三、 LSTM的簡單計算過程
??看看這個圖,找找LSTM有幾個輸入,幾個輸出?
??結果就是三個輸入,三個輸出。那都代表什么呢?X(t)代表當前神經元的輸入,h(t-1)和C(t-1)代表前一神經元的輸入。C(t)和h(t斜)代表當前神經元要提供給下一神經元的(也就是下個階段的h(t)和c(t-1)),即下一層訓練的輸入。另外一個h(t)就是當前神經元的細胞輸出。
??那有個問題來了:**為什么上一神經元會給兩個輸入呢?**其實這就是LSTM保持遠端狀態的奧秘所在。C(t-1)叫做long-term memory,h(t-1)叫做work-memory。從上面的圖可以看到,c(t)和c(t-1)連接是一條直線,而h(t)和h(t-1)則相對曲折。當很多個時序連在一起時c(t-1)這條直線更容易追溯到遠端的情況,而h(t-1)則更多反應了上一神經元的狀態。
??再多問個為什么?為什么這里面是c和h(是其他24個英文字母不香嗎?)。其實都有其代表的含義:c代表cell,以細胞狀態來描述當前神經元的狀態。H代表hide,即隱藏層,也就是上一神經元的輸入。(隱藏層一般指深度網絡中除了輸入和輸出的其他層,這里的隱藏層可以理解為相對于本層的直接輸入層)明白這個更能理解c(t-1)和h(t-1)的關系了吧。
??下面再詳細的分析一下計算步驟:
??我先把這個計算式子列出來,看不懂沒關系。看完后面的內容再回來看就很清晰了。
??我先解釋下里面參數的含義,并且計算也需要一些先修知識,我也介紹一下。
????W(f),W(i),W?,W(o)為權重矩陣
????b(f),b(i),b?,b(o)為偏置常數
??以上兩部分都是神經網絡模型訓練的必要部分,也是模型訓練的修改對象。
??那tanh和σ 呢?其實這是兩種激活函數:
??σ (sigmoid)
??對于sigmoid激活函數現在通常被Relu激活函數替代,因為sigmoid激活函數容易造成梯度消失,所以后人設計了Relu激活函數。但經典中仍是sigmoid。
??tanh
??這兩種激活函數都是比較常見的,但在此處我們只需要了解它們的取值范圍即可。對于激活函數更詳細的內容可以上網去查查資料,會有很多。
??下面伴隨結構來描述下計算過程:
??計算過程可分為三大部分(正好對應于三個門),第二大部分里面又可分為兩個部分。
??(一) 計算對上一輸入的遺忘程度(上一神經元對本神經元的影響)
??通過上面對于激活函數的介紹,我們可以知道f(t)是一個[0,1]之間的數值。一個這樣的數乘以上一狀態的結果是不是相當于上一狀態的影響比例。
??舉個例子:有一個門,門外是上一個狀態的結果。我可以選擇不開門(f(t)=0)那就是完全屏蔽上一個狀態的影響,也可以選擇全部打開(f(t)=1)那就是完全接受上一狀態。當然,也可以0~1之間的數字,那就是不同的開門比例。也就是不同的遺忘程度。
??LSTM中正是憑借這遺忘門這步來有效地保持前后狀態的連接。
??(二_1)計算當前輸入對本細胞狀態的影響
??這個部分主要計算的當前輸入的影響,i(t)也是一個[0,1]之間的數值,乘以經過tanh計算的預備c(t)就計算出了通過輸入門后的數值。
??(二_2)確定本細胞狀態
??本細胞狀態由兩部分組成:經過遺忘門的過去細胞狀態和經過輸入門的當前輸入影響。這里面有兩種操作,定義如下圖(圈中點和圈中x是一樣的):
??注意:圈中點/叉代表的是矩陣點乘(之前寫了對應位置相乘,感覺好low,hhhh),而不是矩陣相乘。因為在計算過程中二者都涉及到了,所以要特別進行區分。
??截至目前為止,C(t)已經被計算完成。
??(三)計算當前神經元輸出
??這步就是通過運算最終得到兩個輸出,并分別作用于不同對象。
??到此!再回去看看那個計算式以及神經元的結構應該更加清晰了吧!
??所以,我們再問自己一個問題?LSTM到底是怎么解決梯度爆炸和梯度消失的呢?LSTM的記憶性又體現在哪里呢?
??對于LSTM來說,細胞狀態c(t)的傳輸就是記憶性的體現。而c(t)計算中涉及兩部分(過去狀態和當前輸入)做加法,避免了連乘的困擾,解決了梯度問題。通過對于遺忘門的調控來決定對過去狀態的取舍。這就是LSTM。
??再解釋最后一個問題:那為什么LSTM只是緩解而不是徹底解決呢?
??其實可以看到,當數據流向在c(t)這條線上時是沒有問題的,除此之外還會有一些其他的支路,如果在訓練過程中,通過支路,仍是存在梯度爆炸/梯度消失的風險的。所以只是緩解,而不是解決。
??LSTM也不是終點,對其的優化仍在進行。如GRU等等,剩下的就慢慢學習吧!
留一些好的參考資料:
1.新手入門理解
https://www.jianshu.com/p/9dc9f41f0b29
https://baijiahao.baidu.com/s?id=1573792228593933&wfr=spider&for=pc
2.三個門參數計算
https://zhuanlan.zhihu.com/p/52701603
3.三個門的計算過程:
https://blog.csdn.net/jamesjjjjj/article/details/83046491
4.RNN梯度消失和梯度爆炸
https://zhuanlan.zhihu.com/p/28687529
感謝施老師對于本篇文章的耐心修改
因作者水平有限,文章如有錯誤之處,請各位高手在下方評論區批評指正,謝謝!
總結
- 上一篇: 通过socket得到远端的IP和连接端口
- 下一篇: C++ 常用设计模式