標籤:

[學習筆記] Long Short-Term Memory

Based on Understanding LSTM Networks from colahs blog一篇很經典的介紹LSTM的文章。以及該文章中提到的一些paper的內容

Recurrent Neural Networks

人類的思考不是空穴來風。當你閱讀這篇文章的時候,你理解詞語的意思其是是通過前文的意思。人類的思想是永續的。傳統NN不能做到這一點,但RNN可以,因為其內部有loops,使得過去的信息可以對現在的訓練有所影響。

recurrent neural networks are intimately related to sequences and lists

RNN可以很好的應用於:speech recognition, language modeling(compute the probability of a sentence or sequence of words), translation, image captioning...尤其是這裡介紹的其神奇功能The Unreasonable Effectiveness of Recurrent Neural Networks by Andrej Karpathy。

而RNN之所以能取得這樣的成績離不開黨和國家對它的栽培。。更重要的是離不開一個神器「LSTM-long short-term memory」。其實LSTM是一種特殊的RNN,不過比一般的RNN屌太多,幾乎目前所有比較exciting的成果都是基於LSTM的模型獲得的。

Long-Term Dependencies

預測詞語需要前文context,但需要多早之前的就要case by case。RNN可以利用比較近的context,但比較久遠的就很難利用,主要難度在於Gradient Descent對於訓練Long-Term Dependencies很困難,具體為什麼可以參看Learning Long-Term Dependencies with Gradient Descent is Difficult,大概結論是back-propagation難以發現跨度太大的關聯性。而LSTM就厲害在它沒有這個問題。後面有解釋RNN用gradient方法會產生的gradient vanishing問題。

LSTM Networks

優點是:可以訓練long-term dependencies。用兩個圖對比傳統RNN和LSTM

LSTM的repeating module內部有四個相互關聯的神經網路層次,下面細講。

核心思想

cell state,就是下圖所示的水平箭頭,類似一個傳送帶,只有一些簡單的線性變換,所以可以讓信息在不同module之間流動不產生變化。

不過LSTM還是能夠改變信息,對信息的刪除或添加處理由「gate」來處理。gate有選擇地使信息通過,結構是sigmoid 神經網路層配合pointwise乘法處理。sigmoid層的輸出是0-1之間的數,決定了每一個component能夠通過的程度。A value of zero means 「let nothing through,」 while a value of one means 「let everything through!」。LSTM有三個gate來保護和控制cell state。

步驟分解

  • 第一步:決定哪些信息是要扔掉的。由「遺忘之門 - forget gate layer」決定。input是前一個module的輸出結果h_t以及inputx_t(就是word sequence)。比如,探究一個新的對象的性別,我們需要忘記上一個對象的性別。

f_t=sigma(W_fcdot [h_{t-1},x_t]+b_f)

  • 第二步:決定哪些信息是要存進cell state。由「輸入之門 - input gate layer」和tanh層共同決定。input gate層是sigmoid層決定哪些component值得update,然後一個tanh層計算一個新的cell state加在舊的上面。接前例,這一步將把新對象的性別加到cell state中。

