1. 程式人生 > >自己動手實現深度學習框架-7 RNN層--GRU, LSTM

自己動手實現深度學習框架-7 RNN層--GRU, LSTM

# 目標         這個階段會給cute-dl新增迴圈層,使之能夠支援RNN--迴圈神經網路. 具體目標包括: 1. 新增啟用函式sigmoid, tanh. 2. 新增GRU(Gate Recurrent Unit)實現. 3. 新增LSTM(Long Short-term Memory)實現. 4. 使用基於GRU和LSTM的RNN模型擬合一個正餘弦疊加函式. # RNN原理 ## 原始的RNN         RNN模型用來捕捉序列資料的特徵. 給定一個長度為T的輸入系列$X=(x_1, x_2, .., X_T)$, RNN層輸出一個長度為T的序列$H=(h_1, h_2, ..., H_T)$, 對於任意時間步t, 可以表示為: $$ H_t = δ(X_tW_x + H_{t-1}W_h + b), \quad t = 2, 3, .., T $$         函式δ是sigmoid函式: $$ δ = \frac{1}{1 + e^{-x}} $$         $H_t$包含了前面第1到t-1步的所有資訊。 和CNN層類似, CNN層在空間上共享引數, RNN層在時間步上共享引數$W_x, W_h, b$.         RNN層中隱藏層的數量為T-2, 如果T較大(超過10), 反向傳播是很容易出現梯度爆炸. GRU和LSTM就是為了解決這個問題而誕生, 這兩種模型,可以讓RNN能夠支援長度超過1000的輸入序列。 ## GRU         GRU使用了不同功能的門控單元, 分別捕捉序列上不同時間跨度的的依賴關係。每個門控單元都會都有獨立的引數, 這些引數在時間步上共享。         GRU的門控單元有:
        $R_t = δ(X_tW^r_x + H_{t-1}W^r_h + b^r)$, 重置門用於捕捉短期依賴關係.
        $U_t = δ(X_tW^u_x + H_{t-1}W^u_h + b^u)$, 更新門用於捕捉長期依賴關係
        $\bar{H}_t = tanh(X_t\bar{W}_x + (R_t * H_{t-1})\bar{W}_h + \bar{b})$
        除此之外, 還有一個輸出單元:
        $H_t = U_t * H_{t-1} + (1-U_t)*\bar{H}_t$
## LSTM         LSTM的設計思路和GRU類似, 同樣使用了多個門控單元:
        $I_t = δ(X_tW^i_x + H_{t-1}W^i_h + b^i)$, 輸入門,過濾記憶門的輸出.
        $F_t = δ(X_tW^f_x + H_{t-1}W^f_h + b^f)$, 遺忘門, 過濾前面時間步的記憶.
        $O_t = δ(X_tW^o_x + H_{t-1}W^o_h + b^o)$, 輸出門, 過濾當前時間步的記憶.
        $M_t = tanh(X_tW^m_x + H_{t-1}W^m_h + b^m)$, 記憶門.
        它還有自己獨有的記憶單元和輸出單元:
        $\bar{M}_t = F_t * \bar{M}_{t-1} + I_t * M_t$
        $H_t = O_t * tanh(\ba