lstm-思想
RNN(Recurrent Neural Network)
今天我這裡講到的RNN主要是上圖這種結構的,即是Hidden Layer會有連向下一時間Hidden
Layer的邊,還有一種結構是Bidirectional Networks,也就是說會有來自下一時間的Hidden
Layer傳回來的邊,但這不在我們今天的讨論範圍内,講完LSTM,如果你想推導一下Bidirectional
Network,應該也是順理成章的。為了友善推導和描述,我們後面都将左邊簡化為右邊這樣一個結構。
RNN和傳統的多層感覺機不同的就是跟時間沾上邊了,下一時間(了解為step)會受本時間的影響,為了更好地說明這個東西,我們可以将網絡按照時間進行展開:
主要的參數就是三部分:在RNN中每一個時間步驟用到的參數都是一樣的,要了解清楚的是:一般來說,每一時間的輸入和輸出是不一樣的,比如對于序列資料就是将序列項依次傳入,每個序列項再對應不同的輸出(比如下一個序列項),舉個栗子(預測後面的狀态):
BPTT(Back Propagation Through Time)算法
将RNN展開之後,似乎一切都很明了了,前向傳播(Forward Propagation)就是依次按照時間的順序計算一次就好了,反向傳播(Back Propagation)就是從最後一個時間将累積的殘差傳遞回來即可,跟普通的神經網絡訓練并沒有本質上的不同。
前向傳播
直接上公式啦:
本文用到的公式基本來自Alex的論文,其中a表示彙集計算的值,b表示經過激活函數計算的值,w是不同節點之間連接配接的參數(具體睡誰連誰看下标),帶下标k的是輸出層,帶下标h的是隐藏層相關的,除此之外你看到所有帶括号的的函數都是激活函數, ϵ 和 δ 的定義看公式,L 是最後的Loss function,這裡沒有給出具體的計算方法,因為這和NN是一樣的,可以看到輸出層和普通的NN是完全一樣的,接收隐藏層傳入的資料并乘以參數求和,隻是每一個計算出來的值都有個時間上标t,表示它是t時刻的那個節點。
而隐藏層的計算就是和NN不同的地方,從之前的拓撲圖也看到了,隐藏層會接受來自上一時間隐藏層傳入的資料,在公式裡也展現出來了:第一個求和是和NN一緻的,接收來自輸入層的資料,第二個是接收來自上一隐藏層的資料。
後向傳播
這裡主要給出的是計算隐藏層的累積殘差的公式,因為輸出層和經典的NN是一回事,可以看到第一個公式括号中的兩個部分,一個是接收目前時間輸出層傳回的殘差,第二個是接收下一時間隐藏層傳回的殘差,看着上面的圖其實非常好了解。
LSTM(Long-Short Term Memory)
原生的RNN會遇到一個很大的問題,叫做 The vanishing gradient problem for
RNNs,也就是後面時間的節點對于前面時間的節點感覺力下降,也就是忘事兒,這也是NN在很長一段時間内不得志的原因,網絡一深就沒法訓練了,深度學習
那一套東西暫且不表,RNN解決這個問題用到的就叫LSTM,簡單來說就是你不是忘事兒嗎?我給你拿個小本子把事記上,好記性不如爛筆頭嘛,是以LSTM
引入一個核心元素就是Cell。
與其說LSTM是一種RNN結構,倒不如說LSTM是RNN的一個魔改元件,把上面看到的網絡中的小圓圈換成LSTM的block,就是所謂的LSTM了。那它的block長什麼樣子呢?

