迴圈神經網路RNN的簡單框架實現

2021-08-20 07:52:18 字數 2651 閱讀 6509

迴圈神經網路rnn結構與全連線或者卷積神經網路結構相比,rnn比較複雜。通過閱讀各種資料,覺得《tensorflow:實戰google深度學習框架》中rnn講的最通俗易懂,在這裡將簡單的總結一下書上的內容。

迴圈神經網路的主要用途是處理和**序列資料,為了刻畫乙個序列當前的輸出與之前資訊的關係。從網路結構上看,rnn會利用之前的資訊影響後面結點的輸出,也就是rnn的隱藏層之間的結點是有連線的,隱藏層的輸入不僅包含輸入層的輸入,還包含上一時刻隱藏層的輸出。

這張圖就是rnn迴圈體按時間展開後的結構。x為網路輸入,a為隱藏層狀態,h為輸出。在每乙個時刻會有乙個輸入xl,然後rnn當前的狀態al提供乙個輸出。而當前狀態al是根據上一時刻狀態al-1和當前的輸入xl共同決定的。

如何將狀態資訊迴圈輸入神經網路,這個迴圈結構被稱之為迴圈體。下圖是乙個使用最簡單的迴圈體結構的rnn,在這個迴圈體中只是用了乙個類似全連線層的神經網路結構。

迴圈神經網路中的狀態是通過乙個向量來儲存的,這個向量的維度也被稱為rnn隱藏層的大小,設為h。從圖中可以看出,迴圈體的輸入有兩個部分,一部分為上一時刻的狀態,另一部分為當前時刻的輸入樣本。對於語言模型來說,輸入樣例可以是當前單詞對應的單詞向量word embedding。

若輸入向量的維度為x,則迴圈體的全連線層神經網路的輸入大小為h+x,也就是將上一時刻的狀態和輸入向量拼接起來。該迴圈體的輸出為當前時刻的狀態,所以輸出層的大小也為h,所以迴圈體中神經網路的所有引數個數為(h+x)*h(權重)+h(偏置)個。但是迴圈體輸出還作為rnn的輸出,所以,迴圈體還需要另外乙個全連線神經網路來完成這個過程。下圖為乙個迴圈神經網路前向傳播的全部過程。

圖中輸入輸出的維度都是1,迴圈體中全連線層權重為wrnn,偏置項為brnn,用於rnn輸出的全連線層權重為woutput,偏置項為boutput。初始迴圈體狀態為[0,0],因為當前輸出為1,所以拼接得到的向量為[0,0,1],通過迴圈體中的全連線層神經網路得到的結果為:

這一結果將作為下一時刻的輸入狀態,同時迴圈體也會使用該狀態生成rnn的輸出,將該向量作為輸入給用於輸出的全連線神經網路可以得到當前時刻的最終輸出:

在得到迴圈神經網路的前向傳播過程之後,可以和其他神經網路類似地定義損失函式,唯一區別就在於rnn在每個時刻都有乙個輸出,所以rnn的總損失為所有(部分)時刻上的損失函式的總和。

下面**是用python簡單的實現了乙個rnn的前向傳播過程,結合上面的過程圖能更好地理解。

import numpy as np

x = [1, 2] # x為輸入序列

state = [0.0, 0.0] # 隱藏層初始值

# 迴圈體中的全連線層引數,分開定義不同輸入的權重

w_cell_state = np.asarray([[0.1, 0.2], [0.3, 0.4]]) # 隱藏層狀態state權重

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)):

# 計算迴圈體中的全連線神經網路, np.dot為矩陣乘法

before_activation = np.dot(state, w_cell_state) + x[i] * w_cell_input + b_cell

# 當前的隱藏層狀態state

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.56128388]

before

activation: [1.2923401 1.39225678]

state: [0.85973818 0.88366641]

output

[2.72707101]

理論上rnn可以支援任意長度的序列,然而在實際中,如果序列過長會導致優化時出現梯度瀰散的問題,所以實際中一般會規定乙個最大長度。

RNN迴圈神經網路

評測乙個句子出現的可能性 文字自動生成 rnn迴圈處理相同的任務,就是 句子接下來的單詞是什麼。rnn迴圈記錄前面所有文字的資訊 也叫做記憶 作為 當前詞的乙個輸入 1.語言模型和文字生成 語言模型中,輸入是經過編碼的詞向量序列,輸出是一系列 的詞 2.機器翻譯 機器翻譯必須等待所有輸入結束後才能輸...

迴圈神經網路 RNN

from torchnlp.word to vector import glove vectors glove vectors hello torch.nn.utils.clip grad norm p,10 10就是最大梯度的模閾值,即保留原來梯度的方向,但梯度大小縮放至10對與梯度瀰散現象,考慮...

RNN迴圈神經網路

神經網路基礎 神經網路可以當做是擬合任意函式的黑盒子,給定特定的輸入x,就能夠的得到希望的輸出y。神經網路結構如下圖 將神經網路模型訓練好之後,輸入層輸入乙個x,通過網路之後就能夠在輸出層輸出特定的y.有了這麼強大的模型,為什麼會出現rnn 迴圈神經網 它們單獨的乙個個的輸入,前乙個輸入和後乙個輸入...