egin{align*}& i_t=sigma(W_icdot [h_{t-1},x_t]+b_i)\& 	ilde C_t=	anh(W_Ccdot [h_{t-1},x_t]+b_Cend{align*}

綜合第一第二步:我們獲得第t次更新後的cell state,即放棄該放棄的,堅持該堅持的。

C_t=f_t	imes C_{t-1} + i_t	imes 	ilde C_t

  • 最後:確定輸出,給下一個module,即h_t。首先,用一個sigmoid層決定cell state的哪些component值得輸出,然後把當前cell state經過tanh的洗禮並與之前的sigmoid 結果相乘,就可以輸出我們想輸出的。緊接上例,因為模型目前只知道有這麼一個對象,所以猜測,下一個次可能是動詞(也可能不是),因此決定輸出的對象可以包含一些對動詞的預測有幫助的信息,比如對象是單數還是複數,這樣後面一個module在預測下一個動詞(如果真是動詞)的時候可以選擇對應單數主語或複數主語。

egin{align*}& o_t=sigma(W_o[h_{t-1},x_t]+b_o)\& h_t=o_t	imes 	anh(C_t)end{align*}

計算出的h_t有兩個去向,一個是用作模型的預測值輸入error function計算error,另一個就 是輸入下一個module

LSTM變體

前述LSTM是一個標準形式,但所有人都會對自己的LSTM作一些小調整。這裡介紹一些比較厲害的。

  1. Gers & Schmidhuber (2000)加入了一個「peephole connection (pc)」,就是每一個門都接收上一個cell state:egin{align*}& f_t=sigma(W_f[mathbf{C_{t-1}},h_{t-1},x_t]+b_f)\& i_t=sigma(W_i[mathbf{C_{t-1}},h_{t-1},x_t]+b_i)\& o_t=sigma(W_o[mathbf{C_{t}},h_{t-1},x_t]+b_o)end{align*},也有的paper只給部分門pc.

  2. 變體二將forget gate 和input gate合在一起,即C_t=f_t	imes C_{t-1} + m{(1-f_t)}	imes 	ilde C_t,就是,對於某個component,只有forget才會有input,不forget就不input
  3. 變體三變得比較大,但其實形式比標準LSTM簡單,而且越來越流行:Cho, et al. (2014)提出的GRU(Gated Recurrent Unit)。結合forget和input gates形成一個"update gate",同時也結合cell state以及hidden state。如下圖:

這麼多變體哪種比較厲害?Greff, et al. (2015)對很多流行的變體作了比較,發現都差不多。而 Jozefowicz, et al. (2015)更是閑的不行,測試了一萬多種RNN架構,發現一些在特定任務下表現比LSTM還好的架構。主要結論是:最好的模型都類似GRU。以及,各種gate裡面,forget gate最重要,然後是input gate,最後是output gate。並且,如果forget gate使用正的bias,模型performance會很好。

結論

下一步的研究將是「attention」。讓RNN的每一步都能從一個大範圍的信息中抽取細節。比如作image caption,RNN可以每次看圖片的一小部分然後model一個詞。

還有其他比較有前景的方向,比如Grid LSTM by Kalchbrenner, et al. (2015)。Generative Models using RNNs by Gregor, et al. (2015), Chung, et al. (2015), or Bayer & Osendorfer (2015)

其他補充知識

  • Exploding and Vanishing gradients是RNN一個很典型的問題,因為它是自循環,所以相當於gradient matrix的很多次方,使得gradient grow or shrink at a rate exponential in number of time steps。
    • Exploding很好解決,當其norm(範式,L1或L2)超過一個設定值,就縮小gradient。
    • 但是Vanishing不好解決,因為並不是說所有gradient都很小,而是gradient的component在對應於long-term dependencies的方向上很小,在對應於short-term dependencies的方向上很大,所以RNN更容易學習short term dependencies而不是long -term。LSTM的解決方法是修改RNN對hidden stateS_t的update方式,RNN是用S_{t-1}作矩陣乘法得到S_t,而LSTM是用S_{t-1}先算、S_t然後兩者相加得到S_t。,the gradients of an RNN that computes、S_tare nicer, since they cannot vanish. 有兩個因素決定gradient會不會vanish,1)weight;2)activation function,就像時間序列方程的coefficients一樣,有一個是小於0的話,gradient就會vanish。根據前文LSTM結構核心概念,主線cell state在repeating module之間的flow所用的activation function是identity function,gradient是1,而effective weight是forget gate activation,it is the rate at which you want the neural network to forget its past memory。大概意思是每一次只要forget gate有輸出那麼輸出就接近1,不會造成vanishing。
  • How LSTM (or RNN) stops:Show and Tell: A Neural Image Caption Gdnerator. 里粗略的提了一下

we denote by S_0 a special start word and by S_N a special stop word which designates the start and end of the sentence. In particular by emitting the stop word the LSTM signals that a complete sentence has been generated.

自己的理解

  • 模型的設置是對language model有一些prior knowledge,所以machine learning不是模型和編程那麼簡單,不是說建立一個模型適用於所有問題,而是需要對所要研究的問題有一定的研究,假設。比如另一篇翻譯AlexNet的文章裡面,Alex也有提到,他們的CNN是基於很多重要的對圖像的假設。

  • 感覺學科之間的交互性,雖然尚未接觸到深層原理,但是看RNN的結構和對gradient vanishing的一些解釋,感覺這個模型很像一個時間序列模型。因為,RNN是需要以往的信息作為一個input來預測下一個信息,很像時間序列模型。兩者都需要對參數進行控制以識別使用過去多久的信息比較合理。還需要搜索一下有沒有這方面的研究,感覺是很好的學科交流。

拓展閱讀

有幾個不錯的了解LSTM的文章或tutorial:

  1. TensorFlows tutorial on RNN and LSTM
  2. LSTM implementation explained:用Torch7框架 Lua語言

推薦閱讀:

我是如何「元學習」的
生成對抗網路
【求援】需要你的參與
模型評估和選擇
非極大值抑制演算法(Python實現)

TAG:機器學習 |