迴圈神經網路 RNN

mxb1234567發表於2020-12-21

目錄

迴圈神經網路 RNN

長短時記憶網路 LSTM

迴圈神經網路 RNN

迴圈神經網路的主要用途是處理和預測序列資料。迴圈神經網路刻畫了一個序列當前的輸出與之前資訊的關係。從網路結構上,迴圈神經網路會記憶之前的資訊,並利用之前的資訊影響後面節點的輸出。

迴圈神經網路的一個重要的概念就是時刻。上圖中迴圈神經網路的主體結構A的輸入除了來自輸入層的x_t,還有一個自身當前時刻的狀態。在每一個時刻,A會讀取t時刻的輸入X_t,並且得到一個輸出h_t。同時還會得到一個當前時刻的狀態S_t,傳遞給下一時刻t+1。將迴圈神經網路按照時間序列展開,如下圖所示:

鏈式的特徵揭示了 RNN 本質上是與序列和列表相關的。在標準的 RNN 中,這個重複的模組只有一個非常簡單的結構,例如一個tanh層。

下圖展示了一個迴圈神經網路的前向傳播演算法的具體計算過程:

在得到前向傳播計算結果之後,可以和其他網路類似的定義損失函式。神經網路的唯一區別在於它每一個時刻都有一個輸出,所以迴圈神經網路的總損失為前面所有時刻的損失函式的總和。

import numpy as np

X = [1,2,1,2,1,2,3,1]
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([[0.1],[0.2]])
b_output = 0.1
# 按照時間順序執行迴圈神經網路的前向傳播過程
for i in range(len(X)):
    before_activetion = np.dot(state, w_cell_state) + X[i] * w_cell_input + b_cell
    state = np.tanh(before_activetion)
    #計算當前時刻的最終輸出
    final_output = np.dot(state,w_output) + b_output
    #輸出每一時刻的資訊
    print("before_activation",before_activetion)
    print("state",state)
    print("final_output",final_output)

長短時記憶網路 LSTM

迴圈神經網路工作的關鍵點就是使用歷史的資訊來幫助當前的決策。迴圈神經網路能很好的利用傳統的神經網路不能建模的資訊,但同時,也帶來了更大的挑戰——長期依賴的問題。在有些問題中,模型僅僅需要短期內的資訊來執行當前的任務。但同時也會有一些上下文場景更加複雜的情況。當間隔不斷增大時,簡單的迴圈神經網路可能會喪失學習到如此遠的資訊的能力。或者在複雜的語言場景中,有用的資訊的間隔有大有小,長短不一,迴圈神經網路的效能也會受限。

LSTM與單一tanh迴圈結構不同,LSTM擁有三個門:“輸入門”、“輸出門”、“遺忘門”。 

細胞狀態類似於傳送帶。直接在整個鏈上執行,只有一些少量的線性互動。資訊在上面流傳保持。

LSTM 有通過精心設計的稱作為“門”的結構來去除或者增加資訊到細胞狀態的能力。門是一種讓資訊選擇式通過的方法。他們包含一個sigmod神經網路層和一個按位的乘法操作。

在我們 LSTM 中的第一步是決定我們會從細胞狀態中丟棄什麼資訊。這個決定通過一個稱為忘記門層完成。該門會讀取h_{t-1}x_t,輸出一個在0到1之間的數值給每個在細胞狀態C_{t-1}中的數字。1表示“完全保留”,0表示“完全捨棄”。例如,當我們在句子中希望通過主語選擇相應的代詞,細胞狀態可能包含當前主語的性別,因此正確的代詞可以被選擇出來。當我們看到新的主語,我們希望忘記舊的主語。

丟棄資訊

下一步是確定什麼樣的新資訊被存放在細胞狀態中。這裡包含兩個部分。第一,sigmod層稱 “輸入門層” 決定什麼值我們將要更新。然後,一個tanh層建立一個新的候選值向量\widetilde{C}_t,會被加入到狀態中。

這樣就把細胞狀態從C_{t-1}更新為C_t了。

我們把舊狀態與f_t相乘,丟棄掉我們確定需要丟棄的資訊。接著加上i_t\times \widetilde{C}_t。這就是新的C_t,根據我們決定更新每個狀態的程度進行變化。

更新細胞狀態

在語言模型的例子中,這裡就是實際根據前面確定的目標,丟棄舊代詞的性別資訊並新增新的資訊的地方。

最終,輸出門層需要確定輸出什麼值,這個輸出將會基於我們的細胞狀態。首先,執行一個sigmod層來確定細胞狀態的哪個部分將輸出出去。接著,把細胞狀態通過tanh進行處理(得到一個在-1到1之間的值)並將它和sigmod門的輸出相乘。

單個細胞的輸入和輸出入下圖所示: 

demo參考自:

【TensorFlow】 利用LSTM進行情感分析

demo:github

參考文獻

TensorFlow對於自然語言序列(PTB)的預測----RNN模型

TensorFlow學習筆記(六)迴圈神經網路

如何簡單的理解LSTM——其實沒有那麼複雜

相關文章