前段時間看了一些關於LSTM方面的論文,一直准備記錄一下學習過程的,因為其他事兒,一直拖到了現在,記憶又快模糊了。現在趕緊補上,本文的組織安排是這樣的:先介紹rnn的BPTT所存在的問題,然后介紹最初的LSTM結構,在介紹加了遺忘控制門的,然后是加了peephole connections結構的LSTM,都是按照真實提出的時間順序來寫的。本文相當於把各個論文核心部分簡要匯集一下而做的筆記,已提供快速的了解。
一.rnn結構的BPTT學習算法存在的問題
先看一下比較典型的BPTT一個展開的結構,如下圖,這里只考慮了部分圖,因為其他部分不是這里要討論的內容。
對於t時刻的誤差信號計算如下:
這樣權值的更新方式如下:
上面的公式在BPTT中是非常常見的了,那么如果這個誤差信號一直往過去傳呢,假設任意兩個節點u, v他們的關系是下面這樣的:
那么誤差傳遞信號的關系可以寫成如下的遞歸式:
n表示圖中一層神經元的個數,這個遞歸式的大概含義不難理解,要求t-q時刻誤差信號對t時刻誤差信號的偏導,就先求出t-q+1時刻對t時刻的,然后把求出來的結果傳到t-q時刻,遞歸停止條件是q = 1時,就是剛開始寫的那部分計算公式了。將上面的遞歸式展開后可以得到:
論文里面說的是可以通過歸納來證明,我沒仔細推敲這里了,把里面連乘展開看容易明白一點:
整個結果式對T求和的次數是n^(q-1), 即T有n^(q-1)項,那么下面看問題出在哪兒。
如果|T| > 1, 誤差就會隨着q的增大而呈指數增長,那么網絡的參數更新會引起非常大的震盪。
如果|T| < 1, 誤差就會消失,導致學習無效,一般激活函數用simoid函數,它的倒數最大值是0.25, 權值最大值要小於4才能保證不會小於1。
誤差呈指數增長的現象比較少,誤差消失在BPTT中很常見。在原論文中還有更詳細的數學分析,但是了解到此個人覺的已經足夠理解問題所在了。
二.最初的LSTM結構
為了克服誤差消失的問題,需要做一些限制,先假設僅僅只有一個神經元與自己連接,簡圖如下:
根據上面的,t時刻的誤差信號計算如下:
為了使誤差不產生變化,可以強制令下式為1:
根據這個式子,可以得到:
這表示激活函數是線性的,常常的令fj(x) = x, wjj = 1.0,這樣就獲得常數誤差流了,也叫做CEC。
但是光是這樣是不行的,因為存在輸入輸出處權值更新的沖突(這里原論文里面的解釋我不是很明白),所以加上了兩道控制門,分別是input gate, output gate,來解決這個矛盾,圖如下:
圖中增加了兩個控制門,所謂控制的意思就是計算cec的輸入之前,乘以input gate的輸出,計算cec的輸出時,將其結果乘以output gate的輸出,整個方框叫做block, 中間的小圓圈是CEC, 里面是一條y = x的直線表示該神經元的激活函數是線性的,自連接的權重為1.0
三.增加forget gate

四.增加Peephole的LSTM結構

- input gate, forget gate的輸入輸出
- cell的輸入
- output gate的輸入輸出
- cell的輸出(這里也是block的輸出)
五.一個LSTM的FULL BPTT推導(用誤差信號)

- 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的個數


