天天看點

TensorFlow——循環神經網絡一 循環神經網絡二 長短時記憶網絡(LSTM)結構三 循環神經網絡的變種

recurrent neural network

一 循環神經網絡

循環神經網絡的主要用途是處理和預測序列資料。

循環神經網絡的來源就是為了刻畫一個序列目前的輸出與之前資訊的關系。從網絡結構上看,循環神經網絡會記憶之前的資訊,并利用之前的資訊影響後面結點的輸出。循環神經網絡的隐藏層之間的結點是有連接配接的,隐藏層的輸入不僅包括輸入層的輸出,還包括上一時刻隐藏層的輸出。

TensorFlow——循環神經網絡一 循環神經網絡二 長短時記憶網絡(LSTM)結構三 循環神經網絡的變種

循環神經網絡按時間展開後的結構

 循環神經網絡最擅長解決與時間序列相關的問題。

TensorFlow——循環神經網絡一 循環神經網絡二 長短時記憶網絡(LSTM)結構三 循環神經網絡的變種

循環神經網絡實作機器翻譯示意圖 (輸入ABCD ,輸出為 XYZ)

TensorFlow——循環神經網絡一 循環神經網絡二 長短時記憶網絡(LSTM)結構三 循環神經網絡的變種

使用單層全連接配接神經網絡作為循環體的循環神經網絡結構圖

循環體重的神經網絡的輸入有兩部分,一部分為上一時刻的狀态,另一部分為目前時刻的輸入樣本。對于時間資料來說,每一時刻的輸入樣例可以是目前時刻的數值;對于語言模型來說,輸入樣例可以是目前單詞對應的單詞向量。

TensorFlow——循環神經網絡一 循環神經網絡二 長短時記憶網絡(LSTM)結構三 循環神經網絡的變種

循環神經網絡的前向傳播的計算過程示意圖

假設狀态的次元為2,輸入輸出的次元都為1,循環體中的全連接配接層中的權重為:

$$

w_{m n}=\left[\begin{array}{cc}{0.1} & {0.2} \\ {0.3} & {0.4} \\ {0.5} & {0.6}\end{array}\right]

$$

偏置項大小為:\( b_{r m n}=[0.1,-0.1] \)

用于輸出的全連接配接層權重為: \begin{equation} w_{\text {output}}=\left[\begin{array}{l}{1.0} \\ {2.0}\end{array}\right] \end{equation}

偏置項大小為\(b_{o u t p u t}=0.1\),在時刻\(t_{0}\),沒有上一時刻,是以将初始狀态初始化為[0, 0],目前的輸入為1,是以拼接得到向量[0, 0, 1],

$$

\tanh \left([0,0,1] \times\left[\begin{array}{cc}{0.1} & {0.2} \\ {0.3} & {0.4} \\ {0.5} & {0.6}\end{array}\right]+[0.1,-0.1]\right)=\tanh ([0.6,0.5])=[0.537,0.462]

$$

這個結果将作為下一時刻的輸入狀态,同時神經網絡也會使用該狀态生成輸出。将該向量作為輸入提供給用于輸出的全連接配接神經網絡可以得到\(t_{0}\)時刻的最終輸出:

$$

[0.537,0.462] \times\left[\begin{array}{c}{1.0} \\ {2.0}\end{array}\right]+0.1=1.56

$$

使用類似的推導得出\(t_{1}\)時刻的狀态。

以下代碼實作了簡單的循環神經網絡前向傳播的過程:

import numpy as np

X = [1, 2]
state = [0.0, 0.0]

# 分開定義不同輸入部分的權重
w_cell_state = np.asarray([[0.1, 0.2], [0.3, 0.4]])
w_cell_input = np.asarray([0.5, 0.6])
b_cell = np.asarray([0.1, -0.1])

# 定義用于輸出的全連接配接層參數
w_output = np.asarray([1.0, 2.0])
b_output = 0.1

# 按照時間順序執行循環神經網絡的前向傳播過程
for i in range(len(X)):
    before_activation = np.dot(state, w_cell_state) + X[i] * w_cell_input + b_cell
    state = np.tanh(before_activation)

    # 根據目前時刻狀态計算最終輸出
    final_output = np.dot(state, w_output) + b_output

    # 輸出每個時刻的資訊
    print("before activation: ", before_activation)
    print("state: ", state)
    print("output: ", final_output)
           
# 運作以上代碼可以得到輸出:

before activation:  [0.6 0.5]
state:  [0.53704957 0.46211716]
output:  1.561283881518055
before activation:  [1.2923401  1.39225678]
state:  [0.85973818 0.88366641]
output:  2.727071008233731
           

二 長短時記憶網絡(LSTM)結構

循環神經網絡通過儲存曆史資訊來幫助目前的決策,但這也帶來了長期依賴(long_term dependencies)問題。有的句子很短,僅僅需要短期資訊;當有的資訊很長時,簡單的循環神經網絡有可能會喪失學習到遠距離資訊的能力。于是提出了長短時記憶網絡:

TensorFlow——循環神經網絡一 循環神經網絡二 長短時記憶網絡(LSTM)結構三 循環神經網絡的變種

LSTM單元結構示意圖

“遺忘門”的作用是讓循環神經網絡“忘記”之前沒有用的資訊。“輸入門”需要從目前的輸入補充最新的記憶。LSTM結構在計算得到新的狀态 \(c_{t}\) 後需要産生目前時刻的輸出,這個過程是通過“輸出門”完成的。“輸出門”會根據最新的狀态 \(c_{t}\) 、上一時刻的輸出 \(h_{t-1}\) 和目前的輸入 \(x_{t}\) 來決定該時刻的輸出 \(h_{t}\) 。

三 循環神經網絡的變種

繼續閱讀