1. 程式人生 > >LSTM入門學習——本質上就是比RNN的隱藏層公式稍微復雜了一點點而已

LSTM入門學習——本質上就是比RNN的隱藏層公式稍微復雜了一點點而已

組成 學習 算法 style oid 進行 python 之間 得到

LSTM入門學習

摘自:http://blog.csdn.net/hjimce/article/details/51234311

下面先給出LSTM的網絡結構圖:

技術分享

看到網絡結構圖好像很復雜的樣子,其實不然,LSTM的網絡結構圖無非是為了顯示其高大上而已,這其實也是一個稍微比RNN難那麽一丁點的算法。為了簡單起見,下面我將直接先采用公式進行講解LSTM,省得看見LSTM網絡結構圖就頭暈。

(1)RNN回顧

先簡單回顧一下RNN隱層神經元計算公式為:

技術分享

其中U、W是網絡模型的參數,f(.)表示激活函數。RNN隱層神經元的計算由t時刻輸入xt,t-1時刻隱層神經元激活值st-1作為輸入。總之說白了RNN的核心計算公式就只有上面這麽簡簡單單的公式,所以說會者不難,難者不會,對於已經懂得RNN的人來說,RNN是一個非常簡單的網絡模型。

(2)LSTM前向傳導

相比於RNN來說,LSTM隱層神經元的計算公式稍微復雜一點,LSTM隱藏層前向傳導由下面六個計算公式組成,而且其中前4個公式跟上面RNN公式都非常相似:

技術分享

首先需要先記住上面五個公式中輸入變量的含義:

(1)輸入變量:x(t)表示t時刻網絡的輸入數據,S(t-1)表示t-1時刻隱藏層神經元的激活值、C是一個記憶單元

(2)網絡參數:U、W都是網絡LSTM模型的參數,或者稱之為權值矩陣

(3)σ表示sigmoid激活函數

(4)另外s(t)是t時刻,LSTM隱藏層的激活值

從上面的公式我們可以看出LSTM在t時刻的輸入包含:X(t)、S(t-1)、C(t-1),輸出就是t時刻隱層神經元激活值S(t)。LSTM前四個公式和RNN非常相似,模型都是:

技術分享

這四個公式的輸入都是x(t),s(t-1),每個公式各有各自的參數U、W。前面三個公式的激活函數選擇s型函數,大牛門給它們起了一個非常裝逼的名詞,i、f、o分別稱之為輸入門、遺忘門、輸出門;第4個公式選用tanh激活函數。

1、輸入門

輸入門可以控制你的輸入是否影響你的記憶當中的內容。因變量為i,自變量為:輸入數據x(t)、上一時刻隱藏層神經元激活值s(t-1),其采用S激活函數,輸出的數值在0~1之間。如果從業余的角度來講,可以把它看成是一個權值;當i為0的時候,表示當前時刻x(t)的信息被屏蔽,沒有存儲到記憶中。

2、遺忘門

遺忘門是來看你的記憶是否自我更新保持下去。因變量為f,自變量依舊為:

3、輸出門

輸出門是影響你的記憶是否被輸出出來影響將來這三個們有一個特點:它們的輸入數據都是x(t),上一時刻隱藏層的激活值s(t-1),另外這三個們

這種方式使你的記憶得到靈活的保持,而控制記憶如何保持的這些門本身是通過學習得到的,通過不同的任務學習如何去控制這些門。

三、源碼實現

https://github.com/fchollet/keras/blob/master/keras/layers/recurrent.py

[python] view plain copy
    1. x_i = K.dot(x * B_W[0], self.W_i) + self.b_i
    2. x_f = K.dot(x * B_W[1], self.W_f) + self.b_f
    3. x_c = K.dot(x * B_W[2], self.W_c) + self.b_c
    4. x_o = K.dot(x * B_W[3], self.W_o) + self.b_o
    5. i = self.inner_activation(x_i + K.dot(h_tm1 * B_U[0], self.U_i))
    6. f = self.inner_activation(x_f + K.dot(h_tm1 * B_U[1], self.U_f))
    7. c = f * c_tm1 + i * self.activation(x_c + K.dot(h_tm1 * B_U[2], self.U_c))
    8. o = self.inner_activation(x_o + K.dot(h_tm1 * B_U[3], self.U_o))
    9. h = o * self.activation(c)

LSTM入門學習——本質上就是比RNN的隱藏層公式稍微復雜了一點點而已