怎麼這麼複雜……不要怕,下文慢慢幫你縷清楚。了解LSTM最友善的就是結合上面這個圖,先簡單介紹下裡面有幾個東西:
- Cell,就是我們的小本子,有個叫做state的參數東西來記事兒的
- Input Gate,Output Gate,在參數輸入輸出的時候起點作用,算一算東西
-
Forget
Gate:不是要記東西嗎,咋還要Forget呢。這個沒找到為啥就要加入這樣一個東西,因為原始的LSTM在這個位置就是一個值1,是連接配接到下一時間的
那個參數,估計是以前的事情記太牢了,最近的就不住就不好了,是以要選擇性遺忘一些東西。(沒找到解釋設定這個東西的動機,還望指正)
在閱讀下面公式說明的時候時刻記得這個block上面有一個輸出節點,下面有一個輸入節點,block隻是中間的隐層小圓圈~~~
前向傳播
一大波公式正在路上。。。。。公式均來自Alex的論文
我們按照一般算法的計算順序來給出每個部分的公式:
Input Gate
帶下标L的就是跟Input Gate相關的,回去看上面那個圖,看都有誰連向了Input Gate:外面的輸入,來自Cell的那個虛線(虛線叫做peephole連接配接),這在公式立展現在4.2的第一項和第三項,計算就是普通的累積求和。那中間那個是個什麼鬼?
帶H的是一個泛指,因為LSTM的一個重要特點是其靈活性,cell之間可以互聯,hidden
units之間可以互聯,至于連不連都看你(是以你可能在不同地方看到的LSTM公式結構都不一樣)是以這個H就是泛指這些連進來的東西,可以看成是從外
面連進了的三條邊的一部分。
至于4.3就是簡單的激活函數計算而已
Forget Gate
再回去看那個圖,連到Forget Gate都有哪些:輸入層的輸入、泛指的輸入、來自cell的虛線,這個和Input Gate就是一回事嘛
Cells
還是老樣子,回去看都有啥連到了Cell(這裡的cell不是指中間那個Cell,而是最下面那個小圓圈,中間的Cell表示的其實是那個狀态值S[c][t]):輸入層的輸入,泛指的輸入。(這展現在4.6式中)
再看看中間的那個Cell狀态值都有誰連過去了:這次好像不大一樣,連過去的都是經過一個小黑點彙合的,從公式也能展現出來,分别是:ForgetGate*上一時間的狀态 + InputGate*Cell激活後的值
Output Gate
老樣子,看誰連到了Output Gate:跟其他幾個Gate好像完全一樣嘛~咦,4.8那個S[c][t]為啥是t,以前都是t-1啊。
這裡我也沒找到相關的原因,可以了解為在計算OG的時候,S[c][t]已經被計算出來了,是以就不用使用上一時間的狀态值了(同樣動機不明~~這就是設定好嘛。。。)
最後最後的輸出
小黑點,用到了激活後的狀态值和Output Gate的結果。
一定按照圖的連接配接來捋一捋,公式還是非常清晰的。
後向傳播
又一波公式來襲。。。。。。
這次就隻貼公式了,因為要每個都講一下實在是太費功夫了,記住一個要點就是『看上面的圖!!』,看看每個要求偏導的東西都有誰會反向傳回東西給它,
可以看到最複雜的就是4.13了,因為這是對那個狀态值求導,它不光連向了三個門(公式後三項,兩個本下一時刻,FG是本時刻的),還連向了最後的輸出
b[c][t](公式第一項)以及下一時刻的自己(公式第二項),反向傳播公式推導用到的唯一數學工具就是鍊式法則,你要覺得求偏導看不懂,就把它拆成鍊
看就好了。
還有一點,記得最後的Loss
Function是每一時間的一個求和,是以當你算目前層輸出層傳回來的殘差都時候就可以忽略其它東西了,舉個例子:4.11是對b[c][t]求偏導,
而b[c][t]是正向傳播LSTM block的輸出,輸出到誰了?目前層的輸出層,下一層的Hidden Layer,這兩個東西的最後的Loss
function是分開的,彼此之間沒有關系,是以公式裡是兩部分相加。4.11中的G和之前的H一樣,也是泛指,因為它不一定隻輸出到下一時間的自己,
可能還會到下一時間的其他隐層unit,G代表什麼純看你怎麼确定的網絡結構。
ϵxt=∂L∂btc=∑kK∂L∂atk∂atk∂btc+∑gG∂L∂at+1g∂at+1g∂btc=(4.11)
後記
推導一遍之後你完全可以自己實作一次了,用到的東西也不複雜,可惜對于RNN和DL這些東西來說,确定網絡結構和調參才是對最後效果有着決定性的影
響,RNN和LSTM裡可以調的東西太多了,每一個未知的激活函數選擇,具體網絡到底怎麼連接配接,還有學習速率這種老問題。也是個大工程的說