LSTM即Long Short Term Memory networks
,是一種特殊的RNN網絡,能夠學習長週期的依賴。一個包含單tanh層的標準RNN網絡以下:git
LSTM也有一個相似結構的鏈條,但卻有四層github
LSTMs的關鍵是cell state
,即下圖中的水平線。網絡
信息能夠很方便地不作改變地在這條線上流動,固然也能夠在這些旁路做用下改變狀態。門是一種選擇性地讓信息經過的方法,由一個sigmoid層和一個點乘操做組成。函數
sigmoid層輸出的是一個0到1的數字,表示的是每一個內容經過的機率。0即全部都不經過,1即全部都經過。post
C1
LSTM的第一步就是決定從cell state
中拋出什麼信息,這個決定由一個叫forget gate layer
的sigmoid層作出,它根據 ht-1 和 xt 爲cell state Ct-1 中的每一個數輸出一個介於0到1的數。1表明全經過,0表明全不經過。學習
以根據前面的詞語判斷下一個詞爲例。在這個問題中,cell state可能包含當前對象的性別,因此正確的代詞纔可以被使用(he, she之類的)。當咱們見到一個新對象時,老對象就應該被忘記。測試
第二步是決定咱們想在cell state中存儲什麼新信息。這包含兩個方面,一是稱爲input gate layer
的sigmoid層決定了咱們要更新哪些值。二是tanh層產生了一個候選值向量,它被添加到state中。下一步中,咱們將結合這兩方面,向state中寫入更新。spa
在這個語言模型例子中,咱們想向cell state中添加新對象的性別,以替換咱們想忘記的老對象的性別。翻譯
如今是時候把老的cell state Ct-1 更新成新的cell state Ct ,以前的步驟已經決定了要作什麼,咱們只須要去實行。code
用 ft 去乘老狀態,忽略掉咱們以前決定忽略的東西。而後加上 it * 。這就是新的候選值,按咱們想要更新狀態值的意願大小去縮放。
在這個語言模型中,這裏就是咱們要扔掉舊對象性別信息,添加新信息的地方。
最後,咱們要決定打算輸出什麼信息。這個輸出要基於咱們的cell state,可是會是一個過濾後的版本。首先,咱們要運行一個決定輸出哪部分cell state的sigmoid層。而後,咱們讓cell state經過tanh層(讓值變爲-1和1之間),而且讓它與sigmoid門相乘。這樣咱們就能夠輸出咱們想輸出的那部分。
對於這個語言模型,既然它看見了一個對象,它或許想要輸出關於動詞的信息。以防那就是接下來的東西。例如,它或許要輸出這個對象是單數仍是複數。
以上描述的都是一個正常的LSTM,但並非全部LSTMs都是像上面那樣的。事實上,看起來幾乎全部包含LSTMs的論文都用的是略有不一樣的版本。差別很小,但仍是有必要提幾個。
一個流行的LSTM異型添加了peephole connections
,這意味着sigmoid門輸入考慮到了cell state。
上圖對全部門添加了窺視孔(peephole),但不少論文只是添加了一部分。
另外一個異型使用了耦合遺忘和輸入門。不一樣於獨立地決定去遺忘什麼、添加什麼,咱們同時作 這些決定。只在打算輸入信息時遺忘,只在遺忘老信息時向狀態中輸入新信息。
另外一個戲劇性的LSTM異型是GRU(Gated Recurrent Unit)。它將遺忘和輸入門合併稱爲一個單獨的update gate
。它也合併了cell state和hidden state,而且作了一些其餘的改變,創造了比標準LSTM更簡單的模型,正在變得愈來愈流行。
這只是一部分,其實還有不少。Greff, et al. (2015)對流行的異型作了比較,發現基本都差很少。Jozefowicz, et al. (2015)測試了超過一萬種RNN網絡,發如今特定任務上有些作的更好。
雙曲函數中的一個,tanh()爲雙曲正切。定義域:R,值域:(-1,1)。y=tanh x是一個奇函數,其函數圖像爲過原點而且穿越Ⅰ、Ⅲ象限的嚴格單調遞增曲線,其圖像被限制在兩水平漸近線y=1和y=-1之間。